Tabla de Contenidos
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.
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()
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:
En el caso de usar X2Go Client ejecutamos la aplicación que instalamos en nuestra PC y procedemos a configurar la sesión:
Vamos Session → New 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
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
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