Saltar a contenido

Apptainer#

Apptainer es una plataforma que permite ejecutar contenedores en entornos HPC. Originalmente, Singularity era la herramienta utilizada para este propósito pero su desarrollo fue bifurcado en Apptainer, que ahora es el estándar recomendado en la comunidad de HPC.

Warning

Singularity ha quedado obsoleto y será eliminado en el futuro, por lo que recomendamos a los usuarios migrar sus flujos de trabajo a Apptainer.

Apptainer ofrece soporte para ejecutar contenedores con soporte MPI y GPU. Además puede integrarse en scripts de Slurm sin problemas.

Uso de Apptainer en TeideHPC#

Info

Actualmente, tenemos disponible la versión 1.3.6 de Apptainer en TeideHPC.

Podemos cargar el software utilizando modules:

$ module load Apptainer/1.3.6
$ apptainer -h

Contenedores de Docker#

Apptainer usa su propio formato de contenedor .sif por lo que los contenedores de Docker deben convertirse aunque esto se hace automáticamente sin intervención del usuario.

Descargar contenedores desde DockerHub#

Info

Las descargas de contenedores deben realizarse siempre desde los login nodes, que tienen acceso a Internet, y no desde los nodos de cómputo.

Ejemplo de descarga de una imagen de DockerHub para su uso en el clúster:

apptainer pull docker://hello-world

Esto generará un archivo de imagen en el directorio actual:

hello-world_latest.sif

Para ejecutar el contenedor:

Warning

No está permitido ejecutar software en los nodos de login. Usa salloc para solicitar un nodo de cómputo y ejecutarlo allí.

apptainer run hello-world_latest.sif

Si necesitamos construir un contenedor desde Docker, podemos usar:

apptainer build mycontainer.sif docker://ubuntu:latest

Ejecutar un contenedor#

Para ejecutar un contenedor:

apptainer run mycontainer.sif <arg-1> <arg-2> ... <arg-N>

También podemos ejecutar un comando específico dentro del contenedor:

apptainer exec mycontainer.sif <comando> <arg-1> <arg-2> ... <arg-N>

Para obtener una shell interactiva dentro del contenedor:

apptainer shell mycontainer.sif

Ejecutar un contenedor en Slurm#

Podemos ejecutar Apptainer en Slurm como cualquier otro software:

#!/bin/bash -l

#SBATCH -J apptainer_job
#SBATCH -p batch
#SBATCH --nodes=1
#SBATCH -o out.log
#SBATCH -e err.log

module load Apptainer/1.3.6

apptainer run $HOME/hello-world_latest.sif

Slurm tratará apptainer como un software más, es decir, que le aplicará las mismas restricciones de recursos, en cuanto a cpu, memoria y tiempo que el resto del software.

Uso con MPI#

Tip

El soporte para MPI dependerá del software que vayamos a ejecutar, no de Apptainer. Por tanto, pedimos a los usuarios que lean la documentación de su software detenidamente antes de ejecutar cualquier cosa.

Si el software dentro del contenedor soporta MPI, podemos ejecutarlo con srun:

#!/bin/bash -l

#SBATCH -J apptainer_mpi
#SBATCH -p batch
#SBATCH --nodes=2
#SBATCH -o out.log
#SBATCH -e err.log

module purge
module load Apptainer/1.3.6
module load GCC/12.2.0 OpenMPI/4.1.4

srun apptainer run $HOME/hello-world_latest.sif

Uso con GPU#

Tip

El soporte para GPU dependerá del software que vayamos a ejecutar, no de Apptainer. Por tanto, pedimos a los usuarios que lean la documentación de su software detenidamente antes de ejecutar cualquier cosa.

Para utilizar GPU, debemos añadir el parámetro --nv (enable Nvidia support) a apptainer:

apptainer run --nv mycontainer.sif

Ejemplo en Slurm:

#!/bin/bash -l

#SBATCH -J apptainer_gpu
#SBATCH -p gpu
#SBATCH --cpus-per-task=4
#SBATCH --gpus=a100:1
#SBATCH -o out.log
#SBATCH -e err.log

module purge
module load Apptainer/1.3.6

apptainer run --nv $HOME/hello-world_latest.sif

Otras opciones#

Podemos montar directorios del host dentro del contenedor con -B:

apptainer run -B /usr/lib/locale/:/usr/lib/locale -B "${PWD}/input":"/input" mycontainer.sif <command> <arg-1> ... <arg-N>