Skip to content

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:

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:

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

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

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