From 875616730bfa68ed98281356d39fbd984575f6c2 Mon Sep 17 00:00:00 2001 From: zin Date: Tue, 2 Jun 2026 19:18:37 +0000 Subject: [PATCH] feat: docker integration --- Dockerfile | 29 +++++++++ Makefile | 20 +++++++ doecker-compose.yml | 64 ++++++++++++++++++++ requirements.txt | 9 +++ metrics_plot.png => src/metrics_plot.png | Bin src/scripts/00_setup_env.sh | 72 +++++++++++++++++++++++ 6 files changed, 194 insertions(+) create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 doecker-compose.yml create mode 100644 requirements.txt rename metrics_plot.png => src/metrics_plot.png (100%) create mode 100644 src/scripts/00_setup_env.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2f44bde --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Базовый образ среды выполнения PyTorch +FROM pytorch/pytorch:2.2.1-cuda12.1-cudnn8-runtime + +# Конфигурация интерпретатора Python (отключение генерации байткода и буферизации вывода) +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +# Системные библиотеки для низкоуровневой обработки изображений +RUN apt-get update && apt-get install -y \ + libglib2.0-0 \ + libsm6 \ + libxext6 \ + libxrender-dev \ + && rm -rf /var/lib/apt/lists/* + +# Интеграция Python-зависимостей +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Модули программного комплекса +COPY src/ /app/src/ + +# Сетевой интерфейс UI +EXPOSE 8080 + +# Точка входа контейнера +CMD ["streamlit", "run", "src/main.py", "--server.port", "8080", "--server.address", "0.0.0.0"] \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a6bd1e4 --- /dev/null +++ b/Makefile @@ -0,0 +1,20 @@ +.PHONY: up down logs restart status + +# Сборка и запуск контейнеров в фоновом режиме +up: + docker compose up --build -d + +# Остановка и удаление контейнеров +down: + docker compose down + +# Просмотр логов в реальном времени +logs: + docker compose logs -f + +# Быстрый перезапуск +restart: down up + +# Проверка статуса +status: + docker compose ps \ No newline at end of file diff --git a/doecker-compose.yml b/doecker-compose.yml new file mode 100644 index 0000000..2365e05 --- /dev/null +++ b/doecker-compose.yml @@ -0,0 +1,64 @@ +version: '3.8' + +# Определение общих сетей для изоляции трафика +networks: + ai_mesh: + driver: bridge + +services: + # ---------------------------------------------------- + # SERVICE 1: Frontend (Пользовательский интерфейс) + # Не требует GPU, может быть вынесен на отдельный сервер + # ---------------------------------------------------- + web_ui: + build: + context: . + dockerfile: Dockerfile + container_name: emom_frontend + restart: always + ports: + - "8080:8080" + networks: + - ai_mesh + environment: + - STREAMLIT_RUN=1 + # Указываем UI, где искать LLM-бэкенд (внутри Docker-сети) + - OLLAMA_HOST=http://llm_backend:11434 + volumes: + - ./src:/app/src + # Модели пока остаются здесь, так как код монолитный, + # но архитектурно сервис уже изолирован + - /home/zin/projects/Thesis/src/emoset_resnet50_best.pth:/app/emoset_resnet50_best.pth:ro + - /home/zin/projects/Thesis/src/music_engine/va_regressor.pkl:/app/src/music_engine/va_regressor.pkl:ro + - /home/zin/projects/Thesis/dataset/DEAM:/app/dataset/DEAM:ro + # Временно оставляем GPU для PyTorch (пока он не вынесен в API) + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + + # ---------------------------------------------------- + # SERVICE 2: LLM Inference Backend (Ollama) + # Изолированный сервис для языковой модели на GPU + # ---------------------------------------------------- + llm_backend: + image: ollama/ollama:latest + container_name: ollama_gpu_inference + restart: always + networks: + - ai_mesh + ports: + - "11434:11434" + volumes: + # Проброс локальных моделей Ollama, чтобы не качать их заново внутри докера + - ~/.ollama:/root/.ollama + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..72857a9 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +streamlit==1.32.0 +torch==2.2.1 +torchvision==0.17.1 +timm==0.9.16 +pandas==2.2.1 +scikit-learn==1.4.1.post1 +joblib==1.3.2 +transformers==4.38.2 +requests==2.31.0 \ No newline at end of file diff --git a/metrics_plot.png b/src/metrics_plot.png similarity index 100% rename from metrics_plot.png rename to src/metrics_plot.png diff --git a/src/scripts/00_setup_env.sh b/src/scripts/00_setup_env.sh new file mode 100644 index 0000000..77b4591 --- /dev/null +++ b/src/scripts/00_setup_env.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# Остановка скрипта при возникновении любой ошибки +set -e + +# Цвета для красивого вывода в консоль +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo -e "${BLUE}[INFO]${NC} Инициализация проверки окружения для проекта EmoM..." + +# 1. ПРОВЕРКА DOCKER +if ! command -v docker &> /dev/null; then + echo -e "${YELLOW}[SETUP]${NC} Docker не найден. Начинаем установку..." + # Использование официального скрипта установки Docker + curl -fsSL https://get.docker.com -o get-docker.sh + sudo sh get-docker.sh + rm get-docker.sh + + # Добавляем текущего пользователя в группу docker, чтобы не писать sudo docker + sudo usermod -aG docker $USER + echo -e "${GREEN}[OK]${NC} Docker успешно установлен." + echo -e "${YELLOW}[ВНИМАНИЕ]${NC} Для применения прав группы docker потребуется перезайти в сессию SSH после завершения скрипта." +else + echo -e "${GREEN}[OK]${NC} Docker установлен ($(docker --version))." +fi + +# 2. ПРОВЕРКА DOCKER COMPOSE +if ! docker compose version &> /dev/null; then + echo -e "${YELLOW}[SETUP]${NC} Плагин Docker Compose не найден. Устанавливаем..." + sudo apt-get update && sudo apt-get install -y docker-compose-plugin + echo -e "${GREEN}[OK]${NC} Docker Compose успешно установлен." +else + echo -e "${GREEN}[OK]${NC} Плагин Docker Compose доступен." +fi + +# 3. ПРОВЕРКА NVIDIA И ПРОБРОСА GPU В DOCKER +if command -v nvidia-smi &> /dev/null; then + echo -e "${GREEN}[OK]${NC} Драйверы NVIDIA обнаружены." + + # Проверяем наличие NVIDIA Container Toolkit + if ! dpkg -l | grep -q nvidia-container-toolkit; then + echo -e "${YELLOW}[SETUP]${NC} NVIDIA Container Toolkit не найден. Выполняется установка..." + + # Настройка репозиториев NVIDIA + curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg + curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ + sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ + sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list + + sudo apt-get update + sudo apt-get install -y nvidia-container-toolkit + + # Конфигурация Docker для работы с NVIDIA + echo -e "${YELLOW}[SETUP]${NC} Конфигурация runtime NVIDIA для Docker..." + sudo nvidia-ctk runtime configure --runtime=docker + sudo systemctl restart docker + + echo -e "${GREEN}[OK]${NC} NVIDIA Container Toolkit установлен и настроен." + else + echo -e "${GREEN}[OK]${NC} NVIDIA Container Toolkit уже установлен." + fi +else + echo -e "${RED}[WARN]${NC} Утилита nvidia-smi не найдена! Убедитесь, что драйверы видеокарты установлены, иначе Docker будет использовать только CPU." +fi + +echo -e "\n${BLUE}[INFO]${NC} =========================================" +echo -e "${GREEN}[SUCCESS]${NC} Окружение готово к работе!" +echo -e "Теперь вы можете запустить проект командой: ${YELLOW}make up${NC}" \ No newline at end of file