Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

veličine za tipičan python3.9 data stack

Code Block
languagebash
# broj direktorija
marko@pc-mkvakic 15:05 ~ $ find ~/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/dist-packages -type d | wc -l
4338

# broj datoteka
marko@pc-mkvakic 15:05 ~ $ find ~/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/dist-packages -type f | wc -l
47355

# veličine
marko@pc-mkvakic 15:06 ~ $ du -hcs ~/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/dist-packages 
939M	/home/marko/.local/lib/python3.9/site-packages
747M	/usr/local/lib/python3.9/dist-packages
1.7G	total

...

Primjerice, ako želimo direktno izgraditi kontejner s operativnim sustavom ubuntu v20.04 (popularnim OS-om koji pruža veliki broj već prevedenih knjižnica kroz svoj upravitelj knjižnicama apt ) osnovnu radnu verziju možemo izgraditi na slijedeći način:

Code Block
languagebash
# izgradnja kontejnera
[korisnik@kompjuter] $ apptainer build ubuntu_20.04.sif docker://ubuntu:20.04
...
INFO: Creating SIF file

# sadržaj trenutnog direktorija
[korisnik@kompjuter] $ ls -lrt
total 27100
-rwxr-xr-x 1 korisnik korisnik 27746304 svi  23 08:47 ubuntu_20.04.sif

...

U prvom slučaju, pri izgradnji kontejnera komandom build moramo navesti opciju --sandbox koja će generirati kontejner u obliku direktorija ubuntu_20.04 :

Code Block
languagebash
# izgradnja sandbox verzije
[korisnik@kompjuter] $ apptainer build --sandbox ubuntu_20.04 docker://ubuntu:20.04
...
INFO:    Creating sandbox directory...
INFO:    Build complete: ubuntu_20.04

# sadržaj trenutnog direktorija
[korisnik@kompjuter] $ ls -l
total 27104
drwxr-xr-x 18 korisnik korisnik     4096 svi  23 09:05 ubuntu_20.04
-rwxr-xr-x  1 korisnik korisnik 27746304 svi  23 08:47 ubuntu_20.04.sif

...

Ispod se nalazi primjer osvježavanja instalacijskih repozitorija apt i instalacije upravitelja knjižnica pip (dostupnog za ovu verziju ubuntua):

Code Block
languagebash
# otvaranje sjednice u kontejneru
marko@pc-mkvakic 09:12 ~/Desktop/conda-wiki $ sudo apptainer shell ubuntu_20.04
INFO:    /etc/singularity/ exists; cleanup by system administrator is not complete (see https://apptainer.org/docs/admin/latest/singularity_migration.html)
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container

# osvježavanje repozitorija
Apptainer> apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
...
All packages are up to date.


# instalacija pip3
Apptainer> apt install python3-pip -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  binutils binutils-common binutils-x86-64-linux-gnu build-essential ca-certificates cpp cpp-9 dirmngr dpkg-dev fakeroot
...

# ispis verzije
Apptainer> pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

...

Jednom kada smo zadovoljni sa sandbox verzijom koja je potrebna za izvršavanje naših aplikacija, možemo ju prevesti u image korištenjem naredbe build:

Code Block
languagebash
# prebacivanje sandbox verzije u image
[korisnik@kompjuter] $ sudo apptainer build ubuntu_20.04.sif ubuntu_20.04/
...
INFO:    Creating SIF file...
INFO:    Build complete: ubuntu_20.04.sif

marko@pc-mkvakic 09:58 ~/Desktop/conda-wiki# sadržaj trenutnog direktorija
[korisnik@kompjuter] $ ls -l
total 154496
drwxr-xr-x 18 korisnik korisnik      4096 svi  23 09:51 ubuntu_20.04
-rwxr-xr-x  1 korisnik korisnik 158195712 svi  23 09:58 ubuntu_20.04.sif

...

Nakon čega se kontejner instalira komandom build :

Code Block
languagebash
# ispis definicijske datoteke
[korisnik@kompjuter] $ cat ubuntu_20.04.def 
Bootstrap: docker
From: ubuntu:20.04

%post
  apt update
  apt install python3-pip -y

# izgradnja imagea iz definicijske datoteke
[korisnik@kompjuter] $ apptainer build ubuntu_20.04.sif ubuntu_20.04.def 
...
INFO:    Creating SIF file...
INFO:    Build complete: ubuntu_20.04.sif

# sadržaj trenutnog direktorija
[korisnik@kompjuter] $ ls -l
total 154504
drwxr-xr-x 18 korisnik korisnik      4096 svi  23 09:51 ubuntu_20.04
-rw-r--r--  1 korisnik korisnik        87 svi  23 10:22 ubuntu_20.04.def
-rwxr-xr-x  1 korisnik korisnik 158195712 svi  23 10:34 ubuntu_20.04.sif

...

Izvršne datoteke koje su dostupne kroz varijablu okoliša PATH u kontejneru mogu se pozvati korištenjem komande exec. Ispod se nalaze primjeri ispisivanja verzije pythona na korisničkom računalu naspram kontejnera:

Code Block
languagebash
# ispis verzije pythona na računalu
[korisnik@kompjuter] $ python3 --version
Python 3.9.2

# ispis verzije pythona u kontejneru
[korisnik@kompjuter] $ apptainer exec ubuntu_20.04.sif python3 --version
INFO:    /etc/singularity/ exists; cleanup by system administrator is not complete (see https://apptainer.org/docs/admin/latest/singularity_migration.html)
INFO:    underlay of /etc/localtime required more than 50 (86) bind mounts
Python 3.8.10

...

Ispod se nalazi primjer u kojem je izvršna naredba python3 zadana kao naredba za direktno izvršavanje (napomena: $@ je bash varijabla koja odgovara ulaznim argumentima):

Code Block
languagebash
# ispis definicijske datoteke
[korisnik@kompjuter] $ cat ubuntu_20.04.def 
Bootstrap: docker
From: ubuntu:20.04

%post
  apt update
  apt install python3-pip -y

%runscript
  exec python3 $@

# izgradnja imagea iz definicijske datoteke
[korisnik@kompjuter] $ apptainer build ubuntu_20.04.sif ubuntu_20.04.def
...
INFO:    Build complete: ubuntu_20.04.sif

[korisnik@kompjuter] $ ./ubuntu_20.04.sif --version
Python 3.8.10

...

Prvi korak je stvaranje osnovnog kontejnera data_stack_sandbox u interaktivnom modu ili verziji sandbox:

Code Block
languagebash
[# izgradnja sandbox verzije
[korisnik@kompjuter] $ apptainer build --sandbox data_stack_sandbox docker://ubuntu:20.04
...
INFO:    Creating sandbox directory...
INFO:    Build complete: data_stack_sandbox

# sadržaj trenutnog direktorija
[korisnik@kompjuter] $ ls -l
total 154520
drwxr-xr-x 18 korisnik korisnik      4096 svi  23 16:33 data_stack_sandbox
drwxr-xr-x 18 korisnik korisnik      4096 svi  23 09:51 ubuntu_20.04
-rw-r--r--  1 korisnik korisnik       119 svi  23 15:17 ubuntu_20.04.def
-rwxr-xr-x  1 korisnik korisnik 158208000 svi  23 15:24 ubuntu_20.04.sif

...

Nakon stvaranja interaktivne sandbox verzije, otvorimo ljusku unutar kontejnera korištenjem sudo ovlasti i instaliramo sve ovisnosti korištenjem pip installa:

Code Block
languagebash
# interaktivna sjednica u kontejneru
[korisik@kompjuter] $ sudo apptainer shell --writable data_stack_sandbox/
INFO:    /etc/singularity/ exists; cleanup by system administrator is not complete (see https://apptainer.org/docs/admin/latest/singularity_migration.html)
WARNING: Skipping mount /etc/localtime [binds]: /etc/localtime doesn't exist in container
Apptainer> apt update
...
Reading state information... Done
10 packages can be upgraded. Run 'apt list --upgradable' to see them.

# instalacija pip3
Apptainer> apt install python3-pip -y
...
Running hooks in /etc/ca-certificates/update.d...
done.

# instalacija pythn knjižnica
Apptainer> pip3 install numpy scipy pandas matplotlib ipython
...
Successfully installed asttokens-2.2.1 backcall-0.2.0 contourpy-1.0.7 cycler-0.11.0 decorator-5.1.1 executing-1.2.0 fonttools-4.39.4 ipython-8.13.2 jedi-0.18.2 kiwisolver-1.4.4 matplotlib-3.7.1 matplotlib-inline-0.1.6 numpy-1.24.3 packaging-23.1 pandas-2.0.1 parso-0.8.3 pexpect-4.8.0 pickleshare-0.7.5 pillow-9.5.0 prompt-toolkit-3.0.38 ptyprocess-0.7.0 pure-eval-0.2.2 pygments-2.15.1 pyparsing-3.0.9 python-dateutil-2.8.2 pytz-2023.3 scipy-1.10.1 six-1.16.0 stack-data-0.6.2 traitlets-5.9.0 tzdata-2023.3 wcwidtWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
h-0.2.6

# ispis verzija knjižnica
Apptainer> pip3 freeze
...
ipython==8.12.2
matplotlib==3.7.1
matplotlib-inline==3.7.1
numpy==1.24.3
pandas==2.0.1
scipy==1.10.1
...

...

Nakon instalacije knjižnica, prebacujemo sandbox direktorij data_stack_sandbox u image verziju data_stack.sif i dostavljamo ju na Supeka: 

Anchor
pretvaranje_dopremanje
pretvaranje_dopremanje

Code Block
languagebash
# prebacivanje sandbox verzije u image
[korisnik@kompjuter] $ sudo apptainer build data_stack.sif data_stack_sandbox/
...
INFO:    Build complete: data_stack.sif

# veličine verzija sandbox i image
[korisnik@kompjuter] $ du -hcs data_stack*
832M	data_stack_sandbox
272M	data_stack.sif
1.1G	total

# dopremanje image verzije na Supek
[korisnik@kompjuter] $ scp data_stack.sif mkvakic@login-gpu.hpc.srce.hr:.
data_stack.sif														   100%  272MB 111.0MB/s   00:02m

...

Nakon spajanja na superračunalo Supek, kontejner možemo koristiti pozivom naredbe apptainer exec:

Code Block
languagebash
[korisnik@kompjuter]# $ login na pristupni poslužitelj gpu
[korisnik@kompjuter] $ ssh korisnik@login-gpu.hpc.srce.hr
Last login: Wed May 24 08:16:00 2023 from x.x.x.x

# sadržaj korisničkog direktorija
[korisnik@kompjuter] $ ls -l
total 278088
-rwxr-xr-x  1 mkvakic hpc 284729344 May 24 08:02 data_stack.sif

# pokretanje dopremljenog imagea na Supeku
[korisnik@kompjuter] $ apptainer exec data_stack.sif python3 --version
Python 3.8.10

...

Code Block
languagebash
linenumberstrue
# ispis definicijske datoteke
[korisnik@kompjuter] $ cat data_stack.def 
Bootstrap: docker
From: ubuntu:20.04

%post
  apt update
  apt install python3-pip -y
  pip3 install numpy scipy pandas matplotlib ipython

%runscript
  exec python3 $@

# izgradnja imagea
[korisnik@kompjuter] $ apptainer build data_stack.sif data_stack.def
...
INFO:    Creating SIF file...
INFO:    Build complete: data_stack.sif

# dopremanje na Supeka
[korisnik@kompjuter] $ scp data_stack.sif mkvakic@login-gpu.hpc.srce.hr:.
data_stack.sif      100%  335MB 110.9MB/s   00:03

# login na pristupni poslužitelj gpu
[korisnik@kompjuter] $ ssh mkvakic@login-gpu.hpc.srce.hr
Last login: Wed May 24 09:18:44 2023 from x.x.x.x

# direktno izvršavanje imagea na Supeku
[korisnik@x3000c0s27b0n0] $ ./data_stack.sif --version
Python 3.8.10

...

Prvi korak je izgradnja sandbox verzije i instalacija mambe korištenjem službenih uputa:

Code Block
languagebash
# izgradnja sandbox verzije
[korisnik@kompjuter] $ sudo apptainer build --force --sandbox data_stack_sandbox docker://ubuntu:20.04
...

[# otvaranje interaktivne sjednice u sandbox kontejneru
[korisnik@kompjuter] $ sudo apptainer shell --writable data_stack_sandbox/

# osvježavanje apt repozitorija
Apptainer> apt update
...

# instalacija curl
Apptainer> apt install curl -y
...

# preuzimanje Miniforge conde
Apptainer> curl -L -O https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh
...
100 82.9M  100 82.9M    0     0  30.7M      0  0:00:02  0:00:02 --:--:-- 42.0M

# batch instalacija u /usr/local/miniforge
Apptainer> bash Miniforge3-Linux-x86_64.sh -b -p /usr/local/miniforge
...
installation finished.

...

Code Block
languagebash
linenumberstrue
# aktivacija conde u kontejneru
Apptainer> source /usr/local/miniforge/bin/activate

# kreiranje virtualnog okruženja data_stack
(base) Apptainer> conda create -n data_stack python=3.10 -y
...
#                                                                                                                                                                                                                                                            
# To activate this environment, use                                                                                                                                                                                                                          
#
#     $ conda activate data_stack
#
# To deactivate an active environment, use
#
#     $ conda deactivate

# aktivacija virtualnog okružaenja data_stack
(base) Apptainer> conda activate data_stack

(data_stack) # instalacija knjižnica pipom
(data_stack) Apptainer> pip3 install numpy scipy pandas matplotlib ipython
...
Downloading and Extracting Packages
                                                                                                                                                                                                                                                             
Preparing transaction: done                                                                                                                                                                                                                                  
Verifying transaction: done                                                                                                                                                                                                                                  
Executing transaction: done

# ispis instaliranih knjižnica
(data_stack) Apptainer> pip3 list
...
ipython           8.13.2
matplotlib        3.7.1
matplotlib-inline 0.1.6
numpy             1.24.3
pandas            2.0.1
scipy             1.10.1
...   

...

Korištenje instaliranog data_stack virtualnog okruženja osigurava se izvršavanjem python izvršne datoteke u /usr/local/miniforge/envs/data_stack/bin/python3:

Code Block
languagebash
# ispis verzije i staze __init__.py datoteke knjižnice matplotlib u kontejneru
[korisnik@kompjuter] $ apptainer exec data_stack_sandbox/ /usr/local/miniforge/envs/data_stack/bin/python3 -c 'import matplotlib; print("matplotlib verzija je: ", matplotlib.__version__); print("matplotlib __init__ datoteka je:", matplotlib.__file__)'
...
matplotlib verzija je:  3.7.1
matplotlib __init__ datoteka je: /usr/local/miniforge/envs/data_stack/lib/python3.10/site-packages/matplotlib/__init__.py

...

  • graditi u direktoriju /scratch, koji nije dio Lustre dijeljenog datotečnog sustava
  • prebaciti kreirani image nazad u vaš korisnički direktorij, jer u protivnom neće biti vidljiv izvan pristupnog čvora login-gpu.hpc.srce.hr
  • nakon izgradnje obrisati sve kreirane datoteke
  • pri sandbox izgradnji koristiti opciju fakeroot (jer korisnici nemaju sudo ovlasti)

Primjer izgradnje osnovnog ubuntu v20.04 imagea s dodatnim knjižnicama:

  • spajanje na login-gpu.hpc.srce.hr (linija 1)
  • pomicanje u /scratch i stvaranje posebnog direktorija za izgradnju (linije 3 do 5)
  • izgradnja kontejnera i njegovo prebacivanje nazad u korisnički direktorij (linije 6 i 7)
  • pomicanje u korisnički direktorij i brisanje /scratch direktorija za izgradnju (linija 8 i 9)

Code Block
languagebash
linenumberstrue
# login na pristupni poslužitelj gpu
[
Code Block
languagebash
linenumberstrue
[korisnik@kompjuter ~]$ ssh korisnik@login-gpu.hpc.srce.hr
Last login: Wed May 24 09:23:06 2023 from x.x.x.x

# pomicanje u /scratch i kreiranje direktorija za izgradnju
[korisnik@x3000c0s27b0n0 ~]$ cd /scratch
[korisnik@x3000c0s27b0n0 scratch]$ mkdir ${USER}-apptainer
[korisnik@x3000c0s27b0n0 scratch]$ cd ${USER}-apptainer

# izgradnja sandbox verzije
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ apptainer build ubuntu_20.04.sif_sandbox docker://ubuntu:20.04
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ apptainer shell --writable --fakeroot ubuntu_20.04_sandbox
Apptainer> ...
Apptainer> ... dodatne komande za izgradnju kontejnera ...
Apptainer> ...
Apptainer> exit

# mijenjanje sanboxa u image, prebacivanje u korisnički i 
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ apptainer build ubuntu_20.04.sif ubuntu_20.04_sandbox
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ mv ubuntu_20.04.sif ~
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ cd ~

# brisanje direktorija za izgradnju
[korisnik@x3000c0s27b0n0 korisnik-apptainer]$ rm -rf /scratch/${USER}-apptainer

...