Laboratorio de computación paralela: cómo piensa una GPU, sin GPU, en JupyterLab
Este laboratorio da a cada alumno un JupyterLab propio para las ideas en las que se apoya una GPU: una operación sobre una multitud de números, un trabajo repartido entre trabajadores, el límite de cuánto puede acelerarlo eso, un lanzamiento de bloques de hilos que encuentran cada uno su elemento, y el coste de mover datos. No hay GPU en el laboratorio. Enseña el modelo con NumPy, el multiprocessing de Python y seis scripts breves.
No es un laboratorio de ataque. Cada copia no tiene salida a internet ni a ningún otro alumno, así que nada se puede descargar en ella y nada de lo que hay en ella puede llegar a nadie más.
Lo que aprenden los alumnos
Que una sola operación de NumPy hace el trabajo de un bucle de Python sobre toda una matriz: la suma de los cuadrados del 1 al 1000 es 333833500 de las dos formas, con 2000 operaciones a nivel de Python para el bucle y 1 para NumPy. Que un trabajo se puede cortar en trozos y repartir entre dos trabajadores, y que las sumas parciales dan el mismo total. Que una parte de todo trabajo no se puede dividir: con un 10 por ciento en serie, 8 trabajadores dan 4,71 veces y ningún número de trabajadores da más de 10,0. Cómo se lanza un núcleo de GPU en bloques de hilos, cada uno calculando su elemento como bloque por tamaño del bloque más hilo, lo que ven simulado en Python sencillo. Si un trabajo está limitado por mover bytes o por hacer cuentas, a partir de un ancho de banda y una velocidad dados. Y por qué los hilos que leen números vecinos traen 1 línea de memoria donde los que saltan traen 8. Sirve para introducciones a la arquitectura de computadores, la computación paralela y de alto rendimiento y los gráficos; comprueba la formulación exacta en la unidad de tu propio organismo certificador, aquí no se cita ninguna.
Ejecútalo en tu navegador
El laboratorio arranca un solo servicio, jupyter, que escribe el cuaderno y los seis scripts en su carpeta de trabajo y está listo en unos segundos, dentro de los 512 MB que puede tener un servicio. JupyterLab no pide ningún token, porque la puerta de la plataforma ya sabe quién lo abre. El terminal junto al laboratorio no tiene Python propio, así que llega al del laboratorio con docker exec jupyter, seguido de la orden que se ejecuta dentro. No se mide ningún tiempo, así que cada script imprime lo mismo cada vez.
- Abre la página Contenedor. Abre «Crear» en la barra y elige «Ejecutar un contenedor». Cualquiera puede abrir la página, y el laboratorio de Git y el de SQL se inician sin cuenta. Todos los demás laboratorios necesitan una cuenta gratuita: crea una, inicia sesión y pulsa «Iniciar».
- Busca el laboratorio. La tarjeta «Laboratorios de ejemplo» lista todos los ejemplos. Busca JupyterLab: computación paralela sin GPU.
- Pulsa «Iniciar». «Iniciar» lo ejecuta tal cual, con una sola pulsación. «Editar el archivo primero» abre el archivo compose para que lo cambies antes de iniciarlo.
- Ábrelo. En la página del laboratorio, la barra del laboratorio tiene un enlace llamado JupyterLab: púlsalo para abrir JupyterLab en tu navegador y haz doble clic en start.ipynb. Después pulsa «Abrir terminal» y escribe docker exec jupyter python3 steps/vectors.py para ver los dos resultados iguales a 333833500, con 2000 operaciones para el bucle y 1 para NumPy.
Qué pedir a los alumnos que entreguen
Un cambio breve suyo en un script, descargado de JupyterLab con File, Download, por ejemplo otro número de trozos en chunks.py, otra parte que no se puede dividir en amdahl.py u otro tamaño de lanzamiento en kernel.py. Después una o dos frases, con sus propias palabras, sobre qué se movió y por qué. Nada se corrige automáticamente: la frase muestra si se entendió. Para un trabajo más exigente, pide que prevean los números nuevos antes de ejecutarlo y que digan qué límite, la parte en serie o la memoria, encontrarían primero en una GPU de verdad.
Una lección básica sobre este laboratorio
Parallel Computing Basics es una lección pequeña que se hace en este laboratorio. En ella el alumno lista los scripts, suma cuadrados con un bucle y con una sola operación de NumPy, reparte una suma entre dos trabajadores, lee una tabla de aceleraciones, ejecuta un lanzamiento simulado de bloques de hilos, ve cuál de dos trabajos está limitado por la memoria y después abre el mismo trabajo en el cuaderno inicial.
Es pequeña a propósito: muestra a un docente qué es una lección que se hace en un laboratorio, y el laboratorio hace el resto. Cópiala en un módulo tuyo para modificarla.
El código en GitHub
El archivo compose no tiene Dockerfile: ejecuta una sola imagen pública estándar, la scipy-notebook de los propios Jupyter Docker Stacks, fijada a una etiqueta con fecha, con su propia cuenta sin privilegios y 512 MB de memoria. La imagen tiene licencia BSD-3-Clause y no la distribuimos nosotros. El archivo escribe los scripts con números fijos al arrancar, así que cada copia imprime lo mismo y no se descarga nada. Los límites son honestos: no hay GPU, así que el lanzamiento del núcleo está simulado en Python y las cifras sobre mover datos son aritmética sobre un dispositivo inventado, nunca una medición. No se puede instalar nada desde internet. No se conserva nada cuando el laboratorio se detiene: el alumno descarga su trabajo antes.
Ponerlo como tarea
Indica en la tarea qué hay que entregar.
- Crea el laboratorio. En tu módulo añade una tarea y elige la tarjeta «Laboratorio de contenedores», y después «En un repositorio de GitHub». Indica https://github.com/mitsurutech/lab-parallel-lab con la rama main. El archivo compose es el predeterminado, compose.yaml. Haz un fork del repositorio antes si quieres modificarlo, por ejemplo para cambiar los números que usa un script.
- Publica y pruébalo. «Publicar» fija el commit que te mostraron, así que un cambio posterior en el repositorio no altera un laboratorio que ya has asignado. Inicia primero tu propia copia.
- Asígnalo. Asígnalo como cualquier tarea, con una fecha de entrega si quieres, e indica en la tarea qué hacer y qué entregar.
- Califica lo entregado. Abre la copia de un alumno y el trabajo que ha entregado, califícalo y devuélvelo con un motivo si necesita más.
Prueba este laboratorio, y lo que cuesta
Con una cuenta personal gratuita puedes seguir las lecciones básicas de este laboratorio, con crédito gratuito suficiente cada mes para seguir la mayoría de las lecciones y sin tarjeta. Para una clase, un centro tiene gratis sus primeros 365 días, hasta 50 alumnos, y después paga por alumno y año, con todos los laboratorios incluidos y el profesorado gratis.
Preguntas frecuentes
- ¿Hay una GPU en el laboratorio?
- No. El laboratorio enseña el modelo sobre el que se construye una GPU, con NumPy, el multiprocessing de Python y scripts breves. El lanzamiento del núcleo está simulado en Python sencillo y las cifras sobre mover datos son aritmética sobre un dispositivo inventado, así que el alumno aprende a pensar en una GPU sin tener una.
- ¿Por qué el terminal usa docker exec jupyter?
- El terminal del laboratorio lleva curl, psql y algunos clientes más, pero no Python. docker exec jupyter ejecuta una orden dentro del contenedor del laboratorio, que tiene Python y NumPy. JupyterLab también tiene su propio terminal, en File, New, Terminal.
- ¿Por qué no se imprime ningún tiempo?
- Un tiempo cambia de una ejecución a otra y de una máquina a otra, así que la lección no podría decir qué debe ver el alumno. Los scripts cuentan operaciones y calculan cifras a partir de un ancho de banda y una velocidad dados: cada ejecución imprime lo mismo y cada respuesta se puede comprobar a mano.