CNTK contenitori Docker

È possibile configurare CNTK come contenitore Docker nel sistema Linux.

Esistono due modi per usare CNTK contenitori Docker:

Uso delle immagini CNTK pubblicate in Docker Hub

Le immagini di CNTK pubbliche sono ospitate in Docker Hub. Vedere l'elenco completo delle immagini disponibili nella pagina CNTK Repository all'Docker Hub. Attualmente vengono ospitate solo le configurazioni di runtime . La configurazione di runtime corrisponde a un ambiente con CNTK pacchetto binario installato e configurato. Questa configurazione non contiene né CNTK codice sorgente né i prerequisiti necessari per compilare CNTK.

Si noti che è necessario NVIDIA Docker per usare CNTK immagini abilitate per GPU.

I comandi Docker standard vengono usati per ottenere l'immagine:

docker pull mcr.microsoft.com/cntk/release

per ottenere l'immagine di rilascio ufficiale più recente, che oggi significa la configurazione più recente del runtime GPU disponibile. È anche possibile ottenere l'immagine di sviluppo notturna più recente:

docker pull mcr.microsoft.com/cntk/nightly

Per ottenere una configurazione specifica, è necessario aggiungere un tag. ad esempio

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

si otterrà CNTK configurazione del runtime della CPU 2.7 configurata per Python 3.5.

Se non si ha familiarità con Docker, leggere le sezioni seguenti in questa pagina.

Uso del contenitore Docker per eseguire esercitazioni CNTK Jupyter Notebook

È possibile usare CNTK contenitori Docker per eseguire CNTK Jupyter Notebook nell'ambiente locale.

Si supponga di aver già estratto le immagini richieste da Docker Hub. Nell'esempio seguente verrà usata la configurazione gpu. Se si usa la configurazione della CPU, nei comandi seguenti sostituire tutte le occorrenze di nvidia-docker con docker.

Creare e avviare prima un contenitore CNTK in modalità scollegata con la porta IP esposta (si usa la porta 8888 predefinita per Jupyter Notebook'applicazione):

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

Avviare ora Jupyter Notebook server nel contenitore 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"

Nel terminale verrà visualizzato l'output della console del server Jupyter Notebooks. L'output conterrà una riga simile alla seguente:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Copiare il token visualizzato (nell'esempio 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

È ora possibile accedere CNTK Jupyter Notebook usando l'indirizzo IP del computer in cui si esegue il contenitore Docker. Ad esempio, se l'indirizzo del computer è 192.168.1.1 quello di accedere a CNTK Notebooks aprire una finestra del browser e passare a http://192.168.1.1:8888.

Si noti che durante la prima esecuzione Jupyter Notebook'applicazione richiederà una password o un token. Usare il token salvato in precedenza.

Per arrestare la sequenza di invio Ctrl-C del server Jupyter Notebook nel terminale in cui è presente l'output della console del server Notebook di Giove e confermare l'arresto del server. Si noti che non arresterà il contenitore Docker stesso. Per arrestare il contenitore, usare il comando :
docker stop cntk-jupyter-notebooks

AVVISO I comandi precedenti esporranno l'applicazione Jupyter Notebooks a tutti gli utenti che possono accedere all'indirizzo IP del computer in cui si esegue il contenitore Docker.

Creazione di immagini Docker CNTK

È possibile compilare ed eseguire CNTK usando lo stesso contenitore ed è un approccio consigliato per riprodurre la configurazione di riferimento.

Prima di tutto è necessario installare Docker. È consigliabile seguire il processo di installazione nella documentazione ufficiale di Docker. Le versioni incluse nella distribuzione di Linux potrebbero essere obsolete e non funzionano con nvidia-docker (che potrebbe essere necessario installare oltre a Docker se si prevede di compilare ed eseguire l'immagine GPU dallo stesso contenitore). È anche consigliabile seguire le istruzioni nella sezione facoltativa intitolata Creazione di un gruppo Docker.

I file Docker corrispondenti si trovano nel repository CNTK all'indirizzohttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Per compilare un'immagine Docker con CNTK e tutte le relative dipendenze, è sufficiente clonare il repository CNTK, passare a CNTK/Tools/docker e usare il Dockerfile da cui si vuole eseguire la compilazione (CPU o GPU). Ad esempio, per compilare l'immagine Docker gpu di CNTK, eseguire:

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

L'argomento -f <path/to/Dockerfile> è obbligatorio perché alcune patch, comuni per i dockerfile CPU e GPU, devono essere applicate al codice sorgente SWIG. Se si ricevono errori che dicono Could not resolve 'archive.ubuntu.com' che sarà necessario fornire Docker con gli indirizzi IP dei server DNS. Trovare prima di tutto gli indirizzi IP dei server DNS usando, ad esempio, il comando

nm-tool

o il comando

nmcli dev show

Si supponga che gli INDIRIZZI IP dei server DNS siano a.b.c.d e x.y.z.w. Risultato

  • in Ubuntu 15.10 e versioni successive (o in altri Linux che usano systemd) modificare /lib/systemd/system/docker.service in modo che il daemon Docker venga avviato con le opzioni aggiuntive --dns a.b.c.d --dns x.y.z.w
  • in Ubuntu 15.04 e versioni precedenti (o in altri Linux che non usano systemd) modificare /etc/default/docker in modo che la riga
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    è un commento e contiene gli indirizzi IP dei server DNS.

Nota: alcune aziende bloccano i server DNS pubblici, ad esempio 8.8.8.8 e 8.8.4.4. È possibile provare a usarli, ma se il problema persiste, è consigliabile provare a usare gli indirizzi IP del server DNS segnalati da nm-tool/nmcli.

Riavviare il daemon Docker tramite

sudo service docker restart

ed eliminare tutte le immagini Docker in cui sono state create con le impostazioni DNS errate. Per eliminare tutte le immagini Docker

docker rmi $(docker images -q)

Per eliminare tutti i contenitori Docker

docker rm $(docker ps -a -q)

Riprovare

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

Se si ha una GPU che si vuole testare se è possibile accedervi tramite un contenitore Docker dopo aver compilato l'immagine. Provare questo comando:

docker run --rm cntk nvidia-smi

Se funziona, hai finito. In caso contrario, significa che esiste una mancata corrispondenza tra la versione CUDA e/o i driver installati nell'host e nell'immagine docker CNTK. In particolare, la mancata corrispondenza è tra il modulo driver NVidia in modalità kernel e il modulo in modalità utente (che è una libreria condivisa) e ciò accade se la versione nell'host non corrisponde esattamente alla versione nel contenitore. Fortunatamente questo è facile da correggere. È sufficiente installare nvidia-docker e usarlo esattamente come docker (non è necessario ricompilare l'immagine).

nvidia-docker run --rm cntk nvidia-smi

Questa operazione dovrebbe funzionare e consente CNTK di usare la GPU dall'interno di un contenitore Docker. In caso contrario, cercare la sezione Problemi nel GitHub nvidia-docker. Molte soluzioni sono già documentate. Si noti che se le directory /usr e /var si trovano in partizioni diverse, sono necessari alcuni passaggi aggiuntivi come qui. Per ottenere una shell interattiva in un contenitore che non verrà eliminato automaticamente dopo l'uscita

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

Se si vogliono condividere i dati e le configurazioni tra l'host (computer o macchina virtuale) e il contenitore in cui si usa CNTK, usare l'opzione -v, ad esempio

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

In questo modo /project1/data dall'host sarà visibile come /data nel contenitore e /project1/config come /config. Questo isolamento riduce le probabilità che gli esperimenti in contenitori sovrascrivano o usino dati errati.