把 FP8 接进 Qwen3:矩阵乘更快,整模型为什么更慢
我用 Qwen3 真实权重完成 FP8 投影实验,再把同一量化方法接回完整模型。预先量化输入时矩阵乘更快,计入在线转换后,整模型 decode 反而慢约 21%,并且未通过预设数值检查。
参数与资源用量
| 项目 | 本次实测配置与用量 |
|---|---|
| 执行并行方式 | 1 张 GPU、单进程、batch=1;两种精度交错串行执行,没有服务端并发请求 |
| 模型与框架 | Qwen3-0.6B;PyTorch 2.6.0、CUDA 12.6;SDPA attention |
| 精度对照 | BF16 对照;28 个 MLP gate projection 使用 tensorwise E4M3,激活在线缩放和转换 |
| 输入与输出 | 输入 128 / 512 / 2048 token;每例固定 16 步缓存 decode,单 token 解码行数补齐到 16 |
| 重复方式 | 每种精度、每个长度各 6 次平衡 AB/BA 计时,共 36 次;两段文本共比较 102 个 logit 位置 |
| 正式计时窗口 | BF16 累计 7.529 秒,FP8 累计 9.043 秒;单卡合计折算 16.571 GPU·秒,约 0.00460 GPU·小时 |
| 峰值分配显存 | 随输入长度为 1282 / 1435 / 2052 MiB;两种权重副本同时驻留,不能用于比较净显存节省 |
GPU·秒按一张卡乘正式 prefill 与 decode 窗口墙钟计算,未包含加载、暖机、数值检查和其他实验,不能作为全项目用量。计时不包含一次性权重转换与切换,包含在线激活处理。
局部投影结果
下表为三个实际层的中位数汇总,单位为每次调用的微秒。
| 输入 token | BF16 | 预量化 FP8 | FP8 加在线激活处理 |
|---|---|---|---|
| 128 | 7.735 | 5.184 | 21.824 |
| 512 | 20.232 | 12.447 | 33.647 |
| 2048 | 64.304 | 35.512 | 76.496 |
预量化 FP8 的局部优势约为 1.49–1.81 倍;独立新进程重复仍有优势,但在线版本在全部长度上都慢于 BF16。
完整模型结果
时间为每种精度 6 次运行的中位数,单位毫秒;decode 一列为 16 步合计。
| 输入 token | BF16 / FP8 prefill | BF16 / FP8 decode | 两段文本最大 logit 差 |
|---|---|---|---|
| 128 | 26.269 / 30.535 | 388.016 / 470.386 | 1.1875 / 0.8125 |
| 512 | 26.846 / 30.957 | 388.423 / 469.398 | 3.71875 / 6.92969 |
| 2048 | 28.530 / 33.021 | 390.829 / 471.736 | 2.15625 / 1.78125 |
预设检查要求所有位置 top-1 一致且最大绝对 logit 差不超过 0.5。虽然 102/102 个位置 top-1 相同,六个文本与长度组合都超过误差阈值。因此这些是失败方案的诊断计时,不能称为质量等价的模型加速。
完整笔记保留实现、全部重复、数值复核和逐层误差定位。
完整实验记录保存在 pegasas-notes-v2 私有仓库,仅向已获仓库访问权限的账号开放。