¿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
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
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í 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
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.
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
Instalar docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
-
Construya la siguiente imagen que incluye los controladores nvidia y el kit de herramientas 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
- 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
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.
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
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
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