Delavnica ARC 10.06.2014 – Matematični seminar

Nekaj tehničnih napotkov za udeležence delavnice.

Na delavnici bomo uporabljali vmesno programsko opremo NorduGrid ARC, ki ga podpira večina gruč slovenskega omrežja grid, ter ga preizkušali na Arnesovi testni gruči.

Postopek uporabe je v veliki meri enak kakor pri običajni uporabi, opisani v navodilih za uporabnike. V nadaljevanju so opisane razlike.

Overjanje in digitalna potrdila

Za uporabnike delavnice smo pripravili testne elektronske certifikate (potrdila) za delo v gridu z dobo veljavnosti en teden. Gesla boste prejeli na delavnici.

Za preoblikovanje potrdila v obliko, primerno za orodja NorduGrid ARC, si lahko pomagate s priročno skripto. (Na tej delavnici je ne boste potrebovali.)

Avtorizacija in virtualne organizacije

Za potrebe delavnice so pripravljena potrdila vnaprej avtorizirana, zato se uporabnikom ni treba vključevati v virtualno organizacijo.

Uporabniški vmesnik do omrežja grid

Uporabljali bomo različico Nordugrid ARC, ki je nameščena iz imenika epel.repo, na operacijskem sistemu CentOS 6.5

Na voljo je tudi vnaprej pripravljeno okolje, do katerega dobite dostop z geslom, ki ga dobite na delavnici. Dostop do ukazne vrstice je preko vmesnika ssh, npr:

  ssh demo$x@294.ablak.arnes.si
  $x=1..30

V tem okolju je za uporabo tudi že pripravljen certifikat, v tem primeru demo07.

NorduGrid ARC client

Obstaja sicer tudi neodvisna različica odjemalca ARC, ki pa je že malenkost zastarela. Če želite preizkusiti le-to, sledite navodilom na spletnih straneh NorduGrid ARC.

Sledi korak za namestitev avtorizacijskega sitema za slovenske virtualne organizacije:

  mkdir .arc
  mkdir .arc/vomses
  echo '  "gen.vo.sling.si" "voms.sling.si" "15001" \
"/C=SI/O=SiGNET/O=SLING/CN=voms.sling.si" "gen.vo.sling.si"'\
 > .arc/vomses/gen.vo.sling.si-voms.sling.si
  mkdir -p .arc/vomsdir
  curl http://www-f9.ijs.si/~lesi/voms.sling.si.lsc \
-o .arc/vomsdir/gen.vo.sling.si

Če je uporabnik uspešno namestil osebno potrdilo v direktorij ~/.arc, je s tem sistem pripravljen za uporabo.

Nastavite še ustrezne podatke v client.conf (dodajte ga v direktorij .arc):

Dodajte tudi pot do certifikata.

  vi .arc/client.conf

[common]
keypath=/home/<username>/.arc/key.pem
certificatepath=/home/<username>/.arc/cert.pem

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

 

(Opomba: v prejšnjih različicah so se vsi ukazi programske opreme začenjale s črkami ng, v sedanjih pa se začenjajo z arc: torej namesto ngsub arcsub. Večina namestitev podpira obe poimenovanji, vendar je to dobro vedeti, saj dokumentacija in primeri lahko uporabljajo drugačno različico, kakor ste je vajeni.)

Testna naloga v okolju ARC

Pred zagonom testne naloge je treba nalogi omogočiti overjanje in avtorizacijo v imenu uporabnika. V omrežju grid naloge ne morejo uporabljati uporabnikovega elektronskega potrdila, saj bi to pomenilo, da se nešifrirano potrdilo sključem kopira po omrežju. Zato naloge uprabljajo zastopniška potrdila (proxy certificates), ki morajo vsebovati tudi avtorizacijske atribute. Takšna potrdila niso šifrirana, vendar so kratkotrajna.

Zastopniško potrdilo brez avtorizacijskega atributa virtualne organizacije, ki ga v tem primeru ne potrebujete, lahko pridobite z naslednjim ukazom:

  arcproxy

ali z določanjem točnih poti:

 arcproxy -C .arc/cert.pem -K .arc/key.pem -s .arc/vomsdir -V .arc/vomses

Opcija --help pokaže pomoč.

Izdana posredniška potrdila si uporabnik lahko ogleda z naslednjim ukazom:

  arcproxy -I

Za zagon testne naloge je treba najprej pripraviti datoteko z opisom naloge, imenovali jo bomo test.xrsl:

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

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

V tem primeru namesto zagonske skriptne datoteke uporabljamo sistemski ukaz /usr/bin/env, ki izpiše okoljske spremeljivke v sistemu.

(Seveda je lahko datoteka z opisom naloge tudi bolj kompleksna, npr. našteva podtakovne datoteke, ki naj se prenesejo na strežnik in s strežnika, zahtevajo specifično programsko okolje ali zahtevajo zagon naloge, ki bo uporabljala večje število procesorskih jeder.)

Nalogo lahko pošljemo v sistem z naslednjim ukazom:

   arcsub -c jost.arnes.si -o joblist test.xrsl

Ukaz bo izpisal ID naloge in tudi shranil ID obstoječih nalog v datoteko joblist (kar smo zahtevali z opcijo -o).

 

Status naloge lahko preverjamo (ID dobis od prejsnje komande):

  arcstat gsiftp://jost.arnes.si:2811/jobs/<vpišite-ID-tukaj>

Oziroma za preverjanje vseh nalog uporabnika:

  arcstat --all

Ko je status FINISHED, lahko uradnik skopira rezultate z delovnega direktorija, s čimer tudi odstrani rezultate s strežnika:

  arcget gsiftp://jost.arnes.si:2811/jobs/<vpišite-ID-tukaj>

Priročna sta še ukaza za spremljanje standarnega izhoda naloge ter vsebine delovne mape:

  arccat <jobid>
  arcls <jobid>

Podrobnejša navodila za delo z vmesno programsko opremo za grid NorduGrid ARC so na voljo na spletu (v angleščini): ARC Manuals, Notes and Tutorials.

Primer naloge

Za vajo se bomo lotili primera naloge, ki izračunava število pi z uporabo metode Monte Carlo. Kot je običajno pri metodah Monte Carlo, lahko pričakujemo natančnost sqrt(n) pri n iteracijah.

Za 3 mesta natančnosti torej potrebujemo 1M iteracij. Za natačnost 10^-6 potrebujemo 10^12 iteracij …

Rezultati so kumulativni: če poganjamo program z različnimi naključnimi semeni, lahko sestavljamo približke. Problem je trivialno paralelen.

Izvorna koda programa pil.cc.

Najprej potrebujemo lokalno zagonsko skripto, naloga.sh:

  #!/bin/bash

  # argumenti
  N=$1
  S=$2

  # prevajanje
  g++ -O2 pil.cc -o pil.exe

  # zagon
  time ./pil.exe $N $S

Pripravimo na zagon:

  chmod a+x naloga.sh

In že jo lahko zaženemo:

  ./naloga.sh 10 10

Zdaj moramo pripraviti datoteko z opisom naloge, npr. pil.xrls. Prvi znak mora biti &, sledijo argumenti v oklepajih, pri čemer je sintaksa takšna, da je v bistvu kar sintaksa LDAP.

  &
  (executable = "naloga.sh")
  (arguments = "1000 1")

To bi bilo v resnici že dovolj, a manjka še datoteka izvorne koda:

  &
  (executable = "naloga.sh")
  (arguments = "1000 1")
  (inputfiles =
    ("pil.cc" "")
  )

Vhodne datoteke naštejemo kot pare vrednosti, pri čemer je prva ciljno ime datoteke, druga vrednost pa URL datoteke, privzeta vrednost je lokalna datoteka z enakim imenom.

Torej lahko tudi tako:

  &
  (executable = "naloga.sh")
  (arguments = "1000 1")
  (inputfiles =
    ("pil.cc" "http://www.slings.si/arcschool/pil.cc")
  )

Povejmo sistemu nekaj karakteristik naloge:

  &
  (executable = "naloga.sh")
  (arguments = "1000 1")
  (inputfiles =
    ("pil.cc" "http://www.slings.si/arcschool/pil.cc")
  )
  (jobname = "pil")
  (count = 1)
  (memory = 2000)
  (cputime = 60)
  (join = "yes")

To pomeni, da bo izvorno kodo strežnik skopiral iz spleta, naloga se bo imenovala pil, uporabila pa bo največ 1 procesno jedro, 2000 MB pomnilnika in 60 minut procesorskega časa. Zadnji ukaz je napotek, naj v dnevniški datoteki (log file) sistem združi STDOUT in STDERR, da bo spremljanje dogajanja bolj preprosto.

Naloga je pripravljena:

  arcsub -c jost.arnes.si pil.xrls

Preverimo status:

  arcstat --all

Če je prišlo do napake, preverimo, kaj se je zgodilo z nalogo. Za to lahko uporabimo ukaz arccat, ki pokaže STDOUT naloge.

  arccat <id-naloge>

Če bomo uporabljali ves čas gručo z enakim okoljem, lahko preveden program pošljemo z nalogo:

  &
  (executable = "naloga.sh")
  (arguments = "1000 1")
  (inputfiles =
    ("pil.exe" "")
  )
  (jobname = "pil")
  (count = 1)
  (memory = 2000)
  (cputime = 60)
  (join = "yes")
  (* primer komentarja *)
  (stdout "pil.log")

Vendar moramo popraviti skripto, da ne prevede izvorne kode, temveč namesto tega spremeni programsko datoteko, da jo bo mogoče izvajati. (Lahko pa bi tudi program navedli kot executable – glej navodila XRSL Reference Manual.)

Zdaj je čas, da avtomatiziramo masivno pošiljanje nalog.

  for i in `seq 1 10` ;
    do perl -pe "s/XXX/$1/" naloga.xrsl > naloga-$1.xrsl ;
    arcsub -c jost.arnes.si naloga-$i.xrsl ;
  done

Ustrezno prilagodimo datoteko z opisom naloge:

  &
  (executable = "naloga.sh")
  (arguments = "1000 XXX")
  (inputfiles =
    ("pil.exe" "")
  )
  (jobname = "pil.XXX")
  (count = 1)
  (memory = 2000)
  (cputime = 60)
  (join = "yes")
  (* primer komentarja *)
  (stdout "pil.log")

Ko imamo več nalog, lahko za vse preverimo status:

  arcstat -a

Delovno okolje nalog

Oz. Runtime Environment. V ARC Monitorju so pri vsaki gruči lepo našteti, saj je to stvar dogovorov in organizacij med gručami in uporabniki oz. VO.

Delovno okolje lahko vzpostavi specifično okolje, da so dosegljive ustrezne knjižnice in programi (včasih tudi cel OS v okolj chroot). Na ta način lahko večje skupine uporabnikov na gručah namestijo svoje okolje, da ga ni treba pošiljati z vsako nalogo, in pri tem ni težav za nadgradnjami in različicami, ker ima vsaka naloga definirano, katero okolje in katero različico potrebuje:

  (runtimeenvironment = "APPS/ARNES/NAMD-IB-2.9")

Takšna vrstica povrzoči, da se naloga lahko zažene le na gruči, ki takšno delovno okolje dejansko podpira, ob zagonu pa se zaženejo zagonske skripte. Delovno okolje tipično vsebuje tudi ustrezne datoteke (programe in knjižnice).

Na podoben način se npr. nastavi okolje za MPI na enem vozlišču (Multi Core – Single Node):

  (runtimeenvironment = "APPS/ARNES/MPI-1.7")

Zadnja nastavitev omogoča izbor posamezne čakalne vrste. V tem primeru je nastavljena posebna vrsta, ki vključuje samo tista vozlišča, ki imajo Infiniband vmesnike.

Ko nam na gruči vzpostavijo okolje za MPI, tako lahko poskusimo preprosto nalogo z ustrezno skripto in opisom naloge.