Curso de redes neuronales LCC@UNISON
81
Para el curso, se preparó una imagen en docker. Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos (la definición la copié de la Wikipedia, por supuesto).
Vamos a describir como instalar y probar docker. Después vamos a ver cómo cargar la imagen del curso y generar un contenedor particular. Este contenedor es el que vamos a estar activando cada vez que queramos hacer algún ejercicio del curso.
También es posible utilizar la imagen para crear nuevos contenedores con otras aplicaciones de redes neuronales, ya que viene con la mayoría de las herramientas preinstaladas que se utilizan.
La imagen que se generó para el curso se encuentra
aquí. Si quieres saber
cómo se construyó la imagen, en este
archivo
se encuentran el Dockerfile que utilicé para generarla.
Para instalar docker vas a requerir darte de alta. No te preocupes, solamente es para abrir un espacio donde puedas publicar y compartir tus imágenes cuando generes algunas. Para la instalación te pide que le des acceso como administrador (algo típico en este tipo de instalaciones).
Si tienes Mac: https://docs.docker.com/docker-for-mac/install/
Si tienes Ubuntu: https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ (puedes buscar aquí para otras distribuciones de Linux).
Si tienes Windows (64bit Windows 10 Pro, Enterprise o Education): https://docs.docker.com/docker-for-windows/install/
Si tienes una versión viejita de Windows: https://docs.docker.com/toolbox/toolbox_install_windows/
Sólo sigue las instrucciones. Una vez instalado vamos a probar que la instalación se hizo correctamente. Para esto hay que abrir la aplicación de terminal favorita que tengas (en Windows viene en el menú de docker).
Vamos a preguntar primero por la versión de docker
$ docker --version
y si nos devuelve algo como
Docker version 18.03.0-ce, build 0520e24
entonces estamos listos para cargar una imagen, aunque sea pequeña. Vamos a cargar la imagen de prueba con el comando:
$ docker pull hello-world
Y carga una imagen que se usa para probar la instalación. Si la imagen se cargo bien entonces se puede crear un contenedor al ejecutar la imagen
$ docker run hello-world
Ahora vamos a cargar una imagen que tenga sentido, por ejemplo una distribución mínima de linux con nada instalado (esta es una base bastante normal para construir imágenes más complejas).
$ docker pull ubuntu
y vamos a ejecutarla en modo interactivo (con el fin que tengamos acceso a la terminal).
$ docker run -it --name mi_ubuntu ubuntu:latest
Acabamos de crear un contenedor llamado mi_ubuntu, basado en la
imagen ubuntu:latest y la cual opera en forma interactiva con una
terminal (-it). Para salir de la sesión en tu nueva máquina virtual
simplemente utiliza en la sesión Ctrl-d que es el comando clásico.
El contenedor seguirá existiendo y todo lo que se modificó internamente (y los archivos que se creen dentro) seguirán existiendo. Para regresar a tu contenedor sólo tienes que teclear el comando
$ docker start -i mi_ubuntu
Podemos revisar las imagenes que tenemos con
$ docker image ls
así como los contenedores que se encuentran activos en el momento
$ docker container ls
y todos los contenedores
$ docker container ls -a
Por último, se pueden borrar los contenedores y las imágenes que ya no
estemos utilizando, primero los contenedores que tienen dependencia y
luego las imágenes. Por ejemplo, para borrar el contenedor, y la
imagen de ubuntu hay que teclear
$ docker container rm mi_ubuntu
$ docker image rm ubuntu:latest
Si no te deja borrar la imagen, entonces revisa si hay otros contenedores que dependan de la imagen. Cuando no queden contenedores ligados a la imagen, entonces la puedes borrar.
Para obtener la imagen más reciente del curso hay que ejecutar
docker pull juliowaissman/rn-unison:cpu-jupyter
Esta imagen contiene la distribución de Linux Ubuntu 16.04 con todos
los programas y dependencias que se necesitan para el curso.
Esta imagen funciona solamente con CPU, e instala el entorno de jupyter
para programación literal (o investigación reproducible). Próximamente voy
a agregar una imagen (con sus instrucciones) para instalar una imagen similar pero
para una computadora con GPUs.
La imagen completa toma aproximadamente 2GB, lo que hace que se tarde un poco en su descarga. Si tienes un proveedor de internet como el mío que cuando detecta una descarga grande empieza a bloquearte, no te preocupes, la imagen se descarga por partes y cuando reinicies el comando, continúa con la descarga donde la dejaste.
Si te aparece el error "Got permission denied while trying to connect
to the Docker daemon socket..." necesitas agregarte como usuario al
grupo docker (en algunos Linux con mucha proteción). Para eso
ejecuta:
sudo usermod -a -G docker $USER
sudo service docker restart
y luego realiza logout y login al sistema operativo como usuario.
Para el curso vamos a generar un contenedor, el cual libere el puerto 8080 (para poder ejecutar las libretas de jupyter), que funciones en forma interactiva, y que tenga un punto de montaje, lo que permite tener carpetas que son visibles tanto en el contenedor como fuera de él.
Para Linux y OSX, hay que crear una carpeta donde pondremos nuestro
curso (i.e. libretas), y estando en esa carpeta en la linea de
comando ejecutar:
docker run -it --user $(id -u):$(id -g) -p 8080:8080 --name rn-unison -v $PWD:/rn-unison/libretas juliowaissman/rn-unison:cpu-jupyter
Esto crea un contenedor interactivo (-it) que accede al puerto 8080 (-p 8080:8080) que se va a llamar rn-unison, en el que vamos a
montar la direccion $PWD (directorio actual) en la dirección (dentro
del directorio) /rn-unison/libretas. El contenedor se basa en la imagen
juliowaissman/rn-unison:cpu-jupyter. Al estar montado el volumen como externo
(esto es, la carpeta rn-unison se va a compartir entre el contenedor y tu computadora)
en Linux y MacOS es importante que el usuario y grupo sean el mismo dentro y fuera
del contenedor, si no, todo lo que crees en el contenedor, por fuera de este los
archivos pertenecerían al usuario root con todos los problemas que eso pueda implicar.
Para Windows, es necesario hacer algo ligeramente diferente. El comando es:
docker run -it -p 8080:8080 --name curso-pln --user root -v /c/Users/$USUARIO:/root/curso-pln juliowaissman/pln-unam:latest
donde /c/Users/$USUARIO es el camino a la carpeta home del usuario
que tienes.
Esto por supuesto que lo copié, porque hace más de 15 años que no uso Windows. Si el procedimiento no es el correcto, les pido a los usuarios de windows que lo revisen y en su caso lo corrijan.
Para detener el contenedor, simplemente salr de la sesión con
Ctrl-d. Para regresar al contenedor, simplemente
docker start -i curso-pln
y lo puedes iniciar donde sea, ya que el punto de montaje ya está establecido.
Para probar si funciona, vamos a verificar que se pueda ejecutar
correctamente una libreta de jupyter. Para esto, desde el contenedor
ejecutar
root@5ccdd4f5afa5:~# run_notebook
y en tu navegador de preferencia ir a la dirección
http://localhost:8080 donde tiene que aparecer la página inicial de
tu servidor jupyter que es algo como esto:

Si no funciona, existen varias cosas por probar:
Si el comando run_notebook está ejecutándose pero no la ves en el
navegador, intenta con las direcciones "http://localhost:8080" o
"http://127.0.0.1:8080". Si tampoco funciona, revisa en la
configuración de tu navegador si tienes un proxy en el puerto
8080.
Si estás usando Docker Toolbox en Windows, usa la dirección "http://192.168.99.100:8080".
Si el comando run_notebook no se ejecuta por falta de memoria, es
debido a las limitaciones de 2Gb de memoria que impone docker por
default a los contenedores en Windows y MacOS. También puede ser
una causa de error si tu computadora tiene menos de 2Gb de RAM. En
ambos casos, debes modificar el límite de uso de memoria.
Para parar el servidor de jupyter, hay que ir a la línea de comando
y teclear Ctrl-c dos veces. A partir de aquí-, simplemente sale uno
del contenedor, como vimos anteriormente, con Ctrl-d.
El contenedor también puede ejecutar scripts de python, puedes compilar
con gcc, incluye varias herramientas de CLI, y sobre todo, viene cargado con
un arma secreta: vim.
Content type
Image
Digest
Size
801 MB
Last updated
almost 8 years ago
docker pull juliowaissman/rn-unison:cpu-jupyter