Compartilhar via


CNTK Contêineres do Docker

Você pode configurar CNTK como um contêiner do Docker em seu sistema Linux.

Há duas maneiras de usar CNTK Contêineres do Docker:

Usando imagens CNTK publicadas em Docker Hub

Hospedamos imagens de CNTK públicas no Docker Hub. Confira a lista completa de imagens disponíveis na página CNTK Repositórios em Docker Hub. Atualmente, hospedamos apenas configurações de runtime . A configuração de runtime corresponde a um ambiente com CNTK pacote Binário instalado e configurado. Essa configuração não contém CNTK código-fonte nem os pré-requisitos necessários para compilar CNTK.

Observe que você precisa do Docker NVIDIA para usar CNTK imagens habilitadas para GPU.

Os comandos standard do Docker são usados para obter a imagem:

docker pull mcr.microsoft.com/cntk/release

para obter a imagem de versão oficial mais recente, o que hoje significa a configuração de runtime de GPU disponível mais recente. Você também pode obter a imagem noturna de desenvolvimento mais recente:

docker pull mcr.microsoft.com/cntk/nightly

Para obter uma configuração específica, você precisa adicionar uma marca. Por ex.:

docker pull mcr.microsoft.com/cntk/release:2.7-cpu-python3.5

você terá CNTK configuração de runtime da CPU 2.7 configurada para Python 3.5.

Se você não estiver familiarizado com o Docker, leia as seções abaixo nesta página.

Usando o contêiner do Docker para executar tutoriais CNTK Jupyter Notebook

Você pode usar CNTK contêineres do Docker para executar CNTK Jupyter Notebooks em seu ambiente local.

Presumimos que você já tirou as imagens necessárias do Docker Hub. No exemplo abaixo, usaremos a configuração de GPU. Se você estiver usando a configuração da CPU, os comandos abaixo substituirão todas as ocorrências por nvidia-dockerdocker.

Primeiro, crie e inicie um contêiner CNTK no modo desanexado com a porta IP exposta (usamos a porta 8888 que é padrão para Jupyter Notebook aplicativo):

nvidia-docker run -d -p 8888:8888 --name cntk-jupyter-notebooks -t mcr.microsoft.com/cntk/release

Agora inicie Jupyter Notebook servidor no contêiner do Docker:

docker exec -it cntk-jupyter-notebooks bash -c "source /cntk/activate-cntk && jupyter-notebook --no-browser --port=8888 --ip=0.0.0.0 --notebook-dir=/cntk/Tutorials --allow-root"

No terminal, você verá a saída do console do servidor Jupyter Notebooks. Essa saída conteria uma linha como esta:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Copie o token exibido (em nosso exemplo 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Agora você pode acessar CNTK Jupyter Notebooks usando o endereço IP do computador em que você está executando o contêiner do Docker. Ou seja, se o endereço do computador for 192.168.1.1 acessado CNTK Notebooks abrir uma janela do navegador e ir para http://192.168.1.1:8888.

Observe que durante a primeira execução Jupyter Notebook aplicativo solicitará uma senha ou token. Use o token que você salvou acima.

Para interromper a sequência de envio Ctrl-C do servidor Jupyter Notebook no terminal em que você tem a saída do console do servidor jupiter notebook e confirme o desligamento do servidor. Observe que ele não interromperá o contêiner do Docker em si. Para interromper o contêiner, use o comando:
docker stop cntk-jupyter-notebooks

ALERTA! Os comandos acima exporão o aplicativo Jupyter Notebooks a todos que podem acessar o endereço IP do computador em que você está executando o contêiner do Docker.

Criando imagens do Docker CNTK

Você pode criar e executar CNTK usando o mesmo contêiner e essa é uma abordagem recomendada para reproduzir nossa configuração de referência.

Primeiro, você precisa instalar o Docker. É altamente recomendável seguir o processo de instalação na documentação oficial do Docker. As versões que vêm com sua distribuição do Linux podem estar desatualizadas e não funcionarão (com nvidia-docker as quais talvez seja necessário instalar além do Docker se você planeja compilar e executar a imagem de GPU no mesmo contêiner). Você também deve seguir as instruções na seção opcional intitulada criando um grupo do Docker.

Os arquivos do Docker correspondentes estão no repositório CNTK emhttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Para criar uma imagem do Docker com CNTK e todas as suas dependências, basta clonar o repositório CNTK, navegar CNTK/Tools/docker e usar o Dockerfile do qual você deseja criar (CPU ou GPU). Por exemplo, para criar a imagem do docker de GPU do CNTK, execute:

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

O -f <path/to/Dockerfile> argumento é necessário porque alguns patches, comuns para dockerfiles de CPU e GPU, precisam ser aplicados no código-fonte SWIG. Se você receber erros que dizem Could not resolve 'archive.ubuntu.com' que precisará fornecer ao Docker os endereços IP dos servidores DNS. Primeiro, localize os endereços IP dos servidores DNS usando, por exemplo, o comando

nm-tool

ou o comando

nmcli dev show

Digamos que os IPs de seus servidores DNS são a.b.c.d e x.y.z.w. Então

  • no Ubuntu 15.10 e posterior (ou em outro Linux que usa sistema) modifique /lib/systemd/system/docker.service para que o daemon do Docker seja iniciado com as opções adicionais --dns a.b.c.d --dns x.y.z.w
  • no Ubuntu 15.04 e anterior (ou em outro Linux que não usa sistema) edite /etc/default/docker para que a linha
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    não é descompactado e contém os endereços IP dos servidores DNS.

Observação: algumas empresas bloqueiam servidores DNS públicos, como 8.8.8.8 e 8.8.4.4. Você pode tentar usá-los, mas se o problema persistir, você deverá tentar usar os endereços IP do servidor DNS relatados por nm-tool/nmcli.

Reiniciar o daemon do docker via

sudo service docker restart

e exclua todas as imagens do Docker criadas com as configurações DNS erradas. Para excluir todas as imagens do Docker

docker rmi $(docker images -q)

Para excluir todos os contêineres do Docker

docker rm $(docker ps -a -q)

Agora tente novamente

docker build -t cntk -f CNTK-GPU-Image/Dockerfile .

Se você tiver uma GPU, desejará testar se pode acessá-la por meio de um contêiner do Docker depois de criar a imagem. Experimente este comando:

docker run --rm cntk nvidia-smi

Se funcionar, você terminará. Caso contrário, isso significa que há uma incompatibilidade entre a versão cuda e/ou drivers instalados no host e na imagem do docker CNTK. Em particular, a incompatibilidade está entre o módulo de driver NVidia do modo kernel e o módulo do modo de usuário (que é uma lib compartilhada) e isso acontece se a versão no host não corresponder exatamente à versão no contêiner. Felizmente, isso é fácil de corrigir. Basta instalar o nvidia-docker e usá-lo exatamente como o Docker (sem necessidade de recriar a imagem).

nvidia-docker run --rm cntk nvidia-smi

Isso deve funcionar e permite que CNTK usem a GPU de dentro de um contêiner do Docker. Se isso não funcionar, pesquise a seção Problemas no GitHub nvidia-docker – muitas soluções já estão documentadas. Observe que, se os diretórios /usr e /var estiverem em partições diferentes, você precisará de algumas etapas extras, como aqui. Para obter um shell interativo para um contêiner que não será excluído automaticamente após a saída

nvidia-docker run --name cntk_container1 -ti cntk bash

Se você quiser compartilhar seus dados e configurações entre o host (seu computador ou VM) e o contêiner no qual você está usando CNTK, use a opção -v, por exemplo.

nvidia-docker run --name cntk_container1 -ti -v /project1/data:/data -v /project1/config:/config cntk bash

Isso tornará /project1/data do host visível como /data no contêiner e /project1/config como /config. Esse isolamento reduz as chances de seus experimentos em contêineres substituirem ou usarem dados incorretos.