opt: real-GPU validation (6x5060 Ti) + block checkpointing results
Browse files
docs/OPTIMIZATION_2026-08-22.md
CHANGED
|
@@ -180,15 +180,45 @@ End-to-end moteur CPU (bench_engine.py, d=128, 2 blocs, E8, B=8, SEQ=128,
|
|
| 180 |
| cumsum (défaut) | 703 |
|
| 181 |
| chunked | 764 (+8.7 %) |
|
| 182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
## 5. Tests
|
| 184 |
|
| 185 |
```bash
|
| 186 |
-
py -m pytest tests/ -q #
|
| 187 |
py benchmarks/bench_attention.py --iters 8
|
| 188 |
py benchmarks/bench_engine.py --steps 20
|
| 189 |
```
|
| 190 |
|
| 191 |
-
Statut : **
|
|
|
|
| 192 |
(`test_engine_tick_chunk_train_ce_matches_train`,
|
| 193 |
`test_engine_end_to_end_chunk_equivalence`) exigent le clonage explicite des
|
| 194 |
poids (`load_state_dict`) entre instances comparées — deux constructions sous
|
|
|
|
| 180 |
| cumsum (défaut) | 703 |
|
| 181 |
| chunked | 764 (+8.7 %) |
|
| 182 |
|
| 183 |
+
### Validation GPU réelle (6× RTX 5060 Ti 16 Go, torch 2.11+cu128, 2026-08-24)
|
| 184 |
+
|
| 185 |
+
Config 1B complète (d1280 ×16 blocs, E128, bf16 autocast), smoke synthétique
|
| 186 |
+
puis trainer v2 complet sur vrais checkpoints + shards phase-2 :
|
| 187 |
+
|
| 188 |
+
| Config | tok/s/GPU | VRAM peak |
|
| 189 |
+
|---|---|---|
|
| 190 |
+
| cumsum + BLOCK_CKPT, B=2 | 338 | 14.3 GB |
|
| 191 |
+
| chunked + BLOCK_CKPT, B=2 | 431 | 14.0 GB |
|
| 192 |
+
| **chunked + BLOCK_CKPT, B=3** | **483** | **14.8 GB** |
|
| 193 |
+
| chunked + BLOCK_CKPT, B=4 | 501 | 15.6 GB |
|
| 194 |
+
|
| 195 |
+
- **Sans BLOCK_CKPT, la config 1B ne tient PAS dans 16 Go** (OOM dès le
|
| 196 |
+
forward MoE, même kernel chunked) : le checkpointing par bloc est ce qui
|
| 197 |
+
ouvre les cartes 16 Go. Naif interdit : `tick_chunk_core` lit-écrase le
|
| 198 |
+
carry → refactor en noyau pur `_tick_chunk_core_pure` (carry hors zone
|
| 199 |
+
checkpointée), prouvé équivalent par `tests/test_block_ckpt.py` (losses,
|
| 200 |
+
grads, évolution du carry sur chunks consécutifs). Suite : 46/46.
|
| 201 |
+
- Sur GPU, **chunked bat cumsum de ×1.27** à B égal : la réduction de
|
| 202 |
+
FLOPs paie enfin (contrairement au CPU, cf. plus haut).
|
| 203 |
+
- Trainer v2 complet (branche SS incluse) : **~340–382 tok/s/GPU soutenu**
|
| 204 |
+
à B=3, mem stable 14.8 GB, `loaded_tensors=424` sur chaque GPU (poids
|
| 205 |
+
réels chargés intégralement), lb≈14.03, tf en descente.
|
| 206 |
+
|
| 207 |
+
**ETA x6 5060 Ti pour finir la passe phase-2** (3,433 M tokens restants,
|
| 208 |
+
aggregate ~2,170 tok/s) : **≈ 17–19.5 jours** (~18 j au point médian).
|
| 209 |
+
Comparaison : 8×5090 baseline ≈ 4.5–5.5 j ; le gain post-opt sur 5090
|
| 210 |
+
reste à mesurer sur pod (même procédure).
|
| 211 |
+
|
| 212 |
## 5. Tests
|
| 213 |
|
| 214 |
```bash
|
| 215 |
+
py -m pytest tests/ -q # 46 passed = repo (28) + équivalences (14) + smoke v2 (2) + block-ckpt (2)
|
| 216 |
py benchmarks/bench_attention.py --iters 8
|
| 217 |
py benchmarks/bench_engine.py --steps 20
|
| 218 |
```
|
| 219 |
|
| 220 |
+
Statut : **46/46 passent** (local torch 2.9 CPU et pod torch 2.11+cu128,
|
| 221 |
+
2026-08-24). Les deux preuves moteur
|
| 222 |
(`test_engine_tick_chunk_train_ce_matches_train`,
|
| 223 |
`test_engine_end_to_end_chunk_equivalence`) exigent le clonage explicite des
|
| 224 |
poids (`load_state_dict`) entre instances comparées — deux constructions sous
|