Как запускать контейнеры Docker Compose с доступом к графическому процессору
Доступ к графическому процессору в Docker позволяет помещать в контейнер ресурсоемкие рабочие нагрузки, такие как приложения машинного обучения. Графические процессоры не доступны автоматически при запуске нового контейнера, но их можно активировать с помощью флага --gpus
для docker run
или путем добавления дополнительных полей в файл docker-compose.yml
.
В этой статье мы покажем, как включить поддержку GPU в Docker Compose. Вам понадобится Docker Compose версии v1.28 или новее, чтобы следовать руководству. Графические процессоры не поддерживаются в Compose версии 1.18 и старше; выпуски между v1.19 и v1.27 используют устаревшую структуру полей, которая обеспечивает меньший контроль.
Подготовка вашей системы
Ваш хост Docker должен быть подготовлен, прежде чем он сможет предоставить доступ к оборудованию вашего графического процессора. Хотя контейнеры используют ядро вашего хоста, они не могут видеть установленные вами системные пакеты. В простом контейнере не будет драйверов устройств, которые взаимодействуют с вашим графическим процессором.
Вы можете активировать поддержку графических процессоров NVIDIA, установив NVIDIA Docker Container Toolkit:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt update sudo apt install -y nvidia-docker2 sudo systemctl restart docker
Этот пакет объединяет среду выполнения контейнера Docker с интерфейсом к драйверу NVIDIA вашего хоста. Проверка файла /etc/docker/daemon.json
подтвердит, что настроенная среда выполнения контейнера была изменена. Инструментарий NVIDIA будет обрабатывать внедрение подключений устройств GPU при запуске новых контейнеров. Затем он будет передан вашей обычной среде выполнения контейнера.
$ cat /etc/docker/daemon.json { "runtimes": { "nvidia": { "path": "nvidia-container-runtime", "runtimeArgs": [] } } }
Подготовка изображения
Доступ к графическому процессору в Docker также зависит от правильной настройки образа контейнера. Обычно проще всего создать образ на основе варианта nvidia/cuda
. Эта начальная точка, предоставленная NVIDIA, поставляется с предварительно настроенной поддержкой CUDA. Установите любые языки программирования, которые вам нужны, затем скопируйте код, зависящий от графического процессора:
FROM nvidia/cuda:11.4.0-base-ubuntu20.04 RUN apt update &&\ apt-get install -y python3 python3-pip &&\ pip install tensorflow-gpu COPY tensor.py . ENTRYPONT ["python3", "tensor.py"]
Вы должны использовать ту же версию CUDA, которая установлена на вашем хосте. Вы можете проверить это, запустив nvidia-smi
:
$ nvidia-smi Tue May 10 19:15:00 2022 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+ ...
Теперь вы можете написать файл Docker Compose, чтобы запустить контейнер с вложением графического процессора.
Доступ к графическим процессорам в Docker Compose
На графические процессоры ссылаются в файле docker-compose.yml
через поле deploy.resources.reservations.devices
в ваших службах, которым они нужны. Этот механизм позволяет вам идентифицировать графические процессоры, которые вы хотите подключить. Каждое выбранное устройство будет предоставлено вашим контейнерам.
Вот простой пример запуска контейнера с использованием образа nvidia/cuda
. Он будет выдавать информацию о вашем графическом процессоре при запуске контейнера.
services: app: image: nvidia/cuda:11.4.0-base-ubuntu20.04 command: nvidia-smi deploy: resources: reservations: devices: - driver: nvidia capabilities: [gpu]
Поле deploy.resources.reservations.devices
указывает устройства, которые может использовать ваш контейнер. Установка для драйвера
значения nvidia
и добавление возможности gpu
определяет устройство GPU.
Запустите docker-compose up
(или docker compose up
для Compose v2), чтобы запустить контейнер:
$ docker compose up
Creating network "scratch_default" with the default driver
Creating scratch_app_1 ... done
Attaching to scratch_app_1
app_1 | Tue May 10 14:21:14 2022
app_1 | +-----------------------------------------------------------------------------+
app_1 | | NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4 |
app_1 | |-------------------------------+----------------------+----------------------+
Контейнер должен успешно получить доступ к вашему графическому процессору. Версии драйвера и CUDA будут соответствовать установленным на вашем хосте.
Использование нескольких графических процессоров
Ваш контейнер получает доступ ко всем графическим процессорам в вашей системе, если не предоставлена дополнительная конфигурация. Существует два разных способа доступа к подмножеству ваших устройств GPU.
Доступ к фиксированному количеству устройств
Поле count
резервирует указанное количество устройств. В этом примере система с двумя графическими процессорами предоставит контейнеру один из них. Это произвольно, какой из них будет выбран.
services: app: image: nvidia/cuda:11.4.0-base-ubuntu20.04 command: nvidia-smi deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]
Доступ к определенным устройствам
Вы можете идентифицировать отдельные устройства в вашей системе, используя поле device_ids
. Это принимает массив идентификаторов устройств с индексом 0 для предоставления контейнеру. Вы можете найти эти идентификаторы, перечислив свои графические процессоры с помощью nvidia-smi
:
$ nvidia-smi --list-gpus
GPU 0: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-5ba4538b-234f-2c18-6a7a-458d0a7fb348)
GPU 1: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-d5ce9af3-710c-4222-95f8-271db933d438)
GPU 2: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-50d4eb4f-7b08-4f8f-8d20-27d797fb7f19)
GPU 3: NVIDIA GeForce GTX 1080 Ti (UUID: GPU-bed2d40a-c6e7-4547-8d7d-a1576c5247b2)
Для надежного доступа к последним двум устройствам в списке включите их идентификаторы устройств в конфигурацию службы:
services: app: image: nvidia/cuda:11.4.0-base-ubuntu20.04 command: nvidia-smi deploy: resources: reservations: devices: - driver: nvidia device_ids: ["2", "3"] capabilities: [gpu]
Вы можете использовать count
или device_id
в каждом из определений службы. Вы получите сообщение об ошибке при запуске docker-compose up
, если попытаетесь объединить оба, указать недопустимый идентификатор устройства или использовать значение count
, превышающее количество графических процессоров в вашей системе.
Краткое содержание
Современные выпуски Docker Compose поддерживают доступ к GPU через функцию резервирования устройств deploy.resources
. Вы по-прежнему несете ответственность за подготовку своей хост-среды и использование образа контейнера с поддержкой графического процессора. После того, как об этом позаботятся, запустить docker-compose up -d
будет проще, чем помнить о включении флага --gpus all
каждый раз, когда вы используете docker run
.
Вы можете зафиксировать файл docker-compose.yml
в системе управления версиями, чтобы каждый получил автоматический доступ к графическому процессору. Вы должны убедиться, что стандартизируете согласованные версии драйвера NVIDIA, поскольку версия, используемая вашим образом, должна совпадать с версией, установленной на ваших хостах. В будущем поддержка графического процессора Docker может работать и с устройствами Intel и AMD, но попытка использовать ее сегодня приведет к ошибке. NVIDIA — единственный производитель графических процессоров, поддерживаемый в настоящее время проектом Moby.