Run an executable under Apptainer in parallel
This article describes how to run an MPI program that was compiled in an Apptainer environment in parallel, using the host MPI library.
While an Apptainer environment encapsulates the dependencies of an application, including MPI, it is often beneficial, to delegate MPI calls within the container to the host. The advantages are:
- You can let SLURM manage the resources for you
- You can leverage the MPI library on the host, which has been configured for maximum performance
Note that for this to work, the MPI version inside the container must be compatible with that on the host. We'll illustrate this approach with an example.
Build the containerised executable¶
This will need to take place on a Milan node. Hence, we need to submit a SLURM script that calls apptainer build
:
git clone git@github.com:pletzer/fidibench.git
cd fidibench
sbatch fidibench_apptainer_build_intel.sl
When the job finishes (after 1+ hour), you will have a fidibench_intel.sif
file in your directory.
Run the containerised executable¶
You can check that the executable was built successfully by running a quick test, using the internal MPI
apptainer exec fidibench_intel.sif mpiexec -n 4 /software/fidibench/bin/upwindMpiCxx -numCells 128 -numSteps 10
Number of procs: 4
times min/max/avg: 3.33281/3.34092/3.3355 [seconds]
Check sum: 1
To submit the job via SLURM, write the following job script fidibench_intel_apptainer.sl
:
#!/bin/bash -e
#SBATCH --ntasks=64
#SBATCH --partition=milan
#SBATCH --job-name=fidibench_app
module purge
module load Apptainer
module load intel # load the Intel MPI
export I_MPI_FABRICS=ofi # turn off shm to allow the code to run on multiple nodes
# -B /opt/slurm/lib64/ binds this directory to the image when running on mahuika,
# it is required for the image's MPI to find the libpmi2.so library. This path
# may be different on a different host.
srun apptainer exec -B /opt/slurm/lib64/ fidibench_intel.sif /software/fidibench/bin/upwindMpiCxx -numCells 512 -numSteps 10
and submit it
sbatch fidibench_intel_apptainer.sl
The above job can run on multiple nodes.
Note that the host MPI is loaded with the intel
module. The MPI libraries on the host and in the
container need to be compatible. At the time of writing, the host MPI is 2021.5
and the MPI in the container is 2021.8
.