Estoy buscando una manera de usar la GPU desde el interior de un contenedor acoplable.
El contenedor ejecutará código arbitrario, así que no quiero usar el modo privilegiado.
¿Algun 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
Respuestas:
La respuesta de Regan es excelente, 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 contexto de ejecución predeterminado a partir de docker 0.9.
En cambio, es mejor decirle a Docker sobre los dispositivos nvidia a través del indicador --device, y simplemente usar el contexto de ejecución nativo en lugar de lxc.
Ambiente
Estas instrucciones se probaron en el siguiente entorno:
Instale el controlador nvidia y cuda en su host
Consulte CUDA 6.5 en la instancia de GPU de AWS que ejecuta Ubuntu 14.04 para obtener la configuración de su máquina host.
Instalar Docker
Encuentra tus dispositivos nvidia
Ejecute el contenedor Docker con el controlador nvidia preinstalado
He creado una imagen de Docker que tiene los controladores de Cuda preinstalados. El dockerfile está disponible en dockerhub si desea saber cómo se construyó esta imagen.
Querrá personalizar este comando para que coincida con sus dispositivos nvidia. Esto es lo que funcionó para mí:
Verifique que CUDA esté instalado correctamente
Esto debe ejecutarse desde el interior del contenedor acoplable que acaba de iniciar.
Instalar muestras de CUDA:
Construir dispositivo Ejemplo de consulta:
Si todo funcionó, debería ver el siguiente resultado:
fuente
ls -la /dev | grep nvidia
pero CUDA no puede encontrar ningún dispositivo compatible con CUDA:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
¿se debe a la falta de coincidencia de las bibliotecas CUDA en el host y en el contenedor?Escribir una respuesta actualizada ya que la mayoría de las respuestas ya presentes son obsoletas a partir de ahora.
Versiones anteriores a las que
Docker 19.03
solía requerirnvidia-docker2
y la--runtime=nvidia
bandera.Desde entonces
Docker 19.03
, debe instalar elnvidia-container-toolkit
paquete y luego usar la--gpus all
bandera.Entonces, aquí están los conceptos básicos,
Instalación de paquete
Instale el
nvidia-container-toolkit
paquete según la documentación oficial en Github .Para sistemas operativos basados en Redhat, ejecute el siguiente conjunto de comandos:
Para sistemas operativos basados en Debian, ejecute el siguiente conjunto de comandos:
Ejecutar la ventana acoplable con soporte para GPU
Tenga en cuenta que la bandera
--gpus all
se usa para asignar todos los gpus disponibles al contenedor acoplable.Para asignar una GPU específica al contenedor acoplable (en caso de múltiples GPU disponibles en su máquina)
O
fuente
Ok, finalmente logré hacerlo sin usar el modo privilegiado.
Estoy corriendo en el servidor ubuntu 14.04 y estoy usando la última versión de 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 te sugiero que sigas esta guía /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
ATENCIÓN: es muy importante que conserve los archivos que usó para la instalación del host cuda
Haz que Docker Daemon se ejecute usando lxc
Necesitamos ejecutar docker daemon usando el controlador lxc para poder modificar la configuración y dar acceso al contenedor al dispositivo.
Utilización única:
Configuración permanente Modifique su archivo de configuración de docker ubicado en / etc / default / docker Cambie la línea DOCKER_OPTS agregando '-e lxc' Aquí está mi línea después de la modificación
Luego reinicia el demonio usando
¿Cómo verificar si el demonio usa efectivamente el controlador lxc?
La línea del controlador de ejecución debería verse así:
Cree su imagen con el controlador NVIDIA y CUDA.
Aquí hay un Dockerfile básico para construir una imagen compatible con CUDA.
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:
Si el resultado está en blanco, el uso de iniciar una de las muestras en el host debería ser 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. Solo usaremos los números principales por conveniencia.
¿Por qué activamos el controlador lxc? Usar la opción lxc conf que nos permite permitir que nuestro contenedor acceda a esos dispositivos. La opción es: (recomiendo usar * para el número menor porque reduce la longitud del comando de ejecución)
Entonces, si quiero iniciar un contenedor (suponiendo que el nombre de su imagen sea cuda).
fuente
--device
opción para permitir que el contenedor acceda al dispositivo del host. Sin embargo, traté de usar--device=/dev/nvidia0
para permitir que el contenedor Docker ejecute cuda y fallé./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
y/dev/nvidia-uvm
con--device
. Aunque no sé por qué./dev/nvidia*
@Regan. Para @ChillarAnand he hecho un cuda-dockerAcabamos de lanzar un repositorio experimental de GitHub que debería facilitar el proceso de uso de GPU NVIDIA dentro de los contenedores Docker.
fuente
Las mejoras recientes de NVIDIA han producido una forma mucho más sólida 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 del host.
En cambio, los controladores están en el host y los contenedores no los necesitan. Requiere un docker-cli modificado en este momento.
Esto es genial, porque ahora los contenedores son mucho más portátiles.
Una prueba rápida en Ubuntu:
Para obtener más detalles, consulte: Contenedor Docker habilitado para GPU y: https://github.com/NVIDIA/nvidia-docker
fuente
Actualizado para cuda-8.0 en ubuntu 16.04
Instale docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Cree la siguiente imagen que incluye los controladores de nvidia y el kit de herramientas de cuda
Dockerfile
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
fuente
Para usar GPU desde el contenedor docker, en lugar de usar Docker nativo, use Nvidia-docker. Para instalar Nvidia Docker, use los siguientes comandos
fuente
Utilice x11docker por mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration dice
Este script es realmente conveniente ya que maneja toda la configuración y configuración. Ejecutar una imagen acoplable en X con gpu es tan simple como
fuente