Использование GPU из контейнера docker?
Я ищу способ использовать GPU изнутри контейнера docker.
контейнер будет выполнить произвольный код, поэтому я не хочу использовать привилегированный режим.
какие-либо советы?
из предыдущих исследований я понял, что run -v и / или LXC cgroup был способ пойти, но я не уверен, как именно это сделать
6 ответов:
ответ Регана велик, но он немного устарел, так как правильный способ сделать это-избежать контекста выполнения lxc, поскольку Docker имеет dropped LXC как контекст выполнения по умолчанию с docker 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
это должно быть запущено изнутри контейнера 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
Ок, я, наконец, удалось сделать это без использования --привилегированный режим.
Я работаю на 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если результат пуст, используйте запуск одного из образцов на хосте должен сделать трюк. Результат должно выглядеть так
Как вы можете видеть, существует набор из 2 чисел между группой и датой. Эти 2 числа называются большими и малыми числами (записываются в таком порядке) и проектируют устройство. Мы просто будем использовать основные номера для удобства.
почему мы активировали драйвер lxc? Чтобы использовать опцию lxc conf, которая позволяет нам разрешить нашему контейнеру доступ к этим устройствам. Опция: (я рекомендую использовать * для незначительного числа, потому что это уменьшает длину команды run)
--lxc-conf= ' lxc.контрольной группе.устройства.разрешить = с [большим количеством]:[дополнительный номер или *] РВМ'
поэтому, если я хочу запустить контейнер (предположим, что ваше имя изображения-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
установить докер https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
построить следующее изображение, которое включает в себя драйверы Nvidia и технологии CUDA инструментарий
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
- запустить свой контейнер
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 прямо сейчас.
Это здорово, потому что теперь контейнеры многое другое портативный.
быстрый тест на 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 контейнер, вместо того чтобы использовать собственные настройки в видеокартах NVIDIA-докер. Для установки 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
Как вы можете видеть, существует набор из 2 чисел между группой и датой.
Эти 2 числа называются большими и малыми числами (записываются в таком порядке) и проектируют устройство.
Мы просто будем использовать основные номера для удобства.
Comments