精度对比方法论:如何搭建科学的精度对比流水线

精度对比这件事,说白了就是拿你的“标准答案”和模型推理结果做比对。我见过太多团队,模型跑通了就急着上线,结果线上精度崩了,回头查才发现对比方法就有问题。今天咱们就聊聊,怎么搭一条靠谱的精度对比流水线。

一、Golden Data 从哪来?

Golden Data 就是你的“标准答案”。我个人习惯用 PyTorch 或 TensorFlow 的 FP32 推理结果作为基准。为什么是 FP32?因为精度最高,最接近数学上的“真实值”。

生成 Golden Data 时,有几点要注意:

  • 输入数据要固定:用同一个随机种子,确保每次生成的输入一样
  • 模型权重要一致:从同一个 checkpoint 加载,别用不同训练阶段的权重
  • 推理模式要正确:记得设 model.eval(),关掉 dropout 和 batch norm 的 training 模式

重要提醒:Golden Data 最好保存成文件,比如 .npy 或 .npz 格式。别每次现跑,万一哪天 PyTorch 版本升级了,结果可能就不一样了。

二、TRT-LLM 输出怎么抓?

TRT-LLM 推理时,输出是 Tensor 形式。我建议在推理引擎的 output 节点直接 dump 数据。具体做法:

# 伪代码示例
output_tensor = session.run(output_names, input_feed)
np.save("trt_output.npy", output_tensor)

嗯,这里要注意:TRT-LLM 的默认输出可能是 FP16 或 INT8 的。如果你要对比精度,最好把输出也转成 FP32,再和 Golden Data 比。

三、对比指标怎么选?

不是所有场景都适合用“绝对误差”。我踩过坑,给大家列几个常用指标:

指标 适用场景 阈值建议
绝对误差 (MAE) 回归任务、连续值输出 < 1e-3
相对误差 (MRE) 数值范围差异大的场景 < 1%
余弦相似度 向量输出、embedding 对比 > 0.99
Top-K 准确率 分类任务、生成任务 与 baseline 差距 < 0.5%

我个人习惯先用 MAE 扫一遍,如果发现异常点,再针对性地用相对误差分析。你想想看,如果某个输出值本身很小,绝对误差可能看起来不大,但相对误差可能已经爆了。

四、搭建自动化对比流水线

手动对比一次两次还行,项目迭代起来就受不了了。我建议用脚本自动化:

def compare_accuracy(golden_path, trt_path, metric='mae'):
    golden = np.load(golden_path)
    trt_output = np.load(trt_path)
    
    if metric == 'mae':
        diff = np.abs(golden - trt_output)
        return np.mean(diff)
    elif metric == 'cosine':
        # 余弦相似度计算
        dot = np.dot(golden.flatten(), trt_output.flatten())
        norm = np.linalg.norm(golden) * np.linalg.norm(trt_output)
        return dot / norm

小技巧:流水线里加个“失败阈值”判断。比如 MAE > 0.01 就直接报错,阻止模型发布。我在项目中遇到过,有一次量化参数设错了,全靠这个阈值拦住了,没让问题流到线上。

五、常见坑与避坑指南

我曾经因为数据类型不一致,排查了整整两天。Golden Data 是 FP32,TRT-LLM 输出是 FP16,直接相减,误差看起来很大,其实是精度转换的问题。

  • 数据类型对齐:对比前统一转成 FP32
  • 数值范围对齐:如果模型输出有 softmax,确保 Golden Data 和 TRT-LLM 都经过了 softmax
  • Batch 顺序一致:多 batch 推理时,确保输出顺序和输入顺序对应

警告:别只看平均值!我建议同时看最大值、最小值、标准差。有时候平均值很漂亮,但个别 token 的误差已经大到离谱了。

六、可视化对比

数字看多了眼花,我习惯画个分布图。用 matplotlib 把 Golden Data 和 TRT-LLM 输出的分布叠在一起,一眼就能看出问题。

import matplotlib.pyplot as plt

plt.hist(golden.flatten(), bins=100, alpha=0.5, label='Golden')
plt.hist(trt_output.flatten(), bins=100, alpha=0.5, label='TRT-LLM')
plt.legend()
plt.show()

如果两条曲线基本重合,那精度基本没问题。如果有一条明显偏移,赶紧查原因。

七、精度对比的核心逻辑

下面这张图,是我总结的精度对比流水线核心流程:

生成 Golden Data PyTorch FP32 推理 TRT-LLM 推理 获取输出 Tensor 数据预处理 类型/形状对齐 指标计算 MAE / 余弦相似度 / Top-K 阈值判断 通过 → 发布 | 失败 → 排查

这张图把整个流程串起来了。从生成 Golden Data 开始,到 TRT-LLM 推理,再到数据预处理、指标计算,最后用阈值做决策。每一步都不能省。


精度对比不是一次性工作。模型迭代、量化参数调整、引擎版本升级,每次变化都要重新跑一遍对比流水线。我建议把它集成到 CI/CD 里,每次构建自动触发。这样,问题在早期就能被发现,而不是等到线上用户反馈了才去查。

好了,这一章就聊到这。记住:精度对比的终极目标不是“误差越小越好”,而是“误差在可接受范围内,且不影响最终任务效果”。

专注资料整理