Dask es una librería de Python para la computación distribuida y paralela. Dask es:
Dask se basa en tres elementos: planificador, trabajadores y código de Python.
Dask utiliza un planificador y tantos trabajadores como el usuario necesite (o el sistema soporte). El planificador distribuye entre los trabajadores la carga computacional de ejecutar el código de Python (el cual debe incluir funciones de Dask), y monitoriza el estado de los mismos. Dado que en Drago se utiliza SLURM para administrar los recursos, deberemos decirle a SLURM que lance el planificador, los trabajadores y el código de Python.
Los archivos de ejemplo se pueden descargar aquí:
import dask.array as da
from dask.distributed import Client
# Conectar con el planificador de Dask
client = Client(scheduler_file='scheduler.json')
# Crear una matriz de Dask
x = da.random.random(size=(100000, 100000), chunks=(10000, 10000))
# Realizar cálculos
y = x + x.T
z = y.mean()
# Computar el resultado
result = z.compute()
print("Media de la matriz:", result)
El archivo scheduler.json de la línea 5 se utiliza para indicarles a los trabajadores dónde está el planificador. Este archivo se generará automáticamente cuando se lance el planificador.
x = da.random.random(size=(100000, 100000), chunks=(10000, 10000))
En esta línea de código creamos una matriz de 100000x100000 dividida en "chunks" (trozos) de 10000x10000, Dask distribuirá las computacones que se hacen sobre estos trozos entre los trabajadores.
Cuando se calcule result la Media de la matriz y result se escribirán en el archivo de salida: dask_output.txt
Podemos guardar este código en un archivo, por ejemplo: dask_script.py
#!/bin/bash
#SBATCH --job-name=dask_job # Nombre del trabajo
#SBATCH --nodes=2 # Número de nodos
#SBATCH --ntasks-per-node=8 # Número de tareas por nodo
#SBATCH --cpus-per-task=1 # Número de núcleos por tarea
#SBATCH --time=00:30:00 # Límite de tiempo hrs:min:sec
#SBATCH --output=dask_output.txt # Fichero de salida
#SBATCH –partition=express # Cola en la que se lanzará el trabajo
# Cargar los módulos necesarios
module load rama0.3 GCC/12.2.0 OpenMPI/4.1.4 dask
# Iniciar el planificador de Dask
dask scheduler --scheduler-file scheduler.json &
# Le damos tiempo al planificador antes de seguir con el script
sleep 25
# Iniciar los trabajadores indicándoles el archivo de sincronización
srun dask worker --nthreads 1 --scheduler-file scheduler.json &
# Le damos algo de tiempo a los trabajadores para iniciarse antes de lanzar el programa de Python
sleep 5
# Lanzamos el script de Python
python dask_script.py
Este archivo sbatch lanzará 15 trabajadores (ocho en un nodo y siete en otro; y un planificador, tal y como está definido por las líneas 3 y 4).
En la línea 7 especificamos el archivo en el que se irá reflejando el progreso del cómputo, así como el resultado final.
Podemos guardar el script en un archivo, por ejemplo: dask_job.sh
El usuario debe asegurar la correcta instalacion y configuración de PuTTY (u otro cliente ssh).
Conectar a Drago
ssh mi_nombre_usuario@drago.csic.es
Crear un directorio para pruebas
mkdir dask_test
cd dask_test
Copiar los archivos locales a Drago
scp dask_job.sh mi_nombre_usuario@drago.csic.es:~/dask_test
scp dask_script.py mi_nombre_usuario@drago.csic.es:~/dask_test
Ejecutar el archivo sbatch
sbatch dask_job.sh
Seguir el progreso
tail -f dask_output.txt
Para dejar de ver el archivo pulsamos CTRL+c
Dask crea un panel de monitorización y administración de procesos que es muy útil. Para poder acceder a él tenemos primero que averiguar en qué nodo se ha ejecutado el planificador, y después usar un túnel SSH para poder conectar a vía nuestro navegador.
Tras lanzar el trabajo (sbatch dask_job.sh)
(b) Localizar el nodo del planificador
cat dask_output.txt | grep Scheduler
La salida de este comando será algo parecido a lo siguiente:
2024-10-08 17:04:56,507 - distributed.scheduler - INFO - Scheduler at: tcp://10.5.32.7:8786
Tomamos nota de la dirección IP del nodo (en este caso la 10.5.32.7)
Crear el doble túnel
Desde nuestra máquina local, en otra ventana del cliente ssh:
ssh -L 8787:localhost:8787 mi_nombre_usuario@drago.csic.es
Nos aparecerá una shell en Drago, en ella ejecutamos:
ssh -L 8787:localhost:8787 mi_nombre_usuario@10.5.32.7
Después del @ viene la IP que hemos anotado antes.
Nos aparecerá otra consola dentro del nodo al que apuntamos.
Conectar con el navegador al panel de Dask
Abrimos nuestro navegador y ponemos en la dirección la url:
Deberíamos obtener una página como la siguiente:
Dask es mucho más potente de lo que refleja este ejemplo sencillo. Su propia documentación es excelente:
Es destacable la documentación sobre el panel de Dask:
SLURM también tiene una página de documentación muy buena:
Licendia de tipo BSD 3-Clause:
Copyright (c) 2014, Anaconda, Inc. and contributors
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.