Singularity Jobs
3 minute read
What is Singularity
In short, Singularity
is a program that will allow a user to run code or command, within a customized environment.
We will refer to this customized environment as a container
.
This type of container system is common, the more popular one being Docker.
Since Docker
requires root access and HPC users are not typically granted these permissions, we use Singularity instead.
Docker
containers can be used via Singularity
, with varying compatibility.
Singularity
is forking into 2 branches:
We will be using Apptainer
when it is ready for production use.
However, in the meantime, singularity-ce
is currently availble on the cluster.
Limitations
Currently we are not supporting Slurm jobs bening submitted from within a container.
If you load the container centos/7.9
and try to submit a job from within it will fail.
Please contact support in order to work around this issue.
How to use Singularity
Singularity
is easy to use.
You can run singularity
in an interactive mode by calling a shell, or you can run singularity
in a non-interactive mode and just pass it a script.
This 2 modes are very similar to job submission on the cluster; srun
is used for interactive, while sbatch
is used for non-interactive.
Interactive Singularity
When running singularity you need to provide the path to a singularity
image file.
For example, this would be the most basic way to get a shell within your container:
module load singularity
singularity shell /path/to/singularity/image
Typically when we install singularity
enabled software, we will also create an environment variable which holds the location of the singularity
image file.
For example, this would be how we would use the centos
module:
module load centos
singularity shell $CENTOS7_SING
There is a special shortcut for the centos
module that allows us to run the above more simply, as:
module load centos
centos.sh
Here is a another example that utilizes an interactive job:
module load centos
srun -p batch --mem=1g -c 4 --time=2:00:00 --pty centos.sh
Non-Interactive Singularity
When running singularity as non-interactive, the same basic rules apply, we need a path to our singularity
image file as well as a command.
Basics
For example, here is the basic syntax:
module load singularity
singularity exec /path/to/singularity/image someCommand
Using centos
as an example, you can execute an abitraty command like so:
module load singularity
singularity exec $CENTOS7_SING cat /etc/redhat-release
Shortcuts
Now using the centos
shortcut:
module load centos
centos.sh "cat /etc/redhat-release"
Here is a more complex example with modules:
module load centos
centos.sh "module load samtools; samtools --help"
Jobs
Here is an example submitted as a job:
module load centos
sbatch -p batch --wrap="centos.sh 'module load samtools; samtools --help'"
Variables
Here is an example with passing environment variables:
export SINGULARITYENV_SOMETHING='stuff'
centos.sh 'echo $SOMETHING'
Notice: Just add the SINGULARITYENV_
prefix to pass any varibales to the centos container.
Enable GPUs
First review how to submit a GPU job from here.
Then request an interactive GPU job, or embed one of the following within your submission script.
In order to enable GPUs within your container you need to add the --nv
option to the singularity command:
module load centos
singularity exec -nv $CENTOS7_SING cat /etc/redhat-release
However, when using the centos
shortcut it is easier to just set the following environment variable then run centos.sh
as usual:
module load centos
export SINGULARITY_NV=1
centos.sh
Last modified September 29, 2022:
edits (ec9df4e8d)