Singularity
IST Cluster uses Singularity containers to control environment. Singularity containers can be used to package entire scientific workflows, softwares, libraries, and even data. Containers can be pull from Docker.
Singularity Usage Workflow
You have to build a container or environment from your workstation.
1. Develop and test containers using --sandbox(build into a writable directory)
2. Build your production containers with a squashfs filesystem.
Once you have the container with the necessary libraries and data inside, it can be executed by HPC cluster without requireing root access.
####A production container should be an immutable object, so if you need to make changes you should go back to your build system with root privilleges, rebuild container with the changes, and re-upload the container to the HPC cluster.#####
Singularity Commands
build: Build a container or environmentexec: Execute a command to containerinspect: See labels, run and test scripts, and environment variablespull: Pull an image from Docker or Singularity Hubrun: Run image as an executableshell: Shell into image
Example: Build a container from a Singularity definition file
-
Create a file name
my-def-fileas a definition file.touch my-def-file - Edit
my-def-fileBootstrap: docker From: ubuntu:bionic %post apt-get -y update apt-get -y install cowsay lolcat %environment export LC_ALL=C export PATH=/usr/games:${PATH} %runscript cowsay "Hello World" | lolcat -
Build a container from
my-def-file(root privillege)singularity build --sandbox --fakeroot hello-world my-def-filesingularity buildneeds root privillege, since you are user of IST cluster and not granted sudo access.--fakeroothelps you to build singularity containers and images without real root privillege. -
Build a sif(Singularity Image File) from the
hello-worldcontainer.singularity build --fakeroot hello-world.sif hello-world -
You can upload
hello-world.sifinto IST cluster to execute it.Since this is tutorial and
hello-world.sifis small enough to execute from local computer../hello-world.sif
Example: Copying data from host into the container
If you have necessary data in your local computer and you want to execute them with your scientific jobs. Assume you have a file hello.txt in your local computer (If not, echo "Hello World" > hello.txt)
-
Create a file name
copy-into-containeras a definition file.touch copy-into-container - Edit
copy-into-containerBootstrap: docker From: ubuntu:bionic %post apt-get -y update apt-get -y install %environment export LC_ALL=C export PATH=/usr/games:${PATH} %runscript cat /data/hello.txt | cowsay | lolcat -
Build a container from
copy-into-containersingularity build --sandbox --fakeroot example-container copy-into-container -
Since
--sandboxmode, we can read and write data into the container (With root privillege). Try to make a directory and copy a file into the container with these commands.sudo mkdir example-container/data sudo cp hello.txt example-container/data -
Build a sif from
copy-into-containercontainer.singularity build --fakeroot copy-into-container.sif copy-into-containerThen run the image.
./copy-into-container.sif
Example: Execute the image and get the result
If you want output from your work. Singularity can execute works and simply save output file in your workstation (Outside container)
-
Write some python script that read and write a file.
from sys import argv from random import randint inp = [] with open(argv[1], 'r') as reader: for line in reader: inp.append(str(line)*randint(1, 6)) with open(argv[2], 'w') as writer: for line in inp: writer.write(line)saved as
py-script.py.In this python script, it takes 2 arguments. 1st argument is
input.txtand 2nd argument isoutput.txtwhich this script will generate when execution end.Create
input.txtwith this following command.printf "some string\nfish\nthis is python\nHello world\n" > input.txtThe runscript should be
python py-script.py input.txt output.txt -
Create a definition file
py-container-defBootstrap: docker From: ubuntu:bionic %post apt-get -y update apt-get -y install python3 alias python=python3 %runscript python py-script.py input.txt output.txt -
Build a container from
py-container-defsingularity build --sandbox --fakeroot my-python-container py-container-def -
Build a sif from
my-python-containersingularity build --fakeroot my-python.sif my-python-container -
Singularity image can access to the host filesystem automatically. Make sure you have all necessary files(Or folders) in your workstation.
Following this section of example, you should have
py-script.py(necessary)input.txt(necessary)py-container-def(unnecessary)my-python-container(folder, unnecessary)my-python.sif(necessary)
Run the command
./my-python.sifYou should have the
output.txtin your current directory.