Publicat la data de 8 august 2025, acest ghid detaliază arhitectura și implementarea diverselor strategii de paralelism, esențiale pentru cercetătorii și inginerii care lucrează cu modele la scară largă.
Înțelegerea strategiilor de paralelism
Pentru a naviga prin complexitatea antrenării distribuite, este crucial să înțelegem mai întâi strategiile fundamentale.
#### Data Parallelism (Paralelismul Datelor)
Data Parallelism (DP) este cea mai comună și intuitivă tehnică. Aceasta presupune replicarea întregului model — incluzând parametrii, gradienții și stările optimizatorului — pe fiecare dispozitiv GPU. În același timp, setul de date este împărțit în sub-batch-uri, fiecare GPU procesând o porțiune distinctă a datelor.
Deși această abordare crește semnificativ throughput-ul comparativ cu antrenarea pe un singur dispozitiv, ea are o limitare majoră: modelul trebuie să încapă în totalitate pe un singur GPU. În cadrul configurației `ParallelismConfig`, parametrul `dp_replicate_size` controlează numărul de replici ale modelului. Este important de menționat că DP este o strategie de nivel superior; dacă o combinăm cu alte tehnici, fiecare replică va fi la rândul ei supusă altor forme de paralelism.
#### Fully Sharded Data Parallelism (FSDP)
Ce se întâmplă însă când modelul este prea mare pentru a încăpea pe un singur GPU? Aici intervine Fully Sharded Data Parallelism (FSDP), o tehnică inspirată de ZeRO-3 din DeepSpeed. FSDP fragmentează (shard) parametrii modelului, gradienții și stările optimizatorului între GPU-uri. Astfel, fiecare dispozitiv deține doar o porțiune a modelului, nu o copie completă.
Mecanismul funcționează prin adunarea (gathering) parametrilor necesari pentru un strat specific înainte de trecerea forward sau backward, urmată de re-fragmentarea lor. Această abordare reduce drastic utilizarea memoriei, dar introduce un cost de comunicare ridicat. În practică, se optează adesea pentru adunarea ponderilor pentru un întreg bloc de transformer decoder odată, balansând astfel consumul de memorie cu overhead-ul de comunicare.
#### Tensor Parallelism (TP)
Tensor Parallelism este o formă de paralelism al modelului, unde fragmentele modelului „trăiesc” permanent pe dispozitive separate. Spre deosebire de tehnicile de paralelism al datelor, în TP fiecare dispozitiv primește același batch de date, dar calculează doar o porțiune a operațiilor matriceale din straturile liniare.
Această tehnică este extrem de eficientă pentru straturile liniare mari, cum ar fi cele din rețelele feed-forward ale transformatoarelor. Un aspect cheie este partiționarea inteligentă: primul strat este împărțit pe coloane, iar stratul subsequent pe rânduri. Acest lucru permite combinarea ieșirilor fragmentate cu o singură operație de reducere (AllReduce), minimizând comunicarea. TP creează partiții statice de memorie, rezultând într-o reducere constantă a utilizării memoriei, scalabilă odată cu dimensiunea grupului TP.
#### Context Parallelism (CP)
Pentru secvențe de intrare foarte lungi, Context Parallelism devine esențial. Această tehnică împarte secvența de intrare între dispozitive, permițând procesarea unor contexte extinse care altfel ar depăși memoria GPU-ului individual.
Combinarea strategiilor: ND Parallelisms
Pe măsură ce scalăm către modele cu zeci de miliarde de parametri, o singură strategie nu este suficientă. Aici intervin configurațiile hibride.
#### Hybrid Sharded Data Parallelism (HSDP)
HSDP combină Data Parallelism cu FSDP. Aceasta este utilă atunci când dorim să replicăm modelul de mai multe ori (pentru un batch size global mare), dar fiecare replică este prea mare pentru un singur GPU și trebuie fragmentată. De exemplu, cu `dp_replicate_size=2` și `dp_shard_size=2`, avem două replici ale modelului, fiecare fiind fragmentată pe două GPU-uri.
#### FSDP + Tensor Parallelism
Această combinație este puternică pentru modele masive. FSDP gestionează starea completă a modelului (fragmentată), în timp ce TP optimizează calculele matriceale mari. Totuși, trebuie acordată atenție interacțiunii dintre cele două pentru a evita conflictele de comunicare.
#### Hybrid Sharded Data Parallelism + Tensor Parallelism
Aceasta este o configurație complexă care utilizează toate nivelurile de paralelism. De exemplu, putem avea replici DP, fiecare fiind fragmentată prin FSDP, iar în interiorul fiecărei fragmentări FSDP, aplicăm TP pentru straturile liniare.
Implementare practică și Exemple de Cod
Pentru a implementa aceste strategii, biblioteca `accelerate` oferă o interfață unificată. Iată un exemplu de configurare care necesită cel puțin 2 noduri cu câte 8 GPU-uri fiecare:
```python
from transformers import AutoModelForCausalLM
from accelerate import Accelerator
from accelerate.parallelism_config import ParallelismConfig
from accelerate.utils import FullyShardedDataParallelPlugin
# Configurarea paralelismului dorite
pc = ParallelismConfig(
dp_shard_size=2, # Gradul FSDP
dp_replicate_size=2, # Gradul Data Parallel
cp_size=2, # Gradul Context Parallel
tp_size=2, # Gradul Tensor Parallel
)
fsdp_plugin = FullyShardedDataParallelPlugin(
fsdp_version=2,
auto_wrap_policy="transformer_based_wrap",
transformer_cls_names_to_wrap=["LlamaDecoderLayer"],
state_dict_type="SHARDED_STATE_DICT",
)
accelerator = Accelerator(
parallelism_config=pc,
fsdp_plugin=fsdp_plugin
)
model = AutoModelForCausalLM.from_pretrained(
"NousResearch/Hermes-3-Llama-3.1-8B",
device_mesh=accelerator.torch_device_mesh
)
model = accelerator.prepare(model)
```
Integrarea cu Axolotl și Optimizarea Fluxului de Lucru
Pentru a simplifica procesul de fine-tuning la scară largă, aceste tehnici au fost integrate și în Axolotl. Utilizatorii pot configura gradele de paralelism direct în fișierele de configurare YAML, fără a scrie cod complex.
De exemplu, adăugarea câmpurilor `dp_shard_size`, `dp_replicate_size`, `context_parallel_size` și `tensor_parallel_size` în configurația Axolotl este suficientă pentru a activa strategiile dorite.
Concluzii și Bune Practici
Alegerea configurației potrivite depinde de arhitectura modelului, dimensiunea batch-ului și infrastructura hardware disponibilă. Regula generală este de a evita FSDP pur peste mai multe noduri din cauza overhead-ului de comunicare. În schimb, combinațiile hibride permit utilizarea eficientă a lățimii de bandă intra-nod (pentru TP) și inter-nod (pentru DP sau FSDP).
Înțelegerea profundă a acestor strategii și a modului în care interacționează este cheia pentru a debloca potențialul modelelor de ultimă generație, transformând antrenarea dintr-o provocare logistică într-un proces optimizat și scalabil.