diff --git a/.env.example b/.env.example index 1809030..99bc8cb 100644 --- a/.env.example +++ b/.env.example @@ -59,8 +59,10 @@ PHOTO_AI_URL=http://photo-ai:8080 PHOTO_AI_MAX_PIXELS=4000000 # Устройство инференса: auto (CUDA, если контейнеру выдан GPU, иначе CPU), cuda, cpu. # Явный cuda без доступной CUDA не роняет сервис: WARN в лог и работа на CPU. -# GPU-вариант собирается оверрайдом (отдельный образ whatido-photo-ai:cu126, GPU через CDI): +# GPU-вариант собирается оверрайдом (отдельный образ whatido-photo-ai:cu126, GPU через `gpus: all`): # docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai +# Чтобы оверрайд применялся ко всем командам docker compose на этой машине, укажите +# в локальном .env: COMPOSE_FILE=docker-compose.yml:docker-compose.gpu.yml # Подробности установки NVIDIA Container Toolkit — в README, раздел «Запуск на NVIDIA GPU». PHOTO_AI_DEVICE=auto # Размер тайла инференса (0 — без тайлов). Меньше тайл — меньше памяти, медленнее. diff --git a/README.md b/README.md index 61d70b9..476ef9f 100644 --- a/README.md +++ b/README.md @@ -153,11 +153,7 @@ curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-contai | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit -# 2. GPU-образ (для устройств с поддержкой CDI спеку генерирует сам toolkit) -sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml -sudo systemctl restart docker - -# 3. Запуск +# 2. Запуск docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai curl http://127.0.0.1:8081/health ``` @@ -166,10 +162,15 @@ curl http://127.0.0.1:8081/health те же версии, что и в CPU-образе, отличаются только CUDA-библиотеки), поэтому CPU-образ `whatido-photo-ai:latest` не перетирается и переключение обратно — обычный `docker compose up -d photo-ai`. -GPU выдаётся контейнеру через CDI (`device_ids: nvidia.com/gpu=all`), поэтому править -`/etc/docker/daemon.json` и перезапускать демон не нужно. Если nvidia-runtime уже зарегистрирован в -демоне (`nvidia-ctk runtime configure --runtime=docker`), в оверрайде можно заменить это на -классическое резервирование `driver: nvidia, count: 1` — результат тот же. +GPU выдаётся контейнеру ключом `gpus: all`, поэтому править `/etc/docker/daemon.json` и перезапускать +демон не нужно. Схема через CDI (`deploy.resources.reservations.devices` → `nvidia.com/gpu=all`) +намеренно не используется: спека `/etc/cdi/nvidia.yaml` запекает нумерацию `/dev/dri/card*` на момент +генерации, поэтому после переподключения видеокарты или смены порта она начинает ссылаться на +несуществующий узел, и контейнер не стартует с `CDI device injection failed: failed to stat CDI host +device /dev/dri/cardN`. Перегенерация спеки требует sudo и теряется при каждой перегенерации; +`gpus: all` от этого свободен. Если nvidia-runtime уже зарегистрирован в +демоне (`nvidia-ctk runtime configure --runtime=docker`), в оверрайде можно вместо этого указать +`deploy.resources.reservations.devices` с `driver: nvidia, count: 1` — результат тот же. Проверка результата: в `/health` должны быть `device: cuda:0`, `half: true`, непустые `vram_total_mb`/`vram_free_mb`. На 4 ГБ (например, RTX 3050 Laptop) реально держатся одновременно diff --git a/docker-compose.gpu.yml b/docker-compose.gpu.yml index 67ecab6..e00dbc8 100644 --- a/docker-compose.gpu.yml +++ b/docker-compose.gpu.yml @@ -2,11 +2,18 @@ # Использование: # docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai # -# Требуется драйвер NVIDIA и NVIDIA Container Toolkit. GPU выдаётся контейнеру через CDI -# (device_ids ниже соответствует спеку /etc/cdi/nvidia.yaml): этот путь не требует правки -# /etc/docker/daemon.json и перезапуска демона. Если nvidia-runtime зарегистрирован в демоне -# (nvidia-ctk runtime configure --runtime=docker), вместо CDI можно вернуть классический вид -# резервирования: driver: nvidia, count: 1 — результат тот же. +# Требуется драйвер NVIDIA и NVIDIA Container Toolkit. GPU выдаётся контейнеру ключом +# `gpus: all`: Docker сам подставляет драйвер NVIDIA, правка /etc/docker/daemon.json и +# перезапуск демона не нужны. +# Схема через CDI (deploy.resources.reservations.devices -> nvidia.com/gpu=all) здесь +# НЕ используется намеренно: спека /etc/cdi/nvidia.yaml запекает нумерацию /dev/dri/card* +# на момент генерации, поэтому после переподключения видеокарты или смены порта +# она начинает ссылаться на несуществующий узел и контейнер не стартует +# ("CDI device injection failed: failed to stat CDI host device /dev/dri/cardN"). +# Перегенерация спеки требует sudo и теряется при каждой перегенерации; +# `gpus: all` от этого свободен. Если nvidia-runtime зарегистрирован в демоне +# (nvidia-ctk runtime configure --runtime=docker), можно вместо этого указать +# deploy.resources.reservations.devices с driver: nvidia, count: 1 — результат тот же. # TORCH_VARIANT=cu126, а не cu124: в индексе cu124 последний torch — 2.6.0, а cu126 даёт ровно # те же torch 2.14.0 / torchvision 0.29.0, что и CPU-образ, поэтому варианты сборки отличаются # только CUDA-библиотеками. @@ -22,11 +29,4 @@ services: TORCH_VARIANT: cu126 environment: PHOTO_AI_DEVICE: ${PHOTO_AI_DEVICE:-cuda} - deploy: - resources: - reservations: - devices: - - driver: cdi - device_ids: - - nvidia.com/gpu=all - capabilities: [gpu] + gpus: all