Create a container image for HPC
Overview
This KB outlines how to do the following:
- Create a Docker image on your laptop
- Export the image as a file and transfer it to a HPC server
- Convert the image to an Apptainer (formerly Singularity) image
- Run a container
Requirements
- An HPC/DartfS account (request at https://rcweb.dartmouth.edu/accounts/)
- Install Rancher Desktop or Docker Desktop. You can check Docker Desktop license information at https://www.docker.com/pricing/faq/ where they list that use is free for research at non-for-profit institutions (last checked 2023-07-26).
Create a Python file with demo code
cat << 'EOF' > fibonacci.py
import os, pickle, sys, time
CHECKPOINT_FILE = "fibonacci.pickle"
class Fibonacci:
def __init__(self, n):
self.checkpoint_i = 1
self.n = n
self.a = 0
self.b = 1
def run(self):
print(f"Fibonacci: {self.n} (starting at calc {self.checkpoint_i})")
self.checkpoint_time = time.time()
if self.n == 0:
return 0
elif self.n == 1:
return self.b
else:
for i in range(self.checkpoint_i, self.n):
self.c = self.a + self.b
self.a = self.b
self.b = self.c
if time.time() - self.checkpoint_time > 10:
print(f"Checkpoint: {i}")
self.checkpoint_i = i + 1
with open(CHECKPOINT_FILE, 'wb') as f:
pickle.dump(self, f)
self.checkpoint_time = time.time()
return self.b
# Handle calling Fibonacci from a script
if __name__ == "__main__":
# allow for working with large numbers
sys.set_int_max_str_digits(0)
if os.path.exists(CHECKPOINT_FILE):
with open(CHECKPOINT_FILE, 'rb') as f:
fib = pickle.load(f)
else:
fib = Fibonacci(int(sys.argv[1]))
# start/continue calculating
result = fib.run()
print(f"Result: {result}")
# clean-up checkpoint file if exists
if os.path.exists(CHECKPOINT_FILE):
os.remove(CHECKPOINT_FILE)
EOFRun the Python file to test it
python ./fibonacci.py 30Create a Dockerfile
cat << 'EOF' > Dockerfile
FROM python:3.10-alpine
COPY fibonacci.py /src/
EOFBuild the image locally
If not on a Mac with a M1 chip or later
docker build -t fibonacci:latest .If on a Mac with a M1 chip or later, build the image for x86_64 architecture
docker buildx build --platform linux/amd64 -t fibonacci:latest .Run a container locally
docker run -it --rm fibonacci:latest python /src/fibonacci.py 30Export the image
docker save fibonacci:latest -o fibonacci.tarTransfer the image to Discovery
scp fibonacci.tar netid@discovery:Build an Apptainer image from the Docker image
ssh netid@discovery
apptainer build fibonacci docker-archive://fibonacci.tarRun an Apptainer container
apptainer exec fibonacci python /src/fibonacci.py 40Create Slurm job script
cat << 'EOF' > fibonacci-apptainer.sh
#!/bin/bash
#SBATCH --job-name=fibonacci-apptainer
#SBATCH --error=%x-%J.err
#SBATCH --output=%x-%J.out
#SBATCH --requeue
#SBATCH --time=00:01:00
#SBATCH --mem=1G
##SBATCH --account=free
##SBATCH --partition=standard
scontrol show job $SLURM_JOBID > fibonacci-info.$SLURM_JOBID
stdbuf -i0 -o0 -e0 apptainer exec fibonacci.tar.sif python -u /src/fibonacci.py 3000001
EOFSubmit the job to Discovery
sbatch fibonacci-apptainer.shNOTE: You can use the squeue command to see the status of your job.