GPU
Репозиторий получает доступ к GPU только через разрешение на устройство. Машина публикует имеющиеся GPU как именованные устройства, а оператор выдаёт репозиторию те имена, которые ему можно использовать. Репозиторий без разрешения не получает GPU, а форк стартует без разрешения, даже если оно есть у родителя.
Имена следуют стандарту Container Device Interface (CDI), с помощью которого Docker 25 и новее описывает устройство и всё, что нужно контейнеру для работы с ним. Имя CDI выглядит как <vendor>/<class>=<device>, например nvidia.com/gpu=all.
Что такое разрешение CDI
Каждый репозиторий запускает собственный демон Docker за API-шлюзом, который отклоняет любой способ подключить оборудование к контейнеру, поэтому GPU нельзя получить флагами docker run. Разрешение остаётся единственной дверью. Оно записывает точное имя CDI для одного репозитория, и после этого шлюз пропускает запрос контейнера, который называет именно это устройство и никакое другое.
- Разрешения вступают в силу со следующего запроса к Docker, перезапуск демона не нужен.
- Разрешение называет ровно одно устройство. Выдача
nvidia.com/gpu=allдопускаетnvidia.com/gpu=all, но неnvidia.com/gpu=0. Чтобы дать репозиторию одну карту, выдаётся имя этой карты. - При записи разрешение сверяется со спецификациями устройств на машине, поэтому имя с опечаткой отклоняется, а не сохраняется.
- Разрешение принадлежит репозиторию, для которого оно выдано. Форки и копии нуждаются в собственном.
Настройка машины
rdc machine setup <machine> обнаруживает GPU на машине и записывает результат в /etc/rediacc/gpu/inventory.json. Если есть GPU NVIDIA, setup также устанавливает NVIDIA Container Toolkit и создаёт спецификацию CDI в /etc/cdi/nvidia.yaml. Машина без GPU всё равно получает файл инвентаря с пустыми списками.
Установкой toolkit управляет параметр --install-nvidia-toolkit команды renet setup:
| Значение | Поведение |
|---|---|
auto | Toolkit устанавливается, если есть GPU NVIDIA. Это значение по умолчанию. |
true | Toolkit устанавливается в любом случае. |
false | Toolkit пропускается, спецификация NVIDIA не создаётся. |
Setup не настраивает никакой среды выполнения контейнеров, потому что допускается только runc. Toolkit нужен лишь для спецификации, которая пересоздаётся при каждом setup, чтобы следовать за сменой драйвера.
Два вида устройств предоставляет сам Rediacc, и им не нужны пользовательские компоненты производителя, потому что они лишь отображают файлы устройств:
| Вид | Устройства | Источник |
|---|---|---|
rediacc.io/dri | По одному на узел рендеринга, например rediacc.io/dri=renderD128 | /dev/dri/renderD<N> |
rediacc.io/amd | gpu<N> для одной карты AMD и all | /dev/kfd и узел рендеринга карты |
Устройства NVIDIA берутся из спецификации toolkit: nvidia.com/gpu=all и по одному имени на карту. Для вычислений на AMD нужен пользовательский слой ROCm в образе контейнера, так как setup ROCm не устанавливает.
Список GPU
rdc machine gpu list <machine>
rdc machine gpu list <machine> -o json
Таблица показывает каждый GPU с именем, версией драйвера и объёмом памяти, платформу (нативная или WSL), возраст инвентаря и каждое имя устройства CDI, которое можно выдать. -o json печатает инвентарь в том виде, в каком он записан на машине. Действующие разрешения читаются с машины в реальном времени.
Выдача и отзыв
rdc repo gpu grant <repo-ref> --device nvidia.com/gpu=all
rdc repo gpu revoke <repo-ref> --device nvidia.com/gpu=all
<repo-ref> это имя репозитория, при необходимости с машиной, например gpu-a@wsl-gpu. Обе команды можно повторять с разными значениями --device. После выдачи контейнер этого репозитория стартует с устройством:
docker run --rm --device nvidia.com/gpu=all ubuntu:24.04 nvidia-smi -L
Тот же контейнер в репозитории без разрешения отклоняется, и сообщение называет недостающее разрешение.
Эксклюзивные разрешения
rdc repo gpu grant <repo-ref> --device nvidia.com/gpu=0 --exclusive
Эксклюзивное разрешение закрепляет устройство за одним репозиторием. Оно отклоняется, если то же имя уже есть у другого репозитория, а пока оно действует, любая выдача этого имени другому репозиторию отклоняется. Проверка выполняется при выдаче, под блокировкой на все разрешения машины.
Эксклюзивное разрешение это резервирование, а не планировщик. Два контейнера одного разрешённого репозитория по-прежнему делят карту.
Отклоняемые варианты записи
Любой другой путь к GPU остаётся закрытым, с разрешением или без него. Форма CDI заменяет каждый из них.
| Отклоняется | Вместо этого |
|---|---|
docker run --gpus all | docker run --device nvidia.com/gpu=all |
runtime: nvidia в Compose | devices: [nvidia.com/gpu=all] |
deploy.resources.reservations.devices в Compose | devices: [nvidia.com/gpu=all] |
gpus: all в Compose | devices: [nvidia.com/gpu=all] |
Сырые устройства /dev/dri или /dev/kfd, либо bind в /dev | rediacc.io/dri=renderD128 или rediacc.io/amd=gpu0 |
| Правила cgroup для устройств | Разрешение CDI на устройство |
Сервис Compose с выданным устройством выглядит так:
services:
inference:
image: ubuntu:24.04
command: nvidia-smi -L
devices:
- nvidia.com/gpu=all
Добавление группы вроде video или render через group_add принимается, но ничего не даёт, так как группа не открывает доступ к устройству, которое репозиторию не выдавали.
WSL
В WSL2 драйвер Windows предоставляет GPU через /dev/dxg и библиотеки в /usr/lib/wsl/lib. Машина сообщает платформу wsl, а setup создаёт спецификацию NVIDIA в формате WSL:
nvidia-ctk cdi generate --mode=wsl --output=/etc/cdi/nvidia.yaml
Драйвер находится на стороне Windows, поэтому его обновление подхватывается при следующем запуске rdc machine setup. Команды выдачи, списка и отзыва работают так же, как на нативной машине.
Нативный NVIDIA
На нативной машине NVIDIA служба nvidia-cdi-refresh из toolkit пересоздаёт спецификацию после установки, смены драйвера и загрузки. Setup направляет её в /etc/cdi/nvidia.yaml, единственный каталог спецификаций, который читает демон Docker репозитория. Если запущен nvidia-persistenced, его сокет делается видимым для демонов репозиториев, потому что спецификация монтирует его в контейнеры.