Использование 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
Если результат пуст, использование запуска одного из образцов на хосте должно сделать трюк.
Результат должен выглядеть так:
Как видите, между группой и датой существует набор из двух чисел.
Эти 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
- Запустите контейнер
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