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

Как использовать графический процессор NVIDIA с контейнерами Docker


Контейнеры Docker не видят GPU вашей системы автоматически. Это приводит к снижению производительности в рабочих нагрузках, зависящих от графического процессора, таких как платформы машинного обучения. Вот как предоставить доступ к графическому процессору NVIDIA вашего хоста вашим контейнерам.

Как заставить GPU работать в Docker

Контейнеры Docker используют ядро вашего хоста, но имеют собственную операционную систему и пакеты программного обеспечения. Это означает, что в них отсутствуют драйверы NVIDIA, используемые для взаимодействия с вашим графическим процессором. Docker по умолчанию даже не добавляет графические процессоры в контейнеры, поэтому простой docker run вообще не увидит ваше оборудование.

На высоком уровне заставить ваш GPU работать — это двухэтапная процедура: установите драйверы в вашем образе, а затем проинструктируйте Docker добавить устройства GPU в ваши контейнеры во время выполнения.

Это руководство посвящено современным версиям CUDA и Docker. Последний выпуск NVIDIA Container Toolkit предназначен для комбинаций CUDA 10 и Docker Engine 19.03 и более поздних версий. Для старых сборок CUDA, Docker и драйверов NVIDIA могут потребоваться дополнительные действия.

Добавление драйверов NVIDIA

Убедитесь, что драйверы NVIDIA правильно работают на вашем хосте, прежде чем продолжить настройку Docker. Вы сможете успешно запустить nvidia-smi и увидеть имя своего графического процессора, версию драйвера и версию CUDA.

Чтобы использовать GPU с Docker, начните с добавления NVIDIA Container Toolkit на хост. Это интегрируется в Docker Engine для автоматической настройки ваших контейнеров для поддержки GPU.

Добавьте репозиторий пакетов инструментария в свою систему, используя пример команды:

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

Затем установите пакет nvidia-docker2 на свой хост:

apt-get update
apt-get install -y nvidia-docker2

Перезапустите демон Docker, чтобы завершить установку:

sudo systemctl restart docker

Теперь Container Toolkit должен работать. Вы готовы запустить тестовый контейнер.

Запуск контейнера с доступом к GPU

Поскольку Docker по умолчанию не предоставляет графические процессоры вашей системы, вам необходимо создать контейнеры с флагом --gpus, чтобы ваше оборудование отображалось. Вы можете либо указать определенные устройства для включения, либо использовать ключевое слово all.

Образы nvidia/cuda предварительно настроены с помощью двоичных файлов CUDA и инструментов GPU. Запустите контейнер и выполните команду nvidia-smi, чтобы проверить доступность вашего графического процессора. Вывод должен соответствовать тому, что вы видели при использовании nvidia-smi на своем хосте. Версия CUDA может отличаться в зависимости от версий инструментария на вашем хосте и в выбранном образе контейнера.

docker run -it --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi

Выбор базового изображения

Использование одного из тегов nvidia/cuda — это самый быстрый и простой способ запустить рабочую нагрузку графического процессора в Docker. Доступно множество различных вариантов; они предоставляют матрицу операционной системы, версии CUDA и вариантов программного обеспечения NVIDIA. Образы создаются для нескольких архитектур.

Каждый тег имеет следующий формат:

11.4.0-base-ubuntu20.04

  • 11.4.0 — версия CUDA.
  • base – вид изображения.
  • ubuntu20.04 — версия операционной системы.

Доступны три различных варианта изображения. Образ base — это минимальный вариант с необходимыми двоичными файлами среды выполнения CUDA. среда выполнения — это более полнофункциональный вариант, включающий математические библиотеки CUDA и NCCL для взаимодействия между графическими процессорами. Третий вариант — devel, который предоставляет вам все, от runtime, а также заголовки и инструменты разработки для создания пользовательских образов CUDA.

Если вам подойдет один из образов, постарайтесь использовать его в качестве основы в своем Dockerfile. Затем вы можете использовать обычные инструкции Dockerfile для установки языков программирования, копирования исходного кода и настройки приложения. Это устраняет сложность шагов ручной настройки графического процессора.

FROM nvidia/cuda:11.4.0-base-ubuntu20.04
RUN apt update
RUN apt-get install -y python3 python3-pip
RUN pip install tensorflow-gpu

COPY tensor-code.py .
ENTRYPONT ["python3", "tensor-code.py"]

Сборка и запуск этого образа с флагом --gpus запустит вашу рабочую нагрузку Tensor с ускорением графического процессора.

Ручная настройка образа

Вы можете вручную добавить поддержку CUDA в свой образ, если вам нужно выбрать другую базу. Лучший способ добиться этого — обратиться к официальным файлам NVIDIA Dockerfiles.

Скопируйте инструкции, используемые для добавления репозитория пакетов CUDA, установите библиотеку и свяжите ее со своим путем. Мы не воспроизводим все шаги в этом руководстве, поскольку они зависят от версии CUDA и операционной системы.

Обратите внимание на переменные среды в конце файла Dockerfile — они определяют, как контейнеры, использующие ваш образ, интегрируются со средой выполнения контейнеров NVIDIA:

ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility

Ваше изображение должно обнаружить ваш графический процессор после установки CUDA и установки переменных среды. Это дает вам больший контроль над содержимым вашего изображения, но оставляет вас обязанным корректировать инструкции по мере выпуска новых версий CUDA.

Как это работает?

NVIDIA Container Toolkit — это набор пакетов, которые объединяют среды выполнения контейнеров, такие как Docker, с интерфейсом для драйвера NVIDIA на хосте. Библиотека libnvidia-container отвечает за предоставление API и интерфейса командной строки, которые автоматически предоставляют графические процессоры вашей системы контейнерам через среду выполнения.

Компонент nvidia-container-toolkit реализует хук prestart во время выполнения контейнера. Это означает, что он уведомляется, когда новый контейнер вот-вот запустится. Он просматривает графические процессоры, которые вы хотите подключить, и вызывает libnvidia-container для обработки создания контейнера.

Хук активируется nvidia-container-runtime. Это оборачивает вашу «настоящую» среду выполнения контейнера, такую как containerd или runc, чтобы обеспечить запуск хука NVIDIA prestart. Ваша существующая среда выполнения продолжает процесс запуска контейнера после выполнения хука. Когда контейнерный инструментарий будет установлен, вы увидите среду выполнения NVIDIA, выбранную в файле конфигурации демона Docker.

Краткое содержание

Для использования графического процессора NVIDIA внутри контейнера Docker необходимо добавить на хост NVIDIA Container Toolkit. Это интегрирует драйверы NVIDIA со средой выполнения вашего контейнера.

Вызов docker run с флагом --gpu делает ваше оборудование видимым для контейнера. Это должно быть установлено для каждого контейнера, который вы запускаете, после установки Container Toolkit.

NVIDIA предоставляет предварительно настроенные образы CUDA Docker, которые вы можете использовать в качестве быстрого старта для своего приложения. Если вам нужно что-то более конкретное, обратитесь к официальным файлам Docker, чтобы собрать свой собственный файл, совместимый с Container Toolkit.