...
- Lustre i virtualna okruženja - Kako se virtualna okruženja ponašaju na datotečnom sustavu Lustre
- Apptainer i kontejnerizacija - Poželjan način dopremanja i korištenja virtualnih okruženja
- Primjeri - Primjeri stvaranja kontejnera za određene aplikacije
- Kako dalje? - Reference s dodatnim detaljima
Prva dva poglavlja plitki kratki su uvod u potrebu kontejnera pri korištenju python knjižnica na Supeku, dok su druga dva posvećena naputcima za nestrpljive brzi razvoj i referencama za one koji žele ući dublje u načine na koje se to može ostvariti.
...
Način na koji ovo postiže je fizičkim razdvajanjem opisa datotečnog sustava (tzv. namespacea ) od njegovog stvarnog sadržaja (u objektnom obliku) koji je na Supeku pohranjen na stotinjak SSD-ova u tehničkoj izvedbi ClusterStor E1000.
...
U višekorisničkom okruženju poput klastera Supek, pristup i upravljanje podataka mora biti usklađeno i koherentno svakoj korisničkoj aplikaciji između svake korisničke aplikacije koja im pristupa. Ovo se postiže naizmjeničnim osvježavanjem i usklađivanjem virtualnog zapisa koje ima svoje granice optimalnog izvođenja, iznad kojeg se performanse drastično smanjuju za cijeli datotečni sustav kojim se upravlja i sve korisnike koji ga koriste.
Neke od preporuka za Lustre dijeljeni datotečni sustav uključuju:
...
Ispod se nalazi primjer čitanja sadržaja direktorija komandom ls -l *
stotinu puta zaredom (što je tipično opterećenje jednog klastera) nad raznim kombinacijama broja direktorija i datoteka koje zajedno sadrže 10GB podataka. Najintenzivnije usporavanje postiže se povećanjem broja direktorija (x40-50) naspram broja datoteka (x4-5), koje ukazuje na nužnost agregacije što većeg broja datoteka u u što manje direktorija;
Ako uzmemo u obzir dva rubna slučaja: 1) tisuću datoteka u jednom direktoriju naspram 2) tisuću direktorija s jednom datotekom, vidljivo je da se množenjem direktorija efikasnost ove operacije značajno smanjuje (approx. 20 puta). Slični trend vidljiv je i u ostalim kombinacijama (10/100 vs. 100/10, itd.) što upućuje na nužnost agregacije podataka u manji broj direktorija i idealno u datoteke većeg obujma.
Slika 2. Vrijeme izvođenja komande ls -l *
stotinu puta nad
kombinacijama broja direktorija (1-1000) i datoteka (1-100) koje
sadrže 10GB podataka. Crne crtane linije povezuju točke s istim
brojem datoteka
Python i virtualna okruženja
...
Iako ove aplikacije pružaju veoma jednostavno i efikasno okruženje za brzi razvoj i eksperimentiranje raznih kombinacija knjižnica i njihovih kombinacija, svakom novom instalacijom broj datoteka se multiplicira i dodatno opterećuje dijeljeni sustav (učestalim čitanjem i pisanjem pri razvoju ili izvršavanju).
...
veličine za tipičan python3.9 data stack
Code Block | ||||
---|---|---|---|---|
| ||||
marko@pc-mkvakic 15:05 ~ $ find ~/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/dist-packages -type d | wc -l 4338 marko@pc-mkvakic 15:05 ~ $ find ~/.local/lib/python3.9/site-packages /usr/local/lib/python3.9/dist-packages -type f | wc -l 47355 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 |
...
Napomena: Upute pretpostavljaju da applikaciju apptainer imate već instaliranu na osobnom računalu sa sudo ovlastima.
Izgradnja kontejnera - build
Najbitnija komanda apptainera je komanda build
kojom se kontejneri mogu izgraditi u obliku slike (samo čitanje) ili sandbox verziji putem opcije build --sandbox
(za interaktivno modificiranje).:
- slike ili verzije image - oblik koji podržava samo čitanje, namijenjen finalnoj verziji kontejnera
- direktorija ili verzije sandbox - oblik koji podržava i pisanje, namijenjen razvoju kontejnera
Pri tom, kontejnere se može izgraditi na sljedeće načineKontejneri se grade korištenjem recepata zvanih definition datoteka i mogu se:
- preuzeti s online repozitorija - za brzo pripremanje već testiranih recepata
- skrojiti ručno - za pripremanje specifičnih konfiguracija
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 | ||
---|---|---|
| ||
[korisnik@kompjuter] $ apptainer build ubuntu_20.04.sif docker://ubuntu:20.04 ... output izgradnje koji završava s... INFO: Creating SIF file... [korisnik@kompjuter] $ ls -lrt total 27100 -rwxr-xr-x 1 korisnik korisnik 27746304 svi 23 08:47 ubuntu_20.04.sif |
Iako je ovaj image ograničene koristi (jer ubuntu sam po sebi obično ne sadrži aplikacije za izvođenje na HPC-ukoje su nam potrebne), ovom komandom se mogu dohvatiti već pripremljeni recepti za koje postoje posvećeni repozitoriji, i koji mogu biti osnova za daljnju izgradnju kontejnera.
Neki od poznatijih repozitorija su:
- hub.docker.com - najpoznatija meka za kontejnere i obično prvi rezultat Google upitabiocontainers.pro - posvećeno bioinformatici
- condaforge - kontejneri s već pripremljenim upraviteljima paketa conda ili mamba
- Nvidia NGC - posvećeni posvećeno ML i AI aplikacijama optimiziranim za grafičke procesore
- biocontainers.pro - posvećeno bioinformatici
Modifikacija kontejnera - shell --writable
Ako želimo u gore naveden kontejner instalirati dodatne knjižnice, možemo to učiniti na dva načina:
- interaktivnom izgradnjom korištenjem verzije sandbox
- izgradnjom slike korištenjem definicijske datoteke .def
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 | ||
---|---|---|
| ||
[korisnik@kompjuter] $ apptainer build --sandbox ubuntu_20.04 docker://ubuntu:20.04 ... INFO: Creating sandbox directory... INFO: Build complete: ubuntu_20.04 [korisnik@kompjuter] $ ls -l total 27104 drwxr-xr-x 18 marko marko 4096 svi 23 09:05 ubuntu_20.04 -rwxr-xr-x 1 marko marko 27746304 svi 23 08:47 ubuntu_20.04.sif |
Novonastali sandbox kontejner možemo modificirati korištenjem opcije shell --writable
kojom otvaramo ljusku unutar kontejnera sa svim korisničkim knjižnicama koje doprema.
Ispod se nalazi primjer osvježavanja instalacijskih repozitorija apt
i instalacije upravitelja knjižnica pip (dostupnog za ovu verziju ubuntua):
Code Block | ||
---|---|---|
| ||
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
Apptainer> apt update
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
...
All packages are up to date.
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
...
Apptainer> pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8) |
Istim principom možemo unutar kontejnera instalirati bilo koju aplikaciju u bilo kojem obliku: prevođenjem izvornog koda, instalacijom conde i kreiranjem virtualnih okruženja, itd.
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 | ||
---|---|---|
| ||
[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 $ ls -l
total 154496
drwxr-xr-x 18 marko marko 4096 svi 23 09:51 ubuntu_20.04
-rwxr-xr-x 1 marko marko 158195712 svi 23 09:58 ubuntu_20.04.sif |
Novija image verzija sada će (osim osnovnog operativnog sustava ubuntu v20.04) sadržavati i upravitelj knjižnicama pip v20.0.2
Ručna priprema kontejnera - .def
Drugi način (osim gore opisane interaktivne nadogradnje) je korištenjem definicijskih datoteka .def koje u sebi sadrže upute za izgradnju kontejnera.
Ovaj način je najpoželjniji jer osigurava dosljednu izgradnju imagea koja se može postepeno i dosljedno poboljšavati, no na uštrb brzine razvoja jer svakom se modifikacijom image mora ponovo izgraditi.
.def datoteke u sebi sadrže:
- zaglavlje ili header - definicija osnovnog operativnog sustava
- poglavlja ili sections - dijelovi koji definiraju razne dijelove izgradnje i korisnički okoliš koji je dostupan u kontejneru
U primjeru iznad (ubuntu v20.04 + pip v20.0.2) definicijska datoteka bi sadržavala:
-
Bootstrap:/From:
linije u zaglavlju koje definiraju osnovni operativni sustav - poglavlje
%post
koje definira naredbe koje će se izvršiti nakon izgradnje osnovnog kontejnera
Nakon čega se kontejner instalira komandom build
:
Code Block |
---|
[korisnik@kompjuter] $ cat ubuntu_20.04.def
Bootstrap: docker
From: ubuntu:20.04
%post
apt update
apt install python3-pip -y
[korisnik@kompjuter] $ apptainer build ubuntu_20.04.sif ubuntu_20.04.def
...
INFO: Creating SIF file...
INFO: Build complete: ubuntu_20.04.sif
[korisnik@kompjuter] $ ls -l
total 154504
drwxr-xr-x 18 marko marko 4096 svi 23 09:51 ubuntu_20.04
-rw-r--r-- 1 marko marko 87 svi 23 10:22 ubuntu_20.04.def
-rwxr-xr-x 1 marko marko 158195712 svi 23 10:34 ubuntu_20.04.sif |
S obzirom da je instalacija u primjeru veoma jednostavna i oslanja se na izvorni upravitelj knjižnica apt, jedino potrebno poglavlje je %post
kojim se izvršavaju komande nakon izgradnje osnovnog kontejnera.
U slučaju instalacije korištenjem izvornog koda i posebnih putanja, u ponekim slučajevima potrebno je definirati okolišne varijable LD_LIBRARY_PATH
i PATH
u poglavlju %environment
ili dostaviti dodatne datoteke pri izgradnji korištenjem poglavlja %files
.
Dodatne detalje o ovim funkcionalnostima možete naći na službenim stranicama.
Korištenje kontejnera - exec/run
Jednom kada pripremimo kontejner s aplikacijama, postoji više komanda ili načina na koji se mogu koristiti:
exec
- izvršavanje aplikacija ili skripta unutar kontejnerarun
- izvršavanje kontejnera kao izvršne datoteke
Izvršne datoteke koje su dostupne kroz varijablu okoliša PATH
mogu se pozvati korištenjem komande exec
. Ispod se nalaze primjeri ispisivanja verzije pythona na korisničkom računalu naspram kontejnera:
Code Block |
---|
[korisnik@kompjuter] $ python3 --version
Python 3.9.2
[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 |
...
Primjer
Anchor | ||||
---|---|---|---|---|
|
Kako dalje?
Anchor | ||||
---|---|---|---|---|
|
...