PBS Professional Open Source

    PBS Professional Open Source este aplicația de gestiune a resurselor de calcul paralel și a joburilor folosită în cadrul sistemului HPC Cluster2. Rolul principal al PBSPRO este de a prelua joburile utilizatorilor, de a verifica existența resurselor de calcul solicitate, de a trimite spre lansare către nodurile de calcul a joburilor utilizatorilor și a gestiona aceste joburi, asigurând interacțiunea utilizatorilor cu joburile proprii care se află în curs de executare sau sunt programate pentru executare. Toate joburile sunt trimise într-o coadă pentru execuție iar un alt rol al sistemului de gestiune a joburilor este de a asigura gestiunea și funcționarea acestor cozi. Informații suplimentare privind gestiunea joburilor se pot obține din manualul utilizatorului pentru PBS Professional.

        Utilizarea managerului de joburi - ”Job Scheduler”

    Pentru a rula o aplicație un utilizator trebuie să lanseze un job către managerul de joburi, de obicei plecând de pe unul din sistemele de conectare (Login Node). Un job conține atât detaliile despre aplicațiile care trebuie executate (procesare efectivă, fișierul executabil al aplicației, fișiere/date de intrare și/sau ieșire, parametri de configurare a execuției, etc.) cât și directive necesare pentru ca managerul de joburi să realizeze alocarea resurselor necesare rulării aplicațiilor (număr de procesoare, număr de servere, memorie ocupată, coada de executare, etc.).

    Joburile sunt executate ca joburi ”batch” (liste de comenzi) și nu în mod interactiv. În mod uzual un utilizator se conectează pe unul din sistemele dedicate conectării de unde lansează un job în execuție și apoi, de cele mai multe ori, se deconectează. Există totuși și posibilitatea de rula joburi în mod interactiv.

    Joburile sunt gestionate de către managerul de joburi, o aplicație care are rolul de a:

  • aloca resursele necesare solicitate de către job
  • rularea efectivă a jobului
  • raportarea către utilizator a rezultatului rulării jobului
  • eliberarea resurselor după terminarea jobului

Pentru a rula un job trebuie parcurși următorii pași:

  • pregătirea unui script pentru lansarea jobului
  • trimiterea jobului pentru execuție
  • monitorizarea executării jobului

        Realizarea unui script pentru un job

    Pentru a rula trebuie realizat scriptul care va executa aplicația dorită. Scriptul este o secvență de comenzi pentru Linux - nu trebuie omis faptul că gestionarul joburilor rulează sub Linux. "bash" este interpretorul de comenzi implicit în cadrul sistemelor Linux instalate și astfel, precum majoritatea scripturilor bash, fișierul trebuie să înceapă cu #!/bin/bash. În continuarea scriptului vor exista mai multe linii care încep cu # care pentru bash sunt comentarii. Pentru sistemul Torque însă, liniile care încep cu #PBS reprezintă directive care solicită alocarea unor resurse. Fișierul script se va termina prin includerea comenzilor efective care trebuie executate, cele care realizează efectiv procesarea paralelă, de obicei prin execuția aplicației dorite (bazată pe MPI) prin intermediul utilitarului MPI mpirun. Un exemplu pentru un astfel de script:

#!/bin/bash
# stabilirea numarului de procesoare dorite
# si anume 32 de procesoare 
#PBS -l select=32
# setarea timpului maxim de executie a jobului la 1h si 30 de minute 
#PBS -l walltime=1:30:00
# denumirea literala a jobului pentru o identificare ulterioara
#PBS -N TestJob 
# trimiterea unui email de informare la pornire (begin), la sfarsit (end) si in cazul opririi executiei (abortion)
#PBS -m bea
# adresa de email la care se vor trimite mesajele
#PBS -M Această adresă de email este protejată contra spambots. Trebuie să activați JavaScript pentru a o vedea. 
# schimbarea directorului de unde a fost lansat jobul
cd $PBS_O_WORKDIR
# lansarea efectiva a jobului MPI 
mpirun $PBS_NODEFILE aplicatie_mpi

Mai multe exemple de scripturi pentru rularea joburilor se regăsesc în secțiunea ”Rulare joburi”.

Pentru a edita un script se poate folosi orice editor de texte sub Linux. Având în vedere că folderul de lucru este același sub Windows cât și sub Linux, fișierele script pot fi editate și sub Windows folosind editoarele instalate (PSPad, Notepad++).

        Directivele PBS

    Directivele PBS reprezintă cerințe speciale ale jobului referitor la alocarea resurselor necesare rulării și parametri generali pentru configurarea jobului.

    Cele mai importante directive PBS sunt cele care solicită un număr de procesoare (nuclee) pentru execuția aplicațiilor, spațiu de memorie RAM disponibilă, timp de execuție și numele cozii pentru executarea . 

Directivă     Descriere
#PBS -l select=64 Numărul de procesoare solicitate de job. (ex. 64 de procesoare, distribuirea procesoarelor se va face în funcție de disponibilități)
#PBS -l select=3:ncpus=24:mpiprocs=24 Numărul de noduri solicitate, fiecare nod cu „ncpus” procesoare și cu „mpiprocs” procese paralele (în exemplu se solicită 3 noduri cu câte 24 de procesoare și 24 de procese paralele, în total vor fi folosite 72 de procesoare pentru 72 de procese repartizate la nivelul a 3 noduri de calcul).
#PBS -l walltime=01:00:00 Durata maximă a jobului (ex. 1h). După ce această limită a fost atinsă, jobul va fi oprit și resursele vor fi eliberate, chiar dacă aplicația a terminat de procesat sau nu. Nu se realizează nici un fel de salvare a datelor prelucrate, această sarcină revenind aplicației.
De obicei această limită trebuie setată în mod rezonabil pentru a permite aplicației să își termine execuția în mod normal.
#PBS -q nume_coada Realizează asignarea cozii în care trebuie să fie executat jobul (ex. coada=nume_coada). Se vor impune jobului restricțiile specifice cozii în cadrul căreia are loc execuția.
#PBS -N numeJob Asignează un nume jobului pentru identificarea ulterioară a jobului. În cazul în care lipsește numele scriptului va fi luat în considerare pentru numele jobului.

 

    Alte directive utile care pot fi folosite în cadrul scriptului pentru un job sunt descrise în tabelul următor.

Directivă     Descriere
#PBS -o dir1/dir2/iesire.out Calea către fișier și numele fișierului pentru fluxul de ieșire al aplicației (ceea ce se afișează în consolă). Calea poate fi absolută sau relativă la directorul în care se execută jobul.
#PBS -e dir1/dir2/erori.err Calea către fișier și numele fișierului pentru fluxul de erori al aplicației (erorile care sunt generate de aplicație). Calea poate fi absolută sau relativă la directorul în care se execută jobul.
#PBS -j oe Opțiune care permite îmbinarea fluxului de ieșire cu cel de erori într-un singur flux pentru a fi stocat într-un singur fișier.
#PBS -m b Se va trimite un e-mail la pornirea jobului.
#PBS -m e Se va trimite un e-mail la terminarea (normală) a jobului.
#PBS -m a Se va trimite un e-mail atunci când jobul este oprit (în mod forțat) în urma unei erori.
#PBS -m bae Este posibilă specificarea mai multor parametri într-o singură linie. Dacă sunt prezente mai multe linii de același fel într-un script doar ultima va fi luată în considerare.
#PBS -V Se va realiza exportarea variabilelor de mediu din momentul lansării jobului către mediul în care va rula aplicația din cadrul jobului.

 

        Variabilele de mediu PBS

    După lansarea scriptului pentru execuția jobului sistemul PBS setează mai multe variabile de mediu care pot fi folosite în cadrul scriptului pentru a avea acces la parametrii jobului. Aceste variabile de mediu pot ti utile pentru a configura mediul în care va rula aplicația și cele mai importante sunt descrise în tabelul următor.

Variabilă Descriere
PBS_ENVIRONMENT Setată cu valoarea PBS_BATCH pentru joburi care rulează în background și cu valoarea PBS_INTERACTIVE pentru joburi interactive.
PBS_O_QUEUE Numele cozii în cadrul căreia a fost lansat jobul.
PBS_JOBID Identificatorul numeric al jobului.
PBS_JOBNAME Numele jobului.
PBS_NODEFILE Un fișier care conține numele nodurilor care au fost alocate pentru job, câte o linie pentru fiecare procesor.
PBS_O_WORKDIR Directorul unde rulează în mod implicit jobul.
PBS_WALLTIME Timpul total de lucru alocat jobului, în secunde.

 

        Lansarea jobului

    Dacă fișierul pentru job este pregătit acesta poate fi lansat în execuție. Lansarea se face apelând comanda qsub urmată de numele fișierului. De exemplu pentru a lansa jobul cu instrucțiunile din scriptul testJob.sh se folosește următoarea linie de comandă:

[username@master jobs]$ qsub testJob.sh
133.master
[username@master jobs]$

    Sistemul de management al joburilor va afișa numărul jobului (în exemplu 133) și va reveni la prompterul din linia de comandă. În acest moment jobul este deja plasat în coada și dacă resursele necesare jobului sunt disponibile acesta va fi deja în curs de executare.

    După ce jobul a fost lansat vor apărea (după un scurt interval) în directorul de bază al utilizatorului sau în directorul de unde a fost lansat jobul (în funcție de parametrii #PBS din script) fișiere cu numele „numeJob.oIDjob” și „numeJob.eIDjob”, pentru exemplul dat vor fi testJob.o133 și testJob.e133. Primul fișier (.o) va conține outputul fișierului script pentru job, exact ceea ce ar fi fost afișat pe ecran în cazul în care jobul ar fi fost rulat în mod interactiv. Al doilea fișier (.e) va conține erorile care au fost generate de executarea aplicației, dacă este cazul.

    Pentru mai multe informații despre rularea unui job folosind comanda qsub apelați la pagina de manual a utilitarului în Linux: man qsub.

        Monitorizarea executării

    Pe întreaga durată a existenței unui job într-o coadă de execuție starea sa poate fi monitorizată folosind comanda qstat. Executată direct fără parametri comanda afișează o listă cu joburile care se află în cozile sistemului de management al joburilor și stările în care se află aceste joburi.

  Job ID                   Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
129.master                fluent           hpcuser1        784:15:1 R express
135.master                testJob          hpcuser3        01:20:44 R short
136.master                testJob2         hpcuser4               0 F short
137.master                gromacsTest      hpcuser2               0 Q long

    Prima coloană indică idul jobului, a doua numele jobului, a treia utilizatorul care a lansat jobul. A patra coloană arată timpul scurs de la lansarea jobului iar a cincea coloană arată starea jobului (R = running - în execuție, Q=queued, waiting - în așteptare, E=exiting - în curs de terminare, F=finished - job terminat sau oprit forțat, S=suspended - job suspendat pentru execuția altor joburi prioritare).

    Mai multe informații pot fi obținute despre utilitarul qstat prin consultarea paginii de manual sub Linux: man qstat.

        Oprirea și ștergerea unui job

    Un job care se alfă într-o coadă poate oprit de către utilizatorul care a lansat jobul folosind comanda qdel. Un job poate fi oprit indiferent de starea în care se află, poate fi oprit dacă este în curs de execuție (R-running) sau în așteptarea resurselor necesare rulării (Q-queued, waiting). Între momentul în care a fost trimisă comanda de ștergere și momentul în care jobul este scos din coadă poate să existe un scurt interval de timp. Dacă un job nu poate fi șters dintr-o coadă de execuție trebuie contactată echipa de asistență tehnică la adresa de e-mail support.hpc [at] ugal.ro.

        Joburi în mod interactiv

    Un job poate fi lansat și în mod interactiv, și anume se poate obține un shell Linux (CLI) care permite lansarea directă a programului MPI dorit. Acest mod de utilizare se poate dovedi util atunci când se dorește testarea funcționării unui proces de calcul paralel. Toate directivele menționate mai sus rămân valabile și pentru cazul unui job interactiv, acestea transformâmndu-se în parametri care trebuie comunicația în linia de comandă. Suplimentar mai sunt disponibile următoarele directive pentru PBS:

Directivă     Descriere
-I Lansare job în mod interactiv
-X Redirecționarea mediului X (al sistemului X Windows din Linux) din nodul de calcul către serverul X care este folosit, pentru a rula aplicații care necesită interfața grafică.

    Un exemplu de job interactiv este următorul:

[username@master jobs]$ qsub -I -l select=16 -N nume_job -l walltime=1:00:00
qsub: waiting for job 465.master to start
qsub: job 465.master ready

[username@node-01 ~]$

    Un job în regim interactiv se termină la parăsirea liniei de comandă (cu exit) sau atunci când fereastra este închisă. Spre deosebire de joburile care sunt lansate către managerul de joburi, joburile interactive nu își continuă execuția după abandonarea liniei de comandă, astfel sesiunea de lucru către server trebuie să fie permanent deschisă. Acest mod de utilizare a sistemului de calcul nu este recomandat pentru joburi mai lungi și este recomandat a fi folosit pentru testarea programelor de calcul paralel.

Ultima actualizare: 9 noiembrie 2019

Ultimele actualizări

Informații generale