把 7B 模型的 KV cache 从 fp16 改成 fp8,单卡并发从 24 提到 40,但长文档摘要任务里出现了数字抄错和段落重复,需要量化收益与损失。

一开始怀疑是「校准集与线上长文本分布差异大」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。fp8 的动态范围不足以表示部分激活值。另一种情况是只有 KV 量化,权重仍是 fp16,收益被高估。

另外,并发提高后 batch 变大,注意力精度进一步下降。

上来先记录量化前后的显存与并发上限

nvidia-smi --query-gpu=memory.used --format=csv -l 1

再往下用固定评测集对比两份输出的差异率

python eval_kv.py --base out_fp16.jsonl --quant out_fp8.jsonl --metric rouge

只对长文本层保留 fp16 做混合精度

python -c "print('kv_cache_dtype=fp8, keep last 8 layers fp16')"

末了按并发阶梯压测找精度拐点

python bench.py --concurrency 8,16,24,40 --kv-dtype fp8

恢复的判定其实很直接。并发 32 时摘要指标只掉 0.8 个点、显存下降 38%,超过 32 后数字错误率明显上升,最终把并发上限压在 32。

KV 量化省的是缓存而不是权重,收益上限由上下文长度决定,精度损失在大 batch 下会被放大,必须按并发分档评估。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189