Ciencia de datos con JupyterLab
Docker y JupyterLab son dos herramientas potentes que pueden mejorar tu flujo de trabajo en la ciencia de datos. En esta guía, aprenderás a usarlas juntas para crear y ejecutar entornos de ciencia de datos reproducibles. Esta guía se basa en Supercharging AI/ML Development with JupyterLab and Docker.
En esta guía, aprenderás a:
- Ejecutar un Servidor Jupyter personal con JupyterLab en tu máquina local
- Personalizar tu entorno de JupyterLab
- Compartir tu cuaderno y entorno de JupyterLab con otros científicos de datos
¿Qué es JupyterLab?
JupyterLab es una aplicación de código abierto construida en torno al concepto de un documento de cuaderno computacional. Permite compartir y ejecutar código, procesar datos, visualizar y ofrece una variedad de características interactivas para crear gráficos.
¿Por qué usar Docker y JupyterLab juntos?
Al combinar Docker y JupyterLab, puedes beneficiarte de las ventajas de ambas herramientas, como:
- La contenerización asegura un entorno de JupyterLab coherente en todos los despliegues, eliminando los problemas de compatibilidad.
- JupyterLab contenerizado simplifica el intercambio y la colaboración al eliminar la necesidad de configurar el entorno de forma manual.
- Los contenedores ofrecen escalabilidad para JupyterLab, admitiendo la distribución de cargas de trabajo y la gestión eficiente de recursos con plataformas como Kubernetes.
Requisitos previos
Para seguir esta guía, debes instalar la última versión de Docker Desktop.
Ejecutar y acceder a un contenedor JupyterLab
En una terminal, ejecuta el siguiente comando para iniciar tu contenedor JupyterLab.
$ docker run --rm -p 8889:8888 quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
A continuación se detallan las partes más destacables del comando:
-p 8889:8888: Mapea el puerto 8889 del host al puerto 8888 del contenedor.start-notebook.py --NotebookApp.token='my-token': Establece un token de acceso en lugar de utilizar uno aleatorio.
Para más detalles, consulta las opciones del Servidor Jupyter y la referencia de CLI de docker run.
Si es la primera vez que ejecutas la imagen, Docker la descargará y la iniciará. El tiempo que tarde en descargarse variará en función de tu conexión de red.
Una vez que la imagen se descargue y se ejecute, podrás acceder al contenedor. Para hacerlo, abre un navegador web y navega a localhost:8889/lab?token=my-token.
Para detener el contenedor, presiona ctrl+c en la terminal.
Para acceder a un cuaderno existente en tu sistema, puedes usar un montaje de tipo bind. Abre una terminal y cambia al directorio donde se encuentra tu cuaderno. Luego, ejecuta el comando correspondiente según tu sistema operativo.
$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "%cd%":/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
$ docker run --rm -p 8889:8888 -v "/$(pwd):/home/jovyan/work" quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
La opción -v le indica a Docker que monte tu directorio de trabajo actual en
/home/jovyan/work dentro del contenedor. Por defecto, el directorio raíz de la
imagen de Jupyter es /home/jovyan y solo puedes acceder o guardar cuadernos en ese
directorio en el contenedor.
Ahora puedes acceder a localhost:8889/lab?token=my-token y abrir cuadernos incluidos en el directorio montado.
Para detener el contenedor, presiona ctrl+c en la terminal.
Docker también tiene volúmenes, que son el mecanismo preferido para persistir los datos generados y utilizados por los contenedores de Docker. Mientras que los montajes de tipo bind dependen de la estructura de directorios y del sistema operativo de la máquina host, los volúmenes son gestionados completamente por Docker.
Guardar y acceder a cuadernos
Al eliminar un contenedor, se borran todos los datos que contiene. Para guardar cuadernos fuera del contenedor, puedes usar un volumen.
Ejecutar un contenedor JupyterLab con un volumen
Para iniciar el contenedor con un volumen, abre una terminal y ejecuta el siguiente comando:
$ docker run --rm -p 8889:8888 -v jupyter-data:/home/jovyan/work quay.io/jupyter/base-notebook start-notebook.py --NotebookApp.token='my-token'
La opción -v le indica a Docker que cree un volumen llamado jupyter-data y lo monte en el contenedor en /home/jovyan/work.
Para acceder al contenedor, abre un navegador web y navega a localhost:8889/lab?token=my-token. Ahora los cuadernos se pueden guardar en el volumen y estarán accesibles incluso si se elimina el contenedor.
Guardar un cuaderno en el volumen
Para este ejemplo, utilizarás el ejemplo del Conjunto de datos Iris de scikit-learn.
Abre un navegador web y accede a tu contenedor JupyterLab en localhost:8889/lab?token=my-token.
En el Launcher (Lanzador), en Notebook, selecciona Python 3.
En el cuaderno, especifica lo siguiente para instalar los paquetes necesarios:
!pip install matplotlib scikit-learnSelecciona el botón de reproducción (play) para ejecutar el código.
En el cuaderno, especifica el siguiente código:
from sklearn import datasets iris = datasets.load_iris() import matplotlib.pyplot as plt _, ax = plt.subplots() scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target) ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1]) _ = ax.legend( scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes" )Selecciona el botón de reproducción para ejecutar el código. Deberías ver un gráfico de dispersión del conjunto de datos Iris.
En el menú superior, selecciona File (Archivo) y luego Save Notebook (Guardar cuaderno).
Especifica un nombre en el directorio
workpara guardar el cuaderno en el volumen. Por ejemplo,work/mynotebook.ipynb.Selecciona Rename (Renombrar) para guardar el cuaderno.
El cuaderno ya está guardado en el volumen.
En la terminal, presiona ctrl+ c para detener el contenedor.
Ahora, cada vez que ejecutes un contenedor Jupyter con el volumen, tendrás acceso al cuaderno guardado.
Cuando inicies un contenedor nuevo y vuelvas a ejecutar el código del gráfico de datos, será
necesario ejecutar !pip install matplotlib scikit-learn y descargar los paquetes.
Puedes evitar reinstalar los paquetes cada vez que ejecutes un nuevo contenedor creando
tu propia imagen con los paquetes ya instalados.
Personalizar tu entorno de JupyterLab
Puedes crear tu propio entorno de JupyterLab y construirlo en una imagen utilizando Docker. Al construir tu propia imagen, puedes personalizar tu entorno de JupyterLab con los paquetes y herramientas que necesitas, y asegurarte de que sea coherente y reproducible en diferentes despliegues. Construir tu propia imagen también facilita compartir tu entorno de JupyterLab con otros o usarlo como base para un desarrollo posterior.
Definir tu entorno en un Dockerfile
En el ejemplo anterior del conjunto de datos Iris de Guardar un cuaderno en el volumen, tuviste que instalar las dependencias matplotlib y scikit-learn cada vez que ejecutabas un nuevo contenedor. Aunque las dependencias de ese pequeño ejemplo se descargan e instalan rápidamente, esto puede convertirse en un problema a medida que crezca tu lista de dependencias.
También es posible que desees tener siempre otras herramientas, paquetes o archivos en tu
entorno.
En este caso, puedes instalar las dependencias como parte del entorno en la imagen. De este modo, cada vez que ejecutes el contenedor, las dependencias ya estarán instaladas.
Puedes definir tu entorno en un Dockerfile. Un Dockerfile es un archivo de texto que indica a Docker cómo crear una imagen de tu entorno de JupyterLab. Una imagen contiene todo lo que quieres y necesitas al ejecutar JupyterLab, como archivos, paquetes y herramientas.
En el directorio de tu elección, crea un nuevo archivo de texto llamado Dockerfile. Abre el Dockerfile en un IDE o editor de texto y agrega el siguiente contenido.
# syntax=docker/dockerfile:1
FROM quay.io/jupyter/base-notebook
RUN pip install --no-cache-dir matplotlib scikit-learnEste Dockerfile utiliza la imagen quay.io/jupyter/base-notebook como base y luego ejecuta pip para instalar las dependencias. Para obtener más detalles sobre las instrucciones del Dockerfile, consulta la
referencia de Dockerfile.
Antes de continuar, guarda tus cambios en el Dockerfile.
Construir tu entorno en una imagen
Una vez que tengas un Dockerfile para definir tu entorno, puedes usar docker build para construir una imagen con él.
Abre una terminal, cambia al directorio donde se encuentra tu Dockerfile y ejecuta
el siguiente comando:
$ docker build -t my-jupyter-image .
El comando construye una imagen de Docker a partir de tu Dockerfile y un contexto. El
opción -t especifica el nombre y la etiqueta de la imagen, en este caso
my-jupyter-image. El . indica que el directorio actual es el contexto,
lo que significa que los archivos de ese directorio se pueden usar en el proceso de creación
de la imagen.
Puedes verificar que la imagen se construyó viendo la vista Images (Imágenes) en Docker Desktop, o ejecutando el comando docker image ls en una terminal. Deberías ver una imagen llamada my-jupyter-image.
Ejecutar tu imagen como un contenedor
Para ejecutar tu imagen como un contenedor, utiliza el comando docker run. En el
comando docker run, especificarás tu propio nombre de imagen.
$ docker run --rm -p 8889:8888 my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
Para acceder al contenedor, abre un navegador web y navega a localhost:8889/lab?token=my-token.
Ahora puedes usar los paquetes sin tener que instalarlos en tu cuaderno.
En el Launcher (Lanzador), en Notebook, selecciona Python 3.
En el cuaderno, especifica el siguiente código:
from sklearn import datasets iris = datasets.load_iris() import matplotlib.pyplot as plt _, ax = plt.subplots() scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target) ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1]) _ = ax.legend( scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes" )Selecciona el botón de reproducción para ejecutar el código. Deberías ver un gráfico de dispersión del conjunto de datos Iris.
En la terminal, presiona ctrl+ c para detener el contenedor.
Usar Compose para ejecutar tu contenedor
Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor.
En este caso, la aplicación no es una aplicación de múltiples contenedores, pero Docker
Compose puede facilitar su ejecución al definir todas las opciones de docker run en un
archivo.
Crear un archivo Compose
Para usar Compose, necesitas un archivo compose.yaml. En el mismo directorio que tu
Dockerfile, crea un nuevo archivo llamado compose.yaml.
Abre el archivo compose.yaml en un IDE o editor de texto y agrega el siguiente
contenido.
services:
jupyter:
build:
context: .
ports:
- 8889:8888
volumes:
- jupyter-data:/home/jovyan/work
command: start-notebook.py --NotebookApp.token='my-token'
volumes:
jupyter-data:
name: jupyter-dataEste archivo Compose especifica todas las opciones que utilizaste en el comando docker run. Para más detalles sobre las instrucciones de Compose, consulta la
referencia del archivo Compose.
Antes de continuar, guarda tus cambios en el archivo compose.yaml.
Ejecutar tu contenedor usando Compose
Abre una terminal, cambia al directorio donde se encuentra tu archivo compose.yaml y ejecuta el siguiente comando:
$ docker compose up --build
Este comando construye tu imagen y la ejecuta como un contenedor utilizando las instrucciones
especificadas en el archivo compose.yaml. La opción --build asegura que tu
imagen se reconstruya, lo cual es necesario si realizaste cambios en tu Dockerfile.
Para acceder al contenedor, abre un navegador web y navega a localhost:8889/lab?token=my-token.
En la terminal, presiona ctrl+ c para detener el contenedor.
Compartir tu trabajo
Al compartir tu imagen y cuaderno, creas un entorno de investigación portátil y replicable al que otros científicos de datos pueden acceder y utilizar fácilmente. Este proceso no solo facilita la colaboración, sino que también asegura que tu trabajo se conserve en un entorno donde se pueda ejecutar sin problemas de compatibilidad.
Para compartir tu imagen y tus datos, utilizarás Docker Hub. Docker Hub es un servicio de registro en la nube que te permite compartir y distribuir imágenes de contenedores.
Compartir tu imagen
Regístrate o inicia sesión en Docker Hub.
Renombra tu imagen para que Docker sepa a qué repositorio debe subirla. Abre una terminal y ejecuta el siguiente comando
docker tag. ReemplazaTU-ID-DOCKERcon tu ID de Docker.$ docker tag my-jupyter-image TU-ID-DOCKER/my-jupyter-imageEjecuta el siguiente comando
docker pushpara subir la imagen a Docker Hub. ReemplazaTU-ID-DOCKERcon tu ID de Docker.$ docker push TU-ID-DOCKER/my-jupyter-imageVerifica que hayas subido la imagen a Docker Hub.
- Ve a Docker Hub.
- Selecciona My Hub > Repositories.
- Revisa la hora de Last pushed (Última publicación) de tu repositorio.
Otros usuarios ahora pueden descargar y ejecutar tu imagen usando el comando docker run. Deben reemplazar TU-ID-DOCKER con tu ID de Docker.
$ docker run --rm -p 8889:8888 TU-ID-DOCKER/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
Compartir tu volumen
Este ejemplo utiliza la interfaz gráfica de usuario de Docker Desktop. Alternativamente, en la interfaz de línea de comandos puedes respaldar el volumen y luego subirlo usando la CLI de ORAS.
- Inicia sesión en Docker Desktop.
- En el panel de control (Dashboard) de Docker, selecciona Volumes.
- Selecciona el volumen jupyter-data haciendo clic en su nombre.
- Selecciona la pestaña Exports (Exportaciones).
- Selecciona Quick export (Exportación rápida).
- En Location (Ubicación), selecciona Registry (Registro).
- En el cuadro de texto bajo Registry, especifica tu ID de Docker, un nombre para el
volumen y una etiqueta. Por ejemplo,
TU-ID-DOCKER/jupyter-data:latest. - Selecciona Save (Guardar).
- Verifica que hayas exportado el volumen a Docker Hub.
- Go to Docker Hub.
- Selecciona My Hub > Repositories.
- Revisa la hora de Last pushed (Última publicación) de tu repositorio.
Otros usuarios ahora pueden descargar e importar tu volumen. Para importar el volumen y luego ejecutarlo con tu imagen:
Inicia sesión en Docker Desktop.
En el panel de control (Dashboard) de Docker, selecciona Volumes.
Selecciona Create (Crear) para crear un nuevo volumen.
Especifica un nombre para el nuevo volumen. Para este ejemplo, usa
jupyter-data-2.Selecciona Create.
En la lista de volúmenes, selecciona el volumen jupyter-data-2 haciendo clic en su nombre.
Selecciona Import (Importar).
En Location, selecciona Registry.
En el cuadro de texto bajo Registry, especifica el mismo nombre del repositorio al que exportaste tu volumen. Por ejemplo,
TU-ID-DOCKER/jupyter-data:latest.Selecciona Import.
En una terminal, ejecuta
docker runpara iniciar tu imagen con el volumen importado. ReemplazaTU-ID-DOCKERcon tu ID de Docker.$ docker run --rm -p 8889:8888 -v jupyter-data-2:/home/jovyan/work TU-ID-DOCKER/my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
Resumen
En esta guía, aprendiste cómo aprovechar Docker y JupyterLab para crear entornos de ciencia de datos reproducibles, facilitando el desarrollo y el intercambio de proyectos de ciencia de datos. Esto incluyó la ejecución de un servidor personal de JupyterLab, la personalización del entorno con las herramientas y paquetes necesarios, y el intercambio de cuadernos y entornos con otros científicos de datos.
Información relacionada: