Uso básico del cluster de cálculo del DF

**WORK IN PROGRESS**

Acceso a Dirac

El acceso al sistema se realiza mediante un nodo central interactivo. Este nodo tienen habilitado el acceso desde la red del DF, esto incluye el acceso desde login.df.uba.ar y por la VPN, mediante el protocolo SSH y permiten el uso de los intérpretes más comunes, Ej. bash.

Cluster Dirac

Si en lugar de usuario y password utilizas ssh key podes copiar tu llave (key) en dirac de la siguiente manera desde tu computadora:

roberto@odisea2 ~ ssh-copy-id -i .ssh/id_rsa.pub radhios@dirac

Límites de uso interactivo

Las sesiones abiertas en el sistema se cancelan tras 8 horas de inactividad. Ud. puede utilizar terminales como tmux y screen para mantener sesiones desconectadas indefinidamente.

Información de acceso

El acceso al servicio está controlado mediante mecanismos de autenticación: usuario y password del DF.

Entorno

Dirac dispone de un sistema de configuración de entorno de compilación/ejecución denominado Modules. Mediante la carga de los Modules adecuados es posible personalizar de forma dinámica el entorno, eligiendo los compiladores, librerías versiones de aplicación, etc. Los Modules disponibles por defecto pueden ser consultados mediante la orden module list que proporcionará un listado organizado en categorías.

[radhios@dirac ~]$ module list
 
Currently Loaded Modules:
  1) autotools   2) prun/1.2   3) gnu7/7.3.0   4) openmpi3/3.1.0   5) ohpc

Si quiero ver todos los modulos disponible en el sistema organizado por categorías, ejecuto el comando modules avail

[radhios@dirac ~]$ module avail 
 
------------------------------------------------------------------------------- /opt/ohpc/pub/moduledeps/gnu7-openmpi3 --------------------------------------------------------------------------------
   adios/1.13.1    hypre/2.14.0    mpiP/3.4.1          netcdf-fortran/4.4.4    phdf5/1.10.2      py2-mpi4py/3.0.0    py3-scipy/1.1.0    scorep/4.0       superlu_dist/5.3.0
   boost/1.67.0    imb/2018.1      mumps/5.1.2         netcdf/4.6.1            pnetcdf/1.9.0     py2-scipy/1.1.0     scalapack/2.0.2    sionlib/1.7.1    tau/2.27.1
   fftw/3.3.7      mfem/3.3.2      netcdf-cxx/4.3.0    petsc/3.9.1             ptscotch/6.0.4    py3-mpi4py/3.0.0    scalasca/2.3.1     slepc/3.9.1      trilinos/12.12.1
 
------------------------------------------------------------------------------------ /opt/ohpc/pub/moduledeps/gnu7 ------------------------------------------------------------------------------------
   R/3.5.0         atlas/3.10.1    hdf5/1.10.2     likwid/4.3.2    mpich/3.2.1     ocr/1.0.1          openmpi3/3.1.0 (L)    plasma/2.8.0        py3-numpy/1.14.3    superlu/5.2.1
   arpack/3.1.3    gsl/2.4         lapack/3.4.2    metis/5.1.0     mvapich2/2.2    openblas/0.2.20    pdtoolkit/3.25        py2-numpy/1.14.3    scotch/6.0.4
 
-------------------------------------------------------------------------------------- /opt/ohpc/pub/modulefiles --------------------------------------------------------------------------------------
   EasyBuild/3.6.1        charliecloud/0.2.4    cmake/3.11.1    gnu7/7.3.0    (L)    llvm5/5.0.1       ohpc       (L)    pmix/2.1.1        singularity/2.5.1
   autotools       (L)    clustershell/1.8      gnu/5.4.0       hwloc/1.11.10        mkl/2018.3.222    papi/5.6.0        prun/1.2   (L)    valgrind/3.13.0
 
----------------------------------------------------------------------------------- /opt/ohpc/pub/apps/modules/all ------------------------------------------------------------------------------------
   Anaconda2/5.1.0    Anaconda3/5.1.0    Java/1.8.0_172    numactl/2.0.11-GCCcore-6.4.0
 
  Where:
   L:  Module is loaded
 
Use "module spider" to find all possible modules.
Use "module keyword key1 key2 ..." to search for all possible modules matching any of the "keys".

Para cargar cualquier Module basta con ejecutar module add <app>/<version>, siendo <app>/<version> el nombre y versión de una aplicación concreta. Usando module load <app> cargará la versión por defecto de la aplicación <app>. Este comando modificará el entorno (las variables PATH, MANPATH, LD_LIBRARY_PATH…) para permitir el uso correcto de la aplicación indicada. Ej:

[radhios@dirac ~]$ module load py3-scipy/1.1.0 

Para comprobar los Modules cargados basta con ejecutar module list.

[radhios@dirac ~]$ module list
 
Currently Loaded Modules:
  1) autotools   2) prun/1.2   3) gnu7/7.3.0   4) openmpi3/3.1.0   5) ohpc   6) fftw/3.3.7   7) openblas/0.2.20   8) py3-numpy/1.14.3   9) py3-scipy/1.1.0

Aquí vemos que se cargo el modulo py3-scipy/1.1.0 y sus dependencias en forma automática openmpi3/3.1.0 fftw/3.3.7 openblas/0.2.20 py3-numpy/1.14.3

El comando module unload <app> permite descargar el entorno de la aplicación <app>, deshaciendo las modificaciones del entorno. Si se han cargado varios Modules el resto no se verán afectados, salvo los que han sido cargados automaticamente como dependencias del modulo descargado, en ese caso si serán descargados.

[radhios@dirac ~]$ module unload py3-scipy/1.1.0 
 
[radhios@dirac ~]$ module list
 
Currently Loaded Modules:
  1) autotools   2) prun/1.2   3) gnu7/7.3.0   4) openmpi3/3.1.0   5) ohpc

Vemos que el modulo descargado y sus dependencias ya no están.

Gestión de disco

Los sistemas de archivos tienen habilitado el control de uso mediante un sistema de cuotas. Como norma general, las cuotas se establecen a nivel de usuario. El investigador principal responsable del proyecto es el encargado de gestionar de forma apropiada los recursos asignados. Por omisión, todos los usuarios tienen asignada una cuota de 160 GB para el /home/USER del usuario y 4 TB para el scratch /scratch/USER. Para consultar los límites de cuota asignados se puede ejecutar quota -u <user-id> indicando el identificador de usuario que se desea utilizar.

[radhios@dirac ~]$ id 
uid=1171(radhios) gid=100(users) groups=100(users),1076(compu)
 
[radhios@dirac ~]$ quota -u 1171 -s
Disk quotas for user radhios (uid 1171): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
/dev/mapper/centos_161--dhcp-home
                   354M  97657M    191G            2650       0       0        
 
#### O se puede hacer ####
 
[radhios@dirac ~]$ quota -u radhios -s
Disk quotas for user radhios (uid 1171): 
     Filesystem   space   quota   limit   grace   files   quota   limit   grace
/dev/mapper/centos_161--dhcp-home
                   354M  97657M    191G            2650       0       0        

Si un proyecto necesita una capacidad de almacenamiento mayor que la asignada, el jefe del proyecto deberá solicitar dicha ampliación contactando a COMPU, justificando los motivos y la capacidad que se precisa.

Transferencia de ficheros

Dirac dispone de diversos servicios de transferencia de ficheros, tanto entre el sistema y los equipos de los usuarios como entre dos o más sitios de la RED. Los métodos de transferencia seguros (SCP y SFTP) están habilitados en todos los nodos interactivos. Estos métodos cifran toda la información que se intercambia entre los dos sitios.

Un ejemplo básico de uso sería:

  • SCP
ComputadorPersonal> scp <origen> <destino>

Copiar desde dirac a nuestro computador personal:

u@local> scp [usuario]@dirac.df.uba.ar:RutaRemota RutaLocal

Copiar desde nuestro computador hacia dirac:

u@local> scp RutaLocal [usuario]@dirac.df.uba.ar:RutaRemota
  • SFTP
u@local> sftp [usuario]@dirac.df.uba.ar
sftp> put localfile
sftp> get remotefile 

Uso de SLURM

Ejecución de Programas Utilizando SLURM

Existen dos herramientas esenciales para la ejecución de trabajos

srun Este comando ejecuta trabajos paralelos en el cluster. Si es necesario, srun solicitará recursos antes de la ejecución del trabajo.

sbatch Este comando ejecuta un script bash en SLURM

* ¿Cómo Ejecutar Trabajos Seriales?

Para ejecutar programas seriales interactivos, es decir, que no requieran de alguna entrada de parámetros de forma interactiva, ejecute un comando como el que sigue (recuerde que si cierra la sesión el proceso se cancelará):

srun ./programa &> salida &

Este comando ejecuta ./programa en alguno de los nodos del cluster. El argumento &> salida indica que tanto la salida como los errores se almacenan en un archivo de nombre salida que se creará en el mismo directorio desde donde se ejecutó el programa. Finalmente, el último carácter & es para liberar la consola desde donde se lanza la ejecución del programa.

* ¿Cómo Ejecutar Trabajos Seriales Usando un Script Shell?

Para ejecutar programas seriales pasivos utilizando un script shell, que no requieran de alguna entrada de parámetros de forma interactiva, ejecute un comando como el que sigue:

sbatch ./script.sh

Este comando ejecuta ./script.sh en alguno de los nodos del cluster.

* ¿Cómo Ejecutar Trabajos Paralelos con OpenMP? (Memoria Compartida)

Para ejecutar programas paralelos con OpenMP edite un script shell de nombre openmp.sh con el siguiente contenido:

#!/bin/bash
#SBATCH --cpus-per-task=4 # 
 
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
 
./programa_ejecutable > salida

La línea export OMP NUM THREADS=4 indica que se utilizarán 4 hilos de ejecución. El valor de esta variable debe fijarse según las necesidades y características de su programa ejecutable (programa_ejecutable). Luego, ejecute siguiente comando:

sbatch ./script.sh

Este comando ejecuta el script ./openmp.sh en alguno de los nodos del cluster.

* ¿Cómo Ejecutar Trabajos Paralelos con OpenMPI? (Memoria Distribuida)

Para ejecutar programas paralelos con OpenMPI edite un script shell, de nombre mpi.sh, con el siguiente contenido:

#!/bin/bash
#SBATCH --partition=batch  #Seleccione los nodos para el trabajo de todos el conjunto de nodos de cómputo del cluster
#SBATCH -o mpi.%j.out  #Nombre del archivo de salida
#SBATCH -J mpiJob  #Nombre del trabajo
#SBATCH --nodes=2  #Numero de nodos para correr el trabajo
#SBATCH --ntasks=20  #Numero de procesos
#SBATCH --tasks-per-node=10  #Numero de tareas por nodo
 
#Prepara el ambiente de trabajo
*export I_MPI_PMI_LIBRARY=/opt/ohpc/admin/pmix/lib/libpmi.so
ulimit -l unlimited
 
#Ejecuta el programa paralelo
prun ./programaMPIejecutable

Las líneas que comienzan con la palabra reservada #SBATCH indican las opciones del trabajo paralelo. La opción –partition=all indica que los nodos necesarios para ejecutar el trabajo se seleccionarán de la partición de nombre all. La opción –nodes=2 solicita 2 nodos de cómputo para el trabajo, la opción –ntasks=20 indica que se ejecutarán 20 tareas que en el caso de MPI representan los procesos. La opción –ntasks-per-node=10 indica que los 20 procesos se distribuirán de a 10 procesos por nodo. La siguiente línea enlaza la biblioteca con la que se compila OpenMPI para que tenga soporte integrado con SLURM.

export I_MPI_PMI_LIBRARY=/opt/ohpc/admin/pmix/lib/libpmi.so

Recuerde que sino especifica la cantidad de memoria a utilizar se le asignará 256MB por nodo, en caso de requerir mas deberá incluir el tag:

#SBATCH --mem=XXXX

En caso de querer usar mas sin especificarlo el proceso se cancelará.

Y la siguiente línea es para eliminar el límite de memoria que el sistema operativo fija de forma predefinida.

export I_MPI_PMI_LIBRARY=/opt/ohpc/admin/pmix/lib/libpmi.so

Finalmente, en la última línea, se especifica el programa ejecutable (programaMPIejecutable). Luego, ejecute siguiente comando:

sbatch ./mpi.sh

Este comando ejecuta el script mpi.sh en el conjunto de los nodos del cluster.

Supervisión (SLURM)

Una de la tareas más importantes en la administración de SLURM es conocer el estado de todos los componentes y servicios. Esta sección muestra las herramientas que nos ayudan en la supervisión de SLURM.

sinfo

Este comando muestra el estado de los distintos nodos. Un ejemplo de la salida es la siguiente:

[radhios@dirac ~]$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
batch*       up 2-00:00:00      6   idle compute-[0-5]

scontrol

Además de mostrar la configuración actual de SLURM, este comando es utilizado para modificarla, esto incluye elementos como trabajos (jobs), tareas (job steps), nodos, particiones, reservas, etc. Debe ser ejecutado por root. Si no se le pasan opciones se inicia una línea de comandos desde donde se puede utilizar todas las opciones de forma interactiva. Si se realiza una modificación a la configuración general, se puede escribir la nueva configuración con el comando write (solo root), lo cual generará un nuevo archivo (slurm.conf.fecha) en el directorio de la actual configuración.

[radhios@dirac ~]$ scontrol show nodes compute-0
NodeName=compute-0 Arch=x86_64 CoresPerSocket=8
   CPUAlloc=2 CPUErr=0 CPUTot=32 CPULoad=0.01
   AvailableFeatures=(null)
   ActiveFeatures=(null)
   Gres=(null)
   NodeAddr=compute-0 NodeHostName=compute-0 Version=17.11
   OS=Linux 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 
   RealMemory=56315 AllocMem=512 FreeMem=62642 Sockets=2 Boards=1
   State=MIXED ThreadsPerCore=2 TmpDisk=131072 Weight=1 Owner=N/A MCS_label=N/A
   Partitions=batch 
   BootTime=2018-07-30T13:04:01 SlurmdStartTime=2018-07-30T13:05:00
   CfgTRES=cpu=32,mem=56315M,billing=32
   AllocTRES=cpu=2,mem=512M
   CapWatts=n/a
   CurrentWatts=0 LowestJoules=0 ConsumedJoules=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

squeue

Este comando sirve para mostrar el estado de los trabajos.

[radhios@dirac ~]$ squeue 
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
              1693     batch     bash  capuzzi  R       1:04      1 compute-0

Se puede utilizar una salida con formato para visualizar información específica

[radhios@dirac ~]$ squeue -o "%u   %N      %b"
USER   NODELIST      GRES
capuzzi   compute-0      (null)

Se puede obtener información con formato sobre un trabajo específico

[radhios@dirac ~]$ squeue -n bash -o "%u %N"
USER NODELIST
capuzzi compute-0

Exportar gráficos o aplicaciones graficas desde el nodo central (dirac)

Para poder exportar appl gráficas tipo matplotlib o gnuplot o octave tenemos varios métodos a saber:

*Exportar el display via ssh

De esta manera podemos conectarnos a dirac y decirle que cuando se ejecute una aplicación gráfica X exporte el display a la computadora del usuario para que allí sea mostrado.

Ejemplo:

roberto@odisea2 ~ ssh -XY radhios@dirac      
Last login: Tue Jul 31 13:42:19 2018 from odisea.df.uba.ar
 
[radhios@dirac ~]$ module load Anaconda2
 
[radhios@dirac ~]$ python simple_plot.py

Código del ejemplo

import matplotlib.pyplot as plt
import numpy as np
 
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2*np.pi*t)
plt.plot(t, s)
 
plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
plt.savefig("test.png")
plt.show()

Salida:

La otra forma de acceso es via clientes de servidores gráficos. En nuestro caso tenemos instalados dos servicios X2GO y XPRA, a continuación detallamos como se instalan y usan.

Los paquetes para instalar los clientes son x2goclient.x86_64 / xpra-common-client.noarch para CentOS, Fedora y x2goclient / xpra para Debian, Ubuntu. Existen tambien paquetes análogos para Windows y MacOS.

En el caso de XPRA ejecutamos el siguiente comando en nuestra consola

roberto@odisea2 ~ xpra start ssh/radhios@dirac --start-child="xterm -fn 10x20 -ls" --exit-with-children

Este comando nos va a mostrar una consola grafica xterm de dirac en nuestra PC, y si ejecutamos el mismo ejemplo anterior vamos a obtener la siguiente salida:

Documentación XPRA

En el caso de usar X2Go Client ejecutamos la aplicación que instalamos en nuestra PC y procedemos a configurar la sesión:

Vamos SessionNew Session se va a cargar una ventana de dialogo en la cual configuramos los datos de conexión y aplicación a ejecutar remoto:

En este caso se configuraron las credenciales del usuario y se configuró la aplicación a ejecutar en dirac, igual que en el ejemplo anterior se usa XTERM

Documentación X2Go

Otro ejemplo que pueden ejecutar es:

import numpy as np
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
menStd = (2, 3, 4, 1, 2)
womenStd = (3, 5, 2, 3, 3)
ind = np.arange(N)    # the x locations for the groups
width = 0.35       # the width of the bars: can also be len(x) sequence
 
p1 = plt.bar(ind, menMeans, width, yerr=menStd)
p2 = plt.bar(ind, womenMeans, width,
             bottom=menMeans, yerr=womenStd)
 
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.xticks(ind, ('G1', 'G2', 'G3', 'G4', 'G5'))
plt.yticks(np.arange(0, 81, 10))
plt.legend((p1[0], p2[0]), ('Men', 'Women'))
 
plt.savefig("a.png")
plt.show()

Haciendo lo siguiente:

roberto@odisea2 ~ ssh -XY radhios@dirac
Last login: Tue Jul 31 16:49:45 2018 from odisea.df.uba.ar
[radhios@dirac ~]$ module load Anaconda3
[radhios@dirac ~]$ python bar_stacked.py 

La salida será como se ve a continuación:

Este ejemplo se corrió en el nodo central, igual manera se puede hacer en uno de los nodos de calculo:

roberto@odisea2 ~ ssh -XY radhios@dirac
[radhios@dirac ~]$ srun --pty bash # Aqui el SLURM nos asigna un nodo de calculo, en este caso **compute-0**
[radhios@compute-0 ~]$ python bar_stacked.py 

La salida será como en el ejemplo anterior.

Comandos mas usados de SLURM

Resumen de comandos SLURM

sinfo    -> mostrar información global del cluster
sview    -> mostrar información global del cluster (Grafica, requiere exportar el X de su PC "ssh -XY usuario@dirac.df.uba.ar").
scontrol show job nnnn    -> examinar un job en especial (nnnn = jobid).
scontrol show node nodename    -> examinar un nodo en especial (nodename = compute-0 a compute-6).
sbatch    -> enviar un script ejecutable al sistema de colas.
srun    -> ejecutar un comando como un nuejo job o en uno exitente.
scancel    -> borrar un job.
sacct   -> visualizar el "accounting" del usuario de jobs terminados y en ejecución.

Ejemplo del sview (Interfaz gráfica)

roberto@odisea2 ~ ssh -XY radhios@dirac
Last login: Fri Aug  3 16:18:10 2018 from odisea.df.uba.ar
[radhios@dirac ~]$ sbatch miscript.sh 
Submitted batch job 1827

Ejemplo del sacct (accounting)

[radhios@dirac ~]$ sbatch miscript.sh 
Submitted batch job 1826
[radhios@dirac ~]$ sacct
       JobID    JobName  Partition    Account  AllocCPUS      State ExitCode 
------------ ---------- ---------- ---------- ---------- ---------- -------- 
//
\\
1824.extern      extern               default          1  COMPLETED      0:0 
1824.0               ls               default          1  COMPLETED      0:0 
1825               bash      batch    default          1 CANCELLED+      0:0 
1825.extern      extern               default          1  COMPLETED      0:0 
1826         miscript.+      batch    default        128    RUNNING      0:0 
1826.extern      extern               default        128    RUNNING      0:0 

Convertir del sistemas de colas PBS a SLURM

**WORK IN PROGRESS**