Na ovoj stranici možete naći upute i prijedloge o korištenju pythona, pipa i conde na Supeku:
Prva dva poglavlja kratki su uvod u potrebu kontejnera pri korištenju python knjižnica na Supeku, dok su druga dva posvećena naputcima za brzi razvoj i referencama za one koji žele ući dublje u načine na koje se to može ostvariti.
Lustre je paralelni raspodijeljeni datotečni sustav koji koristi Supek, namijenjen okruženju HPC u kojem veliki broj korisnika generira i koristi iznimnu količinu podataka, i čija je visoka dostupnost i brzina prijenosa bitna radi što efikasnijeg izvođenja paralelnih aplikacija.
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.
Lustre datotečni sustav se sastoji od nekoliko glavnih komponenata (s pripadnim dijagramom ispod):
Slika 1. Dijagram datotečnog sustava Lustre (Figure 1 u izvornoj publikaciji)
Pri svakoj datotečnoj operaciji čitanja ili pisanja, klijent šalje zahtjev Metadata Serveru na kojem se nalazi virtualni zapis opisa i lokacija pravog podatka raspodijeljenog na više Object Storage Servera. Jednom kada se tražena datoteka (ili datoteke) pronađu, stvara se direktna veza između klijenta i fizičkog zapisa, koja osigurava pristup i njeno daljnje upravljanje.
U višekorisničkom okruženju poput klastera Supek, pristup i upravljanje podataka mora biti usklađeno 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:
ls, find, du
ili df
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.
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 knjižnice danas se većinom instaliraju korištenjem aplikacija pip ili conda; upraviteljima knjižnica koji osiguravaju dopremanje svih ovisnosti potrebnih za instalaciju i razvoj aplikacija python.
Iako ove aplikacije pružaju veoma jednostavno i efikasno okruženje za brzi razvoj i eksperimentiranje raznih kombinacija knjižnica, svakom novom instalacijom broj datoteka se multiplicira i dodatno opterećuje dijeljeni sustav (učestalim čitanjem i pisanjem pri razvoju ili izvršavanju).
Ispod se nalazi primjer okruženja nastalog pip instalacijama za samo jednu verziju pythona, koje u sebi sadrži tipični data stack u kojem se nalazi (approx.):
Ako pretpostavimo slična ubrzanja iz prethodnog dijagrama, Lustre datotečni sustav možemo potencijalno koristiti i do deset puta efikasnije (ili barem jedan značajan dio njegove funkcionalnosti) ako okrupnimo podatke u jednu veću, zasebnu cjelinu.
Tablica 1. Ispis broja direktorija, broja datoteka koje sadrže i njihove
veličine za tipičan python3.9 data stack
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 |
Jedan od sve ustaljenijih načina dopremanja aplikacija na HPC klastere su apptainer i singularity; sučelja za stvaranje izoliranih razvojnih okolina zvanih kontejneri.
Kontejneri su datoteke koje u sebi sadrže aplikacije i njihove ovisnosti potrebne za izvršavanje na Unix operativnim sustavima. To čine putem direktne integracije sa samo njihovom jezgrom (koju dijele i koja je odgovorna za upravljanje hardverom), zbog čega su prilagodljivi bilo kojem računalu koje koristi isti operativni sustav.
Datoteke kontejnera obično su u formi tzv. slike (engl. image) koja se stvara na osobnom računalu, gdje se instaliraju datoteke nužne za razvoj i korištenje aplikacija. Jednom kada se pripremi odgovarajući image, doprema se na superračunalo i koristi kao bilo koja druga aplikacija.
Na Supeku je dostupna verzija v1.1.6 apptainer aplikacije. Ispod se nalaze osnove stvaranja i korištenja kontejnera, dok detaljnije upute možete naći na službenim stranicama i našem wikiju Isabelle.
Napomena: Upute pretpostavljaju da applikaciju apptainer imate već instaliranu na osobnom računalu sa sudo ovlastima.
build
Najbitnija komanda apptainera je komanda build
kojom se kontejneri mogu izgraditi u obliku:
Pri tom, kontejnere se može izgraditi na sljedeće načine:
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:
[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 koje 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:
shell --writable
Ako želimo u gore naveden kontejner instalirati dodatne knjižnice, možemo to učiniti na dva načina:
U prvom slučaju, pri izgradnji kontejnera komandom build
moramo navesti opciju --sandbox
koja će generirati kontejner u obliku direktorija ubuntu_20.04
:
[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):
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
:
[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
.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:
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%post
koje definira naredbe koje će se izvršiti nakon izgradnje osnovnog kontejneraNakon čega se kontejner instalira komandom build
:
[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.
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 datotekeIzvrš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:
[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 |