Saltar a contenido

UD00 · Taller 4 — Contenedor de prácticas de IA

Entrega · hecho / no hecho

Se entrega en Aules y se califica como hecho / no hecho: se registra en el libro de calificaciones con peso 0 —no puntúa, pero consta— y es requisito. Al terminar tendrás el entorno del curso levantado, que es el que usarás en el resto de las unidades. Sin él no se pueden hacer las prácticas de la UD02.

Objetivo: levantar un entorno Jupyter reproducible con las bibliotecas del curso.

Fase 1 — Estructura de trabajo

1
2
3
4
5
practicas/
└── docker/
    ├── docker-compose.yml
    ├── requirements-ia.txt
    └── notebooks/          ← tus notebooks: créala tú antes de arrancar

Fase 2 — requirements-ia.txt

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# torch en su versión solo CPU: sin las librerías de CUDA, varios GB menos de descarga
--extra-index-url https://download.pytorch.org/whl/cpu
numpy
pandas
matplotlib
scikit-learn
scikit-fuzzy
nltk
spacy
torch

¿Y experta?

No va en este fichero: exige frozendict==1.2, y en esta imagen esa versión rompe el propio conda, que necesita la 2.x. Se instala aparte, sin dependencias, en la primera celda de código del notebook N01 (fase 5). El porqué está en el apartado 6.5 de los apuntes.

Fase 3 — docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  jupyter:
    image: quay.io/jupyter/scipy-notebook
    ports:
      - "8888:8888"
    volumes:
      - ./notebooks:/home/jovyan/work
      - ./requirements-ia.txt:/home/jovyan/requirements-ia.txt:ro
    environment:
      - JUPYTER_TOKEN=cursoia

La imagen está en quay.io, no en Docker Hub

Las imágenes jupyter/* de Docker Hub dejaron de actualizarse en 2023: el proyecto Jupyter publica ahora en quay.io/jupyter/…. Escribe el nombre completo, con el prefijo quay.io/.

Fase 4 — Verifica la configuración antes de arrancar

1
docker compose config

Comprueba que el puerto 8888:8888 y el token quedan resueltos correctamente.

Fase 5 — Arranca Jupyter

1
2
docker compose up -d
docker compose ps

Abre en el navegador http://localhost:8888 y usa el token cursoia.

El contenedor se para nada más arrancar (Exited (1))

Mira el motivo con docker compose logs jupyter. Si aparece un tarfile.ReadError: empty file o cualquier error al leer un fichero de /opt/conda, la imagen se descargó mal (descarga interrumpida o disco lleno). El fallo está en la imagen, no en tu docker-compose.yml: bórrala y descárgala de nuevo.

1
2
3
4
docker compose down
docker image rm quay.io/jupyter/scipy-notebook
docker compose pull
docker compose up -d

Para comprobar el entorno usa el notebook N01 · Bienvenida al entorno Python para IA: descárgalo en tu carpeta notebooks/ y ábrelo desde la carpeta work de Jupyter. No se entrega, pero es el que demuestra que el entorno funciona.

La imagen ya trae numpy, pandas, matplotlib y scikit-learn; el resto de bibliotecas del curso las instala su primera celda de código, a partir del requirements-ia.txt que el compose monta en /home/jovyan (un nivel por encima de work):

1
2
3
4
5
6
7
import os

if os.path.exists("../requirements-ia.txt"):   # contenedor del taller 4
    %pip install -q -r ../requirements-ia.txt
else:                                          # Colab u otro entorno
    %pip install -q scikit-fuzzy nltk spacy torch
%pip install -q --no-deps experta schema frozendict

La primera vez tarda unos minutos (torch y spacy pesan); si ya están instaladas, pip lo comprueba en unos segundos. La última línea instala experta sin dejar que baje frozendict a la 1.2. El aviso «you may need to restart the kernel» solo importa si alguna biblioteca ya estaba importada antes de instalarla; en ese caso, Kernel → Restart Kernel y sigue.

La celda siguiente importa todas las bibliotecas y muestra sus versiones: si no da ningún error, el entorno está listo.

Los paquetes viven en el contenedor, no en la imagen

Lo que instala %pip desaparece con docker compose down, porque el siguiente up crea un contenedor nuevo a partir de la imagen. Tus notebooks no se pierden (están en notebooks/): basta con volver a ejecutar la celda de instalación del N01. stop y start no borran el contenedor y conservan lo instalado.

Nota para spacy

Algunos modelos de spacy se descargan aparte (python -m spacy download es_core_news_sm). Lo veremos en la UD03.

Fase 6 — Gestiona el servicio

1
2
3
4
5
docker compose logs -f jupyter     # sigue los logs (Ctrl+C para salir)
docker compose exec jupyter bash   # entra dentro del contenedor en marcha
docker compose stop                # lo detiene sin borrarlo (conserva lo instalado)
docker compose start               # lo vuelve a arrancar
docker compose down                # detiene y elimina (hay que reinstalar los paquetes)

Fase 7 — Persistencia (volúmenes nombrados)

Modifica el docker-compose.yml para que la carpeta de Jupyter use un volumen nombrado y comprueba que tus notebooks sobreviven a un down + up:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
services:
  jupyter:
    image: quay.io/jupyter/scipy-notebook
    ports:
      - "8888:8888"
    volumes:
      - jupyter-work:/home/jovyan/work
      - ./requirements-ia.txt:/home/jovyan/requirements-ia.txt:ro
    environment:
      - JUPYTER_TOKEN=cursoia

volumes:
  jupyter-work:

Entrega

Sube a la tarea T04 · Contenedor de prácticas de IA de Aules un único fichero PDF con:

  • la memoria con las evidencias pedidas en el apartado «Entrega» (capturas de las fases 5 y 7, salida de docker compose ps y la respuesta razonada).

Aules solo acepta un PDF en esta tarea. El plazo acaba a las 23:59 del día que marca la tarea; después la tarea se cierra y ya no admite entregas.

Qué tiene que verse en la memoria

  1. Captura de la fase 5 de este taller (Jupyter abierto con el import correcto).
  2. Salida de docker compose ps mostrando el servicio activo.
  3. Respuesta a: ¿por qué este entorno es reproducible en cualquier equipo?
  4. Captura de la fase 7 mostrando que un notebook sobrevive a docker compose down.

Soluciones

Las soluciones no se publican: se corrigen y comentan en clase.


Volver a la UD00 · Ejercicios · Taller 3