CNTK Docker-Container

Sie können CNTK als Docker-Container auf Ihrem Linux-System einrichten.

Es gibt zwei Möglichkeiten, CNTK Docker-Container zu verwenden:

Verwenden CNTK Bilder, die bei Docker Hub veröffentlicht wurden

Wir hosten öffentliche CNTK Images bei Docker Hub. Eine vollständige Liste der Bilder finden Sie auf der Seite CNTK Repositorys unter Docker Hub. Derzeit werden nur Laufzeitkonfigurationen gehostet. Die Laufzeitkonfiguration entspricht einer Umgebung, in der CNTK Binärpaket installiert und konfiguriert ist. Diese Konfiguration enthält weder CNTK Quellcode noch die erforderlichen Voraussetzungen, um CNTK zu erstellen.

Beachten Sie, dass SIE NVIDIA Docker benötigen, um CNTK GPU-aktivierte Images zu verwenden.

Standardmäßige Docker-Befehle werden verwendet, um das Image abzurufen:

docker pull mcr.microsoft.com/cntk/release

um das neueste offizielle Release-Image zu erhalten, was heute die neueste verfügbare GPU-Laufzeitkonfiguration bedeutet. Sie können auch das neueste Entwicklungsbild sehen:

docker pull mcr.microsoft.com/cntk/nightly

Um eine bestimmte Konfiguration abzurufen, müssen Sie ein Tag hinzufügen. Beispiel:

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

erhalten Sie CNTK 2.7 CPU-Laufzeitkonfiguration für Python 3.5 eingerichtet.

Wenn Sie mit Docker nicht vertraut sind, lesen Sie abschnitte unten auf dieser Seite.

Verwenden des Docker-Containers zum Ausführen von CNTK Jupyter Notebook Lernprogrammen

Sie können CNTK Docker-Container verwenden, um CNTK Jupyter-Notizbücher in Ihrer lokalen Umgebung auszuführen.

Wir gehen davon aus, dass Sie die erforderlichen Bilder bereits aus Docker Hub gezogen haben. Im folgenden Beispiel verwenden wir die GPU-Konfiguration. Wenn Sie die CPU-Konfiguration verwenden, ersetzen Sie in den folgenden Befehlen alle Vorkommen durch nvidia-dockerdocker.

Erstellen und starten Sie zunächst einen CNTK Container im getrennten Modus mit ip-Port verfügbar (wir verwenden Port8888, der für Jupyter Notebook Anwendung standardmäßig verwendet wird):

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

Starten Sie nun Jupyter Notebook Server in Ihrem Docker-Container:

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"

In Ihrem Terminal wird die Konsolenausgabe des Jupyter Notebooks-Servers angezeigt. Diese Ausgabe würde eine Zeile wie folgt enthalten:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Kopieren Sie das angezeigte Token (in unserem Beispiel 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Jetzt können Sie auf CNTK Jupyter-Notizbücher zugreifen, indem Sie die IP-Adresse des Computers verwenden, auf dem Sie den Docker-Container ausführen. Wenn Ihre Computeradresse 192.168.1.1 also auf CNTK Notizbücher zugreifen soll, öffnen Sie ein Browserfenster, und wechseln Sie zu .http://192.168.1.1:8888

Beachten Sie, dass während der ersten Ausführung Jupyter Notebook Anwendung nach einem Kennwort oder Token fragt. Verwenden Sie das oben gespeicherte Token.

Um die Jupyter Notebook Server-Sendesequenz Ctrl-C im Terminal zu beenden, in dem Sie die Konsole der Jupiter Notebook-Serverkonsole ausgegeben haben, und bestätigen Sie das Herunterfahren des Servers. Beachten Sie, dass der Docker-Container selbst nicht beendet wird. Um den Container zu beenden, verwenden Sie den Befehl:
docker stop cntk-jupyter-notebooks

WARNUNG! Die oben aufgeführten Befehle stellen jupyter Notebooks-Anwendung allen zur Verfügung, die auf die IP-Adresse des Computers zugreifen können, auf den Sie den Docker-Container ausführen.

Erstellen CNTK Docker-Images

Sie können CNTK mit demselben Container erstellen und ausführen, und dies ist ein empfohlener Ansatz, um unsere Referenzkonfiguration zu reproduzieren.

Zuerst müssen Sie Docker installieren. Es wird dringend empfohlen, den Installationsprozess in der offiziellen Docker-Dokumentation zu befolgen. Versionen, die in Ihrer Linux-Verteilung enthalten sind, sind möglicherweise veraltet und funktionieren nvidia-docker nicht (die Sie möglicherweise zusätzlich zu Docker installieren müssen, wenn Sie das GPU-Image aus demselben Container erstellen und ausführen möchten). Sie sollten auch die Anweisungen im optionalen Abschnitt zum Erstellen einer Docker-Gruppe befolgen.

Die korrespondenten Docker-Dateien befinden sich im CNTK Repository unterhttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Um ein Docker-Image mit CNTK und allen abhängigkeiten zu erstellen, klonen Sie einfach das CNTK Repository, navigieren Sie zu CNTK/Tools/docker und verwenden Sie die Dockerfile, von der Sie erstellen möchten (CPU oder GPU). Führen Sie zum Erstellen des GPU-Docker-Images von CNTK beispielsweise Folgendes aus:

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

Das -f <path/to/Dockerfile> Argument ist erforderlich, da einige Patches, die sowohl für CPU- als auch GPU-Dockerfiles verwendet werden, auf SWIG-Quellcode angewendet werden müssen. Wenn Sie Fehler erhalten, die sagen Could not resolve 'archive.ubuntu.com' , dass Sie Docker mit den IP-Adressen Ihrer DNS-Server bereitstellen müssen. Suchen Sie zuerst die IP-Adressen Ihrer DNS-Server, z. B. den Befehl

nm-tool

oder der Befehl

nmcli dev show

Angenommen, die IPs Ihrer DNS-Server sind a.b.c.d und x.y.z.w. Then

  • auf Ubuntu 15.10 und höher (oder andere Linux, die systemd verwendet) ändern /lib/systemd/system/docker.service , sodass der Docker-Daemon mit den zusätzlichen Optionen gestartet wird --dns a.b.c.d --dns x.y.z.w
  • auf Ubuntu 15.04 und früheren (oder anderen Linux, die systemd nicht verwenden) bearbeiten /etc/default/docker , damit die Zeile
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    ist unkommentiert und enthält die IP-Adressen Ihrer DNS-Server.

Hinweis: Einige Unternehmen blockieren öffentliche DNS-Server wie 8.8.8.8 und 8.8.4.4. Sie können versuchen, sie zu verwenden, aber wenn das Problem weiterhin besteht, sollten Sie versuchen, die von nm-tool/nmcliihnen gemeldeten DNS-Server-IP-Adressen zu verwenden.

Starten Sie den Docker-Daemon über

sudo service docker restart

und löschen Sie alle Docker-Images, die mit den falschen DNS-Einstellungen erstellt wurden. So löschen Sie alle Docker-Images

docker rmi $(docker images -q)

So löschen Sie alle Docker-Container

docker rm $(docker ps -a -q)

Versuchen Sie es jetzt erneut.

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

Wenn Sie über eine GPU verfügen, sollten Sie testen, ob Sie über einen Docker-Container darauf zugreifen können, nachdem Sie das Image erstellt haben. Verwenden Sie den folgenden Befehl:

docker run --rm cntk nvidia-smi

Wenn dies funktioniert, sind Sie fertig. Wenn dies nicht der Grund ist, bedeutet dies, dass zwischen der CUDA-Version und/oder treibern, die auf Ihrem Host installiert sind, und in Ihrem CNTK Docker-Image ein Missverhältnis besteht. Insbesondere liegt die Übereinstimmung zwischen dem Kernelmodus-NVidia-Treibermodul und dem Benutzermodusmodul (die eine freigegebene Lib ist) und dies geschieht, wenn die Version auf dem Host nicht genau mit der Version im Container übereinstimmt. Glücklicherweise ist dies einfach zu beheben. Installieren Sie einfach nvidia-docker , und verwenden Sie es genau wie Docker (es muss kein Image neu erstellt werden).

nvidia-docker run --rm cntk nvidia-smi

Dies sollte funktionieren und ermöglicht es CNTK, die GPU aus einem Docker-Container zu verwenden. Wenn dies nicht funktioniert, durchsuchen Sie den Abschnitt "Probleme" im nvidia-docker-GitHub – viele Lösungen sind bereits dokumentiert. Beachten Sie, dass Sie, wenn sich Ihre Verzeichnisse /usr und /var in verschiedenen Partitionen befinden, einige zusätzliche Schritte wie hier benötigen. So rufen Sie eine interaktive Shell zu einem Container ab, der nach dem Beenden nicht automatisch gelöscht wird

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

Wenn Sie Ihre Daten und Konfigurationen zwischen dem Host (Ihrem Computer oder virtuellen Computer) und dem Container freigeben möchten, in dem Sie CNTK verwenden, verwenden Sie die Option -v, z. B.

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

Dadurch wird /project1/data vom Host als /data im Container und /project1/config als /config als /config sichtbar. Diese Isolation reduziert die Wahrscheinlichkeit, dass Ihre containerisierten Experimente überschreiben oder falsche Daten verwenden.