Поиск по сайту:

Как запускать контейнеры 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.




Все права защищены. © Linux-Console.net • 2019-2024