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.

Uporabnik 1

Uporabnik 2

Uporabnik 3

Uporabnik 4

Uporabnik 5

Uporabnik 6

Uporabnik 7

Uporabnik 8

Uporabnik 9

Uporabnik 10

Uporabnik 11

Uporabnik 12

Uporabnik 13

Uporabnik 14

Uporabnik 15

Uporabnik 16

Uporabnik 17

Uporabnik 18

Uporabnik 19

Uporabnik 20

Uporabnik 21

Uporabnik 22

Uporabnik 23

Uporabnik 24

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

XRSL Reference Manual

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