...
Panel | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
|
Na ovoj stranici možete naći upute i prijedloge o korištenju pythona, pipa i conde na Supeku:
Lustre i virtualna
...
okruženja
Anchor | ||||
---|---|---|---|---|
|
Lustre je paralelni raspodijeljeni datotečni sustav koji koristi Supek, namijenjen okruženju HPC u
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.
...
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.):
- 4000 direktorija
- 15 datoteka po direktoriju
- 2G podataka
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.
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 |
...
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.
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:
- image - slika ili oblik koji podržava samo čitanje, namijenjen finalnoj verziji kontejnera
- sandbox - direktorij ili oblik koji podržava i pisanje, namijenjen razvoju kontejnera
Pri tom, kontejnere se može izgraditi na sljedeće načine:
- 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 | ||
---|---|---|
| ||
# 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 |
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:
- hub.docker.com - najpoznatija meka za kontejnere i obično prvi rezultat Google upita
- condaforge - kontejneri s već pripremljenim upraviteljima paketa conda
- Nvidia NGC - 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 moramo navesti opciju build --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 |
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 | ||
---|---|---|
| ||
# 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) |
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 | ||
---|---|---|
| ||
# 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
# 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 |
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
...
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.):
- 4000 direktorija
- 15 datoteka po direktoriju
- 2G podataka
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.
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 | ||
---|---|---|
| ||
# 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 |
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 i našem wikiju.
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
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 |
U slučaju da koristimo samo jednu aplikaciju, komanda run
je prikladnija jer se u tom slučaju kontejner može pozivati kao izvršna datoteka. Ova funkcionalnost omogućuje se poglavljem %runscript
u definicijskoj datoteci pri izgradnji imagea.
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:~]broj direktorija marko@pc-mkvakic 15:05 ~ $ 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 |
...
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 |
Apptainer i kontejnerizacija
Anchor | ||||
---|---|---|---|---|
|
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 u formi slike (engl. image) koja se stvara na osobnom računalu i, jednom kada se pripremi, doprema na superračunalo i koristi kao bilo koja druga aplikacija
...
Tipični workflow za izgradnju kontejnera namijenjenog određenoj aplikaciji je sljedeći:
- pronalaženje uputa za instalaciju tražene aplikacije
- istraživanje odgovarajućeg operativnog sustava
- kreiranje osnovnog kontejnera i njegova interaktivna nadogradnja
- prebacivanje kontejnera u image ili izvršni oblik
- dopremanje i izvršavanje na klasteru
Prva četiri koraka mogu se u potpunosti vršiti na korisničkom računalu, dok se posljednji vrši na Supeku gdje su dostupni značajniji resursi.
Ispod se nalaze upute za razvoj osnovnog python data stacka koji se sastoji od knjižnica:
- NumPy - upravljanje matričnim podacima
- SciPy - osnovne znanstvene funkcije
- Pandas - upravljanje strukturiranim podacima
- matplotlib - vizualizacija podataka
Operativni sustav kao osnova kontejnera je Ubuntu Focal Fossa (v20.04 LTS)
Slika 3. Workflow za izradu i korištenje kontejnera. Slika je preuzeta sa
stranice Singularitya; preteča Apptaineru koja funkcionira
...
Detaljnije upute možete naći na službenim stranicama i našem wikiju.
Izgradnja pipom
Prvi korak je stvaranje osnovnog kontejnera data_stack_sandbox
u interaktivnom modu ili verziji sandbox:
...