Apptainer
¿Qué es?
Apptainer es un programa informático gratuito , multiplataforma y de código abierto que realiza la virtualización a nivel del sistema operativo, también conocida como containers.
Uno de los principales usos de Apptainer es llevar contenedores y reproducibilidad a la informática científica y al mundo de la informática de alto rendimiento (HPC).
Los contenedores de Apptainer se pueden usar para empaquetar flujos de trabajo científicos completos, software y bibliotecas, e incluso datos. Esto significa que no tiene que pedirle al administrador del clúster que instale nada por usted; puede ponerlo en un contenedor de Apptainer y ejecutarlo.
El software Apptainer puede importar sus imágenes de Docker sin tener Docker instalado o ser un superusuario.
¿Necesitas compartir tu código? Póngalo en un contenedor de Apptainer y su colaborador no tendrá que pasar por la molestia de instalar dependencias faltantes. ¿Necesita ejecutar un sistema operativo completamente diferente? Puede "cambiar" el sistema operativo de su host por otro diferente dentro de un contenedor de Apptainer
Modulos
Para el uso de Apptainer debe cargar los módulos:
- ml aocc/4.2.0
- ml apptainer/1.1.9
Ejemplos de Lanzador
Importar imagen de Apptainer
Para este ejemplo utilizaremos la imagen de Apptainer hello-world (shub://singularityhub/hello-world), crearemos un directorio llamado Ejemplo y nos posicionaremos en el directorio creado:
prueba@leftraru1:~$ mkdir Ejemplo prueba@leftraru1:~$ cd Ejemplo/
Cargar módulo de Apptainer:
prueba@leftraru1:~$ ml purge prueba@leftraru1:~$ ml aocc/4.2.0 prueba@leftraru1:~$ ml apptainer/1.1.9
Crear carpeta temporal:
prueba@leftraru1:~$ mkdir -p /tmp/singularityce/singularity/mnt/session
Importar imagen de Apptainer:
prueba@leftraru1:~/Ejemplo$ apptainer pull shub://singularityhub/hello-world INFO: Downloading shub image 59.75 MiB / 59.75 MiB [=====================================================================================================================================================] 100.00% 12.41 MiB/s 4s prueba@leftraru1:~/Ejemplo$ ll total 57344 -rwxr-xr-x 1 prueba nlhpc 62652447 Jul 30 10:46 hello-world_latest.sif
Ejecutando imagen:
prueba@leftraru1:~/Ejemplo$ apptainer run hello-world_latest.sif INFO: Convert SIF file to sandbox... Tacotacotaco INFO: Cleaning up image...
Como se puede observar el resultado de ejecutar el contenedor es la palabra: Tacotacotaco
Generando Script
Ejemplo de script para lanzar en la partición general.
Utilizamos 1 nodos, 44 simulaciones por nodo y utilizamos los 187 Gb de Ram declarados en el script:
prueba@leftraru1:~/Ejemplo$ vim script_44cores.sh
Ejemplo de Script Slurm:
#!/bin/bash # ----------------SLURM Parameters---------------- #SBATCH -J Hello-world #SBATCH -p general #SBATCH -n 44 #SBATCH --ntasks-per-node=44 #SBATCH --mem-per-cpu=4250 #SBATCH --mail-user=prueba@nlhpc.cl #SBATCH --mail-type=ALL #SBATCH -o hello-world_%j.out #SBATCH -e hello-world_%j.err #Modulos Necesarios ml aocc/4.2.0 ml apptainer/1.1.9 #Creación de carpeta mkdir -p /tmp/singularityce/singularity/mnt/session #Comandos srun apptainer run hello-world_latest.sif
Lanzar script:
prueba@leftraru1:~/Ejemplo$ sbatch script_44cores.sh Submitted batch job 19051335
Revisar estado del trabajo:
prueba@leftraru1:~/Ejemplo$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 19051335 general Hello-wo prueba R 0:12 1 sn045
Revisar estado de simulación: (trabajo finalizado correctamente)
prueba@leftraru1:~/Ejemplo$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
Revisión de inicio del trabajo mediante correo:
Revisión de finalización de trabajo mediante correo:
La tarea fue ejecutada en 3 minutos con 04 segundos.
Resultados de la tarea (se generan 2 archivos, 1 archivo error y un 1 archivo de salida):
prueba@leftraru1:~/Ejemplo$ ll total 61204 -rw-r--r-- 1 prueba nlhpc 3872 Jul 30 11:31 hello-world_19051335.err -rw-r--r-- 1 prueba nlhpc 572 Jul 30 11:31 hello-world_19051335.out -rwxr-xr-x 1 prueba nlhpc 62652447 Jul 30 11:16 hello-world_latest.sif -rwxr-xr-x 1 prueba nlhpc 405 Jul 30 11:30 script_44cores.sh
Resumen de archivo hello-world_19051335.out:
Aquí podemos ver que la ejecución nos entregó como resultado 44 veces la ejecución del contenedor (la simulación fue ejecutada de forma correcta).
prueba@leftraru1:~/Ejemplo$ wc -l hello-world_19051335.out 44 hello-world_19051335.out prueba@leftraru1:~/Ejemplo$ cat hello-world_19051335.out Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco Tacotacotaco ...
Resumen de archivo hello-world_19051335.err:
Aquí podemos ver que Apptainer convirtió la imagen 44 veces y limpio la imagen 44 veces.
prueba@leftraru1:~/Ejemplo$ wc -l hello-world_19051335.err 88 hello-world_19051335.err prueba@leftraru1:~/Ejemplo$ cat hello-world_19051335.err Resumen INFO: Convert SIF file to sandbox... INFO: Convert SIF file to sandbox... INFO: Cleaning up image... INFO: Cleaning up image...
Contenedores GPU AMD MI210
Contamos con un directorio especial que contiene una serie de imágenes listas para ser ejecutadas en las GPU AMD MI210. Basta con cargar el módulo de Apptainer:
ml aocc/4.2.0 ml apptainer/1.1.9
[modules@leftraru1 ~]$ ls $IMAGES chroma_3.43.0.sif nwchem.sif ryzen-ai-tensorflow2_latest.sif cp2k_2022.2.amd3.sif openfoam_2206.1.amd3.sif ryzen-ai-tensorflow_latest.sif grid_0.8.2-20211213.sif openmm_7.7.0_49.sif specfem3d_9c0626d1-20201122.sif gromacs_2022.3.amd1_174.sif petsc_3.18.amd4.sif specfem3d_globe_1ee10977-20210321.sif lammps_2022.5.04_130.sif pyfr_1.14.0_48.sif trilinos_1.7.sif namd_2.15a2-20211101.sif relion_4.0.sif uif-pytorch_uif1.2_rocm5.6.1_vai3.5_py3.8_pytorch1.13.sif namd3_3.0a9.sif ryzen-ai-pytorch_latest.sif uif-tensorflow_uif1.2_rocm5.6.1_vai3.5_tensorflow2.12.sif
Ejemplo contenedor CP2K
#!/bin/bash #---------------Script SBATCH - NLHPC ---------------- #SBATCH -J testamd #SBATCH -p mi210 #SBATCH -n 16 #SBATCH --gres=gpu:1 #SBATCH -c 4 #SBATCH --mem-per-cpu=30354 #SBATCH --mail-user=test@correo.com #SBATCH --mail-type=ALL #SBATCH -o testamd_%j.out #SBATCH -e testamd_%j.err #-----------------Toolchain--------------------------- # ----------------Modulos---------------------------- ml aocc/4.2.0 ml apptainer/1.1.9 # ----------------Comando-------------------------- apptainer exec $IMAGES/cp2k_2022.2.amd3.sif mpirun -x NUM_CPUS=64 -x NUM_GPUS=6 -x RANK_STRIDE=6 -x OMP_NUM_THREADS=4 --oversubscribe -np 16 --bind-to none set_cpu_affinity.sh set_gpu_affinity.sh cp2k.psmp -i /opt/cp2k/benchmarks/QS_DM_LS/H2O-dft-ls.NREP2.inp -o /tmp/H2O-DFT-LS-NREP2-8GPU.txt
Más información pueden encontrar en https://github.com/amd/InfinityHub-CI/