fix(photo-ai): GPU выдаётся ключом gpus: all вместо CDI-спеки

CDI-спека /etc/cdi/nvidia.yaml запекает нумерацию /dev/dri/card* на момент
генерации, поэтому после переподключения видеокарты или смены порта
контейнер не стартует с "CDI device injection failed". Ключ gpus: all от
этого свободен: Docker сам подставляет драйвер NVIDIA, правка
/etc/docker/daemon.json и перезапуск демона не нужны.
This commit is contained in:
dev
2026-10-04 21:04:53 +03:00
parent b5f377b1bf
commit 1d71e249e4
3 changed files with 26 additions and 23 deletions
+3 -1
View File
@@ -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 — без тайлов). Меньше тайл — меньше памяти, медленнее.
+10 -9
View File
@@ -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) реально держатся одновременно
+13 -13
View File
@@ -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