Ok, finalmente consegui fazê-lo sem usar o modo --privileged.
Estou executando no servidor ubuntu 14.04 e estou usando o ultimo cuda (6.0.37 para linux 13.04 64 bits).
Preparação
Instale o driver da nvidia e o cuda no seu host. (pode ser um pouco complicado, então eu sugiro que você siga este guia /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
ATENÇÃO: É realmente importante que você mantenha os arquivos usados para a instalação do host cuda
Faça o Docker Daemon executar usando lxc
Precisamos executar o docker daemon usando o driver lxc para poder modificar a configuração e conceder ao contêiner acesso ao dispositivo.
Utilização única:
sudo service docker stop
sudo docker -d -e lxc
Configuração permanente
Modifique seu arquivo de configuração do docker localizado em / etc / default / docker Altere a linha DOCKER_OPTS adicionando '-e lxc' Aqui está minha linha após a modificação
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Em seguida, reinicie o daemon usando
sudo service docker restart
Como verificar se o daemon usa efetivamente o driver lxc?
docker info
A linha do Driver de Execução deve ficar assim:
Execution Driver: lxc-1.0.5
Crie sua imagem com os drivers NVIDIA e CUDA.
Aqui está um Dockerfile básico para criar uma imagem compatível com 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.
Execute sua imagem.
Primeiro, você precisa identificar seu número principal associado ao seu dispositivo. A maneira mais fácil é executar o seguinte comando:
ls -la /dev | grep nvidia
Se o resultado estiver em branco, o lançamento de uma das amostras no host deve fazer o truque. O resultado deve ser assim.
Como você pode ver, há um conjunto de 2 números entre o grupo e a data. Esses 2 números são chamados de números maiores e menores (escritos nessa ordem) e projetam um dispositivo. Usaremos apenas os principais números por conveniência.
Por que ativamos o driver lxc? Para usar a opção lxc conf que nos permite permitir que nosso contêiner acesse esses dispositivos. A opção é: (eu recomendo usar * para o número menor, pois isso reduz o tamanho do comando executar)
--lxc-conf = 'lxc.cgroup.devices.allow = c [número principal]: [número menor ou *] rwm'
Então, se eu quiser iniciar um contêiner (supondo que o nome da imagem seja cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda