Dela via


CNTK Docker-containrar

Du kan konfigurera CNTK som en Docker-container i Linux-systemet.

Det finns två sätt att använda CNTK Docker-containrar:

Använda CNTK-bilder som publicerats på Docker Hub

Vi är värd för offentliga CNTK-avbildningar på Docker Hub. Se en fullständig lista över avbildningar som är tillgängliga på sidan CNTK lagringsplatser på Docker Hub. Vi är för närvarande endast värd för körningskonfigurationer. Körningskonfigurationen motsvarar en miljö med CNTK binärt paket installerat och konfigurerat. Den här konfigurationen innehåller varken CNTK källkod eller de krav som krävs för att skapa CNTK.

Observera att du behöver NVIDIA Docker för att använda CNTK GPU-aktiverade avbildningar.

Docker-standardkommandon används för att hämta avbildningen:

docker pull mcr.microsoft.com/cntk/release

för att få den senaste officiella versionsavbildningen, vilket i dag innebär den senaste tillgängliga GPU-körningskonfigurationen. Du kan också få den senaste utvecklingsbilden varje kväll:

docker pull mcr.microsoft.com/cntk/nightly

För att få en specifik konfiguration måste du lägga till en tagg. T.ex.

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

får du CNTK 2,7 CPU-körningskonfiguration som konfigurerats för Python 3.5.

Om du inte är bekant med Docker läser du avsnitten nedan på den här sidan.

Använda Docker-containern för att köra CNTK Jupyter Notebook självstudier

Du kan använda CNTK Docker-containrar för att köra CNTK Jupyter Notebooks i din lokala miljö.

Vi antar att du redan har hämtat de nödvändiga avbildningarna från Docker Hub. I exemplet nedan använder vi GPU-konfiguration. Om du använder CPU-konfiguration ersätter du alla förekomster av nvidia-docker med dockeri kommandona nedan .

Skapa och starta först en CNTK container i frånkopplat läge med exponerad IP-port (vi använder en port 8888 som är standard för Jupyter Notebook program):

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

Starta nu Jupyter Notebook-servern i Docker-containern:

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"

I terminalen visas konsolutdata från Jupyter Notebooks-servern. Dessa utdata skulle innehålla en rad som denna:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Kopiera den token som visas (i vårt exempel 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Nu kan du komma åt CNTK Jupyter Notebooks med hjälp av IP-adressen för den dator där du kör Docker-containern. Om datorns adress sedan ska 192.168.1.1 komma åt CNTK Notebooks öppnar du ett webbläsarfönster och går till http://192.168.1.1:8888.

Observera att under den första körningen kommer Jupyter Notebook program att be om ett lösenord eller en token. Använd den token som du har sparat ovan.

Stoppa Jupyter Notebook serverns sändningssekvens Ctrl-C i terminalen där du har utdata från Jupiter Notebook-serverkonsolen och bekräfta att servern stängs av. Observera att det inte stoppar själva Docker-containern. Om du vill stoppa containern använder du kommandot:
docker stop cntk-jupyter-notebooks

VARNING! Kommandona ovan visar Jupyter Notebooks-programmet för alla som har åtkomst till IP-adressen för den dator där du kör Docker-containern.

Skapa CNTK Docker-avbildningar

Du kan skapa och köra CNTK med samma container och det här är en rekommenderad metod för att återskapa vår referenskonfiguration.

Först måste du installera Docker. Vi rekommenderar starkt att du följer installationsprocessen i den officiella Docker-dokumentationen. Versioner som medföljer din Linux-distribution kan vara inaktuella och fungerar inte med nvidia-docker (som du kan behöva installera utöver docker om du planerar att skapa och köra GPU-avbildningen från samma container). Du bör också följa anvisningarna i det valfria avsnittet med rubriken skapa en docker-grupp.

Docker-korrespondentfilerna finns på CNTK-lagringsplatsen påhttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Om du vill skapa en docker-avbildning med CNTK och alla dess beroenden klonar du helt enkelt CNTK lagringsplats, navigerar till CNTK/Tools/docker och använder den Dockerfile som du vill skapa från (CPU eller GPU). Om du till exempel vill skapa CNTK GPU Docker-avbildning kör du:

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

Argumentet -f <path/to/Dockerfile> krävs eftersom vissa korrigeringar, som är vanliga för både CPU- och GPU-dockerfiler, måste tillämpas på SWIG-källkoden. Om du får fel som säger Could not resolve 'archive.ubuntu.com' att du måste tillhandahålla docker med IP-adresserna för dina DNS-servrar. Leta först upp IP-adresserna för dina DNS-servrar med hjälp av till exempel kommandot

nm-tool

eller kommandot

nmcli dev show

Anta att IP-adresserna för dina DNS-servrar är a.b.c.d och x.y.z.w. Gäller följande

  • på Ubuntu 15.10 och senare (eller annan Linux som använder systemd) ändra /lib/systemd/system/docker.service så att docker daemon startas med ytterligare alternativ --dns a.b.c.d --dns x.y.z.w
  • på Ubuntu 15.04 och tidigare (eller annan Linux som inte använder systemd) redigera /etc/default/docker så att raden
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    är okommenterad och innehåller IP-adresserna för dina DNS-servrar.

Obs! Vissa företag blockerar offentliga DNS-servrar som 8.8.8.8 och 8.8.4.4. Du kan prova att använda dem, men om problemet kvarstår bör du försöka använda DNS-serverns IP-adresser som rapporteras av nm-tool/nmcli.

Starta om docker-daemonen via

sudo service docker restart

och ta bort alla docker-avbildningar som skapades med fel DNS-inställningar. Ta bort alla Docker-avbildningar

docker rmi $(docker images -q)

Om du vill ta bort alla Docker-containrar gör

docker rm $(docker ps -a -q)

Försök igen

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

Om du har en GPU vill du testa om du kan komma åt den via en Docker-container när du har skapat avbildningen. Testa följande kommando:

docker run --rm cntk nvidia-smi

Om det fungerar är du klar. Om den inte gör det innebär det att det finns ett matchningsfel mellan CUDA-versionen och/eller drivrutinerna som är installerade på värden och i din CNTK docker-avbildning. I synnerhet är matchningsfelet mellan NVidia-drivrutinsmodulen i kernelläge och modulen för användarläge (som är en delad lib) och detta händer om versionen på värden inte exakt matchar versionen i containern. Lyckligtvis är detta lätt att åtgärda. Installera bara nvidia-docker och använd den exakt som Docker (du behöver inte återskapa avbildningen).

nvidia-docker run --rm cntk nvidia-smi

Detta bör fungera och gör det möjligt för CNTK att använda GPU:n inifrån en docker-container. Om detta inte fungerar söker du i avsnittet Problem på nvidia-docker-GitHub – många lösningar är redan dokumenterade. Observera att om katalogerna /usr och /var finns i olika partitioner behöver du några extra steg som här. Så här hämtar du ett interaktivt gränssnitt till en container som inte tas bort automatiskt när du har avslutat

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

Om du vill dela dina data och konfigurationer mellan värden (datorn eller den virtuella datorn) och containern som du använder CNTK använder du alternativet -v, t.ex.

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

Då visas /project1/data från värden som /data i containern och /project1/config som /config. Sådan isolering minskar risken för att dina containerbaserade experiment skriver över eller använder fel data.