Programska oprema na gručah
Prilagajanje programske opreme
Osnovni mehanizmi
- nameščanje paketov na vozlišča (std, local, opt)
- environment modules / runtime environments
- namestitev na ravni uporabnika (conda, locallibs ipd.)
- prevajanje na prijavnem vozlišču ali v okviru naloge
- uporaba lastnega vsebnika (containers)
- uporaba sistemskega vsebnika
Vsebniki (containers)
Razmevanje tehnologije vsebnikov in razlikovanje med vsebniki in virtualnimi stroji je koristno.
Vsebniki v kontekstu GNU/Linux temeljijo na naslednjih tehnologijah:
- Capabilities
- Namespaces
- cgroups (Control Groups)
- Napredni datotečni sistemi (bind-mounts, SquashFS, OverlayFS ipd.)
Kaj je torej vsebnik? Skupina procesov z dovolj veliko mero izolacije, tipično: omrežje, uporabniki, procesi in diskovje. V operacijskih sistemih, kot so BSD in Solaris, je vsebnik (jail, Security Zone) enota, ki zagotavlja takšno izolacijo. Jedro in distribucije GNU/Linux pa z zgornjimi tehnologijami omogočajo fleksibilno in raznoliko nastavitev izolacije.
Temu mehanizmu lahko rečemo tudi "lahka virtualizacija" ali "OS-level virtualization".
Različne implementacije vsebnikov torej ponujajo različne rešitve za varnost, uporabnost ter učinkovitost, vendar vse implementacije (ctx, Docker, singularity ipd.) uporabljajo iste mehanizme. Podpora na operacijskem sistemu MS Windows pa s povsem drugimi mehanizmi omogoča uporabo na podoben način.
Nekaj virov:
- Delavnica "Napredna uporaba lahke virtualizacije in SLING"
- Linux Containers
- OS-level Virtualization (Wikipedia)
- chroot, cgroups and namespaces - An Overview
- Conainers, Zones, Jails and VMs ramblings
Prednosti vsebnikov (containers)
- izolacija programov v ločenih imenskih prostorih (sistem je izoliran od vsebine vsebnika, zato administratorji dovolijo uporabnikom nameščati programsko opremo v lastne vsebnike)
- omejevanje uporabe virov (linux namespaces in resource usage s cgroups)
- ne zahteva administrativnega dostopa na gruči (lahko ga potrebujete za ustvarjanje vsebnikov, ne pa za namestitev in zagon)
- zelo majhen vpliv na učinkovotost (performance overhead) glede na VM, zlasti kadar ni izolacije mrežnega sklada (neposredna uporaba strojne opreme za nizkolatenčne povezave InfiniBand ter vektorske pospeševalnike GPGPU)
- veliko možnosti prilagajanja (OS, aplikacije, orodja)
- konsistenca izvajanja poslov (kriptografsko podpisan vsebnik s programsko opremo in vsemi pripadajočimi knjižnicami ter sistemskimi komponentami zagotavlja trajno možnost ponovitve eksperimentov in izvajanja poslov tudi v spremenjenem in posodobljenem okolju)
Vsebniki Singularity
Navodila https://sylabs.io/docs/
- Sistem Singularity je nastal za uporabo v znanosti in superračunalniškem okolju:
predpostavlja okolje superračunalniške gruče - uporabnik, omrežje in podatki uporabnika so enaki in neposredno dostopni v okolju vsebnika
- soopravilnost z vsebniki Docker (in drugimi standardi in sistemi)
- knjižnice predpripravljenih vsebnikov:
- Docker hub: https://hub.docker.com/
- Singularity hub: https://singularity-hub.org/
- Nvidia cloud: https://ngc.nvidia.com}/
- Quay: https://quay.io/search\newline
Primer prenosa obstoječega vsebnika:
singularity pull imgname.sif <hub>://<image>[:<tag>]
singularity pull ubuntu.19.10.sif docker://ubuntu:eoan #19.10
singularity pull tf.20.02-tf1-py3.sif docker://nvcr.io/nvidia/tensorflow:20.02-tf1-py3
Na enak način lahko z enim ukazom zaženete vsebnik in v njem uporabite program:
$ singularity exec docker://ubuntu:eoan cat /etc/lsb-release
Docker image path: index.docker.io/library/ubuntu:eoan
Cache folder set to /home/user/.singularity/docker
[4/4] |===================================| 100.0%
Creating container runtime...
Exploding layer: sha256:a9c68053c4b2379a9ad5b7306236a13f469cfd18e727dd4e76470af366445b45.tar.gz
Exploding layer: sha256:f2b9c43fe7e5dcfee42adb18336072154126bc052cc1c578e64d27a8aeaabc97.tar.gz
Exploding layer: sha256:90491034717d4c1d1e0b37a4bde4f3a0e26630af7d360b7c0248660ccbef59d5.tar.gz
Exploding layer: sha256:781c6270286751c77c20928c68fa3edd532f0d3d11108db32020c8840f0ea6cb.tar.gz
Exploding layer: sha256:c6a9ef4b9995d615851d7786fbc2fe72f72321bee1a87d66919b881a0336525a.tar.gz
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=19.10
DISTRIB_CODENAME=eoan
DISTRIB_DESCRIPTION="Ubuntu 19.10"
Delo z vsebniki Singularity
Vir: https://singularity.lbl.gov/
Singularity: ukazi
- Ukazna lupina v vsebniku: singularity shell\
singularity shell docker://ubuntu:eoan
- Zagon ukaza v vsebniku: singularity exec\
\small{
singularity exec docker://ubuntu:latest cat /etc/lsb-release}
- Privzet ukaz v lokalnem vsebniku: singularity run
singularity run centos8.sif
- Podatki o vsebniku:: singularity inspect
singularity inspect --runscript centos.sif
- Nalaganje vsebnika: singularity pull
singularity pull docker://ubuntu:latest singularity pull ubuntu.19.10.sif docker://ubuntu:eoan singularity pull tf.20.02-tf1-py3.sif docker://nvcr.io/nvidia/tensorflow:20.02-tf1
Singularity: nov vsebnik
- uporabite obstoječ vsebnik za osnovo in ga spremenite
- zgradite novega z opisno datoteko (root required)
Koncepta je mogoče kombinirati, saj je "obstoječ" vsebnik lahko
vsebnih v repozitoriju ali vsebnik, ki ste ga že naredili. Prav tako v
opisni datoteki najprej določite, na kakšen način se zgradi osnova
vsebnika - ali z zagonsko metodo distribucijo (yum
, debootstrap
ipd, kar pomeni, da bo operacijski sistem nameščen na novo, kakor da
bi ga nameščali z zagonskega medija, ali z obstoječe slike, kar je
seveda bistveno hitreje.
Kadar je vaš cilj zagotoviti stabilnost in ponovljivost, je priporočljivo osnovo shraniti in paziti na različice ter kriptografske podpise vsebnikov.
sudo singularity build centos8.sif centos8.def
sudo singularity build centos8.sif docker://centos:8
Singularity: primer python
Preverimo različice, ki so na voljo na Docker hub: https://hub.docker.com/_/python
sudo singularity build --sandbox python_3.7.6-stretch \
docker://python:3.7.6-stretch
sudo singularity exec --writable python_3.7.6-stretch \
pip3 install numpy nose test
sudo singularity build python_3.7.6-stretch.sif \
python_3.7.6-stretch
singularity exec python_3.7.6-stretch.sif \
python3 -c"import numpy; numpy.test()"
Singularity in SLURM
Pripravimo skripto SBATCH, ki bo uporabljala aplikacijo v vsebniku Singularity: singularity_test.sh
:
#!/bin/bash
#SBATCH -J singularity\_test
#SBATCH -o singularity\_test.out
#SBATCH -e singularity\_test.err
#SBATCH -p gridlong
#SBATCH -t 0-00:30
#SBATCH -N 1
#SBATCH -c 1
#SBATCH --mem=4000
# Ukazna vrstica Singularity
singularity exec centos7.sif cat /etc/os-release
Takšno skripto v sistemu SLURM lahko kličemo na običajen način:
sbatch singularity_test.sh
Singularity in MPI
- MPI mora biti nameščen na vozlišču in v vsebniku!
- Dva načina uporabe z vsebniki Singularity:
- Bind model: knjižnice MPI z vozlišča (bind mount MPI)
- Hybrid model: knjižnice MPI v vsebniku (enaka različica kot na vozlišču!)
- V obeh primerih prenosnost in soopravilnost ni zagotovljena!
Primer:
mpirun -n <number_of_ranks> singularity exec --bind \
<path/to/host/mpi/directory>:<path/in/container> \
<path/to/my/image> </path/to/binary/within/container>
Primer opisne datoteke za vsebnik, ki v tem primeru gradi na osnovi slike z repozitorija docker:
BootStrap:docker
From:centos:8
%setup
%runscript
echo "Running the mpi container..."
%post
echo "Installing the packages inside the container"
yum -y install vim-enhanced autofs nfs-utils git perl perl-Data-Dumper automake \
autoconf libtool gcc gcc-c++ glibc flex make
echo "Installing mpirun from github"
mkdir /tmp/git
cd /tmp/git
export PATH=/usr/local/share:$PATH
git clone https://github.com/open-mpi/ompi.git
cd ompi
./autogen.pl
./configure --prefix=/usr/local
make
make install
/usr/local/bin/mpicc examples/ring_c.c -o /usr/bin/mpi_ring
cd /
rm -rf /tmp/git
exit 0
%test
/usr/local/bin/mpirun --allow-run-as-root /usr/bin/mpi_ring
Singularity in InfiniBand
Singularity ne loči omrežnega sklada, tako da je mogoče uporabljati hitre nizkolatenčne povezave. Treba pa je zagotoviti soopravilnost.
Dve možnosti:
- OFED mora biti nameščen v vsebniku in ustrezati različici OFED na sistemu
- knjižnice OFED (in OpenMPI) so lahko umeščene vsebnik (bind mount):
-B /usr -B /lib -B /etc -B /sys
- potencialne težave z glib, če se različice ne ujemajo s knjižnicami
V obeh primerih prenosnost in soopravilnost ni zagotovljena!
Singularity in GPU
Knjižnice je mogoče samodejno umestiti (bind mount) v vsebnik z opcijo --nv
.
Primer:
git clone https://github.com/tensorflow/models.git
singularity exec --nv \
docker://tensorflow/tensorflow:latest-gpu \
python models/tutorials/image/mnist/convolutional.py
Singularity and FPGA
Na nekaterih gručah (NSC) načrtujemo strojno opremo s programabilnimi procesorji FPGA.
Npr. vsebnik Vivado za Xilinx lahko pripravimo tako, da ga prenesemo z Docker hub v testni obliki (sandbox
), da preizkusimo orodja:
sudo singularity build --sandbox vivado_sandbox docker://mjerabek/vivado:latest
sudo singularity shell --writable vivado_sandbox
#install whatever you need
sudo singularity build vivado.sif vivado_sandbox
#run your job
singularity exec vivado.sif sh myprogram.sh
V tej obliki je vsebnik razpakiran v imenik (lahko dostopamo do
njegovih datotek) in ni primeren za namestitev na gruče. Če ga želimo prenesi, ga moramo najprej zapakirati v datoteko sif
:
sudo singularity build vivado_sandbox.sif vivado_sandbox
Singularity: viri
- Singularity Docs: https://www.sylabs.io/docs/
- Singularity GitHub: https://github.com/singularityware/singularity
- Singularity na Google Groups: https://groups.google.com/a/lbl.gov/forum/#!forum/singularity
- Dokumentacija za Docker: https://docs.docker.com/
Alternative za vsebnike Singularity
Vsebniki udocker
udocker omogoča zagon vsebnikov Docker brez administratorskih pravic.
Nekatere funkcije niso podprte, a spreminjanje datotek in zagon programov je omogočen.
Namestitev:
git clone https://github.com/indigo-dc/udocker
cd udocker
./udocker install
Primer z vsebnikom za OpenFoam:
udocker pull openfoam/openfoam5-paraview54
udocker run --name=openfoam openfoam/openfoam5-paraview54
Dokumentacija za udocker: https://indigo-dc.gitbook.io/udocker/
Conda
Navodila za orodje za upravljanje s paketi Conda https://docs.conda.io
Minimalna namestitev conda
: zažene se Anaconda, v kateri je le conda
(Miniconda).
Namestitev:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86\_64.sh
bash Miniconda3-latest-Linux-x86\_64.sh -b -p \\/home/USER/miniconda3}\newline
Namestitev paketa conda
iz repozitorija Anaconda:
conda list
conda install numpy
Zdaj lahko dodate željene kanale:
conda config --addchannels biobuilds
Uporabniki občasno ta postopek vnesejo v skripto posla, da zagotovijo konsistentno delovanje, npr. preko vmesne programske opreme ARC. Ta pristop deluje in je fleksibilen pri razvoju, vendar obremenjuje I/O na gručah s ponavljanjem postopka namestitve. Zato je priporočljivo stabilno rešitev s Condo zapakirati v vsebnik, ki ostane nespremnjen, je lahko stalno nameščen na gruči ali pa ga uporabnik naloži v vmesni pomnilnik, če uporablja vmesno programsko opremo ARC.
Conda: primer Tensorflow
module load CUDA/10.1.105}\\
wget \textbackslash \\
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86\_64.sh}\\
bash Miniconda3-latest-Linux-x86\_64.sh -b -p \$PWD/miniconda3}\\
conda install -c defaults python=3.6 numpy six wheel}\\
conda install -c defaults tensorflow-gpu}\\
python -c \textbackslash \\
"from tensorflow.python.client import device\_lib; print(device\_lib.list\_local\_devices())"
Podpora in vsebniki
V SLING skušamo združiti napredne uporabnike v skupino za podporo, katere člani bi:
- skupaj vzdrževali programsko opremo svojega področja za gruče na http://repo.sling.si/
- pomagali vzdrževati navodila in dobre prakse za "svojo" opremo na http://doc.sling.si/
- izmenjevali recepte za
EasyBuild
,Singularity
in dobre prakse - sodelovali s klicnimi centri Arnes in IZUM ter administratorji HPC centrov v strokovnem forumu SLING
- sodelovali v projektu EuroHPC Competence Centres v okviru slovenskega nacionalnega kompetenčnega centra