Використовуєте GPU з контейнера docker?


164

Я шукаю спосіб використання GPU зсередини докерного контейнера.

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

Якісь поради?

З попередніх досліджень я зрозумів, що run -vта / або LXC cgroup- це шлях, але я не впевнений, як саме це зняти


Дивіться stackoverflow.com/questions/17792161/…, що схоже на ваші потреби.
Nicolas Goy

1
@NicolasGoy Посилання було гарним, але не таким корисним, оскільки я не можу використовувати пільги з міркувань безпеки. Lxc-cgroups був хорошим покажчиком, але недостатньо. Я знайшов спосіб, і я сам відповім, коли все буде відшліфовано.
Реган

Відповіді:


132

Відповідь Регана чудова, але вона трохи застаріла, оскільки правильний спосіб зробити це - уникнути контексту виконання lxc, оскільки Докер викинув LXC як контекст виконання за замовчуванням на докер 0,9.

Натомість краще розповісти docker про nvidia-пристрої через прапор --device, а просто використовувати нативний контекст виконання, а не lxc.

Середовище

Ці інструкції були протестовані на наступних умовах:

  • Ubuntu 14.04
  • CUDA 6.5
  • Примірник GPU AWS.

Встановіть драйвер nvidia та cuda на свій хост

Див. Розділ CUDA 6.5 на екземплярі графічного процесора AWS під керуванням 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

Я створив зображення докера, на якому попередньо встановлені драйвери 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/

Побудова зразка пристрою

$ 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
Чому ви встановлюєте lxc-docker, якщо тоді вам не потрібен lxc?
MP0

4
У мене є CUDA 5.5 на хості та CUDA 6.5 в контейнері, створеному з вашого зображення. CUDA працює над хостом, і я передав пристрої в контейнер. Контейнер бачить графічні процесори наскрізь, ls -la /dev | grep nvidiaале CUDA не може знайти жодного пристрою, що підтримує CUDA: ./deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) cudaGetDeviceCount returned 38 -> no CUDA-capable device is detected Result = FAIL Це через невідповідність ліній CUDA на хості та контейнері?
брунетто

1
Я не знаю, ви можете запитати на форумах nvidia. Якщо припустити, що невідповідність версії є проблемою, ви можете взяти цей Dockerfile і відредагувати його, щоб мати драйвери CUDA 5.5, а потім відновити новий образ докера та використовувати його.
tleyden

3
Чи можете ви пояснити, чому для зображення потрібно встановити драйвер nvidia? Я вважав, що достатньо лише встановити драйвер nvidia (і використовувати --device ...)?
Хелін Ван

2
В даний час немає можливості зробити це, якщо у вас хост Windows.
Souradeep Nanda

46

Написання оновленої відповіді, оскільки більшість із вже наявних відповідей застаріли.

Версії раніше, ніж 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

Запуск докера з підтримкою GPU

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

Зверніть увагу, прапор --gpus allвикористовується для призначення всіх доступних gpus контейнеру докера.

Призначити конкретний gpu контейнеру докера (якщо на вашому пристрої доступно декілька графічних процесорів)

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

Або

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

5
Станом на 2019 рік, це правильний спосіб використання GPU зсередини докерних контейнерів.
Тимур Бакієв

1
Хто-небудь коли-небудь пробував це з роботи в Batch на AWS?
medley56

1
Я вважаю, що це найбільш актуально. Бажаю, що я його знайшов раніше, хоча мені довелося адаптувати інструкції від github.com/NVIDIA/nvidia-docker для роботи з Ubuntu 20.04
VictorLegros

40

Гаразд, я нарешті зумів це зробити, не використовуючи привілейований режим.

Я працюю на сервері ubuntu 14.04 і використовую останню версію cuda (6.0.37 для Linux 13.04 64 біт).


Підготовка

Встановіть драйвер nvidia та cuda на свій хост. (це може бути трохи хитро, тому я запропоную вам дотримуватися цього посібника /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )

УВАГА: Дійсно важливо зберігати файли, які використовувались для установки ходу cuda


Запустіть Docker Daemon для запуску за допомогою lxc

Нам потрібно запустити демон-докер за допомогою драйвера 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

Рядок Driver Execution повинен виглядати так:

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, який дозволяє нам дозволити нашому контейнеру отримати доступ до цих пристроїв. Варіант такий: (я рекомендую використовувати * для другорядного числа, оскільки це зменшить довжину команди запуску)

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

Тож якщо я хочу запустити контейнер (припустимо, ваше ім'я зображення - куда).

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

Чи можете ви поділитися контейнером?
ChillarAnand

1
У Docker є --deviceможливість дозволити контейнеру отримати доступ до пристрою хоста. Однак я намагався використовувати, --device=/dev/nvidia0щоб докер-контейнер міг запускати cuda та не вдався.
shiquanwang

4
Я тоді вдалося з оголюючи все /dev/nvidiao, /dev/nvidia1, /dev/nvidiactlі /dev/nvidia-uvmз --device. Хоча не знаю, чому.
shiquanwang

Параметр --device не був реалізований, коли мені довелося знайти це рішення. Вам потрібно щонайменше nvidia0 або nvidia1 (графічна карта) та nvidiactl (загальний пристрій nvidia) та nvidia-uvm (об'єднана пам'ять пристрою).
Реган

2
Дякуємо за підказки щодо /dev/nvidia*@Regan. Для @ChillarAnand я зробив Cuda-докер
shiquanwang

29

Ми щойно випустили експериментальний репозиторій GitHub, який повинен полегшити процес використання NVIDIA GPU у контейнерах Docker.


4
Чи є підтримка windows? Здається, це не так, але, мабуть, мені щось не вистачає.
Блейз

6
Немає підтримки Windows. Запуск контейнера CUDA вимагає драйверів Nvidia для Linux та доступу до пристроїв Linux, що представляють GPU, наприклад / dev / nvidia0. Ці пристрої та драйвери недоступні, коли Docker встановлений у Windows та працює всередині віртуальної машини VirtualBox.
Paweł Bylica

Ще потрібні декларації пристрою в команді run? Я створив контейнер з nvidia / cuda, і контейнер працює нормально, але додаток (Wowza) не розпізнає графічні процесори, в той час як він відмінно працює при запуску безпосередньо на хості (цей хост, тому я знаю, що драйвери прекрасно) . Я бігаю 361.28. Хост EC2 використовує NVidia AMI на g2.8xlarge.
rainabba

Про все не піклується nvidia-docker, ви маєте змогу запустити nvidia-smi всередині контейнера і переглянути свої пристрої
3XX0

22

Нещодавні вдосконалення 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

Докладніші відомості див. У контейнері Docker Container з підтримкою GPU та: https://github.com/NVIDIA/nvidia-docker


Це добре працює, як тільки ви виконаєте всі кроки. Nvidia не надає все це в одному місці, але цей приклад дає все необхідне, щоб він працював із загальним випадком використання.
KobeJohn

@KobeJohn - Я просто дотримувався інструкцій із встановлення, як користуватися командним рядком і переконайтесь, що мої контейнери успадковують від cuda. Це просто працює для мене.
Метт

1
Насправді, чи можете ви дати реальні сценарії, коли використання nvidia-docker має сенс?
Suncatcher

@Suncatcher - я використовую його в кластері, який вимагає доступу до GPU для 3D-рендерінгу. Докеризація додатків спростила розгортання та обслуговування.
Метт

17

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

Докерфайл

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


3
Я отримую наступний вихід. cudaGetDeviceCount повернуто 38 -> не виявлено жодного пристрою, здатного на підтримку CUDA Результат = FAIL
Soichi Hayashi

Пізня відповідь, але це означає, що ви, мабуть, не маєте GPU на цій машині
Джонатан

Чи буде версія Cuda-9 майже такою ж, як ця?
huseyin tugrul buyukisik

@huseyintugrulbuyukisik дивіться цю відповідь на askubuntu askubuntu.com/questions/967332/… , я б сказав, що ви можете використовувати цю відповідь як керівництво, але я не працював із cuda 9, щоб підтвердити, що будуть застосовані ті самі кроки
Джонатан

Не роби це так. Це старий шлях. Використовуйте новий спосіб. Дивіться посилання на мою відповідь. Цей метод загрожує проблемами.
Метт

3

Щоб використовувати GPU з контейнера 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

1

Використовуйте x11docker від mviereck:

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

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

Прискорення обладнання для OpenGL можливе з опцією -g, --gpu.

У більшості випадків це спрацює з вікнами з відкритим кодом. В іншому випадку подивіться на wiki: функціональні залежності. Драйвери NVIDIA із закритим джерелом потребують певної настройки та підтримки менших параметрів сервера x11docker X.

Цей сценарій дійсно зручний, оскільки він обробляє всю конфігурацію та налаштування. Запустити зображення докера на X з gpu так само просто

x11docker --gpu imagename
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.