Manual

do

Maker

.

com

Como utilizar CUDA no Docker (OpenFace)

Como utilizar CUDA no Docker (OpenFace)

Cuda no Docker

Uma das grandes vantagens da utilização de docker é a portabilidade que isso oferece, sendo que você pode transferir uma imagem e/ou container para outra máquina de forma simples. Mas uma das características do docker é o isolamento de processos, e isso pode ser algo que lhe esteja causando uma dor de cabeça inicial para configurar o CUDA no container. Como eu tive que executar esses passos e descobrir algumas coisas até bobas, mas não explícitas, decidi fazer esse artigo para me servir de referência para o próximo container, que certamente será feito em breve.

Configuração inicial

Primeiramente instale o driver de sua placa de video no sistema Linux nativo. É fundamental que a placa esteja devidamente configurada e aparecendo em /dev/nvidia*.

OpenFace

Para quem não conhece, o OpenFace é um conjunto de ferramentas que comporta scripts e uma rede neural (Torch) para fazer reconhecimento facial. Com uma base de 40 pessoas e uma amostragem de 1500 imagens por pessoa, consegui chegar a 100% de confidência no reconhecimento facial. Instale o docker e baixe a imagem do OpenFace seguindo esse tutorial. Mas não execute o treinamento e sequer crie um container ainda caso deseje utilizar CUDA com sua rede neural.

Criar um container

Agora criamos nosso container desse modo:

docker run -p 9000:9000 -p 8000:8000 -name gtx1080 --privileged --cap-add=ALL -d --device=/dev:/dev -v /home/gtx1080/sharedWithOpenFace:/root/sharedWithOpenFace -v /lib/modules:/lib/modules -t -i bamos/openface /bin/bash

Aqui estamos liberando as portas TCP 9000 e 8000 para se conectarem ao container a partir de qualquer ponto externo. Seguidamente, dei o nome da placa de video que estou utilizando para o container, assim fica fácil eu saber qual delas está com CUDA. Então começam os pulos-do-gato. "--privileged" e "--cap-add=ALL" são altamente permissívos, dando um grande poder ao container sobre recursos do sistema nativo. Administradores de sistema certamente torcem o nariz para isso, mas desse modo foi possível solucionar o que até então era um problema, pois não dava pra instalar o driver da NVidia e carregar módulos dentro do container. Depois disso você vê o compartilhamento de /dev, para que todos os dispositivos estejam disponíveis dentro do container. Um diretório comum para transferir arquivos do host para o container também foi criado para facilitar a comunicação e "/lib/modules" precisou estar acessível no container. O resto é apenas o básico; nome da imagem e comando.

Instalar CUDA

Procure por esse gigantesco pacote e instale-o. Então siga os passos posteriores. Juntando tudo, fica assim:

dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb
apt-get update
apt-get install cuda
dpkg -i libcudnn5_5.1.5-1+cuda8.0_amd64.deb

Configurando o suporte no OpenFace

Agora serão necessários alguns passos extras para que o Openface funcione a contento. Instale "primeiro" o torch mais novo. Por causa da versão instalada, tive uma série de problemas para concluir a instalação dos pacotes subsequentes, portanto, faça como abaixo para tudo correr com sucesso:

luarocks install torch
for NAME in dpnn nn optim optnet csvigo cutorch cunn fblualib torchx tds; do luarocks install $NAME; done

Observe se realmente nenhum pacote falha, porque ainda que falhe o loop seguirá adiante e você poderá não notar.

Executar o treinamento da base de fotos

Agora você pode seguir todos os passos indicados nesse outro artigo para treinar e predizer, mas adicionando "--cuda" logo após o comando. Algo como:

./openface/demos/classifier.py --cuda train sharedWithOpenFace/featureDir/

O mesmo para o outro script em lua:

 ./openface/batch-represent/main.lua -cuda -outDir sharedWithOpenFace/featureDir/ -data sharedWithOpenFace/aligned/

Quando chamar o classifier para fazer o infer, inclua "--cuda" da mesma forma, simples assim. Em meu ambiente utilizando CPU levava 80m55s para treinar uma base com 21 mil fotos. Com a GPU levou 1m2s!!! Vale muito a pena utilizar uma GPU, ainda mais se for uma GTX1080, utilizada de maneira tão "esnobe por gamers". Brincadeira, também gosto de jogos.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.