Home
Investigación
ProyectosPersonal
Eventos
Todos los Eventos
Guías
Hoja GuíaGuía de UsuarioDocumentación

Guía de Usuario

Descubra cómo aprovechar al máximo el clúster Kabré para sus necesidades computacionales.

01Introducción

Kabré es una palabra del lenguaje Ngäbe que significa un puñado. Este significado entra dentro de la actual composición del clúster, la cual cuenta con múltiples arquitecturas en paralelo. A lo largo de este tutorial, aprenderá cómo está compuesto Kabré, cómo conectarse al clúster, enviar trabajos, recibir resultados y lo esencial sobre los módulos de entorno.

02Requerimientos

Para completar este tutorial usted requerirá un cliente SSH. En plataformas Unix y Linux comúnmente existe un emulador de terminal capaz de establecer sesiones SSH. En plataformas Windows usted deberá descargar un programa que funcione como cliente SSH, como PuTTY o similar.

Además, requerirá una cuenta activa en Kabré y credenciales válidas. Si no tiene una, por favor diríjase a la página de registro y llene sus datos para solicitar una nueva cuenta, o escríbanos a cnca@cenat.ac.cr explicando su situación.

03Entendiendo la composición de Kabré

La siguiente imagen muestra un diagrama de red de Kabré. A continuación discutiremos un poco sobre sus principales componentes.

Kabré architecture
04Nodos del clúster
Nodos de acceso

Estos nodos, llamados también login, son un tipo de área de trabajo compartido. Cuando usted accede Kabré, se le asigna uno de los nodos login. Algunas tareas comunes que se realizan aquí son:

  • Crear y editar archivos
  • Crear directorios y mover archivos
  • Copiar archivos desde y hacia su computadora
  • Compilar código
  • Enviar trabajos
  • Administrar sus trabajos activos

Código paralelo o tareas pesadas corriendo en los nodos login son considerados comportamientos no deseados.

Nodos de aprendizaje automático (nukwa)

Nukwä significa pájaro en lenguaje Ngäbe. Hay 11 nodos nukwa, 4 de estos nodos cuentan con una GPU NVIDIA Tesla V100, 24 núcleos a 2.20GHz, 1 hilo por núcleo y 32 GB de RAM. Además, hay otros 7 nodos nukwa que poseen una GPU NVIDIA L40S, 20 núcleos a 2.00GHz, 1 hilo por núcleo y 256 GB de RAM.

Solo las aplicaciones con un uso intensivo de GPU obtendrían una aceleración relevante con nodos nukwa.

Nota: Debido a un cambio de sistema operativo que se está llevando a cabo en los nodos de cómputo, los nodos Nukwa cuentan con el sistema operativo de AlmaLinux 9, lo cual ha traído consigo varias incompatibilidades entre los nodos. Por eso, cuando sea requerido usar estos nodos, junto a los módulos del sistema, es necesario insertar en el script de SLURM la línea “. /opt/Modules/3.2.10/init/sh”, con el punto y el espacio después del punto, para que así los módulos funcionen correctamente.

Nodos bioinformáticos (dribe)

Dribe significa alacrán en lenguaje Ngäbe. Dribe tiene 7 nodos, uno que cuenta con un Intel Xeon con 36 núcleos a 3,00 GHz, 2 hilos por núcleo y 1024 GB de RAM, y los demás con 18 núcleos a 3,00 GHz, 2 hilos por núcleo y 512 GB de RAM.

Los nodos Dribe funcionan bien para herramientas que requieren una alta demanda de memoria.

Nodos multipropósito (kurá)

Kurá significa tigre en lenguaje Ngäbe. Kurá tiene 12 nodos, los cuales cuentan con un Intel Xeon con 20 núcleos a 2,30 GHz, 2 hilos por núcleo y 256 GB de RAM.

Estos nodos Kurá funcionan bien para múltiples tipos de herramientas, ya sean tareas de bioinformática que no requieren tanta memoria, análisis de datos para Big Data que ocupen una memoria y procesador con suficientes potencia e hilos, así como otras tareas que no necesiten una gran cantidad de recursos.

Nota: Debido a un cambio de sistema operativo que se está llevando a cabo en los nodos de cómputo, los nodos Kurá cuentan con el sistema operativo de AlmaLinux 8, lo cual ha traído consigo varias incompatibilidades entre los nodos. Por eso, cuando sea requerido usar estos nodos, junto a los módulos del sistema, es necesario insertar en el script de SLURM la línea “. /opt/Modules/3.2.10/init/sh”, con el punto y el espacio después del punto, para que así los módulos funcionen correctamente.

Resumen de nodos computacionales
ParticiónNúmero de nodosUsos principalesMemoria por nodoNúcleos por nodoAcelerador por nodo
Nukwa11IA, Aprendizaje automático, Simulación32-256 GB24-20NVIDIA-GPU (V100-L40S)
Dribe7Bioinformática512-1024 GB18-36NO
Kurá12Multipropósito256 GB20NO
05Interactuando con Kabré
Conexiones SSH y claves SSH

Para empezar, abra un emulador de terminal y abra una sesión ssh escribiendo

$ ssh -p 22022 [user]@kabre.cenat.ac.crCopy

Recuerde cambiar [user] por su nombre de usuario. Escriba su contraseña cuando se le solicite. Se registrará en algún nodo de inicio de sesión. Este es un terminal típico de Linux, pruebe usted algunos comandos conocidos, como ls, cd, mkdir y otros.

Una clave SSH es un archivo que mantendrá su conexión segura y evita que escriba su contraseña cada vez que inicie sesión. Este archivo está comúnmente vinculado a una computadora; normalmente usted deberá generar una para la computadora que utilizará para interactuar con Kabré.

Para generar una clave SSH, en su computadora local (computadora portátil, estación de trabajo …) abra un terminal, vaya a su directorio de inicio y escriba

y siga las instrucciones. Si elige las opciones predeterminadas, la nueva clave estará en ~/.ssh/, ahora tiene que copiar la clave pública a Kabré, para hacerlo escriba

$ scp -P 22022 ~/.ssh/id_rsa.pub your_user@kabre.cenat.ac.cr:~Copy

Ahora, dentro de una sesión ssh en Kabré, escriba:

$ cat id_rsa.pub >> .ssh/authorized_keys $ rm id_rsa.pubCopy

Alternativamente, puede ejecutar este procedimiento en un solo comando si está disponible en su estación de trabajo, de la siguiente manera:

$ ssh-copy-id -p 22022 your_user@kabre.cenat.ac.crCopy

Ahora, si abre un nuevo terminal y escribe ssh -p 22022 your_user@kabre.cenat.ac.cr se registrará sin solicitar la contraseña. Esto se debe a que Kabré tiene la clave ssh pública de su computadora. También es conveniente para su computadora tener la clave pública de Kabré, simplemente adjúntela a autorized_keys en su computadora local, así:

$ scp -P 22022 user@kabre.cenat.ac.cr:~/.ssh/id_rsa.pub . $ cat id_rsa.pub >> ~/.ssh/autorized_keys $ rm id_rsa.pubCopy
Sistema de archivos de Kabré

Contamos con tres directorios: /home, /work y /data.

DirectorioCuotaPropósitoRespaldo
/home/userid10GBScripts y datos importantesMensual
/work/userid100GBDatos temporales y herramientasNO
/data/userid100GBBases de datos y datos a analizarNO

Para saber la cantidad de espacio disponible que queda en cada directorio, puede usar el siguiente comando:

$ df -h /home/useridCopy
$ df -h /work/useridCopy
$ lfs quota -h /dataCopy

  • El usuario es responsable de administrar sus directorios Home, Work y Data. El primero está destinado a programas y datos confidenciales, el segundo a datos temporales, herramientas y archivos generales y el último está destinado a datos masivos, bases de datos y datos a analizar.
  • La capacidad del directorio Work y Data se puede ampliar a petición. Usted debe proporcionar una justificación clara del espacio adicional necesario. Envíe su solicitud a la página de tiquetes tiquetes.kabre.cenat.ac.cr.
  • Aunque se realiza una copia de seguridad del directorio Home mensualmente, le recomendamos que trabaje con un sistema de control de versiones (v.g. git) para sus scripts y códigos fuente.
Copiar archivos entre su computadora y Kabré

El comando scp es similar al comando cp; copia archivos de un origen a un destino a través de una sesión SSH. Tiene la siguiente sintaxis:

$ scp -P 22022 [user]@[host][path]origin_file [user]@[host][path]destiny_fileCopy

Tenga en cuenta que este comando es solo para un solo archivo; si necesita cargar un directorio completo, agregue la opción -r al comando, como se muestra a continuación:

$ scp -P 22022 -r [user]@[host][path]origin_directory [user]@[host][path]destiny_directoryCopy

Los valores por defecto son:

  • user: su usuario local
  • host: host local
  • path: directorio de trabajo actual

El comando scp debe ejecutarse en su máquina local, no en Kabré. Tal vez su aplicación genere muchos archivos de visualización y desee descargar esos archivos a su computadora; recuerde que ~ significa el directorio de inicio y * coincide con cualquier secuencia de caracteres, usando estos conceptos:

$ scp -P 22022 user@kabre.cenat.ac.cr:~/application/output/*.viz ~/app/results/visualizationCopy

O tal vez usted desee cargar un archivo de parámetros para usar en una simulación, debería hacer lo siguiente:

$ scp -P 22022 ~/research/app/parameters.dat user@kabre.cenat.ac.cr:~/application/inputCopy
Dar permisos a otro usuario sobre un directorio

El primer paso es conocer el uid (identificación de usuario) del usuario con el que desea compartir la propiedad; para obtener el uid, ejecute el siguiente comando:

$ id usernameCopy

A continuación, una vez que conozca el uid, usted puede proceder a otorgar permisos sobre un solo archivo o directorio; aquí se puede elegir qué permisos otorgar, podrían ser: R (para lectura), W (para escritura) y/o X (para ejecutar).

Si desea otorgar todos los permisos al usuario cuyo uid es “[uid]” sobre el directorio “[/path/directory]” (recuerde sustituir estos valores por los que necesita), puede usar el siguiente comando:

$ nfs4_setfacl -a A::[uid]:RWX [/path/directory]Copy

Note que esto daría todos los permisos (ya que usamos RWX) a [uid] solo al directorio [/path/directory], pero no a sus subdirectorios. Tenga cuidado al otorgar todos los permisos a otro usuario, ya que tendrá la capacidad de eliminar y modificar libremente.

Si desea incluir todos los subdirectorios, este mismo comando se puede ejecutar de forma recursiva simplemente agregando -R, así:

$ nfs4_setfacl -R -a A::[uid]:RWX [/path/directory]Copy

Por último, si desea eliminar los permisos RWX a un “[uid]” sobre el directorio “[/path/directory]”, puede usar:

$ nfs4_setfacl -a D::[uid]:RWX [/path/directory]Copy
06Entendiendo el sistema de colas de Kabré
Colas Disponibles en Kabré

Los nodos de inicio de sesión son adecuados para tareas ligeras, como se mencionó anteriormente: editar archivos, compilar, copiar archivos, etc. Se espera que las tareas pesadas se ejecuten en los nodos Nukwa o Dribe. Para hacer cumplir un reparto justo de recursos entre los usuarios, su tarea debe enviarse a un sistema de cola. Es como formarse en el banco, una vez que su tarea llega al principio de la fila, se le otorgarán todos los recursos solicitados y se ejecutará hasta que se complete o hasta que consuma su franja de tiempo.

Actualmente, hay diferentes colas para cada componente en Kabré, eso significa que no puede mezclar nodos Nukwa y nodos Kurá en un solo trabajo, por ejemplo. La siguiente tabla muestra todas las colas disponibles:

Partición (Cola)PlataformaNúmero de nodosAsignación de tiempo
nukwaGPU124 horas
nukwa-debugGPU14 horas
nukwa-v100GPU14 horas
nukwa-l40sGPU14 horas
nukwa-wideGPU424 horas
nukwa-longGPU148 horas
dribeXeon172 horas
dribe-longXeon1744 horas
dribe-debugXeon1744 horas
kuraXeon18 horas
kura-debugXeon172 horas
kura-wideXeon48 horas
kura-longXeon124 horas

El proceso de envío de un trabajo en Kabré se puede dividir en cuatro pasos: escribir un archivo SLURM, poner su trabajo en cola, monitorear los trabajos y recuperar los resultados.

Escribiendo un archivo SLURM

Este archivo de configuración le dice al sistema de colas todo lo que necesita saber sobre su trabajo, para que pueda colocarse en la cola correcta y ejecutarse. Pruebe con un ejemplo de trabajo mínimo. A continuación se muestra un código C que se aproxima al valor de pi utilizando un método de Montecarlo. Inicie sesión en Kabré, copie el texto en un archivo y guárdelo con el nombre pi_threads.c.

#include <pthread.h>
#include <math.h>
#include <stdlib.h>

void * calc_partial_pi(void * p){
    // ... implementation
}

int main(int argc, char * argv[]){
    // ...
}

Actualmente, se encuentra en un nodo de inicio de sesión, por lo que está bien compilar el código allí, hágalo escribiendo:

$ gcc -std=gnu99 pi_threads.c -lm -lpthread -o pi_threadsCopy

El siguiente es un archivo SLURM de ejemplo. Todas las líneas que comienzan con #SBATCH son comandos de configuración para el sistema de colas. Las opciones que se muestran aquí son las más comunes y posiblemente las únicas que necesitará.

ConfiguraciónDescripción
–job-name=<nombre>Nombre específico del trabajo
–output=<nombre>El nombre con el que sale el trabajo
–partition=<partición>En qué cola debería ejecutarse
–ntasks=<numero>Número de procesos a ejecutar
MM.SS>Duración aproximada del trabajo

El cuerpo de un archivo SLURM es un código bash. Copie el ejemplo en un archivo llamado pi_threads.slurm.

#!/bin/bash
#SBATCH --job-name=pi_threads
#SBATCH --output=result.txt
#SBATCH --partition=kura
#SBATCH --ntasks=1
#SBATCH --time=00:10:00

module load gcc/7.2.0

srun ./pi_threads 64 100000000000

Nota: Los argumentos de la línea de comando 64 y 100000000000 son los parámetros específicos necesarios para ejecutar pi_threads.

Ahora, desde la línea de comando, invoque al remitente de colas:

$ sbatch pi_threads.slurmCopy

¡Y eso es todo! Su trabajo se pondrá en cola y se ejecutará, en este caso, en un nodo Xeon Phi.

Monitoreando sus trabajos activos

Una forma pasiva de monitorear sus trabajos es indicarle a SLURM que envíe un correo electrónico cuando haya terminado. Esto se puede configurar en el archivo SLURM usando las siguientes opciones:

ConfiguraciónDescripción
–mail-user=<email>Dónde enviar alertas de correo
–mail-type=<BEGIN|END|FAIL>Cuándo enviar alertas de correo
#SBATCH --mail-user=example@mail.com
#SBATCH --mail-type=END,FAIL

Una forma pasiva de monitorear sus trabajos es indicarle a SLURM que envíe un correo electrónico cuando haya terminado. Esto se puede configurar en el archivo SLURM usando las siguientes opciones:

ComandoDescripción
squeue -u <username>Verificar trabajos para un usuario específico
sinfoMostrar todos los nodos (con atributos)
scontrol show job <job_id>Estado de un trabajo en particular
scancel <job_id>Eliminar trabajo

Para mostrar detalles sobre el estado de un trabajo:

$ squeue -j <jobid>Copy

Para mostrar detalles sobre el estado de un trabajo:

$ watch -n <num_seconds> squeue -j <jobid>Copy
Estados de trabajo válido

Para comprender los códigos de estado de trabajo que puede encontrar, verifique lo siguiente:

CódigoEstado
CACancelado
CDCompletado
CFConfigurando
CGCompletando
FFallo
NFFallo de nodo
PDPendiente
RCorriendo
TOTimeout
SSuspendido
Recuperando resultados

De forma predeterminada, cada trabajo generará un archivo de salida con un nombre como en el siguiente ejemplo:

$ result.txtCopy

Puede copiar este archivo a su computadora local o ejecutar otro script para procesar posteriormente la salida.

Trabajos interactivos

A veces desea tener acceso directo a algún nodo. Usar ssh directamente es una mala práctica, porque el sistema de cola podría enviar el trabajo de otra persona para que se ejecute en el nodo que está utilizando actualmente. La forma educada de solicitar acceso directo es a través de un trabajo interactivo que lo pondrá en una ventana interactiva en un nodo de cómputo. Esto le permite experimentar con diferentes opciones y variables que proporcionarán retroalimentación inmediata.

Para solicitar una cola interactiva puede utilizar:

$ sallocCopy
$ salloc --partition=[Partition]Copy

Lo anterior le brindará una ventana a uno de los nodos de la cola que usted elija, ya sea: dribe, kura o nukwa; así como a sus variables: nukwa-wide, nukwa-long, dribe-debug, etc.

07Módulos de ambiente

Diferentes usuarios tienen diferentes necesidades, y a veces esas necesidades pueden ser conflictivas; por ejemplo, cuando se requieren varias versiones de la misma biblioteca. Estas situaciones se resuelven con módulos de entorno. Un caso típico son las diferentes versiones de Python. Para ejemplificar, consulte la cola en la que debe ejecutar escribiendo:

$ SBATCH --partition=nukwaCopy

Luego, escriba $ python. Deberá ingresar al intérprete predeterminado de Python, cuyo encabezado debería verse así:

Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5] on linux2
Type "help" for more information.
>>>

Además del intérprete predeterminado, puede utilizar Intel Distribution for Python, una compilación optimizada específicamente con paquetes comúnmente utilizados en informática científica. Para obtener Intel Python, escriba:

module load intelpython/3.5

Ahora, escriba nuevamente $ python. Obtendrá un encabezado diferente:

Python 3.5.2 |Intel| (default, Oct 20 2016)
Intel(R) Distribution for Python
>>>

Para comprobar qué módulos están cargados, escriba

$ module listCopy

Para obtener una lista de todos los módulos disponibles, escriba

$ module availCopy

Detrás de escena, el comando module solo configura rutas, alias y otras variables de entorno. Los módulos se cargan únicamente para la sesión de shell actual. Puede solicitar módulos específicos en sus trabajos agregando las líneas “module load module_name” dentro del script SLURM, debajo de todas las líneas #SBATCH y antes de ejecutar su programa.

08Agradecimientos

Solicitamos a todos los usuarios de la plataforma informática Kabré que incluyan un reconocimiento en los documentos (informes, artículos, informes técnicos) de su investigación. Ofrecemos aquí un ejemplo en español e inglés, respectivamente:

Esta investigación contó con el apoyo de una asignación computacional en la supercomputadora Kabré del Centro Nacional de Alta Tecnología de Costa Rica

This research was partially supported by a machine allocation on Kabré supercomputer at the Costa Rica National High Technology Center