Salta al contingut
Entendre els LLMs
Bloc 5avançat2-3 h
IntuïtiuMatemàtic

Abans d'això: Preentrenament: dades i lleis d'escala

17 · Entrenament distribuït i eficiència

Idea central: cap model modern cap en una GPU. L'art de l'entrenament a escala consisteix a repartir pesos, gradients, estats i càlcul entre milers de dispositius amagant la comunicació darrere del càlcul.


1. Per què no hi cap# sense fórmules

Memòria per paràmetre entrenant amb AdamW en precisió mixta:

ComponentBytes/param
Pesos bf162
Gradients bf162
Còpia mestra fp324
Moment 1 (fp32)4
Moment 2 (fp32)4
Total~16

Un model de 70B necessita ~1,1 TB només per a estats, sense comptar activacions. Una H100 en té 80 GB.

Per què no hi cap

Quants bytes demana cada paràmetre per entrenar-lo, i quantes GPUs calen només per guardar-los?

Pesos140 GB
Gradients140 GB
Còpia mestra280 GB
Estats de l’optimitzador560 GB
Total: 1.120 GB. Una H100 80 GB en té 80: calen 14 GPUs només per guardar-los.
70 B

Dos moments en fp32: l’estàndard per a LLMs i, sovint, la meitat de tota la memòria.

bytes per paràmetre
16,0
estats
1.120 GB
GPUs de 80 GB
14
contra AdamW
1,00×
Comptat sobre els arrays d'un pas de debò: 32,0 bytes per paràmetre, i la taula del text en diu 16
Estatprecisió mixtaaquest projecte, comptatd'on
Pesos2 B · bf168 Bθ, Float64Array
Gradients2 B · bf168 Bgrad de batchLossAndGrad
Còpia mestra4 B · fp320 Bno cal: θ ja és fp64
Moment 14 B · fp328 Bopt.m, Float64Array
Moment 24 B · fp328 Bopt.v, Float64Array
Total16 B32 B922.624 bytes per a 28.832 paràmetres

Els quatre arrays que un pas d'aquest projecte deixa vius fan exactament 8 bytes per escalar —Float64Array— i la columna surt a 32: el doble de la precisió mixta. La precisió mixta guanya fent els pesos i els gradients en bf16, però paga una còpia mestra en fp32 perquè les actualitzacions petites d'Adam no desapareguin en arrodonir; aquí no cal, perquè θ ja és de precisió doble. I la columna d'aquí no és una fórmula: si l'optimitzador guardés un moment de més, el número de sota ho diria.

70B × 16,0 bytes = 1.120 GB d'estats contra 80 GB d'una H100 80 GB: 14 GPUs

I això abans d'una sola activació. Un 70B amb AdamW en precisió mixta són 1.120 GB —els «~1,1 TB» del text— i en una H100 n'hi caben 80. Canviar d'optimitzador ajuda: Adam de 8 bits, 10,0 bytes per paràmetre; Adafactor, 8,1 bytes per paràmetre; Lion, 12,0 bytes per paràmetre. Però cap optimitzador no baixa dels 4 bytes de pesos i gradients, i cap model de frontera no hi cap sencer en una GPU. Per això calen les cinc dimensions del §2: no per anar més de pressa, sinó per poder entrenar.

La taula no porta activacions, i és a posta: depenen del lot i de la seqüència, no dels paràmetres. A escala sovint són tan grans com els estats, i el widget de l'activation checkpointing les compta.

2. Les cinc dimensions de paral·lelisme# sense fórmules

2.1 Data Parallelism (DP)

Cada GPU té una còpia del model i processa un tros del batch; es sincronitzen els gradients amb un all-reduce. Simple, escala bé, però no resol el problema de memòria.

2.2 ZeRO / FSDP (sharding d'estats)

En comptes de replicar, reparteix:

  • ZeRO-1: reparteix els estats de l'optimitzador (4× menys memòria).
  • ZeRO-2: + gradients.
  • ZeRO-3 / FSDP: + pesos. Cada GPU guarda només un tros; abans de cada capa fa un all-gather del tros que li falta, calcula, i el descarta.

Compromís: memòria per comunicació. FSDP és avui l'opció per defecte en PyTorch per a entrenament i fine-tuning grans.

2.3 Tensor Parallelism (TP)

Reparteix una mateixa matriu entre GPUs: W=[W1,W2]\mathbf{W} = [\mathbf{W}_1, \mathbf{W}_2], cada GPU calcula la seva part i es fa un all-reduce per capa. Requereix interconnexió molt ràpida (NVLink) → normalment només dins d'un node (8 GPUs).

2.4 Pipeline Parallelism (PP)

Reparteix capes entre grups de GPUs. El problema és la "bombolla" (GPUs esperant); es mitiga amb micro-batches i planificacions intel·ligents (1F1B, interleaved, zero-bubble).

2.5 Context / Sequence Parallelism (CP/SP) i Expert Parallelism (EP)

  • CP/SP: reparteix la seqüència entre GPUs; imprescindible per a context llarg (Ring Attention i variants).
  • EP: reparteix els experts d'un MoE; requereix all-to-all per capa.

La combinació ("paral·lelisme 4D/5D")

Els entrenaments reals combinen tot: TP dins del node, PP entre nodes, DP/FSDP per damunt, més CP i EP segons el model. Trobar la configuració òptima és un problema d'optimització en si mateix (i hi ha eines que el resolen automàticament).

Les cinc dimensions de paral·lelisme

Repartir la feina entre milers de GPUs: què baixa la memòria de cada una, què costa en comunicació, i on es perd el temps?

La teva configuració: 512 GPUs = DP 16 × TP 8 × PP 4 × CP 1

Pesos
4,4 GB
Gradients
4,4 GB
Còpia mestra
0,5 GB
Moments
1,1 GB
Activacions
1,3 GB

11,7 GB per GPU contra 80 GB: hi cap. Comunicació per pas i GPU: DP 8,2 · TP 150 · PP 0,5 · CP 0,0 GB.

El pipeline simulat: 4 etapes, 8 microlots, 1F1B

etapa 0etapa 1etapa 2etapa 30000111022013021031241321423524325346354364574654756576567676777

Temps → (forward = 1, backward = 2). Blau: forward; magenta: backward; gris: la bombolla.

ZeRO sobre l'eix de dades
8
8 k
Planificació del pipeline
GPUs
512
memòria per GPU
11,7 GB
comunicació per pas
159 GB
bombolla
27,3 %
DP no baixa la memòria: 1.131 GB amb 16 rèpliques, exactament els 1.131 de sense; ZeRO-3 deixa 70,0 GB d'estats, exactament 1.120/16

La taula de sota compara les estratègies amb el mateix model i 16 dispositius. Cap xifra no està escrita a mà: surten de deviceMemory i commVolume, i el test del projecte comprova les dues igualtats de la franja —DP igual que sense, i ZeRO-3 igual a total/n— amb toBe, no amb aproximacions.

Estratègiaestats / GPUactivacions / GPUcomunicació / pas
Cap paral·lelisme1.120 GB10,7 GB—
DP × 161.120 GB10,7 GB263 GB
ZeRO-1 × 16333 GB10,7 GB263 GB
ZeRO-2 × 16201 GB10,7 GB263 GB
ZeRO-3 × 1670,0 GB10,7 GB394 GB
TP × 8140 GB1,3 GB601 GB
PP × 1670,0 GB5,4 GB4,3 GB

ZeRO-1 reparteix la còpia mestra i els moments —12 dels 16 bytes— i tendeix a una reducció de 4× quan n creix: aquí, 3,37×. ZeRO-2 hi afegeix els gradients i ZeRO-3, els pesos, i el preu és a l'última columna: ZeRO-3 comunica una vegada i mitja el que DP, perquè abans de cada capa ha de reunir els pesos que no té, al forward i al backward. És el «memòria per comunicació» del text, amb els dos números.

TP dins del node: 2,09 ms de comunicació per capa per NVLink, 18,79 per InfiniBand, contra 14,58 de càlcul

Amb TP, cada capa fa quatre all-reduce de les activacions —dos al forward, dos al backward— de 0,1 GB cadascun. Són 0,94 GB per capa i per GPU, i s'han de moure dins de cada capa, entre un producte de matrius i el següent: no es poden amagar darrere de res que no depengui d'ells. NVLink 4 (dins del node): 450 GB/s; InfiniBand NDR 400 Gb/s (entre nodes): 50 GB/s. Per NVLink la comunicació és 14 % del càlcul de la capa (a un 40 % del pic de la H100 80 GB); per InfiniBand, 1,3 vegades. Per això TP es queda a les 8 GPUs d'un node, i entre nodes s'hi posa PP o DP, que comuniquen molt menys sovint.

La bombolla simulada amb 4 etapes i 8 microlots és 27,27 %; la fórmula (p−1)/(m+p−1) en dona 27,27 %

El diagrama de sota no és la fórmula dibuixada: és la simulació d'un pas, operació a operació. Cada etapa fa els forwards i els backwards en l'ordre de la planificació, i cada operació espera la que li cal de l'etapa del costat. Les caselles buides són la bombolla, i sumades donen exactament el que diu la fórmula —el test ho comprova per a 256 combinacions—. Puja m i la bombolla baixa; per això els microlots.

1F1B no redueix la bombolla: redueix la memòria. Amb GPipe cada etapa guarda les activacions dels 8 microlots alhora; amb 1F1B, com a molt 4, 3, 2, 1 per etapa —comptat a la simulació—, perquè comença els backwards abans d'acabar tots els forwards.

La combinació 4D és el que es fa de debò: TP dins del node, PP entre nodes, DP amb ZeRO per damunt, i CP i EP segons el model. Llama 3 405B es va entrenar amb TP 8, PP 16 i DP fins a 128. Prova-ho: 8 × 16 × 128 són 16.384 GPUs.

3. Estalviar memòria# sense fórmules

  • Activation checkpointing: no guardis les activacions intermèdies; recalcula-les al backward. ~30% més de temps, fins a 10× menys memòria d'activacions. Es pot fer selectivament (només les capes cares de recalcular es guarden).
  • CPU/NVMe offloading: desplaça estats a RAM o disc. Salva execucions impossibles, però és lent.
  • Precisió baixa: bf16 → fp8 per als GEMMs, amb acumulació en precisió alta.
  • Optimitzadors eficients en memòria: Adafactor, 8-bit Adam, LoRA (que elimina el 99% dels estats d'optimitzador).

Estalviar memòria: activation checkpointing

Quants números desa de debò un forward perquè el backward funcioni? I què costa no desar-los i tornar-los a calcular?

Escalars desats contra la longitud de seqüència

  • sense checkpointing
  • amb checkpointing: el pic
  • pesos d’atenció, H·L² per capa

Model de 53.536 paràmetres. Els pendents de les rectes en log-log són 1 per a la part lineal i 2 per a la quadràtica: on la línia vermella talla la blava, l'atenció ja pesa més que tota la resta.

128 tokens
4
32
sense checkpointing
609,4 k escalars
amb checkpointing
179,6 k escalars
reducció
3,4×
temps de més
41 %
pesos d’atenció
43 %
Memòria comptada: 609,41 k escalars sense checkpointing, 179,58 k amb: 3,4 vegades menys

Sense checkpointing, cada bloc desa tot això —comptat sobre els arrays del primer bloc, amb L = 128:

weights65.53644 %
gate11.2648 %
up11.2648 %
act11.2648 %
n14.2243 %
n24.2243 %
q4.0963 %
k4.0963 %
qr4.0963 %
kr4.0963 %
Total del bloc148.736

Amb checkpointing es guarda només l'entrada de cada bloc —4 × 128 × 32 = 16.384 escalars— i, al backward, cada bloc es torna a calcular des d'aquella entrada just abans de fer-ne el gradient. Al pic hi ha els punts de control, un sol bloc recalculat (148.736) i el cap del model (14.464). El text diu «fins a 10× menys»: aquí en surten 3,4, i el número creix amb les capes, perquè sense checkpointing cada capa hi suma un bloc sencer i amb checkpointing només una entrada. Posa-hi 8 capes i mira'l créixer.

Temps cronometrat: forward 32,9 ms, backward 46,5 ms; recalcular el forward costa un 41 % més

El text diu «~30 % més de temps». La xifra surt de la ràtio entre forward i backward: si el backward en fa el doble, recalcular un forward afegeix 1/3 del total, un 33 %. Aquí la ràtio mesurada és 1,42 i el sobrecost, 41 %. A diferència del prefill i el decode del fitxer 15, aquest número sí que es pot cronometrar al navegador: no depèn de cap paral·lelisme, sinó de quanta aritmètica fa cada fase. La ràtio no és el 2 que se sol dir, i la diferència és d'aquest codi: el forward hi fa feina de més —còpies de Q i K abans i després de RoPE, les contribucions de cada sublayer desades per als widgets del fitxer 11— i el backward en surt 1,42 vegades i no 2. Com més pesa el forward, més costa repetir-lo: d'aquí el 41 % en comptes del 33 %.

El terme L²: els pesos d'atenció són el 43 % del que desa el forward a L = 128

Tot el que desa el forward creix linealment amb L excepte una cosa: els pesos d'atenció, H·L·L per capa. El gràfic ho ensenya comptat a cinc longituds, i el test del projecte comprova que el terme quadràtic és exactament capes × caps × L². A L = 256 ja són el 60 % del total, i a context llarg dominen.

Aquí es troba amb el fitxer 14: FlashAttention no guarda mai aquesta matriu —la recalcula per blocs al backward, que és checkpointing aplicat només a l'atenció— i per això la memòria d'activacions d'un entrenament de context llarg passa de quadràtica a lineal. El checkpointing selectiu del text és el mateix raonament: guardar el que és barat de guardar i car de recalcular, i recalcular la resta.

Un avís sobre el comptador: desa el que aquest forward desa, que és més del que un backward estrictament necessita —guarda Q abans i després de RoPE i la contribució de cada sublayer, per als widgets del fitxer 11—. Un entrenador de producció n'estalviaria una part. La forma, en canvi, és la mateixa: lineal en L per a tot i quadràtica per als pesos d'atenció.

4. Eficiència: MFU# sense fórmules

Model FLOPs Utilization = FLOPs útils / FLOPs teòrics del hardware.

MFU=6ND/tFLOPSpic⋅nGPUs\text{MFU} = \frac{6ND / t}{\text{FLOPS}_{pic}\cdot n_{GPUs}}
  • 35-55% és bo per a entrenament dens a gran escala.
  • Per sota del 25%, tens un problema (comunicació, bombolles, kernels subòptims, càrrega de dades).
  • Amb MoE i context llarg és normal tenir MFU més baixos.

On es perd eficiència: comunicació no solapada, bombolles de pipeline, kernels no fusionats, càrrega de dades, i fallades. En execucions de milers de GPUs durant setmanes, les fallades de hardware són esdeveniments diaris — cal checkpointing freqüent i asíncron, detecció automàtica de nodes defectuosos i reinici ràpid.

MFU: on es perd el temps

Tens un MFU del 18 %. Quin terme se'n menja la resta, i què arreglaries primer?

El temps d'un pas, terme a terme

  • Càlcul útil al pic · 18 %
  • Kernels per sota del pic · 22 %
  • Forward repetit (checkpointing) · 13 %
  • Bombolla del pipeline · 23 %
  • Comunicació no amagada · 13 %
  • Esperant dades · 3 %
  • Fallades i reinicis · 7 %

Un pas de Llama 3.1 405B amb lots de 16 M tokens. La franja verda és l'MFU: el temps que el pas trigaria si totes les GPUs fessin només càlcul útil al pic.

Punt de partida
16.384
45 %

Fracció del pic que fan els productes de matrius quan calculen.

2.400 ms
30 %
8
16
450 ms
8,0 %

Fracció del temps perduda, amortitzada.

MFU
18,0 %
temps per pas
13.327 ms
ideal
2.397 ms
el terme que domina
Bombolla del pipeline
MFU = 6ND/t ÷ (pic · GPUs) = 17,99 %; pel pressupost de temps, 17,99 %

Els dos camins han de donar el mateix, i donen el mateix: 6 × 405 G × 16 M tokens són 3,89·10¹⁹ FLOPs útils per pas; dividits pels 13,33 s que triga i pel pic de 16.384 H100 80 GB, surt el 18,0 %. Els FLOPs del forward repetit no hi compten: són feina, però no són útils, i per això el checkpointing baixa l'MFU encara que la GPU vagi a ple.

On es perd: bombolla del pipeline (23 %), kernels per sota del pic (22 %), forward repetit (checkpointing) (13 %)
Termemsdel pasquè s'hi fa
Càlcul útil al pic2.39718 %—
Bombolla del pipeline3.10723 %més microlots, planificació intercalada o zero-bubble, menys etapes
Kernels per sota del pic2.93022 %kernels fusionats, FlashAttention, fp8, formes de matrius que omplin els tensor cores
Forward repetit (checkpointing)1.77613 %checkpointing selectiu: recalcular només el que és barat
Comunicació no amagada1.68013 %solapar amb el càlcul, TP dins del node, menys ZeRO-3
Fallades i reinicis9877 %checkpoints més freqüents i asíncrons, detecció de nodes dolents
Esperant dades4503 %precàrrega asíncrona, més fils de lectura, dades preprocessades

La bombolla surt de la fórmula que el widget de paral·lelisme simula: (p−1)/(m+p−1) = 30,4 % del temps del pipeline, que és 0,44 vegades la feina. El text diu que per sota del 25 % «tens un problema», i la taula diu quin: investiga en l'ordre de la columna del mig. Ara mateix, els tres primers són bombolla del pipeline, kernels per sota del pic, forward repetit (checkpointing). Arregla el primer —mou-ne el control— i mira com canvia l'ordre: cada terme que baixa fa que els altres pesin més, i per això a l'exercici 17.5 la resposta no és una llista fixa sinó un mètode.

Una cosa que la taula ensenya i que sorprèn: el checkpointing complet, que fa que el model hi càpiga, costa un 13 % del pas en FLOPs que no són útils.

El 35-55 % que el text diu que és bo no vol dir que la resta sigui malbaratament evitable: una part dels termes té un mínim físic —la comunicació entre milers de GPUs, les fallades en setmanes d'execució— i l'enginyeria consisteix a acostar-s'hi, no a eliminar-los.

5. El hardware, en una pàgina# sense fórmules

  • GPU: memòria HBM (80-192+ GB), ample de banda (3-8 TB/s), FLOPs per format (bf16, fp8, fp4). L'ample de banda mana en inferència; els FLOPs manen en entrenament.
  • Interconnexió: NVLink dins del node (centenars de GB/s per GPU), InfiniBand/RoCE entre nodes. La topologia determina quins paral·lelismes són viables on.
  • Alternatives: TPU (pods amb interconnexió pròpia, excel·lents per a entrenament), acceleradors d'inferència especialitzats (Groq, Cerebras) amb latències molt baixes, i el cost energètic com a restricció cada cop més real.

El sostre del maquinari

Per què l'ample de banda mana quan generes i els FLOPs manen quan entrenes? Situa les dues operacions al diagrama.

colze: 296
  • sostre de la H100 80 GB
  • les altres GPUs del catàleg
  • Decode, lot de 1
  • Decode, lot de 64
  • Entrenament, 8 k tokens
8.192
1
8 k
colze de la GPU
296 FLOP/byte
decode
1,0 FLOP/byte
entrenament
3.641 FLOP/byte
decode: del pic
0,3 %
A la H100 80 GB, el colze és a 296 FLOP/byte; el decode d'un token en demana 1,00 i l'entrenament, 3.641

El colze surt d'arithmeticIntensity: 990 TFLOP/s dividit per 3.350 GB/s. Els punts, de matmulIntensity: 2·m·k·n FLOPs d'un producte de matrius contra els bytes de llegir-ne les entrades i escriure'n la sortida.

El decode d'un token per seqüència multiplica un vector per la matriu de pesos: cada pes es llegeix per fer-ne dues operacions —una multiplicació i una suma— i ocupa dos bytes en bf16. Això és 1 FLOP per byte, no els «~2» que es diuen sovint: el 2 és per paràmetre, i en bf16 cada paràmetre són dos bytes. Queda 296 vegades per sota del colze, i la GPU fa com a molt el 0,34 % del que podria: l'ample de banda mana. Un pas d'entrenament amb 8 k tokens reutilitza cada pes 8 k vegades, i queda per sobre: els FLOPs manen.

Entremig hi ha el batching del fitxer 15: amb un lot de B seqüències, la intensitat del decode és gairebé B. Per arribar al colze d'aquesta GPU calen uns 512 tokens alhora. Canvia de GPU: el colze es mou —les GPUs noves guanyen potència més de pressa que ample de banda, i a cada generació és més fàcil quedar-s'hi per sota— i els punts es queden quiets.

Tot el fitxer 15 i mig fitxer 17 es poden llegir en aquest diagrama. Quantització, GQA, MLA i MoE mouen el decode cap a la dreta o baixen els bytes que ha de llegir; el batching el mou cap a la dreta; FlashAttention treu l'atenció de sota el colze. I en entrenament, tot el que es fa amb el paral·lelisme és mantenir cada GPU a la dreta del colze mentre la feina es reparteix.

6. Comprova que ho has entès#

0 de 5 resoltes

  1. Per què el data parallelism no resol el problema de memòria i ZeRO-3 sí?
  2. Per què el tensor parallelism es limita normalment a les GPUs d'un mateix node?
  3. Què és la bombolla de pipeline i com es redueix? Al widget de paral·lelisme, fes-la baixar per sota del 10 %.

    Objectiu:Al widget de les cinc dimensions, amb almenys 2 etapes de pipeline, puja els microlots fins que la bombolla sigui menor del 10 %.

    Vés al widget ↑pp = per defecte · m = per defecte
  4. Calcula la memòria d'estats d'un model de 13B entrenat amb AdamW en precisió mixta, sense activacions. En GB.
    GBMarge acceptat: 2 %
  5. Tens un MFU del 18 %. Quines tres coses investigues primer, i com?

7. Recursos#

Marca els que hagis llegit
  • The Ultra-Scale Playbook: Training LLMs on GPU Clusters (Hugging Face) — el millor recurs obert que existeix sobre això.

  • Rajbhandari et al. (2019), ZeRO.

  • Shoeybi et al. (2019), Megatron-LM (tensor parallelism).

  • Narayanan et al. (2021), Efficient Large-Scale Language Model Training on GPU Clusters.

  • Llama 3 Herd of Models — secció d'infraestructura i fallades reals.