Estou procurando uma maneira de usar a GPU de dentro de um contêiner de docker.
O contêiner executará código arbitrário, portanto, não quero usar o modo privilegiado.
Alguma dica?
De pesquisas anteriores, entendi que run -v
e / ou o LXC cgroup
era o caminho a seguir, mas não sei ao certo como fazer isso exatamente
Respostas:
A resposta de Regan é ótima, mas está um pouco desatualizada, pois a maneira correta de fazer isso é evitar o contexto de execução lxc, pois o Docker descartou o LXC como o contexto de execução padrão no docker 0.9.
Em vez disso, é melhor falar ao docker sobre os dispositivos da nvidia por meio do sinalizador --device e usar o contexto de execução nativo em vez do lxc.
Meio Ambiente
Estas instruções foram testadas no seguinte ambiente:
Instale o driver nvidia e cuda no seu host
Consulte CUDA 6.5 na instância da AWS GPU executando o Ubuntu 14.04 para obter a configuração da máquina host.
Instalar o Docker
Encontre seus dispositivos nvidia
Execute o contêiner do Docker com o driver da nvidia pré-instalado
Criei uma imagem do docker com os drivers cuda pré-instalados. O dockerfile está disponível no dockerhub se você quiser saber como essa imagem foi criada.
Você deseja personalizar este comando para corresponder aos seus dispositivos nvidia. Aqui está o que funcionou para mim:
Verifique se o CUDA está instalado corretamente
Isso deve ser executado de dentro do contêiner do docker que você acabou de lançar.
Instale amostras CUDA:
Exemplo de build deviceQuery:
Se tudo funcionou, você deverá ver a seguinte saída:
fonte
ls -la /dev | grep nvidia
mas o CUDA não consegue encontrar nenhum dispositivo compatível com o CUDA:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
isso ocorre devido à incompatibilidade das bibliotecas CUDA no host e no contêiner?Escrever uma resposta atualizada, pois a maioria das respostas já existentes está obsoleta a partir de agora.
Versões anteriores ao que
Docker 19.03
costumava exigirnvidia-docker2
e o--runtime=nvidia
sinalizador.Desde então
Docker 19.03
, você precisa instalar onvidia-container-toolkit
pacote e depois usar o--gpus all
sinalizador.Então, aqui estão o básico,
Instalação do pacote
Instale o
nvidia-container-toolkit
pacote de acordo com a documentação oficial no Github .Para sistemas operacionais baseados em Redhat, execute o seguinte conjunto de comandos:
Para sistemas operacionais baseados em Debian, execute o seguinte conjunto de comandos:
Executando a janela de encaixe com suporte à GPU
Observe que o sinalizador
--gpus all
é usado para atribuir todos os gpus disponíveis ao contêiner do docker.Para atribuir gpu específica ao contêiner do docker (no caso de várias GPUs disponíveis em sua máquina)
Ou
fonte
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:
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
Em seguida, reinicie o daemon usando
Como verificar se o daemon usa efetivamente o driver lxc?
A linha do Driver de Execução deve ficar assim:
Crie sua imagem com os drivers NVIDIA e CUDA.
Aqui está um Dockerfile básico para criar uma imagem compatível com CUDA.
Execute sua imagem.
Primeiro, você precisa identificar seu número principal associado ao seu dispositivo. A maneira mais fácil é executar o seguinte comando:
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)
Então, se eu quiser iniciar um contêiner (supondo que o nome da imagem seja cuda).
fonte
--device
opção para permitir que o contêiner acesse o dispositivo do host. No entanto, tentei usar--device=/dev/nvidia0
para permitir que o contêiner do docker executasse cuda e falhou./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
e/dev/nvidia-uvm
com--device
. Embora não saiba o porquê./dev/nvidia*
@Regan. Para @ChillarAnand I fez um cuda-estivadorAcabamos de lançar um repositório experimental do GitHub, que deve facilitar o processo de uso de GPUs NVIDIA dentro de contêineres do Docker.
fonte
Os aprimoramentos recentes da NVIDIA produziram uma maneira muito mais robusta de fazer isso.
Essencialmente, eles encontraram uma maneira de evitar a necessidade de instalar o driver CUDA / GPU dentro dos contêineres e combiná-lo com o módulo do kernel do host.
Em vez disso, os drivers estão no host e os contêineres não precisam deles. Ele requer um docker-cli modificado no momento.
Isso é ótimo, porque agora os contêineres são muito mais portáteis.
Um teste rápido no Ubuntu:
Para obter mais detalhes, consulte: Contêiner do Docker ativado por GPU e: https://github.com/NVIDIA/nvidia-docker
fonte
Atualizado para cuda-8.0 no ubuntu 16.04
Instale o docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Crie a seguinte imagem que inclui os drivers da nvidia e o kit de ferramentas 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
Você deve ver uma saída semelhante a:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS
fonte
Para usar a GPU do contêiner do docker, em vez de usar o Docker nativo, use o Nvidia-docker. Para instalar a docker Nvidia, use os seguintes comandos
fonte
Use o x11docker by mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration diz
Este script é realmente conveniente, pois lida com toda a configuração. A execução de uma imagem do docker no X com gpu é tão simples quanto
fonte