Diferenzas
Isto amosa as diferenzas entre a revisión seleccionada e a versión actual da páxina.
Both sides previous revision Previous revision Next revision | Previous revision Next revisionBoth sides next revision | ||
centro:servizos:hpc [2022/03/07 14:12] – [CONDA] fernando.guillen | centro:servizos:hpc [2022/04/11 09:13] – fernando.guillen | ||
---|---|---|---|
Liña 1: | Liña 1: | ||
- | ====== Cluster de Computación de Altas Prestacións (HPC) ====== | + | ====== Cluster de Computación de Altas Prestacións (HPC) ctcomp3 |
+ | [[ https:// | ||
===== Descripción ===== | ===== Descripción ===== | ||
Liña 11: | Liña 12: | ||
Hay un almacenamiento distribuido accesible desde todos los nodos con 220 TB de capacidad conectado mediante una doble red de fibra de 25Gb. \\ | Hay un almacenamiento distribuido accesible desde todos los nodos con 220 TB de capacidad conectado mediante una doble red de fibra de 25Gb. \\ | ||
\\ | \\ | ||
- | ^ Nombre | + | ^ Nombre |
- | | hpc-login2 | + | | hpc-login2 |
- | | hpc-node[1-2] | + | | hpc-node[1-2] |
- | | hpc-node[3-9] | + | | hpc-node[3-9] |
- | | hpc-fat1 | + | | hpc-fat1 |
- | | hpc-gpu[1-2] | + | | < |
- | | hpc-gpu3 | + | | hpc-gpu3 |
- | | hpc-gpu4 | + | | hpc-gpu4 |
+ | * Son ctgpgpu7 y 8. Se integrarán próximamente en cluster. | ||
===== Conexión al sistema ===== | ===== Conexión al sistema ===== | ||
Para acceder al clúster, hay que solicitarlo previamente a través de [[https:// | Para acceder al clúster, hay que solicitarlo previamente a través de [[https:// | ||
Liña 33: | Liña 34: | ||
Cada nodo tiene una partición local de 1 TB para scratch, que se borra al terminar cada trabajo. Se puede acceder mediante la variable de entorno %%$LOCAL_SCRATCH%% en los scripts. \\ | Cada nodo tiene una partición local de 1 TB para scratch, que se borra al terminar cada trabajo. Se puede acceder mediante la variable de entorno %%$LOCAL_SCRATCH%% en los scripts. \\ | ||
Para datos que deban ser compartidos por grupos de usuarios, hay que solicitar la creación de una carpeta en el almacenamiento compartido que solo será accesible por los miembros del grupo.\\ | Para datos que deban ser compartidos por grupos de usuarios, hay que solicitar la creación de una carpeta en el almacenamiento compartido que solo será accesible por los miembros del grupo.\\ | ||
- | ^ Directorio | + | ^ Directorio |
- | | Home | + | | Home | %%$HOME%% |
- | | Scratch local | %%$LOCAL_SCRATCH%% | + | | Scratch local |
- | | Carpeta de grupo | + | | Carpeta de grupo | %% $GRUPOS/< |
%%* el almacenamiento es compartido%% | %%* el almacenamiento es compartido%% | ||
=== AVISO IMPORTANTE === | === AVISO IMPORTANTE === | ||
Liña 112: | Liña 113: | ||
Para usar cualquier otro software no instalado en el sistema u otra versión del mismo hay tres opciones: | Para usar cualquier otro software no instalado en el sistema u otra versión del mismo hay tres opciones: | ||
- Usar Modules con los módulos que ya están instalados (o solicitar la instalación de un nuevo módulo si no está disponible) | - Usar Modules con los módulos que ya están instalados (o solicitar la instalación de un nuevo módulo si no está disponible) | ||
- | - Usar un contenedor (uDocker o Singularity) | + | - Usar un contenedor (uDocker o Apptainer/Singularity) |
- Usar Conda | - Usar Conda | ||
Un módulo es la solución más sencilla para usar software sin modificaciones o dependencias difíciles de satisfacer.\\ | Un módulo es la solución más sencilla para usar software sin modificaciones o dependencias difíciles de satisfacer.\\ | ||
Liña 146: | Liña 147: | ||
</ | </ | ||
- | === Singularity === | + | === Apptainer/Singularity === |
- | [[ https:// | + | [[ https:// |
- | Singularity está instalado en el sistema de cada nodo, por lo que no es necesario hacer nada para usarlo. | + | Apptainer/Singularity está instalado en el sistema de cada nodo, por lo que no es necesario hacer nada para usarlo. |
Liña 162: | Liña 163: | ||
===== Uso de SLURM ===== | ===== Uso de SLURM ===== | ||
+ | El gestor de colas en el cluster es [[ https:// | ||
+ | <note tip>El término CPU identifica a un core físico de un socket. El hyperthreading está desactivado, | ||
+ | == Recursos disponibles == | ||
+ | <code bash> | ||
+ | hpc-login2 ~]$ sinfo -e -o " | ||
+ | # Hay un alias para este comando: | ||
+ | hpc-login2 ~]$ ver_recursos | ||
+ | NODELIST | ||
+ | hpc-fat1 | ||
+ | hpc-gpu[1-2] | ||
+ | hpc-gpu3 | ||
+ | hpc-gpu4 | ||
+ | hpc-node[1-2] | ||
+ | hpc-node[3-9] | ||
+ | </ | ||
+ | ==== Nodos ==== | ||
+ | Un nodo es la unidad de computación de SLURM, y se corresponde con un servidor físico. | ||
+ | <code bash> | ||
+ | # Mostrar la información de un nodo: | ||
+ | hpc-login2 ~]$ scontrol show node hpc-node1 | ||
+ | NodeName=hpc-node1 Arch=x86_64 CoresPerSocket=18 | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
==== Particiones ==== | ==== Particiones ==== | ||
+ | Las particiones en SLURM son grupos lógicos de nodos. En el cluster hay una única partición a la que pertenecen todos los nodos, por lo que no es necesario especificarla a la hora de enviar trabajos. | ||
+ | <code bash> | ||
+ | # Mostrar la información de las particiones: | ||
+ | hpc-login2 ~]$ sinfo | ||
+ | defaultPartition* | ||
+ | # Cuando se incorporen al cluster ctgpgpu7 y 8 apareceran como los nodos hpc-gpu1 y 2 respectivamente. | ||
+ | </ | ||
+ | ==== Trabajos ==== | ||
+ | Los trabajos en SLURM son asignaciones de recursos a un usuario durante un tiempo determinado. Los trabajos se identifican por un número correlativo o JOBID. \\ | ||
+ | Un trabajo (JOB) consiste en uno o más pasos (STEPS), cada uno consistente en una o más tareas (TASKS) que usan una o más CPU. Hay un STEP por cada programa que se ejecute de forma secuencial en un JOB y hay un TASK por cada programa que se ejecute en paralelo. Por lo tanto en el caso más simple como por ejemplo lanzar un trabajo consistente en ejecutar el comando hostname el JOB tiene un único STEP y una única TASK. | ||
+ | |||
+ | ==== Sistema de colas (QOS) ==== | ||
+ | La cola a la que se envíe cada trabajo define la prioridad, | ||
+ | <code bash> | ||
+ | # Mostrar las colas | ||
+ | hpc-login2 ~]$ sacctmgr show qos | ||
+ | # Hay un alias que muestra solo la información más relevante: | ||
+ | hpc-login2 ~]$ ver_colas | ||
+ | Name | ||
+ | ---------- ---------- --------------- ----------- --------------------------- ----------- ------------- --------- ----------- | ||
+ | | ||
+ | interactive | ||
+ | urgent | ||
+ | long 100 | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | # Priority: es la prioridad relativa de cada cola. \\ | ||
+ | # DenyonLimit: | ||
+ | # UsageFactor: | ||
+ | # MaxTRES: límites por cada trabajo \\ | ||
+ | # MaxWall: tiempo máximo que puede estar el trabajo en ejecución \\ | ||
+ | # MaxTRESPU: límites globales por usuario \\ | ||
+ | # MaxJobsPU: Número máximo de trabajos que un usuario puede tener en ejecución. \\ | ||
+ | # MaxSubmitPU: | ||
+ | |||
+ | ==== Envío de un trabajo al sistema de colas ==== | ||
+ | == Especificación de recursos == | ||
+ | Por defecto, si se envía un trabajo sin especificar nada el sistema lo envia a la QOS por defecto (regular) y le asigna un nodo, una CPU y toda la memoria disponible. El límite de tiempo para la ejecución del trabajo es el de la cola (4 días y 4 horas). | ||
+ | Esto es muy ineficiente, | ||
+ | - %%El número de nodos (-N o --nodes), tareas (-n o --ntasks) y/o CPU por tarea (-c o --cpus-per-task).%% | ||
+ | - %%La memoria (--mem) por nodo o la memoria por cpu (--mem-per-cpu).%% | ||
+ | - %%El tiempo estimado de ejecución del trabajo ( --time )%% | ||
+ | |||
+ | A mayores puede ser interesante añadir los siguientes parámetros: | ||
+ | | -J | ||
+ | | -q | ||
+ | | -o | ||
+ | | | ||
+ | | -C | ||
+ | | | %%--exclusive%% | ||
+ | | -w | %%--nodelist%% | ||
+ | |||
+ | == Cómo se asignan los recursos == | ||
+ | Por defecto el método de asignación entre nodos es la asignación en bloque ( se asignan todos los cores disponibles en un nodo antes de usar otro). El método de asignación por defecto dentro de cada nodo es la asignación cíclica | ||
+ | |||
+ | == Calculo de la prioridad == | ||
+ | Cuando se envía un trabajo al sistema de colas, lo primero que ocurre es que se comprueba si los recursos solicitados entran dentro de los límites fijados en la cola correspondiente. Si supera alguno se cancela el envío. \\ | ||
+ | Si hay recursos disponibles el trabajo se ejecuta directamente, | ||
+ | El fairshare es un cálculo dinámico que hace SLURM para cada usuario y es la diferencia entre los recursos asignados y los recursos consumidos a lo largo de los últimos 14 días. | ||
+ | <code bash> | ||
+ | hpc-login2 ~]$ sshare -l | ||
+ | User RawShares | ||
+ | ---------- ---------- ----------- ----------- ----------- | ||
+ | | ||
+ | 1 0.500000 | ||
+ | user_name | ||
+ | </ | ||
+ | # RawShares: es la cantidad de recursos en términos absolutos asignada al usuario. Es igual para todos los usuarios.\\ | ||
+ | # NormShares: Es la cantidad anterior normalizada a los recursos asignados en total.\\ | ||
+ | # RawUsage: Es la cantidad de segundos/ | ||
+ | # NormUsage: Cantidad anterior normalizada al total de segundos/ | ||
+ | # FairShare: El factor FairShare entre 0 y 1. Cuanto mayor uso del cluster, más se aproximará a 0 y menor será la prioridad.\\ | ||
+ | |||
+ | == Envío de trabajos == | ||
+ | - salloc | ||
+ | - srun | ||
+ | - sbatch | ||
+ | |||
+ | 1. SALLOC \\ | ||
+ | Sirve para obtener de forma inmediata una asignación de recursos (nodos). En cuanto se obtiene se ejecuta el comando especificado o una shell en su defecto. | ||
+ | <code bash> | ||
+ | # Obtener 5 nodos y lanzar un trabajo. | ||
+ | hpc-login2 ~]$ salloc -N5 myprogram | ||
+ | # Obtener acceso interactivo a un nodo (Pulsar Ctrl+D para terminar el acceso): | ||
+ | hpc-login2 ~]$ salloc -N1 | ||
+ | </ | ||
+ | 2. SRUN \\ | ||
+ | Sirve para lanzar un trabajo paralelo ( es preferible a usar mpirun ). Es interactivo y bloqueante. | ||
+ | <code bash> | ||
+ | # Lanzar un hostname en 2 nodos | ||
+ | hpc-login2 ~]$ srun -N2 hostname | ||
+ | hpc-node1 | ||
+ | hpc-node2 | ||
+ | </ | ||
+ | 3. SBATCH \\ | ||
+ | Sirve para enviar un script al sistema de colas. Es de procesamiento por lotes y no bloqueante. | ||
+ | <code bash> | ||
+ | # Crear el script: | ||
+ | hpc-login2 ~]$ vim trabajo_ejemplo.sh | ||
+ | #!/bin/bash | ||
+ | #SBATCH --job-name=prueba | ||
+ | #SBATCH --nodes=1 | ||
+ | #SBATCH --ntasks=1 | ||
+ | #SBATCH --cpus-per-task=1 | ||
+ | #SBATCH --mem=1gb | ||
+ | #SBATCH --time=00: | ||
+ | #SBATCH --qos=urgent | ||
+ | #SBATCH --output=prueba_%j.log | ||
+ | |||
+ | echo "Hello World!" | ||
+ | |||
+ | hpc-login2 ~]$ sbatch trabajo_ejemplo.sh | ||
+ | </ | ||
+ | |||
==== Uso de los nodos con GPU ==== | ==== Uso de los nodos con GPU ==== | ||
- | ==== Límites del sistema | + | Para solicitar específicamente una asignación de GPUs para un trabajo hay que añadir a sbatch o srun las opciones: |
- | ==== Ejemplos de envío | + | | %%--gres%% |
+ | | %%--gpus o -G%% | Solicitud de gpus por JOB | %%--gpus=[type]: | ||
+ | También existen las opciones %% --gpus-per-socket, | ||
+ | Ejemplos: | ||
+ | <code bash> | ||
+ | ## Ver la lista de nodos y gpus: | ||
+ | hpc-login2 ~]$ ver_recursos | ||
+ | ## Solicitar 2 GPU cualesquiera para un JOB, añadir: | ||
+ | --gpus=2 | ||
+ | ## Solicitar una A100 de 40G en un nodo y una A100 de 80G en otro, añadir: | ||
+ | --gres=gpu: | ||
+ | </ | ||
+ | |||
==== Monitorización de los trabajos ==== | ==== Monitorización de los trabajos ==== | ||
- | ==== Salida estándar | + | <code bash> |
+ | ## Listado de todos los trabajos en la cola | ||
+ | hpc-login2 ~]$ squeue | ||
+ | ## Listado de los trabajos de un usuario | ||
+ | hpc-login2 ~]$ squeue -u < | ||
+ | ## Cancelar un trabajo: | ||
+ | hpc-login2 ~]$ scancel < | ||
+ | ## Lista de trabajos recientes | ||
+ | hpc-login2 ~]$ sacct -b | ||
+ | ## Información histórica detallada de un trabajo: | ||
+ | hpc-login2 ~]$ sacct -l -j < | ||
+ | ## Información de debug de un trabajo para troubleshooting: | ||
+ | hpc-login2 ~]$ scontrol show jobid -dd < | ||
+ | ## Ver el uso de recursos de un trabajo en ejecución: | ||
+ | hpc-login2 ~]$ sstat < | ||
+ | </ | ||
+ | ==== Controlar la salida de los trabajos ==== | ||
+ | == Códigos de salida == | ||
+ | Por defecto estos son los códigos de salida de los comandos: | ||
+ | ^ SLURM command | ||
+ | | salloc | ||
+ | | srun | El más alto de entre todas las tareas ejecutadas o 253 para un error out-of-mem | ||
+ | | sbatch | ||
+ | |||
+ | == STDIN, STDOUT | ||
+ | **SRUN: | ||
+ | Por defecto stdout y stderr se redirigen de todos los TASKS a el stdout y stderr de srun, y stdin se redirecciona desde el stdin de srun a todas las TASKS. Esto se puede cambiar con: | ||
+ | | %%-i, --input=< | ||
+ | | %%-o, --output=< | ||
+ | | %%-e, --error=< | ||
+ | Y las opciones son: | ||
+ | * //all//: opción por defecto. | ||
+ | * //none//: No se redirecciona nada. | ||
+ | * //taskid//: Solo se redirecciona desde y/o al TASK id especificado. | ||
+ | * // | ||
+ | * //filename pattern//: Igual que filename pero con un fichero definido por un [[ https:// | ||
+ | |||
+ | **SBATCH: | ||
+ | Por defecto "/ | ||
+ | | %%-i, --input=< | ||
+ | | %%-o, --output=< | ||
+ | | %%-e, --error=< | ||
+ | La referencia de filename_pattern está [[ https:// | ||
+ | |||
+ | ==== Envío de correos ==== | ||
+ | Se pueden configurar los JOBS para que envíen correos en determinadas circunstancias usando estos dos parámetros (**SON NECESARIOS AMBOS**): | ||
+ | | %%--mail-type=< | ||
+ | | %%--mail-user=< | ||
+ | |||
+ | |||
==== Estados de los trabajos en el sistema de colas ==== | ==== Estados de los trabajos en el sistema de colas ==== | ||
+ | <code bash> | ||
+ | hpc-login2 ~]# squeue -l | ||
+ | JOBID PARTITION | ||
+ | 6547 defaultPa | ||
+ | </ | ||
+ | Estados (STATE) más comunes de un trabajo: | ||
+ | * R RUNNING Job currently has an allocation. | ||
+ | * CD COMPLETED Job has terminated all processes on all nodes with an exit code of zero. | ||
+ | * F FAILED Job terminated with non-zero exit code or other failure condition. | ||
+ | * PD PENDING Job is awaiting resource allocation. | ||
+ | |||
+ | [[ https:// | ||
+ | |||
+ | Si un trabajo no está en ejecución aparecerá una razón debajo de REASON:[[ https:// | ||
+ | |||
+ | |||
+ | |||