conteneurs Docker CNTK

Vous pouvez configurer CNTK en tant que conteneur Docker sur votre système Linux.

Il existe deux façons d’utiliser CNTK conteneurs Docker :

Utilisation d’images CNTK publiées à Docker Hub

Nous hébergeons des images CNTK publiques à Docker Hub. Consultez la liste complète des images disponibles dans CNTK page Référentiels à Docker Hub. Nous hébergeons actuellement uniquement les configurations d’exécution . La configuration du runtime correspond à un environnement avec CNTK package binaire installé et configuré. Cette configuration ne contient ni CNTK code source, ni les conditions préalables requises pour générer CNTK.

Notez que vous avez besoin de NVIDIA Docker pour utiliser CNTK images compatibles GPU.

Les commandes Docker standard sont utilisées pour obtenir l’image :

docker pull mcr.microsoft.com/cntk/release

pour obtenir la dernière image de version officielle, ce qui signifie aujourd’hui la dernière configuration du runtime GPU disponible. Vous pouvez également obtenir la dernière image de développement nocturne :

docker pull mcr.microsoft.com/cntk/nightly

Pour obtenir une configuration spécifique, vous devez ajouter une balise. Par exemple,

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

vous obtiendrez CNTK configuration du runtime d’UC 2.7 configurée pour Python 3.5.

Si vous n’êtes pas familiarisé avec Docker, lisez les sections ci-dessous à cette page.

Utilisation du conteneur Docker pour exécuter des didacticiels CNTK Jupyter Notebook

Vous pouvez utiliser CNTK conteneurs Docker pour exécuter CNTK notebooks Jupyter dans votre environnement local.

Nous partons du principe que vous avez déjà extrait les images requises de Docker Hub. Dans l’exemple ci-dessous, nous allons utiliser la configuration GPU. Si vous utilisez la configuration du processeur, dans les commandes ci-dessous, remplacez toutes les occurrences par nvidia-dockerdocker.

Commencez par créer et démarrer un conteneur CNTK en mode détaché avec le port IP exposé (nous utilisons le port 8888 par défaut pour Jupyter Notebook application) :

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

Démarrez maintenant Jupyter Notebook serveur dans votre conteneur 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"

Dans votre terminal, vous verrez la sortie de la console du serveur Jupyter Notebooks. Cette sortie contient une ligne semblable à celle-ci :
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Copiez le jeton affiché (dans notre exemple 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Vous pouvez désormais accéder à CNTK notebooks Jupyter à l’aide de l’adresse IP de l’ordinateur sur lequel vous exécutez le conteneur Docker. Par exemple, si votre adresse de machine est 192.168.1.1 alors d’accéder à CNTK Notebooks ouvrent une fenêtre de navigateur et accédez à http://192.168.1.1:8888.

Notez qu’au cours de la première exécution, Jupyter Notebook application demande un mot de passe ou un jeton. Utilisez le jeton que vous avez enregistré ci-dessus.

Pour arrêter la séquence d’envoi Ctrl-C du serveur Jupyter Notebook dans le terminal où vous disposez de la sortie de la console du serveur Jupiter Notebook et confirmez l’arrêt du serveur. Notez qu’il n’arrête pas le conteneur Docker lui-même. Pour arrêter le conteneur, utilisez la commande :
docker stop cntk-jupyter-notebooks

AVERTISSEMENT ! Les commandes ci-dessus exposent l’application Jupyter Notebooks à tous ceux qui peuvent accéder à l’adresse IP de l’ordinateur sur lequel vous exécutez le conteneur Docker.

Génération d’images Docker CNTK

Vous pouvez générer et exécuter des CNTK à l’aide du même conteneur et il s’agit d’une approche recommandée pour reproduire notre configuration de référence.

Tout d’abord, vous devez installer docker. Il est vivement recommandé de suivre le processus d’installation dans la documentation officielle de Docker. Les versions fournies avec votre distribution Linux peuvent être obsolètes et ne fonctionnent pas avec nvidia-docker (que vous devrez peut-être installer en plus de docker si vous envisagez de générer et d’exécuter l’image GPU à partir du même conteneur). Vous devez également suivre les instructions de la section facultative intitulée Création d’un groupe Docker.

Les fichiers Docker correspondants se trouvent dans le référentiel CNTK à l’adressehttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Pour générer une image Docker avec CNTK et toutes ses dépendances, clonez simplement le référentiel CNTK, accédez au CNTK/Tools/docker fichier Dockerfile à partir duquel vous souhaitez générer (PROCESSEUR ou GPU). Par exemple, pour générer l’image docker GPU de CNTK, exécutez :

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

L’argument -f <path/to/Dockerfile> est requis, car certains correctifs, communs aux fichiers dockerfiles PROCESSEUR et GPU, doivent être appliqués sur le code source SWIG. Si vous recevez des erreurs indiquant que Could not resolve 'archive.ubuntu.com' vous devrez fournir à Docker les adresses IP de vos serveurs DNS. Recherchez d’abord les adresses IP de vos serveurs DNS à l’aide, par exemple, de la commande

nm-tool

ou la commande

nmcli dev show

Supposons que les adresses IP de vos serveurs DNS sont a.b.c.d et x.y.z.w. Alors

  • sur Ubuntu 15.10 et versions ultérieures (ou d’autres Linux qui utilisent systemd) modifient /lib/systemd/system/docker.service afin que le démon Docker soit démarré avec les options supplémentaires --dns a.b.c.d --dns x.y.z.w
  • sur Ubuntu 15.04 et versions antérieures (ou d’autres Linux qui n’utilisent pas systemd) modifient /etc/default/docker de sorte que la ligne
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    n’est pas commenté et contient les adresses IP de vos serveurs DNS.

Remarque : certaines entreprises bloquent les serveurs DNS publics tels que 8.8.8.8 et 8.8.4.4. Vous pouvez essayer de les utiliser, mais si le problème persiste, vous devez essayer d’utiliser les adresses IP du serveur DNS signalées par nm-tool/nmcli.

Redémarrez le démon Docker via

sudo service docker restart

et supprimez toutes les images Docker créées avec les paramètres DNS incorrects. Pour supprimer toutes les images Docker, procédez

docker rmi $(docker images -q)

Pour supprimer tous les conteneurs Docker, procédez

docker rm $(docker ps -a -q)

Réessayez maintenant

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

Si vous disposez d’un GPU, vous souhaitez tester si vous pouvez y accéder via un conteneur Docker une fois que vous avez créé l’image. Essayez cette commande :

docker run --rm cntk nvidia-smi

Si cela fonctionne, vous avez terminé. Si ce n’est pas le cas, cela signifie qu’il existe une incompatibilité entre la version CUDA et/ou les pilotes installés sur votre hôte et dans votre image docker CNTK. En particulier, l’incompatibilité est entre le module de pilote NVidia en mode noyau et le module en mode utilisateur (qui est une bibliothèque partagée) et cela se produit si la version sur l’hôte ne correspond pas exactement à la version dans le conteneur. Heureusement, c’est facile à corriger. Installez simplement nvidia-docker et utilisez-le exactement comme docker (il n’est pas nécessaire de reconstruire l’image).

nvidia-docker run --rm cntk nvidia-smi

Cela doit fonctionner et permet CNTK d’utiliser le GPU à partir d’un conteneur Docker. Si cela ne fonctionne pas, recherchez la section Problèmes sur la GitHub nvidia-docker . De nombreuses solutions sont déjà documentées. Notez que si vos répertoires /usr et /var se trouvent dans des partitions différentes, vous aurez besoin de quelques étapes supplémentaires comme ici. Pour obtenir un interpréteur de commandes interactif dans un conteneur qui ne sera pas automatiquement supprimé une fois que vous avez quitté

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

Si vous souhaitez partager vos données et configurations entre l’hôte (votre machine ou machine virtuelle) et le conteneur dans lequel vous utilisez CNTK, utilisez l’option -v, par exemple.

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

Cela rend /project1/data de l’hôte visible en tant que /data dans le conteneur et /project1/config en tant que /config. Cette isolation réduit les chances que vos expériences conteneurisées remplacent ou utilisent des données incorrectes.