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:
+3
-1
@@ -59,8 +59,10 @@ PHOTO_AI_URL=http://photo-ai:8080
|
|||||||
PHOTO_AI_MAX_PIXELS=4000000
|
PHOTO_AI_MAX_PIXELS=4000000
|
||||||
# Устройство инференса: auto (CUDA, если контейнеру выдан GPU, иначе CPU), cuda, cpu.
|
# Устройство инференса: auto (CUDA, если контейнеру выдан GPU, иначе CPU), cuda, cpu.
|
||||||
# Явный cuda без доступной CUDA не роняет сервис: WARN в лог и работа на 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 -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».
|
# Подробности установки NVIDIA Container Toolkit — в README, раздел «Запуск на NVIDIA GPU».
|
||||||
PHOTO_AI_DEVICE=auto
|
PHOTO_AI_DEVICE=auto
|
||||||
# Размер тайла инференса (0 — без тайлов). Меньше тайл — меньше памяти, медленнее.
|
# Размер тайла инференса (0 — без тайлов). Меньше тайл — меньше памяти, медленнее.
|
||||||
|
|||||||
@@ -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 tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
||||||
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
|
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
|
||||||
|
|
||||||
# 2. GPU-образ (для устройств с поддержкой CDI спеку генерирует сам toolkit)
|
# 2. Запуск
|
||||||
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
|
|
||||||
sudo systemctl restart docker
|
|
||||||
|
|
||||||
# 3. Запуск
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai
|
docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai
|
||||||
curl http://127.0.0.1:8081/health
|
curl http://127.0.0.1:8081/health
|
||||||
```
|
```
|
||||||
@@ -166,10 +162,15 @@ curl http://127.0.0.1:8081/health
|
|||||||
те же версии, что и в CPU-образе, отличаются только CUDA-библиотеки), поэтому CPU-образ
|
те же версии, что и в CPU-образе, отличаются только CUDA-библиотеки), поэтому CPU-образ
|
||||||
`whatido-photo-ai:latest` не перетирается и переключение обратно — обычный `docker compose up -d photo-ai`.
|
`whatido-photo-ai:latest` не перетирается и переключение обратно — обычный `docker compose up -d photo-ai`.
|
||||||
|
|
||||||
GPU выдаётся контейнеру через CDI (`device_ids: nvidia.com/gpu=all`), поэтому править
|
GPU выдаётся контейнеру ключом `gpus: all`, поэтому править `/etc/docker/daemon.json` и перезапускать
|
||||||
`/etc/docker/daemon.json` и перезапускать демон не нужно. Если nvidia-runtime уже зарегистрирован в
|
демон не нужно. Схема через CDI (`deploy.resources.reservations.devices` → `nvidia.com/gpu=all`)
|
||||||
демоне (`nvidia-ctk runtime configure --runtime=docker`), в оверрайде можно заменить это на
|
намеренно не используется: спека `/etc/cdi/nvidia.yaml` запекает нумерацию `/dev/dri/card*` на момент
|
||||||
классическое резервирование `driver: nvidia, count: 1` — результат тот же.
|
генерации, поэтому после переподключения видеокарты или смены порта она начинает ссылаться на
|
||||||
|
несуществующий узел, и контейнер не стартует с `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`, непустые
|
Проверка результата: в `/health` должны быть `device: cuda:0`, `half: true`, непустые
|
||||||
`vram_total_mb`/`vram_free_mb`. На 4 ГБ (например, RTX 3050 Laptop) реально держатся одновременно
|
`vram_total_mb`/`vram_free_mb`. На 4 ГБ (например, RTX 3050 Laptop) реально держатся одновременно
|
||||||
|
|||||||
+13
-13
@@ -2,11 +2,18 @@
|
|||||||
# Использование:
|
# Использование:
|
||||||
# docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai
|
# docker compose -f docker-compose.yml -f docker-compose.gpu.yml up -d --build photo-ai
|
||||||
#
|
#
|
||||||
# Требуется драйвер NVIDIA и NVIDIA Container Toolkit. GPU выдаётся контейнеру через CDI
|
# Требуется драйвер NVIDIA и NVIDIA Container Toolkit. GPU выдаётся контейнеру ключом
|
||||||
# (device_ids ниже соответствует спеку /etc/cdi/nvidia.yaml): этот путь не требует правки
|
# `gpus: all`: Docker сам подставляет драйвер NVIDIA, правка /etc/docker/daemon.json и
|
||||||
# /etc/docker/daemon.json и перезапуска демона. Если nvidia-runtime зарегистрирован в демоне
|
# перезапуск демона не нужны.
|
||||||
# (nvidia-ctk runtime configure --runtime=docker), вместо CDI можно вернуть классический вид
|
# Схема через CDI (deploy.resources.reservations.devices -> nvidia.com/gpu=all) здесь
|
||||||
# резервирования: driver: nvidia, count: 1 — результат тот же.
|
# НЕ используется намеренно: спека /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_VARIANT=cu126, а не cu124: в индексе cu124 последний torch — 2.6.0, а cu126 даёт ровно
|
||||||
# те же torch 2.14.0 / torchvision 0.29.0, что и CPU-образ, поэтому варианты сборки отличаются
|
# те же torch 2.14.0 / torchvision 0.29.0, что и CPU-образ, поэтому варианты сборки отличаются
|
||||||
# только CUDA-библиотеками.
|
# только CUDA-библиотеками.
|
||||||
@@ -22,11 +29,4 @@ services:
|
|||||||
TORCH_VARIANT: cu126
|
TORCH_VARIANT: cu126
|
||||||
environment:
|
environment:
|
||||||
PHOTO_AI_DEVICE: ${PHOTO_AI_DEVICE:-cuda}
|
PHOTO_AI_DEVICE: ${PHOTO_AI_DEVICE:-cuda}
|
||||||
deploy:
|
gpus: all
|
||||||
resources:
|
|
||||||
reservations:
|
|
||||||
devices:
|
|
||||||
- driver: cdi
|
|
||||||
device_ids:
|
|
||||||
- nvidia.com/gpu=all
|
|
||||||
capabilities: [gpu]
|
|
||||||
|
|||||||
Reference in New Issue
Block a user