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:
sudo service docker stop
sudo docker -d -e lxc
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
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Luego reinicia el demonio usando
sudo service docker restart
¿Cómo verificar si el demonio usa efectivamente el controlador lxc?
docker info
La línea del controlador de ejecución debería verse así:
Execution Driver: lxc-1.0.5
Cree su 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, 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)
--lxc-conf = 'lxc.cgroup.devices.allow = c [número mayor]: [número menor o *] rwm'
Entonces, si quiero iniciar un contenedor (suponiendo que el nombre de su imagen sea cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda