Share via


contenedores de Docker de CNTK

Puede configurar CNTK como contenedor de Docker en el sistema Linux.

Hay dos maneras de usar CNTK contenedores de Docker:

Uso de imágenes de CNTK publicadas en Docker Hub

Hospedamos imágenes de CNTK públicas en Docker Hub. Consulte la lista completa de imágenes disponibles en CNTK página Repositorios en Docker Hub. Actualmente solo hospedamos configuraciones en tiempo de ejecución . La configuración en tiempo de ejecución corresponde a un entorno con CNTK paquete binario instalado y configurado. Esta configuración no contiene CNTK código fuente ni los requisitos previos necesarios para compilar CNTK.

Tenga en cuenta que necesita NVIDIA Docker para usar CNTK imágenes habilitadas para GPU.

Los comandos estándar de Docker se usan para obtener la imagen:

docker pull mcr.microsoft.com/cntk/release

para obtener la imagen de versión oficial más reciente, que hoy significa la configuración más reciente del entorno de ejecución de GPU disponible. También puede obtener la imagen de desarrollo más reciente nocturna:

docker pull mcr.microsoft.com/cntk/nightly

Para obtener una configuración específica, debe agregar una etiqueta. Por ejemplo,

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

obtendrá CNTK configuración del entorno de ejecución de CPU 2.7 configurado para Python 3.5.

Si no está familiarizado con Docker, lea las secciones siguientes en esta página.

Uso del contenedor de Docker para ejecutar tutoriales de CNTK Jupyter Notebook

Puede usar CNTK contenedores de Docker para ejecutar CNTK cuadernos de Jupyter Notebook en el entorno local.

Se supone que ya ha extraído las imágenes necesarias de Docker Hub. En el ejemplo siguiente usaremos la configuración de GPU. Si usa la configuración de CPU, en los comandos siguientes, reemplace todas las repeticiones de nvidia-docker por docker.

En primer lugar, cree e inicie un contenedor de CNTK en modo desasociado con el puerto IP expuesto (usamos el puerto 8888 predeterminado para Jupyter Notebook aplicación):

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

Ahora, inicie Jupyter Notebook servidor en el contenedor de 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"

En el terminal, verá la salida de la consola del servidor de Jupyter Notebooks. Esta salida contendrá una línea similar a la siguiente:
http://0.0.0.0:8888/?token=082684fbe2b43eebd72583c301c05072084173d0ac06a4d7

Copie el token mostrado (en nuestro ejemplo 082684fbe2b43eebd72583c301c05072084173d0ac06a4d7).

Ahora puede acceder a CNTK cuadernos de Jupyter Notebook mediante la dirección IP de la máquina donde se ejecuta el contenedor de Docker. Es decir, si la dirección de la máquina es 192.168.1.1 acceder a CNTK Notebooks, abra una ventana del explorador y vaya a http://192.168.1.1:8888.

Tenga en cuenta que durante la primera ejecución Jupyter Notebook aplicación solicitará una contraseña o token. Use el token que ha guardado anteriormente.

Para detener la secuencia de envío Ctrl-C del servidor Jupyter Notebook en el terminal en el que tiene la salida de la consola del servidor de Jupiter Notebook y confirmar el cierre del servidor. Tenga en cuenta que no detendrá el propio contenedor de Docker. Para detener el contenedor, use el comando :
docker stop cntk-jupyter-notebooks

ADVERTENCIA Los comandos anteriores expondrán la aplicación jupyter Notebooks a todos los usuarios que puedan acceder a la dirección IP de la máquina donde se ejecuta el contenedor de Docker.

Creación de imágenes de Docker de CNTK

Puede compilar y ejecutar CNTK con el mismo contenedor y se trata de un enfoque recomendado para reproducir nuestra configuración de referencia.

En primer lugar, debe instalar Docker. Se recomienda encarecidamente seguir el proceso de instalación en la documentación oficial de Docker. Las versiones que vienen con la distribución de Linux podrían estar obsoletas y no funcionarán con nvidia-docker (lo que es posible que tenga que instalar además de Docker si planea compilar y ejecutar la imagen de GPU desde dentro del mismo contenedor). También debe seguir las instrucciones de la sección opcional titulada creación de un grupo de Docker.

Los archivos de Docker correspondientes se encuentran en el repositorio de CNTK enhttps://github.com/Microsoft/CNTK/tree/release/latest/Tools/docker

Para compilar una imagen de Docker con CNTK y todas sus dependencias, simplemente clone el repositorio de CNTK, vaya a CNTK/Tools/docker y use el Dockerfile desde el que quiere compilar (CPU o GPU). Por ejemplo, para compilar la imagen de Docker de GPU de CNTK, ejecute:

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

El -f <path/to/Dockerfile> argumento es necesario porque algunas revisiones, comunes para dockerfiles de CPU y GPU, deben aplicarse en el código fuente de SWIG. Si recibe errores que dicen Could not resolve 'archive.ubuntu.com' que tendrá que proporcionar a Docker las direcciones IP de los servidores DNS. En primer lugar, busque las direcciones IP de los servidores DNS mediante, por ejemplo, el comando .

nm-tool

o el comando

nmcli dev show

Supongamos que las direcciones IP de los servidores DNS son a.b.c.d y x.y.z.w. Entonces

  • en Ubuntu 15.10 y versiones posteriores (u otro Linux que usa systemd) modifique /lib/systemd/system/docker.service para que el demonio de Docker se inicie con las opciones adicionales. --dns a.b.c.d --dns x.y.z.w
  • en Ubuntu 15.04 y versiones anteriores (u otro Linux que no usa systemd) edite /etc/default/docker para que la línea
    #DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
    no se marca la marca de comentario y contiene las direcciones IP de los servidores DNS.

Nota: algunas empresas bloquean servidores DNS públicos como 8.8.8.8 y 8.8.4.4. Puede intentar usarlos, pero si el problema persiste, debe intentar usar las direcciones IP del servidor DNS notificadas por nm-tool/nmcli.

Reinicie el demonio de Docker a través de

sudo service docker restart

y elimine las imágenes de Docker que se crearon con la configuración de DNS incorrecta. Para eliminar todas las imágenes de Docker, haga

docker rmi $(docker images -q)

Para eliminar todos los contenedores de Docker, haga

docker rm $(docker ps -a -q)

Vuelva a intentarlo.

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

Si tiene una GPU, querrá probar si puede acceder a ella a través de un contenedor de Docker una vez que haya compilado la imagen. Ejecute este comando:

docker run --rm cntk nvidia-smi

Si funciona, ya ha terminado. Si no es así, significa que hay un error de coincidencia entre la versión de CUDA o los controladores instalados en el host y en la imagen de Docker de CNTK. En concreto, la discrepancia se produce entre el módulo del controlador NVidia en modo kernel y el módulo en modo de usuario (que es una biblioteca compartida) y esto sucede si la versión del host no coincide exactamente con la versión del contenedor. Afortunadamente, esto es fácil de corregir. Simplemente instale nvidia-docker y úselo exactamente igual que docker (no es necesario volver a generar la imagen).

nvidia-docker run --rm cntk nvidia-smi

Esto debería funcionar y permite que CNTK usen la GPU desde dentro de un contenedor de Docker. Si esto no funciona, busque en la sección Problemas del GitHub nvidia-docker, muchas soluciones ya están documentadas. Tenga en cuenta que si los directorios /usr y /var están en particiones diferentes, necesitará algunos pasos adicionales como aquí. Para obtener un shell interactivo en un contenedor que no se eliminará automáticamente después de salir

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

Si desea compartir los datos y las configuraciones entre el host (la máquina virtual o la máquina virtual) y el contenedor en el que usa CNTK, use la opción -v, por ejemplo.

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

Esto hará que /project1/data del host sea visible como /data en el contenedor y /project1/config como /config. Este aislamiento reduce las posibilidades de que los experimentos en contenedores sobrescriban o usen datos incorrectos.