Containers

If you want to install any special software (a newer version of R, libraries for spatial or bioinformatic data analysis, etc.), the best way to do this is through containers. Containers sound complicated but they’re actually fairly straightforward to use.

The container software used by the Argon system is called Apptainer (formerly Singularity).

Downloading a pre-built container

Docker is the most popular containerization software, but doesn’t integrate with HPC naturally. Thankfully, converting between the two is simple, which means you can use pre-built Docker containers with Apptainer. There are lots of pre-built containers; you can browse through them at Docker Hub. For example, if you just want the latest version of R:

apptainer pull docker://rocker/r-ver

If you want a specific version:

apptainer pull docker://rocker/r-ver:4.5.0

If you want one that comes with all the tidyverse packages installed:

apptainer pull docker://rocker/tidyverse

If you want one that comes with Bioconductor:

apptainer pull docker://bioconductor/r-ver

And so on.

This will create a (pretty big) file called something like r-ver_latest.sif (depending on which container you pulled). This is known as an image file, and contains a miniature operating system with the latest version of R installed (plus any extras, as requested).

Running a program inside the container

Once you have the image you want, you can start an interactive session inside the container with:

apptainer shell r-ver_latest.sif

This is useful for debugging, as you can see what it looks like inside the container, open R, see what packages are available, etc. Once you’re done poking around inside the shell, either press ctrl+d or type exit.

When it’s time to run a script through the container:

apptainer exec r-ver_latest.sif Rscript sim.R

Note that everything after apptainer exec <image> is just an ordinary terminal command. We could (and did) run Rscript sim.R directly from the command line. The difference here is that the script is running inside the container, which means it has access to all the software installed there.

Submitting container jobs over the cluster

You can probably tell where this is going, but:

qsub -cwd -j y -q BIOSTAT -t 1-10 -b y apptainer exec r-ver_latest.sif Rscript sim.R

The pattern remains the same as before: the command you wish to submit over the cluster goes at the end (if you specify -b y). Now this command means that we’ve submitted 10 jobs to run on 10 different nodes, each one opening a separate container to run our simulation.

If you look at the one of the log files (e.g., apptainer.o6279783.5), you’ll see that the R version matches that of the container, not the system.

Customizing your container

If your container needs additional software, the basic format to define a container is this:

Bootstrap: docker
From: bioconductor/r-ver:3.23

%post
    # System dependencies
    apt-get update && apt-get install -y \
        curl \
        git

    # R packages
    Rscript -e 'install.packages(c(
        "data.table",
        "ggplot2",
        "R.utils"
        ), repos = "https://cloud.r-project.org"
    )'

    # Python packages
    python3 -m venv /opt/venv
    /opt/venv/bin/pip install docopt
    /opt/venv/bin/pip install snakemake

%environment
    export PATH=/opt/venv/bin:$PATH

Add or subtract from these packages as needed, then build the image with

apptainer build my-container.sif my-container.def

This can be done anywhere: if you prefer, you can build the container on a different machine and copy it over to the hpc — containers are designed to be portable. If you do build it on Argon, be sure to use a compute node (see warning at top of page).

For more information and examples, see the files in this repository.