Versions Compared

Key

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

...

  1. Lustre i virtualna okruženja - Kako se virtualna okruženja ponašaju na datotečnom sustavu Lustre
  2. Apptainer i kontejnerizacija - Poželjan način dopremanja i korištenja virtualnih okruženja
  3. Primjeri - Primjeri stvaranja kontejnera za određene aplikacije
  4. 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.

Image RemovedImage Added

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
languagebash
linenumberstrue
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
languagebash
[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:

Modifikacija kontejnera - shell --writable

Ako želimo u gore naveden kontejner instalirati dodatne knjižnice, možemo to učiniti na dva načina:

  1. interaktivnom izgradnjom korištenjem verzije sandbox
  2. 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
languagebash
[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
languagebash
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
languagebash
[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.04pip v20.0.2) definicijska datoteka bi sadržavala:

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 kontejnera
  • run - 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
primjeri
primjeri

Kako dalje? 
Anchor
reference
reference

...