¿Usando GPU desde un contenedor docker?


Estoy buscando una forma de usar la GPU desde dentro de un contenedor docker.

El contenedor ejecutará código arbitrario, por lo que no quiero usar el modo privilegiado.

¿Algún consejo?

De investigaciones anteriores entendí que run -v y/o LXC cgroup era el camino a seguir, pero no estoy seguro de cómo lograrlo exactamente

 107
Author: Antoine, 2014-08-07

6 answers

La respuesta de Regan es genial, pero está un poco desactualizada, ya que la forma correcta de hacerlo es evitar el contexto de ejecución lxc, ya que Docker ha eliminado LXC como el contexto de ejecución predeterminado a partir de docker 0.9.

En su lugar, es mejor decirle a docker sobre los dispositivos nvidia a través del indicador device device, y simplemente usar el contexto de ejecución nativo en lugar de lxc.

Medio ambiente

Estas instrucciones se probaron en el siguiente entorno:

  • Ubuntu 14.04
  • CUDA 6.5
  • Instancia de GPU de AWS.

Instale el controlador nvidia y cuda en su host

Consulte CUDA 6.5 en una Instancia de GPU de AWS que ejecuta Ubuntu 14.04 para obtener la configuración de su máquina host.

Instalar 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

Encuentra tus dispositivos 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

Ejecute el contenedor Docker con el controlador nvidia preinstalado

He creado una imagen docker que tiene los controladores cuda preinstalados. El archivo dockerfile es disponible en dockerhub si quieres saber cómo se creó esta imagen.

Querrá personalizar este comando para que coincida con sus dispositivos nvidia. Esto es lo que funcionó para mí:

 $ 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

Verifique que CUDA esté correctamente instalado

Esto debe ejecutarse desde el interior del contenedor docker que acaba de lanzar.

Instalar muestras CUDA:

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

Construir deviceQuery muestra:

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

Si todo funcionó, debería ver la siguiente salida:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS
 110
Author: tleyden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-26 00:36:48

Ok finalmente logré hacerlo sin usar el modo privileged privileged.

Estoy corriendo en ubuntu server 14.04 y estoy usando la última cuda (6.0.37 para linux 13.04 64 bits).


Preparación

Instale el controlador nvidia y cuda en su host. (puede ser un poco complicado, así que le sugeriré que siga esta guía https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04 )

ATENCIÓN: Es realmente importante que conserva los archivos que utilizó para la instalación de host cuda


Consigue que el demonio Docker se ejecute usando lxc

Necesitamos ejecutar docker daemon usando el controlador lxc para poder modificar la configuración y darle al contenedor acceso al dispositivo.

Utilización única:

sudo service docker stop
sudo docker -d -e lxc

Configuración permanente Modifique el archivo de configuración de docker ubicado en/etc/default / docker Cambie la línea DOCKER_OPTS añadiendo '- e lxc' Aquí está mi línea después modificación

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

Luego reinicie el demonio usando

sudo service docker restart

¿Cómo comprobar si el demonio utiliza eficazmente el controlador lxc ?

docker info

La línea del Controlador de ejecución debería tener este aspecto:

Execution Driver: lxc-1.0.5

Construye tu imagen con el controlador NVIDIA y CUDA.

Aquí hay un Dockerfile básico para construir una imagen compatible con 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.

Ejecuta tu imagen.

Primero debe identificar su número principal asociado con su dispositivo. La forma más fácil es hacer el siguiente comando:

ls -la /dev | grep nvidia

Si el resultado está en blanco, utilice el lanzamiento de una de las muestras en el host debería hacer el truco. El resultado debería verse así introduzca la descripción de la imagen aquí Como puede ver, hay un conjunto de 2 números entre el grupo y la fecha. Estos 2 números se llaman números mayores y menores (escritos en ese orden) y diseñan un dispositivo. Usaremos los números principales para mayor comodidad.

¿Por qué activamos el controlador lxc? Para usar la opción lxc conf que permítanos permitir que nuestro contenedor acceda a esos dispositivos. La opción es: (recomiendo usar * para el número menor porque reduce la duración del comando run)

L lxc-conf='lxc.cgroup.dispositivo.allow =c [número mayor]: [número menor o *] rwm '

Así que si quiero lanzar un contenedor (Supongamos que su nombre de imagen es cuda).

docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda
 35
Author: Regan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 12:22:42

Acabamos de lanzar un repositorio experimental GitHub que debería facilitar el proceso de uso de GPU NVIDIA dentro de contenedores Docker.

 25
Author: 3XX0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-05 05:28:06

Actualizado para cuda-8.0 en 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. Ejecute su contenedor

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

Debería ver una salida similar a:

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

 16
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 12:05:08

Las recientes mejoras de NVIDIA han producido una forma mucho más robusta de hacer esto.

Esencialmente han encontrado una manera de evitar la necesidad de instalar el controlador CUDA/GPU dentro de los contenedores y hacer que coincida con el módulo del núcleo host.

En cambio, los controladores están en el host y los contenedores no los necesitan. Requiere una docker-cli modificada ahora mismo.

Esto es genial, porque ahora los contenedores son mucho más portátiles.

introduzca la descripción de la imagen aquí

Una prueba rápida en 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

Para más detalles ver: Contenedor acoplable habilitado para GPU y: https://github.com/NVIDIA/nvidia-docker

 12
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-16 00:08:15

Para usar GPU desde el contenedor docker, en lugar de usar Docker nativo, use Nvidia-docker. Para instalar Nvidia docker utilice los siguientes comandos

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
 0
Author: Patel Sunil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-18 04:58:42