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-docker
docker
.
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
ist unkommentiert und enthält die IP-Adressen Ihrer DNS-Server.#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
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/nmcli
ihnen 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.