diff --git a/doc.zih.tu-dresden.de/docs/software/SingularityExampleDefinitions.md b/doc.zih.tu-dresden.de/docs/software/SingularityExampleDefinitions.md new file mode 100644 index 0000000000000000000000000000000000000000..28fe94a9d510e577148d7d0c2f526136e813d4ba --- /dev/null +++ b/doc.zih.tu-dresden.de/docs/software/SingularityExampleDefinitions.md @@ -0,0 +1,110 @@ +# Singularity Example Definitions + +## Basic example + +A usual workflow to create Singularity Definition consists of the +following steps: + +- Start from base image +- Install dependencies + - Package manager + - Other sources +- Build & Install own binaries +- Provide entrypoints & metadata + +An example doing all this: + +```Bash +Bootstrap: docker +From: alpine + +%post + . /.singularity.d/env/10-docker*.sh + + apk add g++ gcc make wget cmake + + wget https://github.com/fmtlib/fmt/archive/5.3.0.tar.gz + tar -xf 5.3.0.tar.gz + mkdir build && cd build + cmake ../fmt-5.3.0 -DFMT_TEST=OFF + make -j$(nproc) install + cd .. + rm -r fmt-5.3.0* + + cat hello.cpp +#include <fmt/format.h> + +int main(int argc, char** argv){ + if(argc == 1) fmt::print("No arguments passed!\n"); + else fmt::print("Hello {}!\n", argv[1]); +} +EOF + + g++ hello.cpp -o hello -lfmt + mv hello /usr/bin/hello + +%runscript + hello "$@" + +%labels + Author Alexander Grund + Version 1.0.0 + +%help + Display a greeting using the fmt library + + Usage: + ./hello +``` + +## CUDA + CuDNN + OpenMPI + +- Chosen CUDA version depends on installed driver of host +- OpenMPI needs PMI for SLURM integration +- OpenMPI needs CUDA for GPU copy-support +- OpenMPI needs ibverbs libs for Infiniband +- openmpi-mca-params.conf required to avoid warnings on fork (OK on + taurus) +- Environment variables SLURM_VERSION, OPENMPI_VERSION can be set to + choose different version when building the container + +``` +Bootstrap: docker +From: nvidia/cuda-ppc64le:10.1-cudnn7-devel-ubuntu18.04 + +%labels + Author ZIH + Requires CUDA driver 418.39+. + +%post + . /.singularity.d/env/10-docker*.sh + + apt-get update + apt-get install -y cuda-compat-10.1 + apt-get install -y libibverbs-dev ibverbs-utils + # Install basic development tools + apt-get install -y gcc g++ make wget python + apt-get autoremove; apt-get clean + + cd /tmp + + : ${SLURM_VERSION:=17-02-11-1} + wget https://github.com/SchedMD/slurm/archive/slurm-${SLURM_VERSION}.tar.gz + tar -xf slurm-${SLURM_VERSION}.tar.gz + cd slurm-slurm-${SLURM_VERSION} + ./configure --prefix=/usr/ --sysconfdir=/etc/slurm --localstatedir=/var --disable-debug + make -C contribs/pmi2 -j$(nproc) install + cd .. + rm -rf slurm-* + + : ${OPENMPI_VERSION:=3.1.4} + wget https://download.open-mpi.org/release/open-mpi/v${OPENMPI_VERSION%.*}/openmpi-${OPENMPI_VERSION}.tar.gz + tar -xf openmpi-${OPENMPI_VERSION}.tar.gz + cd openmpi-${OPENMPI_VERSION}/ + ./configure --prefix=/usr/ --with-pmi --with-verbs --with-cuda + make -j$(nproc) install + echo "mpi_warn_on_fork = 0" >> /usr/etc/openmpi-mca-params.conf + echo "btl_openib_warn_default_gid_prefix = 0" >> /usr/etc/openmpi-mca-params.conf + cd .. + rm -rf openmpi-* +``` diff --git a/doc.zih.tu-dresden.de/docs/software/SingularityRecipeHints.md b/doc.zih.tu-dresden.de/docs/software/SingularityRecipeHints.md new file mode 100644 index 0000000000000000000000000000000000000000..e2831fc2ead270710f9e8d192d8fc51c31a33927 --- /dev/null +++ b/doc.zih.tu-dresden.de/docs/software/SingularityRecipeHints.md @@ -0,0 +1,79 @@ +# Singularity Recipe Hints + +## GUI (X11) applications + +Running GUI applications inside a singularity container is possible out of the box. Check the +following definition: + +```Bash +Bootstrap: docker +From: centos:7 + +%post +yum install -y xeyes +``` + +This image may be run with + +```Bash +singularity exec xeyes.sif xeyes. +``` + +This works because all the magic is done by singularity already like setting $DISPLAY to the outside +display and mounting $HOME so $HOME/.Xauthority (X11 authentification cookie) is found. When you are +using \`--contain\` or \`--no-home\` you have to set that cookie yourself or mount/copy it inside +the container. Similar for \`--cleanenv\` you have to set $DISPLAY e.g. via + +```Bash +export SINGULARITY_DISPLAY=$DISPLAY +``` + +When you run a container as root (via \`sudo\`) you may need to allow root for your local display +port: `xhost +local:root\` + +### Hardware acceleration + +If you want hardware acceleration you **may** need [VirtualGL](https://virtualgl.org). An example +definition file is as follows: + +```Bash +Bootstrap: docker +From: centos:7 + +%post +yum install -y glx-utils # for glxgears example app + +yum install -y curl +VIRTUALGL_VERSION=2.6.2 # Replace by required (e.g. latest) version + +curl -sSL https://downloads.sourceforge.net/project/virtualgl/"${VIRTUALGL_VERSION}"/VirtualGL-"${VIRTUALGL_VERSION}".x86_64.rpm -o VirtualGL-"${VIRTUALGL_VERSION}".x86_64.rpm +yum install -y VirtualGL*.rpm +/opt/VirtualGL/bin/vglserver_config -config +s +f -t +rm VirtualGL-*.rpm + +# Install video drivers AFTER VirtualGL to avoid them being overwritten +yum install -y mesa-dri-drivers # for e.g. intel integrated GPU drivers. Replace by your driver +``` + +You can now run the application with vglrun: + +```Bash +singularity exec vgl.sif vglrun glxgears +``` + +**Attention:**Using VirtualGL may not be required at all and could even decrease the performance. To +check install e.g. glxgears as above and your graphics driver (or use the VirtualGL image from +above) and disable vsync: + +``` +vblank_mode=0 singularity exec vgl.sif glxgears +``` + +Compare the FPS output with the glxgears prefixed by vglrun (see above) to see which produces more +FPS (or runs at all). + +**NVIDIA GPUs** need the `--nv` parameter for the singularity command: + +``Bash +singularity exec --nv vgl.sif glxgears +``` diff --git a/doc.zih.tu-dresden.de/docs/software/VMTools.md b/doc.zih.tu-dresden.de/docs/software/VMTools.md index bb50c571a98a5b61d8296ac0bbd7bbdbf412f352..556270290641d83c618d29709cfc6b88d7c2c193 100644 --- a/doc.zih.tu-dresden.de/docs/software/VMTools.md +++ b/doc.zih.tu-dresden.de/docs/software/VMTools.md @@ -1,142 +1,123 @@ # Singularity on Power9 / ml partition -Building Singularity containers from a recipe on Taurus is normally not -possible due to the requirement of root (administrator) rights, see -[Containers](Containers). For obvious reasons users on Taurus cannot be -granted root permissions. - -The solution is to build your container on your local Linux machine by -executing something like - - sudo singularity build myContainer.sif myDefinition.def - -Then you can copy the resulting myContainer.sif to Taurus and execute it -there. - -This does **not** work on the ml partition as it uses the Power9 -architecture which your laptop likely doesn't. - -For this we provide a Virtual Machine (VM) on the ml partition which -allows users to gain root permissions in an isolated environment. The -workflow to use this manually is described at [another page](Cloud) but -is quite cumbersome. - -To make this easier two programs are provided: `buildSingularityImage` -and `startInVM` which do what they say. The latter is for more advanced -use cases so you should be fine using *buildSingularityImage*, see the -following section. - -**IMPORTANT:** You need to have your default SSH key without a password -for the scripts to work as entering a password through the scripts is -not supported. - -**The recommended workflow** is to create and test a definition file -locally. You usually start from a base Docker container. Those typically -exist for different architectures but with a common name (e.g. -'ubuntu:18.04'). Singularity automatically uses the correct Docker -container for your current architecture when building. So in most cases -you can write your definition file, build it and test it locally, then -move it to Taurus and build it on Power9 without any further changes. -However, sometimes Docker containers for different architectures have -different suffixes, in which case you'd need to change that when moving -to Taurus. +Building Singularity containers from a recipe on Taurus is normally not possible due to the +requirement of root (administrator) rights, see [Containers](containers.md). For obvious reasons +users on Taurus cannot be granted root permissions. + +The solution is to build your container on your local Linux machine by executing something like + +```Bash +sudo singularity build myContainer.sif myDefinition.def +``` + +Then you can copy the resulting myContainer.sif to Taurus and execute it there. + +This does **not** work on the ml partition as it uses the Power9 architecture which your laptop +likely doesn't. + +For this we provide a Virtual Machine (VM) on the ml partition which allows users to gain root +permissions in an isolated environment. The workflow to use this manually is described at +[another page](Cloud.md) but is quite cumbersome. + +To make this easier two programs are provided: `buildSingularityImage` and `startInVM` which do what +they say. The latter is for more advanced use cases so you should be fine using +*buildSingularityImage*, see the following section. + +**IMPORTANT:** You need to have your default SSH key without a password for the scripts to work as +entering a password through the scripts is not supported. + +**The recommended workflow** is to create and test a definition file locally. You usually start from +a base Docker container. Those typically exist for different architectures but with a common name +(e.g. 'ubuntu:18.04'). Singularity automatically uses the correct Docker container for your current +architecture when building. So in most cases you can write your definition file, build it and test +it locally, then move it to Taurus and build it on Power9 without any further changes. However, +sometimes Docker containers for different architectures have different suffixes, in which case you'd +need to change that when moving to Taurus. ## Building a Singularity container in a job To build a singularity container on Taurus simply run: - buildSingularityImage --arch=power9 myContainer.sif myDefinition.def - -This command will submit a batch job and immediately return. Note that -while "power9" is currently the only supported architecture, the -parameter is still required. If you want it to block while the image is -built and see live output, use the parameter `--interactive`: - - buildSingularityImage --arch=power9 --interactive myContainer.sif myDefinition.def - -There are more options available which can be shown by running -`buildSingularityImage --help`. All have reasonable defaults.The most -important ones are: - -- `--time <time>`: Set a higher job time if the default time is not - enough to build your image and your job is cancelled before - completing. The format is the same as for SLURM. -- `--tmp-size=<size in GB>`: Set a size used for the temporary - location of the Singularity container. Basically the size of the - extracted container. -- `--output=<file>`: Path to a file used for (log) output generated - while building your container. -- Various singularity options are passed through. E.g. - `--notest, --force, --update`. See, e.g., `singularity --help` for - details. - -For **advanced users** it is also possible to manually request a job -with a VM (`srun -p ml --cloud=kvm ...`) and then use this script to -build a Singularity container from within the job. In this case the -`--arch` and other SLURM related parameters are not required. The -advantage of using this script is that it automates the waiting for the -VM and mounting of host directories into it (can also be done with -`startInVM`) and creates a temporary directory usable with Singularity -inside the VM controlled by the `--tmp-size` parameter. +```Bash +buildSingularityImage --arch=power9 myContainer.sif myDefinition.def +``` + +This command will submit a batch job and immediately return. Note that while "power9" is currently +the only supported architecture, the parameter is still required. If you want it to block while the +image is built and see live output, use the parameter `--interactive`: + +```Bash +buildSingularityImage --arch=power9 --interactive myContainer.sif myDefinition.def +``` + +There are more options available which can be shown by running `buildSingularityImage --help`. All +have reasonable defaults.The most important ones are: + +- `--time <time>`: Set a higher job time if the default time is not + enough to build your image and your job is cancelled before completing. The format is the same + as for SLURM. +- `--tmp-size=<size in GB>`: Set a size used for the temporary + location of the Singularity container. Basically the size of the extracted container. +- `--output=<file>`: Path to a file used for (log) output generated + while building your container. +- Various singularity options are passed through. E.g. + `--notest, --force, --update`. See, e.g., `singularity --help` for details. + +For **advanced users** it is also possible to manually request a job with a VM (`srun -p ml +--cloud=kvm ...`) and then use this script to build a Singularity container from within the job. In +this case the `--arch` and other SLURM related parameters are not required. The advantage of using +this script is that it automates the waiting for the VM and mounting of host directories into it +(can also be done with `startInVM`) and creates a temporary directory usable with Singularity inside +the VM controlled by the `--tmp-size` parameter. ## Filesystem **Read here if you have problems like "File not found".** -As the build starts in a VM you may not have access to all your files. -It is usually bad practice to refer to local files from inside a -definition file anyway as this reduces reproducibility. However common -directories are available by default. For others, care must be taken. In -short: - -- /home/$USER, /scratch/$USER are available and should be used -- /scratch/\<group> also works for all groups the users is in -- /projects/\<group> similar, but is read-only! So don't use this to - store your generated container directly, but rather move it here - afterwards -- /tmp is the VM local temporary directory. All files put here will be - lost! - -If the current directory is inside (or equal to) one of the above -(except /tmp), then relative paths for container and definition work as -the script changes to the VM equivalent of the current directory. -Otherwise you need to use absolute paths. Using `~` in place of `$HOME` -does work too. - -Under the hood, the filesystem of Taurus is mounted via SSHFS at -/host_data, so if you need any other files they can be found there. - -There is also a new SSH key named "kvm" which is created by the scripts -and authorized inside the VM to allow for password-less access to SSHFS. -This is stored at `~/.ssh/kvm` and regenerated if it does not exist. It -is also added to `~/.ssh/authorized_keys`. Note that removing the key -file does not remove it from `authorized_keys`, so remove it manually if -you need to. It can be easily identified by the comment on the key. -However, removing this key is **NOT** recommended, as it needs to be -re-generated on every script run. +As the build starts in a VM you may not have access to all your files. It is usually bad practice +to refer to local files from inside a definition file anyway as this reduces reproducibility. +However common directories are available by default. For others, care must be taken. In short: + +- `/home/$USER`, `/scratch/$USER` are available and should be used `/scratch/\<group>` also works for +- all groups the users is in `/projects/\<group>` similar, but is read-only! So don't use this to + store your generated container directly, but rather move it here afterwards +- /tmp is the VM local temporary directory. All files put here will be lost! + +If the current directory is inside (or equal to) one of the above (except `/tmp`), then relative paths +for container and definition work as the script changes to the VM equivalent of the current +directory. Otherwise you need to use absolute paths. Using `~` in place of `$HOME` does work too. + +Under the hood, the filesystem of Taurus is mounted via SSHFS at `/host_data`, so if you need any +other files they can be found there. + +There is also a new SSH key named "kvm" which is created by the scripts and authorized inside the VM +to allow for password-less access to SSHFS. This is stored at `~/.ssh/kvm` and regenerated if it +does not exist. It is also added to `~/.ssh/authorized_keys`. Note that removing the key file does +not remove it from `authorized_keys`, so remove it manually if you need to. It can be easily +identified by the comment on the key. However, removing this key is **NOT** recommended, as it +needs to be re-generated on every script run. ## Starting a Job in a VM -Especially when developing a Singularity definition file it might be -useful to get a shell directly on a VM. To do so simply run: - - startInVM --arch=power9 - -This will execute an `srun` command with the `--cloud=kvm` parameter, -wait till the VM is ready, mount all folders (just like -`buildSingularityImage`, see the Filesystem section above) and come back -with a bash inside the VM. Inside that you are root, so you can directly -execute `singularity build` commands. - -As usual more options can be shown by running `startInVM --help`, the -most important one being `--time`. - -There are 2 special use cases for this script: 1 Execute an arbitrary -command inside the VM instead of getting a bash by appending the command -to the script. Example: \<pre>startInVM --arch=power9 singularity build -\~/myContainer.sif \~/myDefinition.def\</pre> 1 Use the script in a job -manually allocated via srun/sbatch. This will work the same as when -running outside a job but will **not** start a new job. This is useful -for using it inside batch scripts, when you already have an allocation -or need special arguments for the job system. Again you can run an -arbitrary command by passing it to the script. +Especially when developing a Singularity definition file it might be useful to get a shell directly +on a VM. To do so simply run: + +```Bash +startInVM --arch=power9 +``` + +This will execute an `srun` command with the `--cloud=kvm` parameter, wait till the VM is ready, +mount all folders (just like `buildSingularityImage`, see the Filesystem section above) and come +back with a bash inside the VM. Inside that you are root, so you can directly execute `singularity +build` commands. + +As usual more options can be shown by running `startInVM --help`, the most important one being +`--time`. + +There are 2 special use cases for this script: 1 Execute an arbitrary command inside the VM instead +of getting a bash by appending the command to the script. Example: \<pre>startInVM --arch=power9 +singularity build \~/myContainer.sif \~/myDefinition.def\</pre> 1 Use the script in a job manually +allocated via srun/sbatch. This will work the same as when running outside a job but will **not** +start a new job. This is useful for using it inside batch scripts, when you already have an +allocation or need special arguments for the job system. Again you can run an arbitrary command by +passing it to the script. diff --git a/doc.zih.tu-dresden.de/docs/software/containers.md b/doc.zih.tu-dresden.de/docs/software/containers.md index a5eb5244053d4add03eb04ef3316e45cb396b706..f1a312891e88c224ab94b9e46282baf20d297af6 100644 --- a/doc.zih.tu-dresden.de/docs/software/containers.md +++ b/doc.zih.tu-dresden.de/docs/software/containers.md @@ -1,13 +1,13 @@ # Use of Containers -[Containerization]**todo link** encapsulating or packaging up software code and all its dependencies -to run uniformly and consistently on any infrastructure. On Taurus [Singularity]**todo link** used -as a standard container solution. Singularity enables users to have full control of their -environment. This means that you don’t have to ask an HPC support to install anything for you - you -can put it in a Singularity container and run! As opposed to Docker (the most famous container -solution), Singularity is much more suited to being used in an HPC environment and more efficient in -many cases. Docker containers can easily be used in Singularity. Information about the use of -Singularity on Taurus can be found [here]**todo link**. +[Containerization](https://www.ibm.com/cloud/learn/containerization) encapsulating or packaging up +software code and all its dependencies to run uniformly and consistently on any infrastructure. On +Taurus [Singularity](https://sylabs.io/) used as a standard container solution. Singularity enables +users to have full control of their environment. This means that you don’t have to ask an HPC +support to install anything for you - you can put it in a Singularity container and run! As opposed +to Docker (the most famous container solution), Singularity is much more suited to being used in an +HPC environment and more efficient in many cases. Docker containers can easily be used in +Singularity. Information about the use of Singularity on Taurus can be found [here]**todo link**. In some cases using Singularity requires a Linux machine with root privileges (e.g. using the ml partition), the same architecture and a compatible kernel. For many reasons, users on Taurus cannot @@ -15,11 +15,303 @@ be granted root permissions. A solution is a Virtual Machine (VM) on the ml part users to gain root permissions in an isolated environment. There are two main options on how to work with VM on Taurus: - 1. [VM tools]**todo link**. Automative algorithms for using virtual machines; - 1. [Manual method]**todo link**. It required more operations but gives you more flexibility and reliability. +1. [VM tools]**todo link**. Automative algorithms for using virtual machines; +1. [Manual method]**todo link**. It required more operations but gives you more flexibility and reliability. -Additional Information: Examples of the definition for the Singularity container ([here]**todo -link**) and some hints ([here]**todo link**). +## Singularity -Useful links: [Containers]**todo link**, [Custom EasyBuild Environment]**todo link**, [Virtual -machine on Taurus]**todo link** +If you wish to containerize your workflow/applications, you can use Singularity containers on +Taurus. As opposed to Docker, this solution is much more suited to being used in an HPC environment. +Existing Docker containers can easily be converted. + +ZIH wiki sites: + +- [Example Definitions](SingularityExampleDefinitions.md) +- [Building Singularity images on Taurus](VMTools.md) +- [Hints on Advanced usage](SingularityRecipeHints.md) + +It is available on Taurus without loading any module. + +### Local installation + +One advantage of containers is that you can create one on a local machine (e.g. your laptop) and +move it to the HPC system to execute it there. This requires a local installation of singularity. +The easiest way to do so is: + +1. Check if go is installed by executing `go version`. If it is **not**: + +```Bash +wget <https://storage.googleapis.com/golang/getgo/installer_linux> && chmod +x +installer_linux && ./installer_linux && source $HOME/.bash_profile +``` + +1. Follow the instructions to [install Singularity](https://github.com/sylabs/singularity/blob/master/INSTALL.md#clone-the-repo) + +clone the repo + +```Bash +mkdir -p ${GOPATH}/src/github.com/sylabs && cd ${GOPATH}/src/github.com/sylabs && git clone <https://github.com/sylabs/singularity.git> && cd +singularity +``` + +Checkout the version you want (see the [Github releases page](https://github.com/sylabs/singularity/releases) +for available releases), e.g. + +```Bash +git checkout v3.2.1\ +``` + +Build and install + +```Bash +cd ${GOPATH}/src/github.com/sylabs/singularity && ./mconfig && cd ./builddir && make && sudo +make install +``` + +### Container creation + +Since creating a new container requires access to system-level tools and thus root privileges, it is +not possible for users to generate new custom containers on Taurus directly. You can, however, +import an existing container from, e.g., Docker. + +In case you wish to create a new container, you can do so on your own local machine where you have +the necessary privileges and then simply copy your container file to Taurus and use it there. + +This does not work on our **ml** partition, as it uses Power9 as its architecture which is +different to the x86 architecture in common computers/laptops. For that you can use the +[VM Tools](VMTools.md). + +#### Creating a container + +Creating a container is done by writing a definition file and passing it to + +```Bash +singularity build myContainer.sif myDefinition.def +``` + +NOTE: This must be done on a machine (or [VM](Cloud.md) with root rights. + +A definition file contains a bootstrap +[header](https://sylabs.io/guides/3.2/user-guide/definition_files.html#header) +where you choose the base and +[sections](https://sylabs.io/guides/3.2/user-guide/definition_files.html#sections) +where you install your software. + +The most common approach is to start from an existing docker image from DockerHub. For example, to +start from an [Ubuntu image](https://hub.docker.com/_/ubuntu) copy the following into a new file +called ubuntu.def (or any other filename of your choosing) + +```Bash +Bootstrap: docker<br />From: ubuntu:trusty<br /><br />%runscript<br /> echo "This is what happens when you run the container..."<br /><br />%post<br /> apt-get install g++ +``` + +Then you can call: + +```Bash +singularity build ubuntu.sif ubuntu.def +``` + +And it will install Ubuntu with g++ inside your container, according to your definition file. + +More bootstrap options are available. The following example, for instance, bootstraps a basic CentOS +7 image. + +```Bash +BootStrap: yum +OSVersion: 7 +MirrorURL: http://mirror.centos.org/centos-%{OSVERSION}/%{OSVERSION}/os/$basearch/ +Include: yum + +%runscript + echo "This is what happens when you run the container..." + +%post + echo "Hello from inside the container" + yum -y install vim-minimal +``` + +More examples of definition files can be found at +https://github.com/singularityware/singularity/tree/master/examples + +#### Importing a docker container + +You can import an image directly from the Docker repository (Docker Hub): + +```Bash +singularity build my-container.sif docker://ubuntu:latest +``` + +As opposed to bootstrapping a container, importing from Docker does **not require root privileges** +and therefore works on Taurus directly. + +Creating a singularity container directly from a local docker image is possible but not recommended. +Steps: + +```Bash +# Start a docker registry +$ docker run -d -p 5000:5000 --restart=always --name registry registry:2 + +# Push local docker container to it +$ docker tag alpine localhost:5000/alpine +$ docker push localhost:5000/alpine + +# Create def file for singularity like this... +$ cat example.def +Bootstrap: docker +Registry: <a href="http://localhost:5000" rel="nofollow" target="_blank">http://localhost:5000</a> +From: alpine + +# Build singularity container +$ singularity build --nohttps alpine.sif example.def +``` + +#### Starting from a Dockerfile + +As singularity definition files and Dockerfiles are very similar you can start creating a definition +file from an existing Dockerfile by "translating" each section. + +There are tools to automate this. One of them is \<a +href="<https://github.com/singularityhub/singularity-cli>" +target="\_blank">spython\</a> which can be installed with \`pip\` (add +\`--user\` if you don't want to install it system-wide): + +`pip3 install -U spython` + +With this you can simply issue the following command to convert a +Dockerfile in the current folder into a singularity definition file: + +`spython recipe Dockerfile myDefinition.def<br />` + +Now please **verify** your generated defintion and adjust where +required! + +There are some notable changes between singularity definitions and +Dockerfiles: 1 Command chains in Dockerfiles (\`apt-get update && +apt-get install foo\`) must be split into separate commands (\`apt-get +update; apt-get install foo). Otherwise a failing command before the +ampersand is considered "checked" and does not fail the build. 1 The +environment variables section in Singularity is only set on execution of +the final image, not during the build as with Docker. So \`*ENV*\` +sections from Docker must be translated to an entry in the +*%environment* section and **additionally** set in the *%runscript* +section if the variable is used there. 1 \`*VOLUME*\` sections from +Docker cannot be represented in Singularity containers. Use the runtime +option \`-B\` to bind folders manually. 1 *\`CMD\`* and *\`ENTRYPOINT\`* +from Docker do not have a direct representation in Singularity. The +closest is to check if any arguments are given in the *%runscript* +section and call the command from \`*ENTRYPOINT*\` with those, if none +are given call \`*ENTRYPOINT*\` with the arguments of \`*CMD*\`: +\<verbatim>if \[ $# -gt 0 \]; then \<ENTRYPOINT> "$@" else \<ENTRYPOINT> +\<CMD> fi\</verbatim> + +### Using the containers + +#### Entering a shell in your container + +A read-only shell can be entered as follows: + +```Bash +singularity shell my-container.sif +``` + +**IMPORTANT:** In contrast to, for instance, Docker, this will mount various folders from the host +system including $HOME. This may lead to problems with, e.g., Python that stores local packages in +the home folder, which may not work inside the container. It also makes reproducibility harder. It +is therefore recommended to use `--contain/-c` to not bind $HOME (and others like `/tmp`) +automatically and instead set up your binds manually via `-B` parameter. Example: + +```Bash +singularity shell --contain -B /scratch,/my/folder-on-host:/folder-in-container my-container.sif +``` + +You can write into those folders by default. If this is not desired, add an `:ro` for read-only to +the bind specification (e.g. `-B /scratch:/scratch:ro\`). Note that we already defined bind paths +for `/scratch`, `/projects` and `/sw` in our global `singularity.conf`, so you needn't use the `-B` +parameter for those. + +If you wish, for instance, to install additional packages, you have to use the `-w` parameter to +enter your container with it being writable. This, again, must be done on a system where you have +the necessary privileges, otherwise you can only edit files that your user has the permissions for. +E.g: + +```Bash +singularity shell -w my-container.sif +Singularity.my-container.sif> yum install htop +``` + +The `-w` parameter should only be used to make permanent changes to your container, not for your +productive runs (it can only be used writeable by one user at the same time). You should write your +output to the usual Taurus file systems like `/scratch`. Launching applications in your container + +#### Running a command inside the container + +While the "shell" command can be useful for tests and setup, you can also launch your applications +inside the container directly using "exec": + +```Bash +singularity exec my-container.img /opt/myapplication/bin/run_myapp +``` + +This can be useful if you wish to create a wrapper script that transparently calls a containerized +application for you. E.g.: + +```Bash +#!/bin/bash + +X=`which singularity 2>/dev/null` +if [ "z$X" = "z" ] ; then + echo "Singularity not found. Is the module loaded?" + exit 1 +fi + +singularity exec /scratch/p_myproject/my-container.sif /opt/myapplication/run_myapp "$@" +The better approach for that however is to use `singularity run` for that, which executes whatever was set in the _%runscript_ section of the definition file with the arguments you pass to it. +Example: +Build the following definition file into an image: +Bootstrap: docker +From: ubuntu:trusty + +%post + apt-get install -y g++ + echo '#include <iostream>' > main.cpp + echo 'int main(int argc, char** argv){ std::cout << argc << " args for " << argv[0] << std::endl; }' >> main.cpp + g++ main.cpp -o myCoolApp + mv myCoolApp /usr/local/bin/myCoolApp + +%runscript + myCoolApp "$@ +singularity build my-container.sif example.def +``` + +Then you can run your application via + +```Bash +singularity run my-container.sif first_arg 2nd_arg +``` + +Alternatively you can execute the container directly which is +equivalent: + +```Bash +./my-container.sif first_arg 2nd_arg +``` + +With this you can even masquerade an application with a singularity container as if it was an actual +program by naming the container just like the binary: + +```Bash +mv my-container.sif myCoolAp +``` + +### Use-cases + +One common use-case for containers is that you need an operating system with a newer GLIBC version +than what is available on Taurus. E.g., the bullx Linux on Taurus used to be based on RHEL6 having a +rather dated GLIBC version 2.12, some binary-distributed applications didn't work on that anymore. +You can use one of our pre-made CentOS 7 container images (`/scratch/singularity/centos7.img`) to +circumvent this problem. Example: + +```Bash +$ singularity exec /scratch/singularity/centos7.img ldd --version +ldd (GNU libc) 2.17 +``` diff --git a/doc.zih.tu-dresden.de/mkdocs.yml b/doc.zih.tu-dresden.de/mkdocs.yml index d62f62d09ba41bef58466b8d3c99293c1f107a87..502a3aae6ef36d4308f252dcd362962b5cd2e4db 100644 --- a/doc.zih.tu-dresden.de/mkdocs.yml +++ b/doc.zih.tu-dresden.de/mkdocs.yml @@ -17,7 +17,10 @@ nav: - Modules: software/modules.md - JupyterHub: software/JupyterHub.md - JupyterHub for Teaching: software/JupyterHubForTeaching.md - - Containers: software/containers.md + - Containers: + - Singularity: software/containers.md + - Singularity Recicpe Hints: software/SingularityRecipeHints.md + - Singularity Example Definitions: software/SingularityExampleDefinitions.md - Custom Easy Build Modules: software/CustomEasyBuildEnvironment.md - Get started with HPC-DA: software/GetStartedWithHPCDA.md - Mathematics: software/Mathematics.md diff --git a/twiki2md/root/Container/SingularityExampleDefinitions.md b/twiki2md/root/Container/SingularityExampleDefinitions.md deleted file mode 100644 index 429396b61c63d3598b217c591c3463c1c3155fda..0000000000000000000000000000000000000000 --- a/twiki2md/root/Container/SingularityExampleDefinitions.md +++ /dev/null @@ -1,108 +0,0 @@ -# Singularity Example Definitions - -## Basic example - -A usual workflow to create Singularity Definition consists of the -following steps: - -- Start from base image -- Install dependencies - - Package manager - - Other sources -- Build & Install own binaries -- Provide entrypoints & metadata - -An example doing all this: - - Bootstrap: docker - From: alpine - - %post - . /.singularity.d/env/10-docker*.sh - - apk add g++ gcc make wget cmake - - wget https://github.com/fmtlib/fmt/archive/5.3.0.tar.gz - tar -xf 5.3.0.tar.gz - mkdir build && cd build - cmake ../fmt-5.3.0 -DFMT_TEST=OFF - make -j$(nproc) install - cd .. - rm -r fmt-5.3.0* - - cat hello.cpp - #include <fmt/format.h> - - int main(int argc, char** argv){ - if(argc == 1) fmt::print("No arguments passed!\n"); - else fmt::print("Hello {}!\n", argv[1]); - } - EOF - - g++ hello.cpp -o hello -lfmt - mv hello /usr/bin/hello - - %runscript - hello "$@" - - %labels - Author Alexander Grund - Version 1.0.0 - - %help - Display a greeting using the fmt library - - Usage: - ./hello - -## CUDA + CuDNN + OpenMPI - -- Chosen CUDA version depends on installed driver of host -- OpenMPI needs PMI for SLURM integration -- OpenMPI needs CUDA for GPU copy-support -- OpenMPI needs ibverbs libs for Infiniband -- openmpi-mca-params.conf required to avoid warnings on fork (OK on - taurus) -- Environment variables SLURM_VERSION, OPENMPI_VERSION can be set to - choose different version when building the container - -<!-- --> - - Bootstrap: docker - From: nvidia/cuda-ppc64le:10.1-cudnn7-devel-ubuntu18.04 - - %labels - Author ZIH - Requires CUDA driver 418.39+. - - %post - . /.singularity.d/env/10-docker*.sh - - apt-get update - apt-get install -y cuda-compat-10.1 - apt-get install -y libibverbs-dev ibverbs-utils - # Install basic development tools - apt-get install -y gcc g++ make wget python - apt-get autoremove; apt-get clean - - cd /tmp - - : ${SLURM_VERSION:=17-02-11-1} - wget https://github.com/SchedMD/slurm/archive/slurm-${SLURM_VERSION}.tar.gz - tar -xf slurm-${SLURM_VERSION}.tar.gz - cd slurm-slurm-${SLURM_VERSION} - ./configure --prefix=/usr/ --sysconfdir=/etc/slurm --localstatedir=/var --disable-debug - make -C contribs/pmi2 -j$(nproc) install - cd .. - rm -rf slurm-* - - : ${OPENMPI_VERSION:=3.1.4} - wget https://download.open-mpi.org/release/open-mpi/v${OPENMPI_VERSION%.*}/openmpi-${OPENMPI_VERSION}.tar.gz - tar -xf openmpi-${OPENMPI_VERSION}.tar.gz - cd openmpi-${OPENMPI_VERSION}/ - ./configure --prefix=/usr/ --with-pmi --with-verbs --with-cuda - make -j$(nproc) install - echo "mpi_warn_on_fork = 0" >> /usr/etc/openmpi-mca-params.conf - echo "btl_openib_warn_default_gid_prefix = 0" >> /usr/etc/openmpi-mca-params.conf - cd .. - rm -rf openmpi-* diff --git a/twiki2md/root/Container/SingularityRecipeHints.md b/twiki2md/root/Container/SingularityRecipeHints.md deleted file mode 100644 index 016007eb4dbf6aa0a87073ff8c3fd5801340c868..0000000000000000000000000000000000000000 --- a/twiki2md/root/Container/SingularityRecipeHints.md +++ /dev/null @@ -1,75 +0,0 @@ -# Singularity Recipe Hints - -## Index - -[GUI (X11) applications](#X11) - ------------------------------------------------------------------------- - -### \<a name="X11">\</a>GUI (X11) applications - -Running GUI applications inside a singularity container is possible out -of the box. Check the following definition: - - Bootstrap: docker - From: centos:7 - - %post - yum install -y xeyes - -This image may be run with - - singularity exec xeyes.sif xeyes. - -This works because all the magic is done by singularity already like -setting $DISPLAY to the outside display and mounting $HOME so -$HOME/.Xauthority (X11 authentification cookie) is found. When you are -using \`--contain\` or \`--no-home\` you have to set that cookie -yourself or mount/copy it inside the container. Similar for -\`--cleanenv\` you have to set $DISPLAY e.g. via - - export SINGULARITY_DISPLAY=$DISPLAY - -When you run a container as root (via \`sudo\`) you may need to allow -root for your local display port: \<verbatim>xhost -+local:root\</verbatim> - -#### Hardware acceleration - -If you want hardware acceleration you **may** need -[VirtualGL](https://virtualgl.org). An example definition file is as -follows: - - Bootstrap: docker - From: centos:7 - - %post - yum install -y glx-utils # for glxgears example app - - yum install -y curl - VIRTUALGL_VERSION=2.6.2 # Replace by required (e.g. latest) version - - curl -sSL https://downloads.sourceforge.net/project/virtualgl/"${VIRTUALGL_VERSION}"/VirtualGL-"${VIRTUALGL_VERSION}".x86_64.rpm -o VirtualGL-"${VIRTUALGL_VERSION}".x86_64.rpm - yum install -y VirtualGL*.rpm - /opt/VirtualGL/bin/vglserver_config -config +s +f -t - rm VirtualGL-*.rpm - - # Install video drivers AFTER VirtualGL to avoid them being overwritten - yum install -y mesa-dri-drivers # for e.g. intel integrated GPU drivers. Replace by your driver - -You can now run the application with vglrun: - - singularity exec vgl.sif vglrun glxgears - -**Attention:**Using VirtualGL may not be required at all and could even -decrease the performance. To check install e.g. glxgears as above and -your graphics driver (or use the VirtualGL image from above) and disable -vsync: - - vblank_mode=0 singularity exec vgl.sif glxgears - -Compare the FPS output with the glxgears prefixed by vglrun (see above) -to see which produces more FPS (or runs at all). - -**NVIDIA GPUs** need the \`--nv\` parameter for the singularity command: -\`singularity exec --nv vgl.sif glxgears\`