Vsebniki
Vsebniki predstavljajo individualno enoto z ustreznim naborom programske opreme, vključno z ustreznimi knjižnicami in nastavitvami za učinkovito delovanje v okolju. Tehnologija omogoča zanesljivost, prenosljivost, izolacijo, varnost in zagon programske opreme vsebnikov znotraj ali izven ukazne vrstice. Slednje omogoča, da se programska oprema prilagodi okolju superračunalnika. Posamezne distribucije omogočajo različne pristope in mehanizme, ki zagotavljajo fleksibilnost in konfiguracijo okolja. Gruča Vega že ima platformo za vsebnike Apptainer nameščeno in prilagojeno delu na superračunalnikih (HPC).
Na HPC Vega so vsebniki na voljo na $PATH: /ceph/hpc/software/containers/singularity
Vsebniki Apptainer
Apptainer je platforma, namenjena ustvarjanju in zaganjanju vsebnikov znotraj superračunalniškega okolja. Vsebniki imajo dostop do skupne operacijskega sistema, datotečnega sistema in programske opreme, nameščene na vozliščih. Slednja upošteva privilegije operacijskega sistema (v našem primeru je to RHEL), ki omogoča uporabo in prenos ustreznih pravic sistemskega uporabniškega računa. Če se odločimo za namestitev lastnega vsebnika, lahko namestimo programsko opremo, knjižnice in prilagodimo okolje v njem tako, da ustreza našim potrebam. Zaradi omejene izolacije moramo biti pozorni na ustreznost in združljivost okolja, ki ga vzpostavimo. V nasprotnem primeru vsebnik ne bo deloval pravilno ali pa sploh ne bo deloval.
Apptainer zagotavlja visoko stopnjo prenosljivosti – z uporabo formata Singularity Image Format (SIF) – ter ponovljivost priprave vsebnikov s pomočjo definicijskih oziroma opisnih datotek (.def/ .dsc).
Apptainer (prej Singularity) je odprtokodni fork programa Singularity. Večinoma sta medsebojno zamenljiva, zato lahko svoje delovne tokove v Singularityju enostavno prilagodite, da bodo delovali tudi z Apptainerjem.
Več informacij najdete v uradni dokumentaciji.
Ukazi Apptainer
Če ne želite ustvarjati lastnega vsebnika, lahko uporabite že pripravljene vsebnike iz javnih repozitorijev (npr. Docker Hub, Sylabs Library ipd.).
Ukaz apptainer pull prenese izbrani vsebnik na VEGA datotečni sistem in ga shrani v datoteko formata .sif, ki jo lahko kasneje uporabljate za izvajanje programov.
Splošna oblika ukaza:
apptainer pull <image-name>.sif <hub>://<image>[:tag]
kjer:
- <image-name>.sif določa ime datoteke, ki bo ustvarjena na vašem računu,
- <hub> določa vir prenosa (npr. docker, library),
- <image> predstavlja ime vsebnika iz izbranega vira prenosa,
- [:tag] pa je izbirna oznaka različice vsebnika (npr. latest, 2.15, cuda12).
Naslednji ukaz prenese najnovejšo različico vsebnika TensorFlow iz Docker Hub repozitorija:
apptainer pull tensorflow.sif docker://tensorflow/tensorflow:latest
Po uspešnem prenosu bo v trenutnem direktoriju ustvarjena .sif datoteka, npr. container.sif. To datoteko lahko nato uporabite za zagon aplikacij znotraj vsebnika.
Zagon vsebnika
Ko imate vsebnik prenesen v datoteki .sif, ga lahko zaženete na več načinov, odvisno od tega, kaj želite narediti.
Ukaz run zažene privzeti program, ki je nastavljen v vsebniku:
apptainer run container.sif
Za izhod iz vsebnika uporabite ukaz exit.
Ukaz exec zažene točno določen ukaz znotraj vsebnika:
apptainer exec container.sif <command>
Primer:
apptainer exec tensorflow.sif python --version
Z ukazom exec lahko s pomočjo vsebnika zaženete tudi skripte.
Primer:
apptainer exec tensorflow.sif python script.py
Zagon z ukazom exec je najpogosteje uporabljen način dela na HPC sistemih, saj omogoča zagon posameznih programov znotraj vsebnika.
Interaktivno lupino znotraj vsebnika zaženemo z ukazom shell:
apptainer shell container.sif
Sedaj lahko izvajate ukaze neposredno znotraj vsebnika. Primer:
Apptainer> python --version
Apptainer> ls
Apptainer> pwd
Za izhod iz vsebnika uporabite ukaz exit.
Pregled informacij o vsebniku
Za izpis osnovnih podatkov o vsebniku uporabite:
apptainer inspect container.sif
Za prikaz ukaza, ki se izvede ob uporabi apptainer run, uporabite:
apptainer inspect --runscript container.sif
Za prikaz definicijske datoteke vsebnika uporabite:
apptainer inspect --deffile container.sif
Nekateri vsebniki vsebujejo dodatna navodila za uporabo, ki jih prikažemo z:
apptainer run-help container.sif
Za pregled vseh razpoložljivih ukazov uporabite:
apptainer help
Za pomoč pri posameznem ukazu uporabite:
apptainer help <command>
Priprava lastnega vsebnika
Če predpripravljen vsebnik ne vsebuje vseh programov ali nastavitev, ki jih potrebujete, lahko ustvarite lasten vsebnik. Lastni vsebnik lahko pripravite na več načinov, lahko tudi tako, da jih združite. Uporabite lahko tudi predhodno pripravljene vsebnike, jih razporedite in jih prilagodite svojim potrebam. Če pa vam to ne ustreza, lahko ustvarite lastni vsebnik s pomočjo definicijske datoteke. Slednja vam omogoča višjo raven ponovljivosti vsebnika samega (vedno dobite isti rezultat, morate pa biti previdni, da ne uporabite najnovejših oznak).
Predloge so na voljo v različnih repozitorijih za zagon (angl. bootstrap repositories), kot so:
- Knjižnica vsebnikov Singularity: https://cloud.sylabs.io/library
- Docker Hub: https://hub.docker.com/
- Singularity Hub: https://singularity-hub.org/
- Yum
Celotni seznam repozitorijev je na voljo na spletni strani: Navodila za uporabnike
Dodatne funkcionalnosti in uporaba različnih stikal:
Singularity Image Format (SIF) je vsebnik samo za branje, ki omogoča prenosljivost. Če so potrebne spremembe v vsebniku, se lahko pretvori v "sandbox" ali uporabi dodatna funkcionalnost "Persistent Overlays", ki je na voljo s stikalom --overlay.
Več informacij najdete povezavi.
Če je vsebnik pripravljen s stikalom --sandbox, se lahko vsebnik sam ureja neposredno s stikalom --writable.
Sistemske direktorije lahko vpnete v vsebnik z uporabo stikala --bind $PATH.
Več informacij najdete povezavi.
Graditev
Zapisljiv vsebnik (sandbox) lahko ustvarite iz obstoječe slike v izbranem repozitoriju:
apptainer build --sandbox --fix-perms <container>/ <hub>://<image>:[tag]
kjer:
- <containr> predstavlja imenik, v katerega bo vsebnik ustvarjen,
- <hub> določa vir prenosa (npr. docker, library),
- <image> predstavlja ime vsebnika iz izbranega vira prenosa,
- [:tag] pa je izbirna oznaka različice vsebnika.
Naslednji primer ustvari zapisljiv vsebnik na osnovi Ubuntu 24.04:
apptainer build --sandbox --fix-perms ubuntu_container/ docker://ubuntu:24.04
Lupina
Če uporabljate zapisljiv sandbox vsebnik, ga lahko odprete v interaktivni lupini, ki omogoča spreminjanje vsebine:
apptainer shell --writable --fakeroot container/
Fakeroot je funkcionalnost, ki omogoča uporabnikokm brez privilegijev, da pridobijo ustrezne pravice "root" znotraj vsebnikov s stikalom -–fakeroot. Pravice gostiteljskih sistemov datotek (FS) so ustrezno preslikane znotraj vsebnika. Poleg tega se priporoča, da uporabite stikalo --fix-perms, ki ustrezno uravnava in prilagaja pravice znotraj vsebnika.
Več informacij najdete povezavi.
Opomba
Fakeroot za vse uporabnike je privzeto nastavljen na način root-mapped user namespace. Če za namen izdelave lastnih vsebnikov potrebujete rootless mode, pošljite zahtevo za omogočitev na support@sling.si
Izvršitev
Če želite v vsebniku izvesti posamezen ukaz, ne da bi odprli interaktivno lupino, uporabite ukaz exec.
apptainer exec <container> <command>
Naslednji ukaz izvede ukaz whoami v zapisljivem sandbox vsebniku:
apptainer exec --fakeroot container/ whoami
Predpomnilnik
Apptainer med prenosom in gradnjo vsebnikov začasno shranjuje datoteke v predpomnilnik (cache). Tako ob ponovni uporabi ni potrebno znova prenašati istih podatkov, kar pospeši delo in zmanjša omrežni promet.
Za pregled datotek, ki so trenutno shranjene v predpomnilniku, uporabite:
apptainer cache list
Če želite sprostiti prostor na datotečnem sistemu, lahko vsebino predpomnilnika izbrišete:
apptainer cache clean --type=all
Priprava definicijske datoteke
Definicijska datoteka (definition file) vsebuje navodila za gradnjo vsebnika. V njej določite osnovno sliko, namestitev programske opreme, okoljske spremenljivke in druge nastavitve. Definicijsko datoteko lahko ustvarite z urejevalnikom besedila:
$ vim example.def
Definicijska datoteka je sestavljena iz več delov. Prvi del definicijske datoteke predstavlja izvorna slika, ki določa iz katere slike bo vsebnik ustvarjen. Primer:
Bootstrap: docker
From: ubuntu:24.04
V tem primeru se kot osnova uporabi Ubuntu 24.04 iz repozitorija Docker Hub.
V %environment delu definicijske datoteke določimo okoljske spremenljivke, ki bodo na voljo ob vsakem zagonu vsebnika. Primer:
%environment
export LC_ALL=C
V %post delu definicijske datoteke namestimo programe, knjižnice in ustvarimo imenike. Primer:
%post
apt-get -y update
apt-get -y install <package-name>
apt-get clean
V %runscript delu definicijske datoteke določimo, kaj se izvede ob uporabi ukaza apptainer run. Primer:
%runscript
echo "This is what happens when you run the container."
V razdelek %labels lahko zapišemo dodatne informacije o vsebniku. Primer:
%labels
Maintainer Y
Version 1.0
V razdelek %help lahko vključimo navodila za uporabo vsebnika. Primer:
%help
Description of help section.
Primer celotne definicijske datoteke izgleda sledeče:
bootstrap: docker
from: ubuntu:latest
%environment
export LC_ALL=C
%runscript
echo "This is what happens when you run the container.."
%post
apt-get -y update
apt-get -y install <package-name>
apt-get clean
%labels
Maintainer Y
Version 1.0
%help
Description of help section.
Vsebnik samo za branje (stisnjen squashfs) je format SIF (Singularity Image Format), ki se lahko pretvori v sliko s stikalom --writable ali stikalom sandbox na direktorije sandbox. Zapisljivo stikalo (za razliko od direktorijev sandbox) ne omogoča stalnih/trajnih sprememb.
Če želite spreminjati obstoječ SIF vsebnik, ga najprej pretvorite v sandbox obliko:
$ apptainer build --sandbox --fakeroot container/ container.sif
Po pretvorbi lahko vsebnik odprete v zapisljivem načinu:
$ apptainer build --sandbox --fakeroot container.simg container.sif
Uporaba vsebnikov HPC Vega
Na HPC Vega so na voljo različni vsebniki na /ceph/hpc/software/containers/singularity. V tem direktoriju so na voljo:
.sifslike za neposredno poganjanje programske opreme v vsebnikih;.defdefinicijske datoteke za prilagoditev na lastne potrebe.
Neposredna uporaba Apptainer slik na HPC Vega
V primeru, ko vsebnik vsebuje vso potrebno programsko opremo in je potrebno zgolj poganjanje vsebnika, to preprosto storimo z ukazom apptainer run .... Primer:
apptainer run /ceph/hpc/software/containers/singularity/images/tensorflow-23.09-tf2-py3.sif
ali
apptainer exec /ceph/hpc/software/containers/singularity/images/tensorflow-23.09-tf2-py3.sif python3 ...
Navedeno se požene znotraj okolja Slurm.
Uporaba definicijskih datotek za Apptainer
Definicijske datoteke si lahko prilagodimo za svoj primer uporabe (verzija programske opreme, dodatna orodja...). V tem primeru je potrebno datoteko .def skopirati iz /ceph/hpc/software/containers/singularity/def/ na home direktorij, jo urediti skladno s potrebami in tam pognati apptainer build, na primer:
apptainer build --fakeroot moj_tensorflow-23.09-tf2-py3.def my_container.sif
Primer Apptainer definicijske datoteke za MPI aplikacijo
Pri uporabi host MPI mora biti aplikacija v vsebniku prevedena z isto različico MPI, kot jo uporablja host.
Naslednji primer prikazuje gradnjo vsebnika z OpenMPI 4.1.6 in prevod MPI aplikacije z isto MPI različico:
Bootstrap: docker
From: ubuntu:22.04
%post
apt-get update apt-get install -y \ build-essential wget ca-certificates
# Namestitev OpenMPI 4.1.6
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.6.tar.gz
tar xf openmpi-4.1.6.tar.gz
cd openmpi-4.1.6
./configure --prefix=/opt/openmpi
make -j$(nproc)
make install
export PATH=/opt/openmpi/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi/lib:$LD_LIBRARY_PATH
# Prevod aplikacije z isto MPI različico
cd /tmp
tar xf myprogram.tar.gz
cd myprogram
./configure CC=mpicc
make
make install
%environment
export PATH=/opt/openmpi/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi/lib:$LD_LIBRARY_PATH
Po prenosu vsebnika na Vego naložimo enako različico MPI:
module load OpenMPI/4.1.6
Nato aplikacijo zaženemo s sistemom MPI:
mpirun -np 4 apptainer exec my_container.sif /usr/local/bin/myprogram
Pomembno: Različica MPI v vsebniku mora biti enaka različici MPI na Vegi (npr. OpenMPI 4.1.6). Če se različici razlikujeta, lahko pride do napak pri zagonu ali nezdružljivosti.
Uporaba GPU aplikacije v Apptainer vsebniku (CUDA)
Apptainer omogoča uporabo NVIDIA GPU naprav v vsebniku z možnostjo --nv. Pri tem se v vsebnik prenesejo potrebne NVIDIA knjižnice iz gostiteljskega sistema (Vega), medtem ko vsebnik vsebuje uporabniške CUDA knjižnice in aplikacijo.
Pomembno: Verzija CUDA v kontejnerju mora biti združljiva z NVIDIA gonilnikom, nameščenim na Vegi. Gonilnika NVIDIA ne nameščamo v kontejner.
Primer definicijske datoteke
Primer uporablja CUDA 12.4 okolje in aplikacijo, ki se prevede z uporabo nvcc in se namesti v /usr/local/bin. Definicija datoteke je podana v cuda.def:
Bootstrap: docker
From: nvidia/cuda:12.4.1-devel-ubuntu22.04
%post
apt-get update
apt-get install -y build-essential cmake git
# Preverjanje CUDA okolja v vsebniku
nvcc --version
# Prenos izvorne kode GPU aplikacije
cd /opt
git clone https://github.com/example/mycudaapp.git
# Premik v direktorij aplikacije
cd /opt/mycudaapp
# Priprava ločenega direktorija za gradnjo
mkdir build
cd build
# Konfiguracija in prevod aplikacije
cmake ..
make -j$(nproc)
# Prevedeni program kopiramo v imenik, ki je del spremenljivke PATH.
cp mycudaapp /usr/local/bin/
%environment
export PATH=/usr/local/cuda/bin:/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
%runscript
exec /usr/local/bin/mycudaapp "$@"
Primer uporablja namišljeno CUDA aplikacijo z imenom mycudaapp. Pred gradnjo vsebnika mora uporabnik prilagoditi nekaj vrstic glede na svojo aplikacijo:
- Povezavo
https://github.com/example/mycudaapp.gitzamenjajte z naslovom repozitorija svoje aplikacije. - Vrstico
cd /opt/mycudaappzamenjanjte z imenom svojega direktorija. - Primer predpostavlja, da projekt uporablja CMake. Če vaša aplikacija uporablja drugačen postopek gradnje, ustrezno prilagodite ukaze v razdelku
%post. - Vrstica
cp mycudaapp /usr/local/bin/predpostavlja, da po prevajanju nastane izvršljiva datoteka z imenommycudaapp. Če je ime programa drugačno, ga ustrezno zamenjajte. - V razdelku
%runscriptdatotekomycudaappzamenjajte z imenom svoje izvršljive datoteke.
Gradnja vsebnika: apptainer build mycudaapp.sif cuda.def
Za zagon programa z uporabo GPU vsebinika na Vegi, najprej definiramo posel za Slurm, ki uporablja particijo gpu. V sbatch skripti pred zagonom programa naložimo modul s pravilno verzijo cuda: module load CUDA/12.4