NVIDIA Container: мост между GPU и контейнерами в Windows
NVIDIA Container — это набор инструментов (в первую очередь NVIDIA Container Toolkit), который позволяет контейнерным приложениям напрямую использовать мощности видеокарт NVIDIA. В среде Windows он выступает связующим звеном между драйверами хост-системы и изолированной средой Docker, обеспечивая доступ к CUDA-ядрам без необходимости установки тяжелого программного обеспечения внутрь каждого контейнера. Это критически важно для разработчиков, работающих с машинным обучением, рендерингом или обработкой видео на локальных машинах.
Оглавление
Зачем нужен NVIDIA Container на Windows
Без специализированного рантайма контейнеры работают в изоляции от аппаратного обеспечения хоста. Они не «видят» видеокарту, так как не имеют доступа к драйверам ядра Linux или Windows. NVIDIA Container решает эту проблему, предоставляя механизм проброса устройств и библиотек.
Ключевые преимущества использования этого инструмента:
- Доступ к CUDA и Tensor Cores: Приложения внутри контейнера могут выполнять вычисления на GPU так же быстро, как если бы они были запущены нативно.
- Чистота окружения: Вам не нужно устанавливать CUDA Toolkit, cuDNN и другие зависимости на основную систему Windows. Все библиотеки живут внутри образа контейнера.
- Портативность: Настроенный один раз пайплайн легко переносится на другие машины или в облако (Kubernetes), где также поддерживается NVIDIA runtime.
- Автоматическое определение ресурсов: Инструментарий сам определяет доступные GPU, их возможности и необходимые версии драйверов, минимизируя ручную конфигурацию.
Архитектура работы: роль WSL 2
Важно понимать, что Docker Desktop на Windows не запускает Linux-контейнеры напрямую в ядре Windows NT. Он использует подсистему WSL 2 (Windows Subsystem for Linux). Именно здесь возникает нюанс с поддержкой GPU.
NVIDIA реализовала поддержку графики в WSL 2 через специальную прослойку. Драйверы NVIDIA, установленные в Windows, автоматически становятся доступны внутри дистрибутива Linux в WSL 2. NVIDIA Container Toolkit, установленный внутри этого Linux-окружения, использует этот доступ для проброса устройств в Docker-контейнеры.
Таким образом, цепочка выглядит так:
Приложение в Docker -> NVIDIA Container Runtime -> WSL 2 (Linux) -> Драйверы NVIDIA в Windows -> Физическая видеокарта.
Пошаговая настройка окружения
Для корректной работы вам потребуется Windows 10/11 с обновленным WSL 2 и Docker Desktop.
Шаг 1. Подготовка драйверов в Windows
Убедитесь, что на вашей основной системе установлены актуальные драйверы NVIDIA Game Ready или Studio Driver. Специально устанавливать CUDA Toolkit в Windows не обязательно, если вы планируете запускать всё внутри контейнеров, но наличие свежих драйверов критично.
Шаг 2. Настройка WSL 2
Откройте PowerShell от имени администратора и убедитесь, что WSL 2 активен и обновлен:
wsl --update
wsl --set-default-version 2
Перезагрузите компьютер, если обновления затронули ядро WSL.
Шаг 3. Установка NVIDIA Container Toolkit внутри WSL
Запустите ваш дистрибутив Linux (например, Ubuntu) через WSL. Выполните установку toolkit согласно инструкции для вашего дистрибутива. Для Ubuntu это обычно выглядит так:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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#https://#https://raw.githubusercontent.com/#' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
После установки необходимо перезапустить службу Docker внутри WSL:
sudo systemctl restart docker
Шаг 4. Настройка Docker Desktop
В интерфейсе Docker Desktop убедитесь, что в настройках (Settings -> Resources -> WSL Integration) включена интеграция с вашим дистрибутивом Linux. Docker должен автоматически подхватить возможность работы с GPU, если toolkit установлен корректно.
Проверка работоспособности
Самый быстрый способ убедиться, что всё работает — запустить тестовый образ от NVIDIA. Откройте терминал WSL или PowerShell и выполните:
docker run --rm --gpus all nvidia/cuda:12.0-base nvidia-smi
Если настройка прошла успешно, вы увидите таблицу с информацией о вашей видеокарте, версии драйвера и использовании памяти прямо в выводе команды внутри контейнера.
Если команда nvidia-smi внутри контейнера возвращает ошибку или не видит GPU, проверьте, что вы используете флаг --gpus all (или --gpus '"device=0"' для конкретной карты). Без этого флага Docker запускает контейнер в стандартном режиме без доступа к аппаратному ускорению.
Частые ошибки при настройке
| Ошибка | Причина | Решение |
|---|---|---|
could not select device driver "" with capabilities: [[gpu]] | Не установлен или не настроен NVIDIA Container Toolkit в WSL. | Переустановите toolkit внутри Linux-дистрибутива и перезапустите Docker. |
NVML: Driver/Library version mismatch | Версия драйвера в Windows слишком старая для версии библиотек в контейнере. | Обновите драйверы NVIDIA в Windows до последней версии. |
| Docker не видит GPU | Отключена интеграция WSL в Docker Desktop. | Проверьте Settings -> Resources -> WSL Integration в Docker Desktop. |
| Ошибки прав доступа | Контейнер запускается от root, но нет прав на устройства. | Используйте флаг --user или настройте права в Dockerfile. |
FAQ
Нужно ли устанавливать CUDA Toolkit в Windows? Нет, для запуска контейнеров достаточно обычных графических драйверов NVIDIA. Весь софт для вычислений (CUDA, cuDNN) находится внутри Docker-образа.
Работает ли это без WSL 2? Нет. Нативная поддержка GPU для Linux-контейнеров в Docker Desktop на Windows реализована исключительно через бэкенд WSL 2. Старый бэкенд Hyper-V не поддерживает проброс GPU таким образом.
Можно ли использовать несколько видеокарт?
Да. NVIDIA Container Toolkit поддерживает мульти-GPU конфигурации. Вы можете указать конкретные устройства через параметр --gpus '"device=0,1"' или отдать все доступные ресурсы флагом all.
Где брать готовые образы?
Рекомендуется использовать официальные образы из NGC Catalog или верифицированные образы nvidia/cuda на Docker Hub. Они уже содержат оптимизированные библиотеки и драйверы совместимости.