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

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

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

какие-либо советы?

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

6 ответов


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

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

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

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

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

установите драйвер 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. The файла Docker доступно на 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

это должно быть запущено изнутри контейнера docker, который вы просто запускаемый.

установить образцы 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

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

Я работаю на ubuntu server 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 с помощью lxc

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

одно использование времени :

sudo service docker stop
sudo docker -d -e lxc

постоянные конфигурации Измените файл конфигурации docker, расположенный в /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.

вот базовый файл Dockerfile для создания совместимого с 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 чисел. Эти 2 числа называются главными и второстепенными числами (написанными в этом порядке) и проектируют устройство. Мы просто используем основные номера для удобства.

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

--lxc-conf= ' lxc.контрольной группе.устройства.allow = c [major number]: [minor number or *] rwm'

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

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

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


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

Dockerfile

FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com>

# 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


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

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

вместо этого драйверы находятся на хосте, и контейнеры в них не нуждаются. Это требует модифицированного docker-cli прямо сейчас.

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

enter image description here

быстрый тест на 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

Подробнее см.: GPU-включен контейнер Docker и: https://github.com/NVIDIA/nvidia-docker


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

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