...
veličine za tipičan python3.9 data stack
Code Block |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
[# 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 |
---|
|
# 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 |
---|
|
# 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 |
---|
|
[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 |
---|
language | bash |
---|
linenumbers | true |
---|
|
# 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 |
---|
|
# 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 |
---|
language | bash |
---|
linenumbers | true |
---|
|
# 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 |
---|
|
# 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 |
---|
language | bash |
---|
linenumbers | true |
---|
|
# login na pristupni poslužitelj gpu
[ |
Code Block |
---|
language | bash |
---|
linenumbers | true |
---|
|
[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 |
...