Использование GPU из контейнера докеров?

Я ищу способ использования GPU из контейнера докеров.

Контейнер выполнит произвольный код, поэтому я не хочу использовать привилегированный режим.

Какие-нибудь советы?

Из предыдущего исследования я понял, что run -v и/или LXC cgroup - это путь, но я не уверен, как точно это сделать

Ответ 1

Ok, наконец, удалось сделать это, не используя режим --privileged.

Я запускаюсь на сервере ubuntu 14.04, и я использую последнюю версию cuda (6.0.37 для linux 13.04 64 бит).


Подготовка

Установите драйвер nvidia и cuda на свой хост. (это может быть немного сложно, поэтому я предлагаю вам следовать этому руководству https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04)

ВНИМАНИЕ: Очень важно, чтобы вы сохраняли файлы, которые вы использовали для установки хоста cuda


Получить Docker Daemon для запуска с использованием lxc

Нам нужно запустить демон docker с помощью драйвера lxc, чтобы иметь возможность изменять конфигурацию и предоставлять контейнеру доступ к устройству.

Однократное использование:

sudo service docker stop
sudo docker -d -e lxc

Постоянная конфигурация Измените файл конфигурации докеры, расположенный в /etc/default/docker Измените строку DOCKER_OPTS, добавив '-e lxc' Вот моя строка после модификации

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"

Затем перезапустите демон с помощью

sudo service docker restart

Как проверить, действительно ли демон использует драйвер lxc?

docker info

Строка драйвера выполнения должна выглядеть так:

Execution Driver: lxc-1.0.5

Создайте изображение с помощью драйвера NVIDIA и CUDA.

Вот базовый файл Docker для создания совместимого с CUDA изображения.

FROM ubuntu:14.04
MAINTAINER Regan <http://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container>

RUN apt-get update && apt-get install -y build-essential
RUN apt-get --purge remove -y nvidia*

ADD ./Downloads/nvidia_installers /tmp/nvidia                             > Get the install files you used to install CUDA and the NVIDIA drivers on your host
RUN /tmp/nvidia/NVIDIA-Linux-x86_64-331.62.run -s -N --no-kernel-module   > Install the driver.
RUN rm -rf /tmp/selfgz7                                                   > For some reason the driver installer left temp files when used during a docker build (i don't have any explanation why) and the CUDA installer will fail if there still there so we delete them.
RUN /tmp/nvidia/cuda-linux64-rel-6.0.37-18176142.run -noprompt            > CUDA driver installer.
RUN /tmp/nvidia/cuda-samples-linux-6.0.37-18176142.run -noprompt -cudaprefix=/usr/local/cuda-6.0   > CUDA samples comment if you don't want them.
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64         > Add CUDA library into your PATH
RUN touch /etc/ld.so.conf.d/cuda.conf                                     > Update the ld.so.conf.d directory
RUN rm -rf /temp/*  > Delete installer files.

Запустите изображение.

Сначала вам нужно определить свой основной номер, связанный с вашим устройством. Самый простой способ - выполнить следующую команду:

ls -la /dev | grep nvidia

Если результат пуст, использование запуска одного из образцов на хосте должно сделать трюк. Результат должен выглядеть так: enter image description here Как видите, между группой и датой существует набор из двух чисел. Эти 2 числа называются основными и второстепенными номерами (написаны в этом порядке) и проектируют устройство. Мы просто используем основные номера для удобства.

Почему мы активировали драйвер lxc? Чтобы использовать параметр lxc conf, который позволяет нам разрешить нашему контейнеру обращаться к этим устройствам. Параметр: (я рекомендую использовать * для младшего номера, чтобы уменьшить длину команды запуска)

- lxc-conf = 'lxc.cgroup.devices.allow = c [основное число]: [младший номер или *] rwm'

Итак, если я хочу запустить контейнер (предположим, что ваше имя изображения является cuda).

docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda

Ответ 2

Ответ Regan замечательный, но он немного устарел, поскольку правильный способ сделать это - избежать контекста выполнения lxc, поскольку Docker имеет drop LXC в качестве контекста исполнения по умолчанию с докером 0.9.

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

Окружающая среда

Эти инструкции были протестированы в следующей среде:

  • Ubuntu 14.04
  • CUDA 6.5
  • Экземпляр AWS GPU.

Установите драйвер nvidia и cuda на хост

См. CUDA 6.5 на экземпляре AWS GPU, запускающем Ubuntu 14.04, чтобы настроить хост-компьютер.

Установить Docker

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update && sudo apt-get install lxc-docker

Найдите устройства nvidia

ls -la /dev | grep nvidia

crw-rw-rw-  1 root root    195,   0 Oct 25 19:37 nvidia0 
crw-rw-rw-  1 root root    195, 255 Oct 25 19:37 nvidiactl
crw-rw-rw-  1 root root    251,   0 Oct 25 19:37 nvidia-uvm

Запустить контейнер Docker с предустановленным драйвером nvidia

Я создал файл docker, в котором предварительно установлены драйверы cuda. dockerfile доступен на dockerhub, если вы хотите знать, как это изображение было построено.

Вы хотите настроить эту команду для соответствия вашим устройствам nvidia. Вот то, что сработало для меня:

 $ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash

Проверить правильность установки CUDA

Это должно запускаться из контейнера докера, который вы только что запустили.

Установите образцы CUDA:

$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/

Сборка образца deviceQuery:

$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery   

Если все сработало, вы должны увидеть следующий вывод:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS

Ответ 3

Мы только что выпустили экспериментальный репозиторий GitHub, который должен облегчить процесс использования графических процессоров NVIDIA внутри контейнеров Docker.

Ответ 4

Недавние усовершенствования NVIDIA создали гораздо более надежный способ сделать это.

По сути, они нашли способ избежать необходимости устанавливать драйвер CUDA/GPU внутри контейнеров и согласовать его с модулем ядра хоста.

Вместо этого драйверы находятся на хосте, и контейнеры им не нужны. Сейчас требуется модифицированный докер-кли.

Это здорово, потому что теперь контейнеры гораздо более портативны.

введите описание изображения здесь

Быстрый тест на Ubuntu:

# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb

# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda nvidia-smi

Подробнее см.: Контейнер Docker с поддержкой GPU и: https://github.com/NVIDIA/nvidia-docker

Ответ 5

Обновлено для cuda-8.0 на ubuntu 16.04

Dockerfile

FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <[email protected]>

# A docker container with the Nvidia kernel module and CUDA drivers installed

ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run

RUN apt-get update && apt-get install -q -y \
  wget \
  module-init-tools \
  build-essential 

RUN cd /opt && \
  wget $CUDA_RUN && \
  chmod +x cuda_8.0.44_linux-run && \
  mkdir nvidia_installers && \
  ./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \
  cd nvidia_installers && \
  ./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module

RUN cd /opt/nvidia_installers && \
  ./cuda-linux64-rel-8.0.44-21122537.run -noprompt

# Ensure the CUDA libs and binaries are in the correct environment variables
ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
ENV PATH=$PATH:/usr/local/cuda-8.0/bin

RUN cd /opt/nvidia_installers &&\
    ./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\
    cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\ 
    make

WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
  1. Запустите контейнер

sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery

Вы должны увидеть результат, похожий на:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS

Ответ 6

Чтобы использовать графический процессор из контейнера Docker, вместо использования родного Docker, используйте Nvidia-docker. Для установки докера Nvidia используйте следующие команды

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |  sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-
docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker
sudo pkill -SIGHUP dockerd # Restart Docker Engine
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container

Ответ 7

Используйте x11docker от mviereck:

https://github.com/mviereck/x11docker#hardware-acceleration говорит

Аппаратное ускорение

Аппаратное ускорение для OpenGL возможно с опцией -g, - -g pu.

Это будет работать из коробки в большинстве случаев с драйверами с открытым исходным кодом на хосте. В противном случае взгляните на вики: функциональные зависимости. Драйверы NVIDIA с закрытым исходным кодом нуждаются в некоторой настройке и поддерживают меньше возможностей X-сервера X11docker.

Этот скрипт действительно удобен, так как обрабатывает все настройки и настройки. Запуск образа докера на X с помощью gpu так же прост, как

x11docker --gpu imagename

Ответ 8

Написание обновленного ответа, поскольку большинство уже имеющихся ответов устарели.

Версии более ранние, чем Docker 19.03, требовали nvidia-docker2 и флага --runtime=nvidia.

Поскольку Docker 19.03, вам необходимо установить пакет nvidia-container-toolkit, а затем использовать флаг --gpus all.

Итак, вот основы,

Установка пакета

Установите пакет nvidia-container-toolkit согласно официальной документации на Github.

Для ОС на базе Redhat выполните следующий набор команд:

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

$ sudo yum install -y nvidia-container-toolkit
$ sudo systemctl restart docker

Для ОС на основе Debian выполните следующий набор команд:

# Add the package repositories
$ 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-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker

Запуск докера с поддержкой графического процессора

docker run --name my_all_gpu_container --gpus all -t nvidia/cuda

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

Чтобы назначить конкретный графический процессор док-контейнеру (если на вашем компьютере доступно несколько графических процессоров)

docker run --name my_first_gpu_container --gpus device=0 nvidia/cuda

Или

docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda