Table of Contents

Laboratorul 0 - Introducere în clusterul HPC al UPB

Scopul laboratorului

Scopul acestui laborator este de a vă familiariza cu infrastructura de calcul de înaltă performanță (HPC – High Performance Computing) a facultății.

Veți învăța cum să interacționați cu clusterul prin intermediul nodului de acces FEP (Front-End Processor), cum să analizați resursele disponibile, și cum să lansați și să monitorizați joburi pe nodurile de calcul.

De asemenea, veți explora sistemul de gestiune a joburilor și politicile de alocare a resurselor (precumul timp maxim de execuție per job, numărul maxim de joburi active și limitele de utilizare a CPU-urilor, GPU-urilor și memoriei RAM), care pot varia în funcție de categoria de utilizator — student, cadru didactic sau cercetător.

Ce este un cluster HPC?

Aplicațiile moderne din știință și inginerie — de la simulări meteorologice și modelarea curgerilor de fluide, până la antrenarea modelelor de inteligență artificială — necesită resurse de calcul care depășesc cu mult capacitatea unui sistem individual.

Exact pentru astfel de sarcini sunt utilizate clusterele HPC, sisteme capabile să combine puterea a zeci, sute sau chiar mii de noduri într-o infrastructură paralelă, distribuită și scalabilă.

Un cluster HPC este format din noduri de calcul interconectate printr-o rețea internă de mare viteză (de obicei InfiniBand sau Ethernet RDMA, de ordinul sutelor de Gbps). Fiecare nod este echipat cu procesoare multi-core (CPU) și, în multe cazuri, cu acceleratoare grafice (GPU) specializate în calcule masiv paralele.

Pe lângă GPU-uri, în infrastructurile moderne de calcul apar tot mai des și alte tipuri de acceleratoare dedicate unor sarcini specifice, precum TPU (Tensor Processing Unit) – optimizate pentru operații de inteligență artificială și rețele neuronale, DPU (Data Processing Unit) – destinate procesării datelor și managementului traficului de rețea, NPU (Neural Processing Unit) – orientate spre inferență AI pe dispozitive edge, sau QPU (Quantum Processing Unit) – utilizate în calculatorele cuantice.

Aceste acceleratoare extind capabilitățile unui cluster HPC, permițând execuția eficientă a unor tipuri variate de aplicații, de la procesare de date și antrenare AI, până la simulări cuantice și analiză științifică complexă.

Nodurile partajează un sistem de fișiere paralel (precum Lustre, BeeGFS, sau Ceph), care permite acces simultan la date de către procese multiple.

Orchestrarea joburilor și alocarea resurselor se face de către un cluster management software (precum SLURM - cel mai popular, PBS, Torque sau LSF). Acesta primește cererile utilizatorilor, planifică rularea joburilor în funcție de disponibilitatea resurselor și de politicile de acces, optimizând în permanență utilizarea clusterului. Astfel, mai mulți utilizatori pot folosi simultan infrastructura, fără a se afecta reciproc.

Clusterul HPC al Politehnicii folosește schedulerul de joburi SLURM (Simple Linux Utility for Resource Management), precum și sistemul de fișiere paralel Ceph.

Aplicațiile rulate pe un cluster HPC folosesc paradigme și biblioteci de programare distribuită și paralelă, precum:

În cadrul proiectelor, veți învăța să scrieți și să rulați aplicații care folosesc modele hibride de paralelism (cum ar fi MPI+OpenMP+CUDA), pentru a profita de disponibilitatea clusterului de a rula un model hibrid distributed+shared.

Prin combinarea acestor tehnologii, sistemele HPC oferă o platformă integrată capabilă să atingă performanțe de ordinul tera– sau peta–flopilor, fiind esențiale în cercetarea științifică modernă.

Arhitectura unui cluster HPC

Nodurile sunt organizate în partiții, fiecare partiție conținând o configurație hardware omogenă (aceeași arhitectură și același număr de CPU-uri/GPU-uri, aceeași capacitate RAM etc.).

Clusterul poate fi, astfel, heterogen, incluzând de exemplu:

Partițiile pot fi diferențiate și prin politici de acces, unele fiind dedicate anumitor categorii de utilizatori sau proiecte, ori impunând limite de timp și prioritate.

Un cluster HPC include, în general, următoarele componente:

Exemple de infrastructuri HPC în universități

Universitate / Instituție Nume HPC Specificații
Universitatea Politehnica din București (România) HPC UPB Cluster cu mai multe partiții, printre care dgxa100 (7 noduri DGX echipate cu AMD EPYC 7742«2×64 cores, 256 threads», 2 TB RAM și 8x NVIDIA A100), dgxh100 (3 noduri DGX cu Intel Xeon Platinum 8480C«2×56 cores, 224 threads», 2 TB RAM și 8x NVIDIA H100). Alte partiții includ Tesla A100, P100.
University of Cambridge (Marea Britanie) Cumulus (CPU cluster) și Wilkes3 (GPU cluster) Cumulus are 4 partitii, fiecare cu zeci de mii de CPU-uri, intre 3.5 GB si 6GB memorie per CPU, iar Wilkes3 are multiple servere, fiecare cu A100 GPUs, 1 TB memorie, Infiniband 200Gbit/s, 1200 Tflops de putere de calcul
ETH Zürich (Elveția) Euler Cluster care cuprinde peste 200k CPU cores, 1300 GPUs folosite pentru Big Data, AI & ML
Stanford University (SUA) Sherlock 1483 noduri, 26 748 CPU cores, 728 GPUs, si 2053 TFlops de putere de calcul, folosite de mii de cercetatori

Universitățile tehnice dispun adesea de clustere HPC proprii, folosite pentru activități de cercetare și educație. Universitatea Politehnica din București (UPB) deține un astfel de cluster modern, echipat cu GPU-uri performante (precum NVIDIA H100, A100, P100), utilizate pentru proiecte de educatie si cercetare.

[nume.student@fep8 ~]$ sinfo -o "%10P %55N %8c %10m %20G"
PARTITION  NODELIST                                                CPUS     MEMORY     GRES
dgxa100    dgxa100-ncit-wn[01-04]                                  256      2063510    gpu:tesla_a100:8
dgxh100    dgxh100-precis-wn[01-03]                                224      2063426    gpu:tesla_h100:8
haswell*   haswell-wn[29-41]                                       32       127309     (null)
hd         xl675dg10-wn175                                         96       773230     gpu:tesla_a100:10
ml         sprmcrogpu-wn[140-141]                                  112      128230     gpu:tesla_a100:2
sprmcrogpu sprmcrogpu-wn13                                         64       515111     gpu:rtx_2080ti:8
ucsx       ucsx-ncit-gpu-wn[100-101],ucsx-precis-gpu-wn[100-101]   64       257158     gpu:tesla_a100:3
xl         xl270-wn[161-162]                                       56       257158     gpu:tesla_p100:2

Asteriscul de lângă numele unei partiții (in cazul nostru haswell) indică faptul că aceasta este partiția implicită în clusterul orchestrat de SLURM. Prin urmare, dacă trimiteți un job fără să specificati în mod explicit o partiție prin directiva, SLURM va asigna automat jobul tău partiției haswell.

CPU Arhitectura An lansare Sockets Cores/Socket Threads/Core Total CPUs (threads) Frecvență per core RAM per nod
Intel® Xeon® Platinum 8480C (dgxh100) Sapphire Rapids (Intel 4th Gen Xeon Scalable) 2023 2 56 2 224 până la 3.8 GHz ~2 TB
AMD EPYC 7742 64-Core Processor (dgxa100) Rome (AMD Zen 2) 2019 2 64 2 256 până la 2.25 GHz ~2 TB
Intel® Xeon® Gold 6326 @ 2.90 GHz (ucsx) Ice Lake (Intel 3rd Gen Xeon Scalable) 2021 2 16 2 64 2.9 GHz ~256 GB
Intel® Xeon® E5-2680 v4 @ 2.40 GHz (xl) Broadwell (Xeon v4) 2016 2 14 2 56 2.4 GHz ~256 GB
Intel® Xeon® E5-2640 v3 @ 2.60 GHz (haswell) Haswell (Xeon v3) 2014 2 8 2 32 2.6 GHz ~128 GB
GPU Arhitectura An lansare Nuclee (cores) Memorie (VRAM) Scop
NVIDIA H100 80GB HBM3 (dgxh100) Hopper 2022 14592 CUDA cores + 456 Tensor cores (Gen 4) 80 GB HBM3 Advanced AI, LLMs, HPC
NVIDIA A100-SXM4-80GB (dgxa100) Ampere 2020 6912 CUDA cores + 432 Tensor cores (Gen 3) 80 GB HBM2e AI, HPC, simulări numerice
NVIDIA A100-PCIE-40GB (ucsx) Ampere 2020 6912 CUDA cores + 432 Tensor cores (Gen 3) 40 GB HBM2e AI, HPC, simulări numerice
NVIDIA Tesla P100-PCIE-16GB (xl) Pascal 2016 3584 CUDA cores 16 GB HBM2 HPC tradițional, aplicații științifice, AI timpuriu

Ce este FEP-ul?

FEP-ul (Front-End Processor) reprezintă nodul de acces către clusterul HPC al universității. Pe scurt, acesta este serverul prin intermediul căruia utilizatorii se conectează la infrastructură pentru a pregăti și lansa job-urile pe resursele de calcul ale clusterului (CPU-uri și/sau GPU-uri).

Conectarea la FEP se realizează prin protocolul SSH, folosind următoarea comandă:

 ssh -X -o ServerAliveInterval=100 user.name@fep.grid.pub.ro 

Explicația parametrilor:

Pentru o conectare mai simplă, puteți adăuga, local, în fișierul ~/.ssh/config, următorul bloc (după ce ați generat o pereche cheie privată/publică, de exemplu RSA):

Host fep fep.grid.pub.ro
    HostName fep.grid.pub.ro
    User <user.name>
    ForwardX11 yes
    IdentityFile ~/.ssh/id_fep
    ServerAliveInterval 100

Apoi, copiați cheia publică în fișierul ~/.ssh/authorized_keys de pe FEP, pentru a vă putea conecta de acum direct prin ssh fep. După conectare, utilizatorul se află pe serverul FEP. Atenție, acest server NU este destinat execuției joburilor!

FEP-ul are un rol limitat, oferind:

Execuția efectivă a joburilor are loc exclusiv pe nodurile de calcul, care dispun de resursele reale de procesare (CPU, GPU, RAM extins).

Va rugăm NU rulați aplicațiile direct PE FEP! Trimiteți-le ca joburi către cluster, folosind SLURM.

Configurarea mediului de lucru pe cluster

Într-un sistem HPC, numeroase aplicații, compilatoare, biblioteci sunt instalate simultan (de exemplu mai multe versiuni de GCC, CUDA, OpenMPI, etc.). Aceste pachete pot depinde de versiuni diferite de drivere sau biblioteci, iar utilizarea lor directă poate duce la conflicte.

Pentru a evita astfel de probleme și pentru a permite fiecărui utilizator să își configureze rapid propriul mediu de lucru, infrastructurile HPC folosesc sisteme specializate de gestionare a mediului software, precum Environment Modules sau Lmod.

Aceste instrumente permit încărcarea dinamică a mediului de lucru. Practic, ele modifică temporar variabile precum PATH, LD_LIBRARY_PATH, CPATH, astfel încât utilizatorul să folosească exact versiunea dorită a unui compilator sau a unei biblioteci, fără a afecta sistemul global.

Pe clusterul HPC al Politehnicii este instalat Environment Modules, disponibil implicit atât pe nodul de acces (FEP), cât și pe nodurile de calcul. Prin comenzile module, fiecare utilizator poate vedea ce software este disponibil și poate încărca mediul de lucru potrivit pentru aplicația sa.

Comenzi uzuale:

module help
module avail                      # afișează modulele disponibile
module load libraries/cuda-12.3   # încarcă biblioteca CUDA corespunzătoare
module list                       # arată modulele active în sesiunea curentă
module unload libraries/cuda-12.3 # dezactivează un modul
module purge                      # dezactivează toate modulele încărcate

Exemplu de utilizare într-un job SLURM (hello.sh):

#!/bin/bash
#SBATCH --gres=gpu:1
#SBATCH --partition=<GPU_PARTITION>
module load libraries/<CUDA_VERSION>
nvcc -o hello hello.cu
./hello

Apoi rulati sbatch hello.sh pentru a submite jobul.

Exerciții

Resurse utile