Difference between revisions of "Deploy a container using Singularity"
From ScientificComputing
Line 39: | Line 39: | ||
== Deploy the image on the cluster == | == Deploy the image on the cluster == | ||
− | === Use the Docker image on Dockerhub === | + | === Method 1: Use the Docker image on Dockerhub === |
* Push the image to Dockerhub | * Push the image to Dockerhub | ||
− | $ docker push | + | [user@local]$ docker push dockeruser/ubuntu-python3:latest |
− | The push refers to repository [docker.io/ | + | The push refers to repository [docker.io/dockeruser/ubuntu-python3] |
4648e930d81f: Pushed | 4648e930d81f: Pushed | ||
2e38cc729d73: Pushed | 2e38cc729d73: Pushed | ||
Line 52: | Line 52: | ||
* Log into Euler | * Log into Euler | ||
− | $ ssh | + | [user@local]$ ssh nethzuser@euler.ethz.ch |
* [[Singularity#Troubleshooting|To use Singularity, your NETHZ username has to be added to ID-HPC-SINGULARITY group]] | * [[Singularity#Troubleshooting|To use Singularity, your NETHZ username has to be added to ID-HPC-SINGULARITY group]] | ||
* Request a compute node with Singularity | * Request a compute node with Singularity | ||
− | $ bsub -n 1 -R singularity -R light -Is bash | + | [nethzuser@eu-login-01 ~]$ bsub -n 1 -R singularity -R light -Is bash |
Generic job. | Generic job. | ||
Job <174809810> is submitted to queue <light.5d>. | Job <174809810> is submitted to queue <light.5d>. | ||
<<Waiting for dispatch ...>> | <<Waiting for dispatch ...>> | ||
<<Starting on eu-ms-001-02>> | <<Starting on eu-ms-001-02>> | ||
− | [ | + | [nethzuser@eu-ms-001-02 ~]$ |
* Pull the Docker image with Singularity | * Pull the Docker image with Singularity | ||
− | [ | + | [nethzuser@eu-ms-001-02 ~]$ cd $SCRATCH |
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ singularity pull docker://dockeruser/ubuntu-python3 |
INFO: Converting OCI blobs to SIF format | INFO: Converting OCI blobs to SIF format | ||
− | |||
INFO: Starting build... | INFO: Starting build... | ||
Getting image source signatures | Getting image source signatures | ||
Copying blob 345e3491a907 done | Copying blob 345e3491a907 done | ||
− | + | ... | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
INFO: Creating SIF file... | INFO: Creating SIF file... | ||
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ ll |
ubuntu-python3_latest.sif | ubuntu-python3_latest.sif | ||
* Run the container as shell | * Run the container as shell | ||
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ singularity shell ubuntu-python3_latest.sif |
+ | Singularity> | ||
Singularity> lsb_release -a | Singularity> lsb_release -a | ||
No LSB modules are available. | No LSB modules are available. | ||
Line 111: | Line 98: | ||
>>> | >>> | ||
Singularity> exit | Singularity> exit | ||
+ | exit | ||
As you can see, the container contains GCC 9.3.0 with Python 3.8.5 and TensorFlow 2.5.0. At the time of writing tutorial, the latest version of GCC is 8.2.0 and TensorFlow 2.4.0 | As you can see, the container contains GCC 9.3.0 with Python 3.8.5 and TensorFlow 2.5.0. At the time of writing tutorial, the latest version of GCC is 8.2.0 and TensorFlow 2.4.0 | ||
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ module avail gcc |
--------------------------- /cluster/apps/lmodules/Core -------------------------------- | --------------------------- /cluster/apps/lmodules/Core -------------------------------- | ||
gcc/4.8.2 gcc/4.8.5 (L) gcc/5.4.0 gcc/6.3.0 gcc/7.3.0 gcc/8.2.0 (D) | gcc/4.8.2 gcc/4.8.5 (L) gcc/5.4.0 gcc/6.3.0 gcc/7.3.0 gcc/8.2.0 (D) | ||
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ module load gcc/6.3.0 python/3.8.5 |
− | [ | + | [nethzuser@eu-ms-001-02 nethzuser]$ python |
Python 3.8.5 (default, Oct 6 2020, 10:04:29) | Python 3.8.5 (default, Oct 6 2020, 10:04:29) | ||
[GCC 6.3.0] on linux | [GCC 6.3.0] on linux | ||
Line 130: | Line 118: | ||
>>> | >>> | ||
− | === Convert a Docker image to a Singularity image === | + | === Method 2: Convert a Docker image to a Singularity image === |
* Create a tarball of the Docker image | * Create a tarball of the Docker image | ||
[user@local]$ docker save d639b6f22ee5 -o ubuntu-python3.tar | [user@local]$ docker save d639b6f22ee5 -o ubuntu-python3.tar |
Revision as of 09:20, 10 June 2021
< Examples |
Contents
Create a Docker file and build a docker image on your local computer
- Install Docker
- Create a folder
$ mkdir test_container $ cd test_container
- Open file named **Dockerfile** with a text editor
FROM ubuntu:latest WORKDIR /home/project RUN apt-get -y update RUN apt-get install -y lsb-release python3 python3-pip \ && pip install numpy==1.19 matplotlib tensorflow
- Build an image
$ docker build -t username/ubuntu-python3:latest . Sending build context to Docker daemon 3.072kB Step 1/4 : FROM ubuntu:latest ---> 7e0aa2d69a15 Step 2/4 : WORKDIR /home/project ---> Using cache ---> d9947182f6a8 Step 3/4 : RUN apt-get -y update ---> Using cache ---> 89a634ac491b Step 4/4 : RUN apt-get install -y lsb-release python3 python3-pip && pip install numpy==1.19 matplotlib tensorflow ---> Using cache ---> d639b6f22ee5 Successfully built d639b6f22ee5 Successfully tagged username/ubuntu-python3:latest
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE username/ubuntu-python3 latest d639b6f22ee5 18 minutes ago 2.19GB
Deploy the image on the cluster
Method 1: Use the Docker image on Dockerhub
- Push the image to Dockerhub
[user@local]$ docker push dockeruser/ubuntu-python3:latest The push refers to repository [docker.io/dockeruser/ubuntu-python3] 4648e930d81f: Pushed 2e38cc729d73: Pushed f281ab5d2fac: Pushed 2f140462f3bc: Mounted from library/ubuntu 63c99163f472: Mounted from library/ubuntu ccdbb80308cc: Mounted from library/ubuntu latest: digest: sha256:cd8a34b30aabe432232787d1e93844cd01027c2b235fb88f106297ed26c1f2ca size: 1576
- Log into Euler
[user@local]$ ssh nethzuser@euler.ethz.ch
- Request a compute node with Singularity
[nethzuser@eu-login-01 ~]$ bsub -n 1 -R singularity -R light -Is bash Generic job. Job <174809810> is submitted to queue <light.5d>. <<Waiting for dispatch ...>> <<Starting on eu-ms-001-02>> [nethzuser@eu-ms-001-02 ~]$
- Pull the Docker image with Singularity
[nethzuser@eu-ms-001-02 ~]$ cd $SCRATCH [nethzuser@eu-ms-001-02 nethzuser]$ singularity pull docker://dockeruser/ubuntu-python3 INFO: Converting OCI blobs to SIF format INFO: Starting build... Getting image source signatures Copying blob 345e3491a907 done ... INFO: Creating SIF file...
[nethzuser@eu-ms-001-02 nethzuser]$ ll ubuntu-python3_latest.sif
- Run the container as shell
[nethzuser@eu-ms-001-02 nethzuser]$ singularity shell ubuntu-python3_latest.sif Singularity> Singularity> lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.2 LTS Release: 20.04 Codename: focal
Singularity> python3 Python 3.8.5 (default, May 27 2021, 13:30:53) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf 2021-06-09 14:08:24.919069: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /.singularity.d/libs 2021-06-09 14:08:24.919094: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. >>> tf.__version__ '2.5.0' >>> Singularity> exit exit
As you can see, the container contains GCC 9.3.0 with Python 3.8.5 and TensorFlow 2.5.0. At the time of writing tutorial, the latest version of GCC is 8.2.0 and TensorFlow 2.4.0
[nethzuser@eu-ms-001-02 nethzuser]$ module avail gcc --------------------------- /cluster/apps/lmodules/Core -------------------------------- gcc/4.8.2 gcc/4.8.5 (L) gcc/5.4.0 gcc/6.3.0 gcc/7.3.0 gcc/8.2.0 (D)
[nethzuser@eu-ms-001-02 nethzuser]$ module load gcc/6.3.0 python/3.8.5 [nethzuser@eu-ms-001-02 nethzuser]$ python Python 3.8.5 (default, Oct 6 2020, 10:04:29) [GCC 6.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow as tf 2021-06-09 14:56:47.778183: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /cluster/apps/gcc-6.3.0/openblas-0.2.20-cot3cawsqf4pkxjwzjexaykbwn2ch3ii/lib:/cluster/apps/nss/gcc-6.3.0/python/3.8.5/x86_64/lib64:/cluster/spack/apps/linux-centos7-x86_64/gcc-4.8.5/gcc-6.3.0-sqhtfh32p5gerbkvi5hih7cfvcpmewvj/lib64:/cluster/spack/apps/linux-centos7-x86_64/gcc-4.8.5/gcc-6.3.0-sqhtfh32p5gerbkvi5hih7cfvcpmewvj/lib:/cluster/apps/lsf/10.1/linux2.6-glibc2.3-x86_64/lib 2021-06-09 14:56:47.778214: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. >>> tf.__version__ '2.4.0' >>>
Method 2: Convert a Docker image to a Singularity image
- Create a tarball of the Docker image
[user@local]$ docker save d639b6f22ee5 -o ubuntu-python3.tar [user@local]$ ls ubuntu-python3.tar
- Copy the tarball to $SCRATCH on Euler
[user@local]$ scp ubuntu-python3.tar netzuser@euler.ethz.ch:/cluster/scratch/nethzuser
- Log in to Euler
[user@local]$ ssh netzuser@euler.ethz.ch [nethzuser@eu-login-01 ~]$ cd $SCRATCH [nethzuser@eu-login-01 nethzuser]$ pwd /cluster/scratch/nethzuser [nethzuser@eu-login-01 nethzuser]$ pwd /cluster/scratch/nethzuser
- Convert the tarbal to a Singularity image
[nethzuser@eu-login-01 nethzuser]$ singularity build --sandbox ubuntu-python3 docker-archive://ubuntu-python3.tar INFO: Starting build... ... INFO: Creating sandbox directory... INFO: Build complete: ubuntu-python3
- Run the Singularity box
[nethzuser@eu-login-01 nethzuser]$ singularity shell ubuntu-python3 Singularity> Singularity> gcc --version gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Singularity> python3 --version Python 3.8.5 ingularity> python3 -c "import tensorflow as tf; print(tf.__version__)" 2021-06-10 09:12:44.533833: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /.singularity.d/libs 2021-06-10 09:12:44.533867: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine. 2.5.0 Singularity> exit exit
< Examples |