Empieza a trabajar con Theano en una máquina virtual (VirtualBox) con Ubuntu y Docker sin perder tiempo

Esta información puede resultar de interés general, pero especialmente a aquellos que, como yo, estáis cursando el Máster en Business Analytics y Big Data UCJC de IMF Business School, en el caso de que no trabajéis habitualmente con Theano y Jupyter notebook.

Para avanzar con el contenido del Módulo III (Aprendizaje Automático Aplicado), y tras terminar las prácticas de ingeniería de características y selección de modelos, debemos abordar la Unidad 6 (Modelos conexionistas).

Tal como explica len el capítulo 3.1 (Introducción a Theano), es necesario tener configurado el ecosistema Python, Jupyter notebook y Theano. Una alternativa al procedimiento descrito en la documentación es descargar una máquina virtual con Ubuntu y Docker, e importarla en Virtual Box. Posteriormente, es fácil y rápido lanzar un contenedor con todo lo necesario configurado y listo para utilizase.

Yo estoy habituado a crear máquinas virtuales, no tanto a descargarlas, pero para quien quiera practicar con Theano, sin perder tiempo, os he compartido esta

Imagen (Docker) con Ubuntu, Python3, Jupyter notebook y Theano

que podéis descargar de Docker Hub.

Los pasos para dejarla completamente up&running son los siguientes:

0. El prerequisito es tener una máquina virtual de Ubuntu (Virtual Box) con Docker instalado y funcionando. Si no te sientes cómodo con esta parte, tal vez esto puede ayudarte.

1. Arrancar el contenedor Docker de la imagen, mediante el comando

sudo docker run -it --rm theano-morales4dev:1.0 bash

2. Una vez arrancado el contenedor y (con ayuda de otra sessión de shell, con MobaXterm) situados en la máquina (virtual) anfitrion, tenemos que averiguar la dirección ip del contenedor, con el comando:

sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <docker-container-id>

(obvio) sustituyendo <docker-container-id> por el identificador del contenedor arrancado. Supongamos que la ip es 172.17.0.2

3. Situados en la shell del contenedor (iniciada en el punto 1) podemos arrancar jupyter con el comando

jupyter notebook --ip <Docker_container_IP_ADDRESS> --allow-root

(obvio) sustituyendo <Docker_container_IP_ADDRESS> por la dirección que obtuvimos en el punto 2, según el ejemplo 172.17.0.2

4. Finalmente, desde la máquina (virtual) anfitrion, iniciamos el navegador web y apuntamos la URL provista por Jupyter notebook en el log de arranque. Por supuesto, si tu máquina (virtual) anfitrion (esto es, donde tienes instalado docker) tiene las X11 instaladas. Si no, como es nuestro caso, debes establecer el valor de la variable de entorno DISPLAY de esta manera

export DISPLAY=<YOUR_MobaXterm_MACHINE_IP_ADDRESS>:0.0

Por ejemplo, en nuestro caso:

export DISPLAY=192.168.1.115:0.0

y habilitar la característica "SSH X11 Forwarding Display" en MobaXterm.

En este momento ya es posible crear un nuevo cuaderno de Jupyter, y probar un ejemplo con theano:

import theano  
import theano.tensor as T

x = T.scalar('x')  
y = T.scalar('y')

z = x * y

f = theano.function(inputs = [x, theano.In(y, value = 3)], outputs = z)

print(f(10))  

obteniendo el resultado

30  

Si tienes alguna duda, no dudes en ponerte en contacto, intentaré resolvértela via mail en cuanto tenga tiempo, o en el peor de los casos, si se pone difícil, podría echarte una mano vía TeamViewer.

Espero que pueda servir de ayuda a alguien. Sobre esta máquina voy a completar mis prácticas de Theano. Suerte con las tuyas.

NOTA: La creación de esta imagen ha sido fácil, como sabéis lo más complicado de copiar es elegir una buena fuente. En este caso hemos construido la imagen sobre

gw000/keras:2.1.4-py3

la cual ya tenía casi todo lo necesario.

Prácticamente solo faltaba:

  • Instalar Jupiter notebook
  • Instalar Theano
  • Configurar el (no) uso de la GPU mediante THEANO_FLAGS, y por supuesto,
  • subir la imagen al Docker Hub.

Alberto Morales Morales

Software craftsman. Passion for developing quality code that can be proud of. Happily married.

Madrid, Spain.