docs: T14 flash-attention results + evolution/README rows
Fill in the design doc's measured results (grad-check, flash==composed, PyTorch parity, peak mem -16%/-23%, tok/s tradeoff), add the T14 row to evolution.md (算法/Infra) and the README build-journey table. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -151,6 +151,33 @@ dash5 1× RTX 5090,同 config,nvidia-smi 峰值,flash off vs on:attentio
|
||||
同 config steady-state tok/s flash off vs on。预期:本规模 `hd=32` 下 flash kernel **持平或略慢于** cuBLAS 双
|
||||
GEMM(小头维喂不满 tensor-core 是 flash 的已知权衡,胜场在显存)——诚实报告,不为绿而调。
|
||||
|
||||
## 实测结果(dash5,待 capture)
|
||||
## 实测结果(dash5 1× RTX 5090)
|
||||
|
||||
<!-- dash5 实跑后回填:grad-check 数字、flash-vs-composed rel-err、PyTorch 对拍、显存 before/after、tok/s before/after -->
|
||||
**正确性(硬闸门全绿):**
|
||||
|
||||
| 闸门 | 结果 |
|
||||
|---|---|
|
||||
| ① 新 kernel dQ/dK/dV finite-diff grad-check | **过** — dQ 9.3e-3 / dK 1.7e-2 / dV 5.6e-4(单 tile 干净区;多 tile 由②兜) |
|
||||
| flash fwd 对 composed | max rel **6.7e-5** |
|
||||
| flash bwd 对(已 grad-check 的)composed bwd | dQ **1.7e-5** / dK 1.2e-5 / dV 4.3e-5 |
|
||||
| ② flash==composed(model 级,logits/loss/每参数梯度) | fp32: loss rel **0.0**、logits 1.7e-4、grad 4.4e-5;bf16: loss 1.5e-4、logits mean 1.6e-3/p99 5.9e-3、grad scaled-mean 1.2e-2 |
|
||||
| ③ PyTorch SDPA 对拍 B>1(flash 路径,共用 composed oracle) | loss relerr **4.98e-8**、logits **7.92e-6**、25 参数 grad 全进 rtol 0.02 |
|
||||
| ⑤ 回归套(flag off 默认 + flash 路径都测):autograd 18 / structural 5 / batched / bf16 / **flash 3** / overfit 27/27 / recompute 2 / AdamW(GPU+host) / GEMM / DDP 2 / checkpoint-roundtrip | **全绿** |
|
||||
| ⑤ xserv 闭环 md5(v3 ckpt 用 T14 代码重导 safetensors) | **逐位一致** `b04fc9f9a0c9af04c47d9ca649aea12e`(与 registry 同)→ 默认 export 零漂移 |
|
||||
| ⑤ xserv 闭环(flash 训练 → 导出 → xserv 服务贪心) | flash-训出 coherent TinyStories;xserv(BF16) 对 xtrain(F32) 贪心:3 prompt 中 "One day" 逐 token 一致,其余在 ~0.5% BF16 漂移处晚分叉(与 v1/v2/v3 同款) |
|
||||
|
||||
> **finite-diff 的诚实记录**:长 softmax(seq>tile)会产生大量近零梯度元素,中心差分在那些元素上不可靠(出现伪 0.0 / 符号翻转——不是 backward bug)。故 ① 的 finite-diff 跑**单 tile 干净区**(seq=5,对齐既有 composed grad-check 的良态区),**多 tile 的 streaming/online 路径**用「flash bwd 对已 grad-check 的 composed bwd」(seq=40,dQ 1.7e-5)兜——比 finite-diff 更利。dQ/dK 用 eps=2e-3 压低 f32 舍入项(~4e-4 小梯度上舍入项压过截断项)。**没有为凑绿放宽容差**。
|
||||
|
||||
**④ 显存 + 吞吐(payoff vs tradeoff,dim768=8L/12h×64/ffn3072, bf16, steady-state):**
|
||||
|
||||
| config | path | 峰值显存 | tok/s |
|
||||
|---|---|---|---|
|
||||
| batch8 seq1024 | composed (off) | 24670 MiB | **58.6K** |
|
||||
| batch8 seq1024 | **flash (on)** | **20736 MiB(−16%)** | 25.0K(−57%, ~2.3× 慢) |
|
||||
| batch2 seq2048 | composed (off) | 17264 MiB | 36.7K |
|
||||
| batch2 seq2048 | **flash (on)** | **13246 MiB(−23%)** | 13.2K(−64%) |
|
||||
|
||||
→ **显存按预期降**(不物化 `[bh,S,S]`),且**收益随 seq 增长**(seq1024 −16% → seq2048 −23%,O(S²) 砍掉)。
|
||||
**tok/s 如设计 ① 预测的「持平或略慢」实为 ~2.3–2.8× 慢**:hd=64 的小头维下,手写「一行一 block + 串行扫 KV」kernel 喂不满 SM,干不过 cuBLAS tensor-core 的两发批量 GEMM——这正是 flash 的已知权衡(**胜场在显存,不是小模型 wall-clock**),诚实报告不掩饰。两个落地的优化(softmax 权重缓存进 shared 省 hd× 的 expf;dK/dV 原子加摊到全 block 而非串行在列 owner 内)把 backward 从 6.8× 慢拉到 2.3× 慢——主瓶颈是 backward 的跨行原子累加(FA2 用 K-block 拥有 dK/dV 的独立 pass 解,本版未做,留 follow-up)。
|
||||
|
||||
> **escape hatch(follow-up,未做,记给后续)**:① FA2 式 query-tile 划分(一 block 多 query 行,K/V 进 shared 复用)提 SM 占用;② backward 的 dK/dV 改 K-block-owned 独立 pass 消跨行原子;③ 纯 bf16 in-kernel(省两次 cast)。本规模 attention 非训练瓶颈、且会动数值贴合闸门,按 escape hatch 推迟——T14 先把**正确性 + 不物化 N×N + 显存↓**钉死。
|
||||
|
||||
Reference in New Issue
Block a user