SLING: Napredna uporaba lahke virtualizacije v superračunalniškem okolju

Zahteve za sodelovanje

Kratka delavnica bo vsebovala demonstracijo in možnost preizkusa vmesne programske opreme za grid in sistema vsebnikov singularity v superračunalniškem okolju. Uporabniki, ki želijo sami preizkusiti infrastrukturo, potrebujejo računalnih z mrežno povezavo, terminal in ssh. Za delavnico bo na voljo predpripravljeno okolje z elektronskimi potrdili; nameščanje programske opreme ne bo potrebno.

Postopek za pridobitev trajnega dostopa do Slovenskega nacionalnega superračunalniškega omrežja SLING:

  1. Vloga za elektronsko potrdilo SLING CA:

  2.  Pretvorba in namestitev elektronskih potrdil:

    openssl pkcs12 -in usercert.p12 -clcerts -nokeys -out usercert.pem
    openssl pkcs12 -in usercert.p12 -nocerts -out userkey.pem
    chmod 400 userkey.pem
    chmod 644 usercert.pem
    mv userkey.pem ~/.arc/
    mv usercert.pem ~/.arc/
  3.  Članstvo v virtualni organizaciji:

    • Po overjanju je treba preko članstva v virtulani organizaciji dobiti dovoljenje za uporabo.
    • gen.vo.sling.si omogoča prost dostop slovenskim upravičencem – stran za prijavo (z nameščenim osebnim potrdilom) je tu: https://voms.sling.si:8443/voms/gen.vo.sling.si
  4. Namestitev podpore za overjanje

    • Navodila za namestitev so v  ARC Client installation instructions (gl. section 5), splošna navodila: https://wiki.egi.eu/wiki/EGI_IGTF_Release
    • Navodila so na spletnih straneh SLING
    • Če uporabljate sezname preklicev, jih morate redno obnavljate: namestite paket fetch-crl in poskrbite, da se bo redno zaganjal (cron daily)
  5. Navodila za namestitev in nastavitev odjemalca ARC client installation and VOMS settings
    • Navodila: http://www.sling.si/sling/uporabniki/uporabniski-vmesniki/
    • Nastavitev za VOMS za gen.vo.sling.si:
      cd ~/.arc
      mkdir -p vomsdir/gen.vo.sling.si
      cat vomsdir/gen.vo.sling.si/voms.sling.si.lsc 
      /C=SI/O=SiGNET/O=SLING/CN=voms.sling.si
      /C=SI/O=SiGNET/CN=SiGNET CA
      
      cat vomses/gen.vo.sling.si 
      "gen.vo.sling.si" "voms.sling.si" "15001" "/C=SI/O=SiGNET/O=SLING/CN=voms.sling.si""gen.vo.sling.si"
      cd ~/.arc
      mkdir -p vomsdir/fri.vo.sling.si
      cat vomsdir/fri.vo.sling.si/voms.sling.si.lsc 
      /C=SI/O=SiGNET/O=SLING/CN=voms.sling.si
      /C=SI/O=SiGNET/CN=SiGNET CA
      
      cat vomses/fri.vo.sling.si 
      "fri.vo.sling.si" "voms.sling.si" "15003" "/C=SI/O=SiGNET/O=SLING/CN=voms.sling.si" "fri.vo.sling.si"

To je bil kratek opis namestitve programske opreme. Za uporabo prenastavljenih okolij na delavnici to ni potrebno, ker je programska oprema že nameščena.

Za uporabo sistema Singularity so na mnogih sistemih na voljo sistemski paketi, sicer pa je namestitev iz izvorne kode izjemno preprosta: http://singularity.lbl.gov/

Anatomija vsebnikov

Vsebniki (containers) ali lahka virtualizacija so utečen postopek, znane implementacije so npr BSD Jails, Solaris Security Zones. V sistemih na osnovi jedra Linux je bilo več implementacij, ki niso bile del uradnega jedra, dokler ni na osnovi razvoja vrste vmesnikov in tehnologij prišlo do zelo fleksibilne implementacije vsebnikov Linux (Linux Containers).

Vsebniki v kontekstu GNU/Linux temeljijo na naslednjih tehnologijah:

  • Capabilities
  • Name Spaces
  • Control Groups
  • Napredni datotečni sistemi (bind-mounts, squashfs, overlayfs ipd.)

Capabilites

Od Linux 2.2 capabilities predstavljajo modularna dovoljenja (kar je v Unixu klasično pomenil dostop “superuser” oz. “root/admin”).

Nekaj primerov:

  • CAP_SYS_ADMIN – Overloaded with many admin permissions, including many for namespaces
  • CAP_SYS_CHROOT – Chroot and filesystem namespaces
  • CAP_CHOWN – Make arbitrary changes to file UIDs and GIDs (see chown(2)).
  • CAP_DAC_OVERRIDE – Bypass file read, write, and execute permission checks.
  • CAP_NET_ADMIN – Perform various network-related operations

Name Spaces in Namespace Isolation

Generaliziran mehanizem za izolacijo skupin procesov ter segmentov diskovja (tudi chroot).
Konceptualno že v  Plan9, HURD.

 A namespace wraps a global system resource in an abstraction that makes it appear to
 the processes within the namespace that they have their own isolated instance of the
 global resource. Changes to the global resource are visible to other processes that
 are members of the namespace, but are invisible to other processes. One use of names‐
 paces is to implement containers.
  • Network namespace – isolates the network interface controllers (physical or virtual), iptables firewall rules, routing tables etc. Network namespaces can be connected with each other using the “veth” virtual Ethernet device.
  • “UTS” namespace – allows changing the hostname.
  • Mount namespace – allows creating a different file system layout, or making certain mount points read-only.
  • IPC namespace – isolates the System V inter-process communication between namespaces.
    User namespace – isolates the user IDs between namespaces.
  • User namespaces isolate security-related identifiers and attributes, in particular, user IDs and group IDs, the root directory, keys, and capabilities.
  • Control Group – recent, to hide control group hierarchy

Lahko jih tudi gnezdimo!

Sistemski vmesnik (iz priročnika / man pages):

The child process created by clone(2) with the CLONE_NEWUSER flag starts out with a
complete set of capabilities in the new user namespace. Likewise, a process that cre‐
ates a new user namespace using unshare(2) or joins an existing user namespace using
setns(2) gains a full set of capabilities in that namespace. On the other hand, that
process has no capabilities in the parent (in the case of clone(2)) or previous (in
the case of unshare(2) and setns(2)) user namespace, even if the new namespace is cre‐
ated or joined by the root user (i.e., a process with user ID 0 in the root names‐
pace)

Tudi ukaz (in funkcija) unshare, funkcije  clone(2) and unshare(2), tudi setns(<path>) z ustrezno nastavitvijo SAP_SYS_<capability>.

$ sudo unshare --fork --pid --mount-proc bash

Control Groups (cgroups)

Delujejo na hierarhičnih skupinah procesov in omogočajo:

  • omejitev virov (Resource limiting) – groups can be set to not exceed a configured memory limit, which also includes the file system cache
  • prioritete (Prioritization) – some groups may get a larger share of CPU utilization[10] or disk I/O throughput
  • spremljanje porabe virov (Accounting) – measures a group’s resource usage, which may be used, for example, for billing purposes
  • upravljanje (Control) – freezing groups of processes, their checkpointing and restarting

Delujejo na posamezne “kontrolerje” (sistemske sklope sistemskega jedra), glej:

 cat /proc/cgroups #available controllers
 cat /proc/<num>/cgroups #pid belongs to groups

Sistemski sklopi:

  • blkio — this subsystem sets limits on input/output access to and from block devices such as physical drives (disk, solid state, or USB).
  • cpu — this subsystem uses the scheduler to provide cgroup tasks access to the CPU.
  • cpuacct — this subsystem generates automatic reports on CPU resources used by tasks in a cgroup.
  • cpuset — this subsystem assigns individual CPUs (on a multicore system) and memory nodes to tasks in a cgroup.
  • devices — this subsystem allows or denies access to devices by tasks in a cgroup.
  • freezer — this subsystem suspends or resumes tasks in a cgroup.
  • memory — this subsystem sets limits on memory use by tasks in a cgroup and generates automatic reports on memory resources used by those tasks.
  • net_cls — this subsystem tags network packets with a class identifier (classid) that allows the Linux traffic controller (tc) to identify packets originating from a particular cgroup task – and then handle them using services sucha as veth and virtual routers.
  • net_prio — this subsystem provides a way to dynamically set the priority of network traffic per network interface. ns (obsolete) — the namespace subsystem.
  •  perf_event — this subsystem identifies cgroup membership of tasks and can be used for performance analysis

Dodatno varnostno orodje

  • seccomp-bpf — kernel feature that lets you filter which system calls your process can run

Standardna orodja so v paketih  libcgroup libcgroup-tools in na sistemih z systemd tipično niso prednameščena:

 mount -t cgroup -o controller_name none /sys/fs/cgroup/controller_name
 lssubsys -am
 cgexec -g controllers:<path_to_cgroup> <command> <arguments

Pogosto jih uporabljamo kar preko systemd init sistema, ki jih konceptualizira drugače

  • service (systemd-started processes)
  • scope (their children)
  • slice (their cgroup hierarchies)

The kink of systemd – ročna uporaba na ta način:

systemd-run --unit=<name> --scope --slice=<slice_name> <command>

Systemd servise upravlja kot  “persistentne cgroupe”.

… in preko orodij za uporavljanje z vsebniki (lxc, docker ipd.)

Orodja na osnovi teh mehanizmov so številna, najbolj znana:

  • container managers:
    LXC (LinuX Containers), LXD, virsh CoreOS, Docker, Jelastic, lmctfy (deceased), Singularity
  • app & system managers: Kubernetes, Mesos and Mesosphere
  • system tools:
    systemd, specifična orodja
  • HPC managers and schedulers:
    slurm, HTCondor, Hadoop

Kaj je torej vsebnik?

Skupina procesov z dovolj veliko mero izolacije, tipično: omrežje, uporabniki, procesi in diskovje. Vendar je sistem na osnovi zgornjih mehanizmov dovolj fleksibilen, da so različne možnosti.

LXC/LXD vs Docker

LXC je osnovno orodje za linux vsebnike, ki pa se ga zdaj manj uporablja, ker je prevladal docker. Ima vrsto opcij, po funkcijah je blizu sistemu BSD jail. Privzeto sistem naredi vsebnik s celotnim nameščenim operacijskim sistemom (kakor chroot) v poddirektoriju z lastnim mrežnim, procesnim in uporabniškim kontekstom.

V primerjavi s tem pristopom ima Docker vrsto prednosti:

  • podpora za minimalistične vsebnike (busybox, bindmounts)
  • komprimirane sistemske slike (squashfs)
  • sistem za uporavljanje s slednjimi + repozitorij
  • možnost kompozicije vsebnikov
  • integracija z systemd
  • format in kompatibilnost (celo implementacije za druge sisteme)

Posledično je sistem zanimiv za splošno uporabo lahke virtualizacije, vendar ni optimiziran za uporabo z enkratnim zagonom, s specifično strojno opremo (superračunalniki) in mrežnimi/paralelnimi datotečnimi sistemi.

Docker in HPC

  • kompliciran (nadgrajevanje, kompozicija vsebnikov, zunanji viri)
  • namenjen za servise in pogojno cele sisteme, ni namenjen za zagon posameznih ukazov
  • izoliran (težko mapirati generične dele diskovja, home directory ipd.)
  • poskuša nadzirati uporabo virov (v HPC okolju imamo za to druga orodja)

Torej: privzeti mehanizmi v nasporotju s tem, kar potrebujemo v okolju HPC.

Posledično je v okolju HPC nastalo več projektov za lahko virutalizacijo v superračunalniških omrežjih, najbolj znana sta Shifter (močno vpet v slurm) in Singularity: http://singularity.lbl.gov/

Docker vs Singularity

Nekaj skupnih lastnosti:

  • stateless container
  • repositories
  • build systems
  • compatibility

Vendar je Singularity optimiziran za izvajanje enkratnih procesov v superračunalniškem okolju, kjer sistem vrst (batch system) skrbi za omejevanje in obračunavanje virov, diskovni sistemi so pogosto omrežni, podatki pa pogosto zelo veliki.

Ponovimo:

  • uporabnik enak v sistemu in zunaj; administratorski dostop (root) ima samo administrator
  • običajno uporabljamo sistemske slike, ki jih lahko samo beremo
  • IO teče skozi vsebnik – vključno z diskovnim dostopom
  • ne vpliva na hitrost
  • nekaj omejitev: gonilniki, stabilnost overlayfs ipd – zelo učinkovit v večini primerov
  • soopravilnost z dockerjem
  • kompliciran svet: omogoča tudi aplikacije (z več plastmi) in instance (zagon kot servis)

Sistem omogoča naloge, ki imajo povsem nedvisno okolje, zato lahko tečejo v enakem okolju na razlilčnih fizičnih gručah in tudi osebnih računalnikih.

Osnovni primeri uporabe

(Te primere lahko preizkusite v testnem okolju, ki je na voljo za delavnico.)

Nov vsebnik iz repozitorija:

 singularity pull docker://ubuntu:latest

Ima kakšne oznake?

singularity inspect ubuntu-latest.simg


 {
 "status": 404,
 "detail": "This container does not have labels",
 "title": "Labels Undefined"
 }

Poženimo shell:

singularity shell ubuntu-latest.simg 
# You get your own home directory again - it is automounted
# but

 uname -a
 Linux 308.ablak.arnes.si 2.6.32-696.18.7.el6.x86_64 #1 SMP Thu Jan 4 17:31:22 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/lsb-release
 DISTRIB_ID=Ubuntu
 DISTRIB_RELEASE=16.04
 DISTRIB_CODENAME=xenial
 DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS

Vsebnik s strežnikov Docker ali Singularity hub

singularity exec --nv docker://nvidia/cuda:latest nvcc --version
Docker image path: index.docker.io/nvidia/cuda:latest
Cache folder set to /net/jost/home/gen009/.singularity/docker
[10/10] |===================================| 100.0% 
Creating container runtime...
tar: usr/local/cuda-9.0/.wh..wh..opq: implausibly old time stamp 1970-01-01 01:00:00
tar: usr/share/doc/cuda-cudart-9-0/.wh..wh..opq: implausibly old time stamp 1970-01-01 01:00:00
...
...

WARNING: Skipping user bind, non existent bind point (file) in container: '/usr/bin/nvidia-smi'
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

Ali zadnji Ubuntu:

$ singularity exec docker://ubuntu:latest echo "Hello from the container"
Docker image path: index.docker.io/library/ubuntu:latest
Cache folder set to /net/jost/home/gen009/.singularity/docker
Creating container runtime...
Hello from the container

singularity pull docker://ubuntu:latest
singularity build ubuntu.img docker://ubuntu:latest
$ singularity exec docker://fedora:latest cat /etc/redhat-release
Docker image path: index.docker.io/library/fedora:latest
Cache folder set to /net/jost/home/gen009/.singularity/docker
[1/1] |===================================| 100.0%
Creating container runtime...
WARNING: Could not chdir to home: /net/jost/home/gen009
Fedora release 26 (Twenty Six)

Vrsta vnaprej pripravljenih vsebnikov je na voljo na strežniku Singularity Hub:

  • https://singularity-hub.org/collections

Njegova največja prednost pa je, da omogoča gradnjo vsebnikov v oblaku preko povezanih repozitorijev receptov v sistemu github.

Priprava lastnih sistemskih slik za vsebnike – interaktivna

$ sudo singularity build --sandbox ubuntu/ docker://ubuntu
Docker image path: index.docker.io/library/ubuntu:latest
Cache folder set to /root/.singularity/docker
Importing: base Singularity environment
Importing: /root/.singularity/docker/sha256:9fb6c798fa41e509b58bccc5c29654c3ff4648b608f5daa67c1aab6a7d02c118.tar.gz
Importing: /root/.singularity/docker/sha256:3b61febd4aefe982e0cb9c696d415137384d1a01052b50a85aae46439e15e49a.tar.gz
Importing: /root/.singularity/docker/sha256:9d99b9777eb02b8943c0e72d7a7baec5c782f8fd976825c9d3fb48b3101aacc2.tar.gz
Importing: /root/.singularity/docker/sha256:d010c8cf75d7eb5d2504d5ffa0d19696e8d745a457dd8d28ec6dd41d3763617e.tar.gz
Importing: /root/.singularity/docker/sha256:7fac07fb303e0589b9c23e6f49d5dc1ff9d6f3c8c88cabe768b430bdb47f03a9.tar.gz
Importing: /root/.singularity/metadata/sha256:22e289880847a9a2f32c62c237d2f7e3f4eae7259bf1d5c7ec7ffa19c1a483c8.tar.gz
Building image from sandbox: ubuntu/
Singularity container built: ubuntu/

Vsebnik je nameščen v poddirektorj – kjer ga lahko editiramo.

Lahko tudi preko ukazne lupine v vsebniku nameščamo programe:

$ singularity shell --writable ubuntu
Singularity: Invoking an interactive shell within container...

Pomemben je parameter –writable

Po spremembah naredimo read-only production image (produkcijsko sistemsko sliko brez možnosti spreminja):

sudo singularity build ubuntu.simg ubuntu/

Binding in sloji

Singularity ima več opcij za bind-mounting v vsebnikih, tudi interaktivno:

singularity shell --bind /tmp ubuntu

Omogoča binding v sistemskih nastavitvah in v receptu za vsebnik (pomembno za prenos nameščenih knjižnic ipd.)

Lahko pa vsebniku dodamo tudi dodaten sloj, npr. za možnost pisanja, začasne datoteke ali za več različic:

singularity image.create my-overlay.img
sudo singularity shell --overlay my-overlay.img ubuntu.simg

V dodatnem sloju se ohranjajo spremembe, kakor bi vsebnik omogočal pisanje…

Priprava lastnih sistemskih slik za vsebnike – z receptom

To je zaželena oblika za vsebnike, ki jih v vašem imenu namestimo na gručo!

Format opisne datoteke – recepta:

BootStrap: docker
From: ubuntu:16.04

%post
    apt-get -y update
    apt-get -y install fortune 

%environment
    export LC_ALL=C
    export PATH=/usr/games:$PATH

%runscript
    echo "Hello world"
sudo singularity build helloworld.simg helloworld.dsc 
sudo singularity build --environment helloworld.simg helloworld.dsc 

Lahko uporabite le posamezen segment in posodobite vsebnik.

Ta pristop podpira tudi modularne vsebnike (z aplikacijami), SingularityHub pa je integriran sistem za gradnjo vsebnikov z GitHuba.

Po tem kratkem uvodi v tehnologijo vsebnikov si bomo ogledali še sodobno okolje superračunalniških omrežij.

Anatomija superračunalniškega omrežja

Skaliranje procesorske moči

Razvoj sodobnih procesorjev in sistemke arhitekture sta nam prinesla večjederne in večprocesorske platforme z neenakovredno arhitekturo dostopa do pomnilnika (NUMA). Vse več pridobivanja moči gre tako v smeri kompleksne paralelizacije računske moči in povečanja učinkovitosti, zato je treba za izkoriščanje kapacitet programe in nalogre prilagoditi tako, da lahko izkoristimo nove arhitekture, in sicer več fizičnih sistemov vzporedno.

Eden od pristopov je vzpostavljanje enotnih sistemov, kjer se več računalnikov, združenih v omrežje, obnaša kot en velik večprocesorski in večjederni sistem. Te rešitve za visoko-učinkovito računanje večinoma niso primerne, saj je zaradi povečanja časovnih zamikov izjemno težko izkoristiti dejanske fizične kapacitete.

Zato superračunalniški sistemi delujejo kot gruče strežnikov, kjer na vsakem posameznem strežniku teče lastne operacijski sistem, vendar so združeni z hitrim nizkolatenčnim omrežjem, enotnim mrežnim diskovnim sistemov, poenotenim sistemom uporabnikov, skupno banko nameščene programske opreme in knjižnic ter sistemom za upravljanje s kapacitetami: sodobnim sistemom vrst.

Upravljanje računskih nalog

Velikih kapacitet takšnega sistema ne bilo mogoče izkoristiti, če bi se uporabniki povezovali neposredno na posamezne računalnike. Namesto tega so gruče opremljene s sistemom vrst, ki sprejme zahtevo za zagon naloge in jo uvrsti v vrsto, potem pa, ko so proste kapacitete, na enem od strežnikov s primernimi kapacitetami zažene nalogo (program) in obvesti uporabnika, ko se naloga izteče.

Takšni sistemi s v uporabi že vse od prvih velikih računalnikov, ko so programi dejansko že tekli na luknjastih karticah, in sicer zato, ker imajo vrsto prednosti pred neposredno uporabo:

  • load balancing – sistem lahko prilagaja obremenitev posameznih komponent
  • pravična delitev virov – vrstni red se prilagaja obremenitvi s strani posameznih uporabnikov, sistemi omogočajo kvote, rezervacije ipd.
  • boljši izkoristek – z ustreznimi podatki je mogoče prilagoditi sistem tako, da kolikor mogoče učinkovito izkorišča opremo, ki je na voljoc.

Ti sistemi so se v okolju mrežnih sistemov grid in superračunalniških centrov intenzivno razvijali. Najpomembnejša problematika v zadnjem času je upravljanje s programsko opremo in velikimi količinami podakotv. Novi uporabniki tako želijo zadnjo različico knjižnic in programov, uporabniki, ki končujejo daljši projekt, pa želijo do konca uporabljati enako okolje, knjižnice in programe. Zato zagotavljamo različne različice v ločenih okoljih z uporabo raznih tehnik, kot so moduli in lahka virtualizacija (“environment modules” in light vitualization ).

Podatki

Računske naloge, ki zahtevajo veliko računsko moč, pogosto potrebujejo ali ustvarjajo velike količine podatkov. Praktični primeri so naloge, ki v 5-10 urah obdelajo 100 do 260 GB na jedro, kar za manjšo gručo pomeni 112 TB/h ali 260 Gbits/s. Upravljanje s podatki je v tem okolju torej ključnega pomena.

Gruče imajo na voljo :

  • scratch space – fizično na vozlišču, lokalno dostopno (na nekaterih superračunalnikih zelo hitro dostopna lokalizirana shramba)
  • networked job home – privzeti direktorij za nalogo, običajno na zelo hitrem, morda vzporedno dostopnem diskovnem polju, kjer je direktorij deljen z vsemi instancami iste naloge, tudi če so na različnih vozliščih
  • mid-term storage space – običajno večji podatkovni sistem, ki ni neposredno vključen v gručo in je lahko celo na drugi lokaciji, a omogoča srednjeročno hranjenje podatkov

Porazdeljeno omrežje

Vmesna programska oprema Grid omogoča boljše izkoristke strojne opreme, avtomatizira prenose podatkov, unificira dostop do različnih gruč ter samodejno upravljanje z uporabniki. Zaradi boljšega upravljanja pa zahteva podrobnejši opis zahtev naloge – datoteke z opisom.

Kako deluje vmesna programska oprema ARC?

Sistem ARC ima 3 vmesnike:

  • job submission interface – oddaja nalog
  • file access interface – prenos datotek
  • information query interface – informacijski strežnik

Glavni strežniki ARC CE:

  • Grid-manager = storitev za izvajanje nalog (upravljanje sistema vrst oz. LRMS)
  • Informacijski sistemi
  • Strežnik GridFTP  (GFS)

Vmesniki (source: nordugrid.org)

User mapping (source: nordugrid.org):


Upravljanje z nalogami prko  A-REX (vir: nordugrid.org):

Oddajanje nalog:

Uporaba odjemalca ARC

Odjemalec ARC je del vmesne programske opreme grid, s katerim uporabniki komunicirajo s sistemi, poganjajo naloge in upravljanjo s podatki. Uradna navodila: here.

Za uporabo sistema morate poznati nekaj splošno uporabnik ukazov.

Podatki o posamezni gruči so na voljo z ukaznom arcinfo:

$ arcinfo jost.arnes.si
Computing service: Arnes (production)
Information endpoint: ldap://jost.arnes.si:2135/Mds-Vo-Name=local,o=grid
Information endpoint: ldap://jost.arnes.si:2135/Mds-Vo-Name=resource,o=grid
Information endpoint: ldap://jost.arnes.si:2135/o=glue
Information endpoint: https://jost.arnes.si:443/arex
Information endpoint: https://jost.arnes.si:443/arex
Submission endpoint: https://jost.arnes.si:443/arex 
(status: ok, interface: org.ogf.bes)
Submission endpoint: https://jost.arnes.si:443/arex 
(status: ok, interface: org.ogf.glue.emies.activitycreation)
Submission endpoint: gsiftp://jost.arnes.si:2811/jobs 
(status: ok, interface: org.nordugrid.gridftpjob)

Z nalogami lahko delate preko dveh vmesnikov:  HTTPS ali GRIDFTP. Želeni vmesnik in protokol lakho izberete z nastavitvami odjemalca spodaj.

Za GRIDFTP:

[computing/jost] 
url=ldap://jost.arnes.si:2135 
infointerface=org.nordugrid.ldapng 
submissioninterface=org.nordugrid.gridftpjob

Za HTTPS:

[computing/jost]
url=https://jost.arnes.si:443/arex
infointerface=org.ogf.glue.emies.resourceinfo
submissioninterface=org.ogf.glue.emies.activitycreation
default=yes

Pripravite posredniško elektronsko potrdilo

Pred komunikacjo s sistemom je treba vzpostaviti posredniško elektronsko potrdilo (proxy certificate). Posredniško potrdilo lahko vsebuje podatke o vašem članstvu v virutalni organizaciji. Predvidoma je veljavno 12 ur, mogče ga je podaljšati.

arcproxy #pripravi vmesno potrdilo - proxy
arcproxy -S gen.vo.sling.si #create a proxy for gen.vo.sling.si
arcproxy –I #check the proxy information
arcproxy -S gen.vo.sling.si -c validityPeriod=24h -c vomsACvalidityPeriod=24h
arcrenew #obnovi potrdilo

Ukazi za upravljanje z nalogami

#oddaja naloge
arcsub
arcsub –c jost.arnes.si test.xrsl 
arcsub –c jost.arnes.si test.xrsl -d DEBUG #debug mode

#status naloge
arcstat
arcstat JOBID  #check job with ID
arcstat -a #check the status of all submitted jobs

#prevere stdout/stderr naloge
arccat 
arccat JOBID or arccat -a

#prevzemi podatke naloge po izvedbi
arcget 
arcget JOBID ali arcget –a
arcget -K #keep the results on the cluster after the transmission

#prekliči/ubij nalogo
arckill #kills/cancels all active jobs
arcclean #clean the jobs

#nadaljuj z delom nalog
arcresume #required after arcrenew

Vsi ukazi imajo navodila (man pages).

Status nalog

Osnovni ukazi za uporavljanje s podatkovnimi shrambami

Delo s podatki na oddaljenem namenskem strežniku (npr. dcache.arnes.si):

arcls #seznam vsebine mape
arccp #koprija
arcrm #zbriši
arcmkdir #naredi direktorij
arcrename #preimenuj dokument

Drugi koristni ukazi

arcinfo jost.arnes.si #podatki o gruči
arcsync #osveži seznam nalog
arctest #odpošlji testno nalogo

Reševanje težav

Če pride do napak, je korisno dobiti vpogled v dnevniške zapise, kjer so zapisani poteki različnih koponent; naslednja nastavitev v xRSL zahteva, da se vse te datoteke prenese v mapi log/:

(gmlog="log")

Primer:

cat log/failed
LRMS error: (-1) Job was cancelled

Ta izpis v primeru, da uporabnik ni zamenoma prekinil naloge, pomeni, da je sistem ob pripravi naloge naletel na napako; pogledamo v datoteko log/errors log:

cat log/errors
job submitted successfully!
local job id: 2078340
----- exiting submit_slurm_job -----

2017-10-04T12:36:46Z Job state change SUBMIT -> INLRMS   Reason: Job is passed to LRMS
------- Contents of output stream forwarded by the LRMS ---------
slurmstepd: error: Job 2078340 exceeded virtual memory limit (134084 > 4096), being killed
/bin/bash: error while loading shared libraries: libdl.so.2: failed to map segment from shared object
slurmstepd: error: Exceeded job memory limit
------------------------- End of output -------------------------
2017-10-04T12:37:41Z Job state change INLRMS -> FINISHING   Reason: Job processing error
2017-10-04T12:37:41Z Job state change FINISHING -> FINISHED   Reason: Job processing error

Razvidno je (“job submitted successfully”), da je strežnik uspešno zagnal nalogo preko sistema vrst (LRMS). V izpisu LRMS je vidno, da je naloga presegla napovedani maksimalni pomnilnik, zato jo je sistem ubil.

xRSL: opis nalog

Navodila: http://www.nordugrid.org/documents/xrsl.pdf

Primer opisa nalog:

  &
  (executable = /usr/bin/env)
  (jobname = "test")

  (stdout=test.log)
  (join=yes)
  (gmlog=log)
  (memory=1000)

Primer s prenosom datotek:

&
(executable="execution_script.sh")
(stdout="stdout.txt")
(join=yes)
(stdin="stdin.txt")
(inputFiles=
    ("stdin.txt" "http://www.external-url.com/example/stdin.txt")
    ("file1.py" "gsiftp://dcache.arnes.si/data/arnes.si/gen.vo.sling.si/file1.py")
    ("file2.py" "gsiftp://dcache.arnes.si/data/arnes.si/gen.vo.sling.si/file2.py")
)
(outputFiles=
    ("output1.txt" "gsiftp://dcache.arnes.si/data/arnes.si/gen.vo.sling.si/output1.txt")
    ("output2.txt" "gsiftp://dcache.arnes.si/data/arnes.si/gen.vo.sling.si/output2.txt")
)

Primer preproste naloge

Najprej pripravimo posredniško potrdilo:

arcproxy

Preverimo veljavnost:

arcproxy -I
Subject: /C=SI/O=SiGNET/O=SLING/OU=ARCSchoool FRI 2017/CN=Arc School Student 01/CN=1936774291
Issuer: /C=SI/O=SiGNET/O=SLING/OU=ARCSchoool FRI 2017/CN=Arc School Student 01
Identity: /C=SI/O=SiGNET/O=SLING/OU=ARCSchoool FRI 2017/CN=Arc School Student 01
Time left for proxy: 11 hours 59 minutes 51 seconds
Proxy path: /tmp/x509up_u541
Proxy type: X.509 Proxy Certificate Profile RFC compliant impersonation proxy - RFC inheritAll proxy
Proxy key length: 1024
Proxy signature: sha512

Prva naloga

Opis: hellogrid.xrsl

&
(executable=hellogrid.sh)
(wallTime="5 minutes")
(stdout="stdout.txt")
(stderr="stderr.txt")
(runtimeenvironment="APPS/DEMO/DEFAULT")

Skripta: hellogrid.sh

#!/bin/sh
echo "Hello, grid"

Odpošljemo nalogo…

arcsub -c jost.arnes.si hellogrid.xrsl

Preverimo status in prenesemo rezultate.

Programska okolja: Runtime environments

Na sistemu je vrsta vnaprej nameščenih programskih paketov, knjižnic in okolij. Seznam lahko najdete na spletni strani  Grid Monitor ali z neposrednim poizvedovanjem:

ldapsearch -x -h jost.arnes.si -p 2135 -b ' Mds-Vo-name=local,o=grid' 
| grep nordugrid-cluster-runtimeenvironment

Programe lahko pošljete tudi kot del podatkov z nalogo, vendar je priporočjivo, da ne presegajo  100MB. Prav tako je mogoče v okviru naloge zaganjati prevajalnike.

Če potrebujete kakšno programsko opremio, nas obvestite na  support@sling.si oz. se obrnite na lokalne upravitelje. Programe lahko tudi prenesete na strežnik za podatke (dcache.arnes.si) in jih zahtevate v datoteki xrsl.

Nastavitev želenega okolja:

(runtimeenvironment="APPS/BASE/GPU"

Uporaba OpenMPI in omrežja infiniBand

Omrežje InfiniBand omogoča nizkolatenčno komunikacijo v večjedrnih nalogah.

Prvi primer z OpenMPI:

Program v jeziku C: hellompi.c

/* C Example */
#include <stdio.h>
#include <mpi.h> 


int main (argc, argv)
     int argc;
     char *argv[];
{
  int rank, size;

  MPI_Init (&argc, &argv);      /* starts MPI */
  MPI_Comm_rank (MPI_COMM_WORLD, &rank);        /* get current process id */
  MPI_Comm_size (MPI_COMM_WORLD, &size);        /* get number of processes */
  printf( "Hello world from process %d of %dn", rank, size );
  MPI_Finalize();
  return 0;
}

Skripta, ki bo program prevedla in zagnala:

#!/bin/bash
date
hostname
echo "Compiling example"
mpicc -o hello hellompi.c
echo "Done."
echo "Running example:"
mpirun --mca btl openib,self -np 4 ${PWD}/hello > hellompi.out
echo "Done."
date

Opis naloge xrsl:

&
(count = 4)
(jobname = "hellompi")
(inputfiles =
  ("hellompi.sh" "")
  ("hellompi.c" "")
)
(outputfiles = 
  ("hellompi.out" "")
)
(executable = "hellompi.sh")
(stdout = "hellompi.log")
(join = yes)
(walltime = "15 minutes")
(gmlog = log)
(memory = 2000)
(runtimeenvironment = "APPS/DEMO/OPENMPI-2.0.2")

Za zagon več jeder na istem računalniku zahtevate  count=4  in  countpernode=4. Pri večjih nalogah (več kot 30 jeder) je priporočljivo, da omejite število vozlišč, sicer se lahko naloge preveč razpršijo in učinkovitost pade.

Naloge z vektorskimi/grafilčnimi procesorji GPGPU s pomočjo CUDA

Z nalogo bomo izmerili pasovno širino pomnilika do kartice:

Najprej program cudatest.cu:

#include <stdio.h>  

int main() {
  int nDevices;

  cudaGetDeviceCount(&nDevices);
  for (int i = 0; i < nDevices; i++) {
    cudaDeviceProp prop;
    cudaGetDeviceProperties(&prop, i);
    printf("Device ID: %dn", i);
    printf("  GPU, device name: %sn", prop.name);
    printf("  Memory Clock Rate (KHz): %dn",
           prop.memoryClockRate);
    printf("  Memory Bus Width (bits): %dn",
           prop.memoryBusWidth);
    printf("  Peak Memory Bandwidth (GB/s): %fnn",
           2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6);
  }
}

Skripta cudatest.sh:

#!/bin/bash
env| grep -i cuda > cudaenv.out
nvcc cudatest.cu -o cudatest
./cudatest > cudatest.out

Opis naloge:

&
(executable="cudatest.sh")
(inputfiles=
  ("cudatest.sh" "")
  ("cudatest.cu" "")
)
(outputfiles=
  ("cudatest.out"  " ")
  ("cudaenv.out"  " ")
)
(stdout="error.txt")
(join=yes)
(gmlog="log")
(jobName="cudatest")
(walltime="10")
(count="1")
(memory="500")
(runtimeenvironment="APPS/DEMO/GPU")

Lahka vitualizacija na gruči

Včasih so vnaprej pripravljena okolja (runTimeEnvironemnents) na gručah implementirana kot vsebniki Singularity – bodisi zaradi lažje namestitve, zaradi lažjih nadgradenj ali zato, ker lahko na ta način več gruč uporablja enake sistemske slike. Če želite, nam lahko pošljete recept, da vam ga namestimo. To je za vse vpletene najlažji način nameščanja programske opreme v superračunalniško okolje.

Za uporabo vnaprej pripravljenega okolja, nameščenega na gručo, lahko (s podatkom o lokaciji) v skripti zaženete neposredno aplikacijo v vsebniku:

$ singularity exec /grid/arc/sw/singularity/cuda-latest.img cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.3 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.3 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

Uporaba sistemske slike z zunanjega vira

Je zelo preprosta, saj lahko uporabite enak pristop kot pri neposrednem zaganjanju na svojem računalniku. Pripravimo skripto in opis naloge:

sing-test.sh:

singularity exec /grid/arc/sw/singularity/cuda-latest.img cat /etc/os-release

job.xrsl:

&
(executable="sing-test.sh")
(stdout="stdout.txt")
(join=yes)

Pri tem načinu seveda izvajamo prenose na sistemskih slik na gručo. Ob množični uporabi je smiselno, da upravitelji gruče vzpostavijo spletni posrednik z vmesnim pomnilnikom (caching proxy) ali lastni hub.

Uporaba lastne sistemske slike

Sistemske slike lahko shranite na zunanji strežik (npr. https, ftp) ali strežnik za podatke, npr. dCache. Potem sliko navedete kot vhodno datoteko (InputFiles v xrsl) ter jo uporabite v skripti.

Primer z vsebnikom helloworld.simg – ki smo ga zgoraj pripravili z receptom:

singularity-hello-world.sh:

singularity exec helloworld.simg cat /etc/lsb-release

job.xrsl:

&
(executable="singularity-hello-world.sh")
(stdout="stdout.txt")
(join=yes)
(inputfiles
  ("helloworld.simg" "")
)

Ko boste nalogo odposlali z arcsub, bo odjemalec prenesel tudi vsebnik, sistem pa ga bo odložil v delovno mapo naloge. Tako bo datoteka na voljo za uporabo v skripti.

Uporaba vsebnikov in MPI

Singularity je nastal z mislijo na oprimizacijo za superračunalniško okolj, za je MPI neposredno integriran in deluje brez posebne intervencije uporabnika: če pokličete singularity exec preko mpirun (oz. ko ga pokliče sistem), singularity transparetno vzpostavi povezavo med procesom ORTED in aplikacijo oz. MPI knjižnico preko PMI (Process Management Interface) in aplikacija deluje normalno.

Za ilustracijo kompleten primer vsebnika za QuantumExpress (courtesy by Barbara Krašovec, kot vsi kompletni primeri); v tem primeru recept temelji na Centos 7 z Docker Hub in vsebuje prevajanje in namestitev OpenMPI in QuantumExpresso:

Bootstrap: docker
From: centos:latest

%setup

%runscript
 echo "Running the container..."

%post
 echo "Installing the packages inside the container"
 yum -y update

echo "Adding repos"
 yum -y install epel-release

echo "Installing prerequisites"
 yum -y install awk sed wget make gcc-gfortran gcc libgfortran openblas-devel openblas lapack lapack-devel fftw fftw-devel perl-devel gcc-c++

echo "Set locale"
 export LC_ALL=C

echo "Builing OpenMPI"
 cd /opt
 wget https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.2.tar.gz
 tar xvzf openmpi-2.1.2.tar.gz
 cd openmpi-2.1.2
 mkdir build || echo "folder build exists"
 ./configure --prefix=/opt/openmpi-2.1.2/build
 make all
 make all install
 cd ..
 rm -rf /opt/openmpi-2.1.2.tar.gz

echo "Add OpenMPI to PATH"
 export LD_LIBRARY_PATH=/opt/openmpi-2.1.2/build/lib:$LD_LIBRARY_PATH
 echo 'LD_LIBRARY_PATH=/opt/openmpi-2.1.2/build/lib:$LD_LIBRARY_PATH' >>$SINGULARITY_ENVIRONMENT
 export PATH=/opt/openmpi-2.1.2/build/bin:$PATH
 echo 'PATH=/opt/openmpi-2.1.2/build/bin:$PATH' >>$SINGULARITY_ENVIRONMENT

echo "Building Quantum Espresso"
 cd /opt
 wget http://www.qe-forge.org/gf/download/frsrelease/247/1132/qe-6.2.1.tar.gz
 tar xvzf qe-6.2.1.tar.gz
 cd qe-6.2.1
 mkdir build || echo "folder build exists"
 ./configure --prefix=/opt/qe-6.2.1/build
 make all
 make install
 rm -rf /opt/qe-6.2.1.tar.gz

echo "Adding QE to PATH"
 export LD_LIBRARY_PATH=/opt/qe-6.2.1/build/lib:$LD_LIBRARY_PATH
 echo 'LD_LIBRARY_PATH=/opt/qe-6.2.1/build/lib:$LD_LIBRARY_PATH' >>$SINGULARITY_ENVIRONMENT
 export PATH=/opt/qe-6.2.1/build/bin:$PATH
 echo 'PATH=/opt/qe-6.2.1/build/bin:$PATH' >>$SINGULARITY_ENVIRONMENT
 export RTEHOME=/opt/qe-6.2.1/build
 export MPIHOME=/opt/openmpi-2.1.2/build
 echo 'RTEHOME=/opt/qe-6.2.1/build' >>$SINGULARITY_ENVIRONMENT
 echo 'MPIHOME=/opt/openmpi-2.1.2/build' >>$SINGULARITY_ENVIRONMENT

echo "Post done."

Pripravljen je generičen vsebnik s QuantumExpresso s podporo za MPI!

Vsebniki in GPGPU / CUDA

Podpora za prevezave in bind-mounting za Singularity pomeni, da je mogoče različne sistemske knjižnice in vmesnike do strojne opreme “izvoziti” v vsebnik in tako omogočiti neposreden dostop do njih. Od različice 2.3 pa ima Singularity neposredno podporo za uvoz gonilnikov in vmesnikov za grafične koprocesorje (GPGPU) ter knjižnice CUDA, ki jih lahko pokličem s stikalom –nv

singularity exec --nv ubuntu.simg <command>
Sistem samodejno uvozi naslednje knjižnice:
Found NV library: /lib64/libnvidia-tls.so.387.34
Found NV library: /lib64/libnvidia-tls.so.370.28
Found NV library: /lib64/libnvidia-ptxjitcompiler.so.370.28
Found NV library: /lib64/libnvidia-ptxjitcompiler.so.1
Found NV library: /lib64/libnvidia-opencl.so.1
Found NV library: /lib64/libnvidia-ml.so.1
Found NV library: /lib64/libnvidia-ml.so
Found NV library: /lib64/libnvidia-glsi.so.387.34
Found NV library: /lib64/libnvidia-glsi.so.370.28
Found NV library: /lib64/libnvidia-glcore.so.387.34
Found NV library: /lib64/libnvidia-glcore.so.370.28
Found NV library: /lib64/libnvidia-fatbinaryloader.so.387.34
Found NV library: /lib64/libnvidia-fatbinaryloader.so.370.28
Found NV library: /lib64/libnvidia-encode.so.1
Found NV library: /lib64/libnvidia-eglcore.so.387.34
Found NV library: /lib64/libnvidia-eglcore.so.370.28
Found NV library: /lib64/libnvidia-egl-wayland.so.370.28
Found NV library: /lib64/libnvidia-egl-wayland.so.1
Found NV library: /lib64/libnvidia-compiler.so.387.34
Found NV library: /lib64/libnvidia-compiler.so.370.28
Found NV library: /lib64/libnvidia-cfg.so.1
Found NV library: /lib64/libnvcuvid.so.1
Found NV library: /lib64/libcuda.so.1
Found NV library: /lib64/libcuda.so
Found NV library: /lib64/libOpenGL.so.0
Found NV library: /lib64/libOpenCL.so.1
Found NV library: /lib64/libGLdispatch.so.0
Found NV library: /lib64/libGLX_nvidia.so.0
Found NV library: /lib64/libGLX.so.0
Found NV library: /lib64/libGLESv2_nvidia.so.2
Found NV library: /lib64/libGLESv2.so.2
Found NV library: /lib64/libGLESv1_CM_nvidia.so.1
Found NV library: /lib64/libGLESv1_CM.so.1
Found NV library: /lib64/libGL.so.1
Found NV library: /lib64/libEGL_nvidia.so.0
Found NV library: /lib64/libEGL.so.1

Knjižnice CUDA (CUDA toolkit) se na ta način ne namestijo v celoti, zato jih je treba namestiti v vsebniku. Ker je mogoče hkrati namestiti več različic CUDA, ni težko pripraviti splošno uporabnega (generičnega) vsebnika za GPU.

Okolje CUDA se v tem primeru izbere z izvozov spremenljivke LD_LIBRARY_PATH.

Primer za recept za vsebnik:

wget https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda_8.0.61_375.26_linux-run 
chmod +x cuda_8.0.61_375.26_linux-run
./cuda_8.0.61_375.26_linux-run --toolkit --toolkitpath=/usr/local/cuda-8.0 --override --silent
rm -rf cuda_8.0.61_375.26_linux-run
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/include:$LD_LIBRARY_PATH
echo 'LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/include:$LD_LIBRARY_PATH' >>$SINGULARITY_ENVIRONMENT

Lahko pa spremenjivke nastavite v sekciji  %environment recepta za vsebnik:

 %environment export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/include:$LD_LIBRARY_PATH If you want to avoid this entirely in the image, you can simply run the container by: SINGULARITYENV_LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:/usr/local/cuda-8.0/include:$LD_LIBRARY_PATH singularity exec --nv ubuntu.img <command>

Če so na voljo ustrezne predpripravljene sistemske slike, jih seveda lahko uporabite tako, da uporabite Docker ali Singularity hub, lahko tudi neposredno:

singularity exec --nv docker://tensorflow/tensorflow:latest-gpu python /tmp/tensorflow-mnist.py

Lahko pa tudi uporabite metodo “–sandbox”, da iz njih pripravite nove, prilagojene sistemske slike za vsebnike.

Če želite uporabljati  OpenCL, bo sistem iskal gonilnike za OpenCL drivers v obliki datoteke .icd (.icd = installable client drivers). Na RHEL jih najdete v direktoriju  /etc/OpenCL/vendors – in tega je treba uvoziti (–bind) v vsebnik.

Dejanski primer recepta:

Bootstrap: docker
From: centos:latest

%setup 

%runscript
    echo "Running the container..."


%post
    echo "Installing the packages inside the container"
        yum -y update

    echo "Adding repos"
        yum -y install epel-release
        
    echo "Installing prerequisites"
        yum -y install awk sed wget make gcc gcc-c++ python34 python34-pip python34-devel libffi-devel perl perl-devel binutils-devel glib2-devel

    echo "Set locale"
        export LC_ALL=C

    mkdir /usr/include/cuda || echo "cuda folder exists"
    touch /bin/nvidia-smi || echo "file exists"

    echo "Installing CUDA Toolkit"
    wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run
    chmod +x cuda_9.0.176_384.81_linux-run
    ./cuda_9.0.176_384.81_linux-run --toolkit --toolkitpath=/usr/local/cuda-9.0 --override --silent
    export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH
    echo 'LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH' >>$SINGULARITY_ENVIRONMENT
    rm -rf cuda_9.0.176_384.81_linux-run 

    echo "Install python packages"
        pip3 install --upgrade pip
        pip3 install --upgrade numpy
        pip3 install --upgrade scipy
        pip3 install --upgrade matplotlib
        pip3 install --upgrade mako
        pip3 install --upgrade cffi
    echo "Installing pyopencl"
        pip3 install --upgrade --global-option=build_ext  --global-option="-I/usr/local/cuda-9.0/lib64:/usr/local/cuda-9.0/include" --global-option="-L/usr/local/cuda-9.0/lib64:/usr/local/cuda-9.0/include" pyopencl

(Pripravil Jan Jona Javoršek, večino izvirnega gradiva in primerov ter vse napredne recepte pripravila Barbara Krašovec, strokovna podpora Dejan Lesjak in Peter Kacin)