Delavnica FMF
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, preizkušali ga bomo na Arnesovi testni gruči.
Namestitev odjemalca ARC
Odjemalec ARC je na voljo za operacijski sistem MacOS in operacijski sistem Linux. Za namestitev odjemalca sledite navodilom za uporabnike.
Overjanje in digitalna potrdila
Za uporabnike delavnice smo pripravili testne elektronske certifikate (potrdila) za delo v gridu z dobo veljavnosti en teden.
Vaši certifikati za potrebe te delavnice so že v ustrezni obliki.
Sicer za preoblikovanje potrdila v obliko, primerno za orodja NorduGrid ARC, lahko uporabite priročno skripto ali certifikate pretvorite ročno:
openssl pkcs12 -in usercert.p12 -clcerts -nokeys -out usercert.pem openssl pkcs12 -in usercert.p12 -nocerts -out userkey.pem #nastavite ustrezne pravice chmod 400 userkey.pem chmod 644 usercert.pem #certifikat mora biti dosegljiv v mapi .arc (/home/<uporabnik>/.arc) mv userkey.pem ~/.arc/ mv usercert.pem ~/.arc/
Avtorizacija in virtualne organizacije
Za dostop do gruč mora uporabnik imeti avtorizacijo. Mehanizem za avtorizacijo v okolju grid je sistem virtualnih organizacij (VO). V določeni organizaciji je uporabnik lahko član, lahko pa tudi pridobi posebne pravice (roles). Za uporabo gruče zadošča članstvo v virtualni organizaciji gen.vo.sling.si
Članstvo je potrebno zahtevati prek spletne strani:
Stran za prijavo: https://voms.sling.si:8443/voms/gen.vo.sling.si
Virtualno organizacijo je treba konfigurirati v programski opremi grid. Upoštevajte spodnja navodila.
Odjemalec NorduGrid ARC
Na domacem direktoriju uporabnika sta datoteki vomses in vomsdir, ki vsebujeta podatke o virtualni organizaciji uporabnika.
Konfiguracija odjemalca je v datoteki ~/.arc/client.conf in vsebuje podatke o tem, kje se na sistemu nahaja digitalno potrdilo, nastavljen je tudi protokol, preko katerega boste posiljali naloge.
vi .arc/client.conf [common] keypath=/home/<username>/.arc/userkey.pem certificatepath=/home/<username>/.arc/usercert.pem [computing/jost] url=ldap://jost.arnes.si:2135 infointerface=org.nordugrid.ldapng jobinterface=org.nordugrid.gridftpjob
Potrebno je nastaviti virtualno organizacijo GEN.VO:
mkdir -f ~/.arc/vomses/ cat <<end > ~/.arc/vomses/gen.vo.sling.si-voms.sling.si "gen.vo.sling.si" "voms.sling.si" "15001" \ "/C=SI/O=SiGNET/O=SLING/CN=voms.sling.si" "gen.vo.sling.si" end mkdir -f ~/.arc/vomsdir cat <<end > ~/.arc/vomsdir/gen.vo.sling.si /C=SI/O=SiGNET/O=SLING/CN=voms.sling.si /C=SI/O=SiGNET/CN=SiGNET CA end
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
Možnost--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) (RuntimeEnvironment=APPS/FMF/DEFAULT)
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.
Navodila za pripravo naloge
Delovno okolje nalog in naloge MPI
Delovno okolje oziroma 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.
Če želite preverti, katera okolja za izvajanje so na voljo, uporabite ukaz:
ldapsearch -x -h jost.arnes.si -p 2135 -b \ 'Mds-Vo-name=local,o=grid'| grep nordugrid-cluster-runtimeenvironment
Za FMF smo nastavili 2 okolji:
– za uporabo MPI 1.6.4:
(runtimeenvironment = "APPS/FMF/MPI-1.6")
– za uporabo MPI 1.7.3 (priporočeno):
(runtimeenvironment = "APPS/FMF/MPI-1.7")
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).
Ko nam na gruči vzpostavijo okolje za MPI, tako lahko poskusimo preprosto nalogo tipa Helloworld
Opis naloge:
& (count = 4) (jobname = "fmfstudent1") (inputfiles = ("hellompi.sh" "") ("helloworld.c" "") ) (executable = "hellompi.sh") (stdout = "hellompi.log") (join = yes) (walltime = "15 minutes") (gmlog = log) (memory = 2000) (runtimeenvironment = "APPS/FMF/MPI-1.7")
Skripta hellompi.sh:
#!/bin/bash date hostname echo "Compiling example" mpicc -o hello helloworld.c echo "Done." echo "Running example:" mpiexec ${PWD}/hello echo "Done."
Program helloworld.c:
#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 %d\n", rank, size ); MPI_Finalize(); return 0; }
Nadaljujemo lahko s kompleksnejšo nalogo:
Primer opisa naloge:
& ( jobname = pimpi ) ( runtimeenvironment = APPS/FMF/MPI-1.7 ) ( count = 32 ) ( memory = 500 ) ( walltime = 100) ( executable = pimpi.sh) ( inputfiles = ( pimpi.cc "pimpi.cc") (pimpi.sh "") ) ( stdout = pimpi.log ) ( join = "yes")
Zagonska skripta pimpi.sh:
ls -l mpic++ -o pimpi pimpi.cc chmod a+x pimpi $MPIRUN $PWD/pimpi 1000000000 10
Program pimpi.cc:
#include <iostream> #include <cmath> #include <cstdlib> #include <mpi.h> using namespace std; int main(int argc, char** argv) { // stevilo tock long N = atoi(argv[1]); // seme za slucajna stevila long seed = atoi(argv[2]); // mpi spremenljivke // numprocs: stevilo processov // rank: identifikacija posameznega processa int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; // standardna inicializacija MPI MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); // izpis posameznega procesa printf("Process %d on %s out of %d\n", rank, processor_name, numprocs); // stevec tock znotraj kroga (neodvisen za vsak proces) int M = 0; // izvajanje v stranskih procesih if ( rank > 0 ) { // razlicno seme za vsak proces srand48(seed + rank ); // generacija N tock znotraj kvadrata for ( int i = 0 ; i < N ; i++) { double x=drand48(); double y=drand48(); // test ce je tocka znotraj kroga if (x*x+y*y<1) M++; } // stevilo tock znotraj kroga posljemo glavnemu procesu MPI_Send(&M, 1, MPI_LONG, 0 , 0, MPI_COMM_WORLD); } // glavni proces if ( rank == 0 ) { // stevec vseh tock znotraj kroga long Msum = 0; for ( int i = 1 ; i < numprocs ; i++) { // od stranskih procesov zberemeo vse stevce M in jih sestejemo MPI_Recv(&M, 1, MPI_LONG, i , 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); Msum += M; } long Nsum = (numprocs-1) * N; cout.precision(15); // izracunamo pi double pi = 4.*double(Msum)/double(Nsum) ; // izracunamo napako double error = sqrt (Nsum ) / Nsum * pi; // in izpisemo cout << "M=" << Msum << " N=" << Nsum << " pi = " << pi << " +- " << error << endl; } MPI_Finalize(); }
POZOR: V primeru napak in nedoslednosti se za morebitne popravke zahvaljujemo. Pošljite jih, prosim, na: support@sling.si