Skip to content

Commit d5697b0

Browse files
authored
Create tutorial for Apptainer on Torch
Added a comprehensive tutorial on using Apptainer with Torch, covering container basics, file access, command execution, and using Docker images.
1 parent c5f0d15 commit d5697b0

1 file changed

Lines changed: 223 additions & 0 deletions

File tree

Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
# Introduction to Apptainer on Torch
2+
3+
## Why containers?
4+
Researchers often rely on complex software stacks that include programming languages and libraries. Installing and maintaining these dependencies can be challenging when different projects require different software versions.
5+
6+
Containers provide a way to package software together with the environment it needs to run. Instead of manually installing every dependency on a system, users can run software inside a container that already includes the required libraries and tools.
7+
8+
## What is Apptainer?
9+
Apptainer is a container platform that allows users to run software inside isolated environments. It allows users to run software inside isolated environments without requiring administrator privileges on the host system.
10+
11+
Apptainer is the continuation of the Singularity project. The open-source Singularity project was renamed to Apptainer and continues to be developed under the Linux Foundation.
12+
13+
Unlike Docker, Apptainer does not require a privileged daemon running on the system. This makes it well suited for shared HPC environments where security and multi-user access are important considerations.
14+
15+
Torch uses Apptainer as its supported container platform. Many container images distributed through Docker registries can be used directly with Apptainer, allowing researchers to take advantage of existing software environments while working on the cluster.
16+
17+
# Files in Apptainer Containers
18+
Apptainer is designed to work closely with the host filesystem. In most cases, your home directory and current working directory remain accessible from within the container.
19+
20+
## Accessing Your Files
21+
22+
While inside a container, check your current directory:
23+
24+
```bash
25+
pwd
26+
```
27+
28+
You can also list files in your home directory:
29+
30+
```bash
31+
ls ~
32+
```
33+
34+
The files and directories you see should match those available outside the container.
35+
36+
Files created in these mounted directories remain available after the container exits.
37+
38+
## Binding Additional Directories
39+
40+
Sometimes you may need access to additional directories that are not automatically available inside the container.
41+
42+
Apptainer allows additional directories to be mounted using the `-B` option:
43+
44+
```bash
45+
apptainer shell \
46+
-B /scratch:/scratch \
47+
/share/apps/images/ubuntu-24.04.3.sif
48+
```
49+
50+
This makes `/scratch` available inside the container.
51+
52+
You can also mount a directory at a different location:
53+
54+
```bash
55+
apptainer shell \
56+
-B /scratch:/data \
57+
/share/apps/images/ubuntu-24.04.3.sif
58+
```
59+
60+
In this example, files stored in `/scratch` on the host system are accessible through `/data` inside the container.
61+
62+
## Why This Matters
63+
64+
Container images are typically read-only. Research data, scripts, notebooks, and output files usually remain outside the container.
65+
66+
By making host directories available inside the container, Apptainer allows applications to access data stored on Torch while maintaining a reproducible software environment.
67+
68+
# Using Apptainer to Run Commands on Torch
69+
70+
:::warning
71+
72+
Container workloads should be run on compute nodes rather than login nodes.
73+
74+
While simple commands may work on a login node, pulling images, launching software, installing packages, or building environments can consume significant CPU, memory, and storage resources. These activities should be performed within an interactive Slurm allocation or a batch job.
75+
:::
76+
77+
Torch provides many prebuilt container images under:
78+
79+
```bash
80+
ls /share/apps/images/
81+
```
82+
83+
:::note
84+
85+
Torch provides container images with both `.sif` and `.sqf` extensions.
86+
87+
`.sif` is the standard Apptainer image format. Some Torch-provided application images use `.sqf` and may be intended to be launched through wrapper scripts such as `run-anaconda3-2024.10-1.bash`.
88+
89+
When available, use the wrapper script documented for that application. For general Apptainer examples in this tutorial, we use `.sif` images because they work directly with `apptainer exec`, `apptainer run`, and `apptainer shell`.
90+
91+
:::
92+
93+
For this tutorial, we will use the Ubuntu 24.04 image that is already available on the cluster.
94+
95+
## Running Your First Container
96+
97+
Apptainer images can define a default action that runs when the container starts.
98+
99+
To launch a container and execute its default action, use `apptainer run`:
100+
101+
```bash
102+
apptainer run /share/apps/images/ubuntu-24.04.3.sif
103+
```
104+
105+
Depending on how the image was built, this command may produce output, launch an application, or simply start and exit.
106+
107+
The important point is that with `apptainer run`, Apptainer executes the default action defined by the image creator.
108+
109+
Sometimes, however, we want to run a specific command instead of the image's default action. In those cases, we use `apptainer exec`.
110+
111+
## Running Specific Commands Within a Container
112+
113+
Unlike `apptainer run`, which executes the image's default action, `apptainer exec` allows us to specify exactly what command should run inside the container.
114+
115+
For example:
116+
117+
```bash
118+
apptainer exec /share/apps/images/ubuntu-24.04.3.sif /bin/echo "Hello World!"
119+
```
120+
121+
Output:
122+
123+
```text
124+
Hello World!
125+
```
126+
127+
## The Difference Between `apptainer run` and `apptainer exec`
128+
129+
Both `apptainer run` and `apptainer exec` start a container, but they serve different purposes.
130+
131+
`apptainer run` executes the default action defined by the image creator. Depending on how the image was built, this may launch an application, run a script, or perform another predefined task.
132+
133+
`apptainer exec` allows you to specify exactly which command should run inside the container. Rather than relying on the image's default behavior, you provide the command directly.
134+
135+
In practice, `apptainer exec` is often used when working on HPC systems because it provides more control over what is executed inside the container environment.
136+
137+
## Opening an Interactive Shell Within a Container
138+
139+
Sometimes it is useful to explore a container interactively. Apptainer provides the `apptainer shell` command for this purpose.
140+
141+
Launch a shell inside the Ubuntu container:
142+
143+
```bash
144+
apptainer shell /share/apps/images/ubuntu-24.04.3.sif
145+
```
146+
147+
You should see a prompt similar to:
148+
149+
```text
150+
Singularity>
151+
```
152+
153+
You can now run commands inside the container:
154+
155+
```bash
156+
whoami
157+
pwd
158+
cat /etc/os-release
159+
```
160+
161+
Example output:
162+
163+
```text
164+
PRETTY_NAME="Ubuntu 24.04.3 LTS"
165+
NAME="Ubuntu"
166+
VERSION_ID="24.04"
167+
...
168+
```
169+
170+
Notice that the prompt changes to indicate that you are working inside the container environment.
171+
172+
When you are finished, leave the container with:
173+
174+
```bash
175+
exit
176+
```
177+
178+
This returns you to your normal shell on Torch.
179+
180+
## Using Docker images with Apptainer
181+
182+
So far, we have used container images that are already available on Torch under `/share/apps/images`.
183+
184+
In practice, you may also want to run software that is not provided by the cluster. Apptainer can pull images directly from Docker registries and convert them into the Apptainer SIF format.
185+
186+
For example, we can pull an official PyTorch image from Docker Hub:
187+
188+
```bash
189+
apptainer pull pytorch.sif docker://pytorch/pytorch:latest
190+
```
191+
192+
During the pull process, Apptainer downloads the Docker image layers and converts them into a single SIF image:
193+
194+
```text
195+
INFO: Converting OCI blobs to SIF format
196+
INFO: Starting build...
197+
INFO: Fetching OCI image...
198+
...
199+
INFO: Creating SIF file...
200+
```
201+
202+
The output shows that Apptainer is downloading the Docker image layers and converting them into a single SIF image. Once the conversion completes, the resulting SIF file can be used without Docker.
203+
When the command completes, a new image named `pytorch.sif` will be created in the current directory.
204+
205+
You can verify that the image exists:
206+
207+
```bash
208+
ls -lh pytorch.sif
209+
```
210+
211+
The image can now be used like any other Apptainer image.
212+
213+
For example:
214+
215+
```bash
216+
apptainer exec pytorch.sif python --version
217+
```
218+
219+
or
220+
221+
```bash
222+
apptainer exec pytorch.sif python -c "import torch; print(torch.__version__)"
223+
```

0 commit comments

Comments
 (0)