Найти тему
Машинное обучение

Docker Swarm и GPU

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

1. Как включить доступ к графическому процессору в сервисе docker swarm? (поскольку вы не можете использовать --gpus, как в docker run)

2. Как передать аргумент размера shm при создании службы docker swarm?

Что такое Docker Swarm?

Если вы хотите масштабировать приложение в облаке или локально, то одним из способов сделать это является создание образа докера вашего приложения и его настройка с помощью инструмента оркестровки. Вы наверняка слышали о Kubernetes, верно? Ну, Docker Swarm — это другое. Docker swarm — это инструмент настройкой контейнеров с архитектурой master-worker.

Как видите, Docker Swarm, также называемый кластером, состоит из 4 узлов. Главный узел называется Swarm manager а остальные — workers (рабочими). Взаимодействовать и запускать команды с кластером можно через менеджер .

Я рекомендую просмотреть документацию для получения дополнительной информации, если вы новичок в этом. Давайте быстро перейдем к нашей основной цели этой статьи. Сначала мы возьмем образ докера сервера Triton из каталога Nvidia NGC и модель машинного обучения из их репозитория Github. Позже мы развернем сервер в Docker Swarm . В настоящее время у меня есть одна машина, поэтому я не смогу показать вам настройку с несколькими узлами, но добавление нового узла — это всего лишь однострочная команда.

Конфигурация для настройки графического процессора для Docker Swarm

[Linux-based OS (Ubuntu 20.04 in my case) and Nvidia GPUs (gtx 1660ti, driver version 510.47)]

$ nvidia-smi -a | grep UUID
-2

Обновите файл /etc/docker/daemon.json до этого и включите uuid вашего графического процессора:

{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime":"nvidia",
"node-generic-resources": [
"NVIDIA-GPU=GPU-4b0429cc"
]}

Затем раскомментируйте вторую строку в /etc/nvidia-container-runtime/config.toml, чтобы ваш файл выглядел так:

disable-require = false
swarm-resource = "DOCKER_RESOURCE_GPU"
#accept-nvidia-visible-devices-envvar-when-unprivileged = true
#accept-nvidia-visible-devices-as-volume-mounts = false[nvidia-container-cli]
#root = "/run/nvidia/driver"
#path = "/usr/bin/nvidia-container-cli"
environment = []
#debug = "/var/log/nvidia-container-toolkit.log"
#ldcache = "/etc/ld.so.cache"
load-kmods = true
#no-cgroups = false
#user = "root:video"
ldconfig = "@/sbin/ldconfig.real"[nvidia-container-runtime]
#debug = "/var/log/nvidia-container-runtime.log"

Перезапустите docker service:

$ sudo systemctl restart docker.service

Извлеките образ сервера Triton Inference из каталога Nvidia NGC и создайте каталог модели для сервера. (Сервер Triton Inference — это всего лишь пример приложения, которое можно организовать на docker swarm/k8s, использующем GPU.)

Создайте Docker Raw:

$ sudo docker swarm init --advertise-addr <ip-of-any-network-interface>

Эта команда инициализирует кластер докеров с этой машиной в качестве менеджера .

Примечание: вы можете использовать команду ifconfig, чтобы узнать IP для разных сетевых интерфейсов.

-3

Запустите службу с доступом к графическому процессору.

Для доступа к GPU используется аргумент --generic-resource "NVIDIA-GPU=0" , а для размера shm --mount type=tmpfs,target=/dev/shm .

-4

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

Ссылки:

https://gist.github.com/tomlankhorst/33da3c4b9edbde5c83fc1244f010815c

https://github.com/triton-inference-server/server

https://docs.docker.com/engine/swarm/