专栏算法工具链【J6】验证仅删除qdq前后bc一致性

【J6】验证仅删除qdq前后bc一致性

Jade-self2026-01-25
18
0

1. 整体介绍

在模型量化部署流程中,quantized.bc包含 qdq(Quantize/DeQuant)算子,在某些场景中,这些 qdq 算子可以删除融合到前后处理使用c++实现,但必须确保删除前后的 quantized.bc vs quantized_remove.bc 推理结果保持一致。

  • quantized.bc:包含完整 qdq 的量化模型

  • quantized_remove_qdq.bc:将 qdq 删除后的版本

本文将介绍如何验证 只删除 qdq 前后的 bc 是否一致,验证思路如下:

  1. 加载两个 bc 模型

  2. 根据包含 qdq 模型输入类型构造随机输入

  3. 对 remove_qdq 版本进行手动量化输入构造

  4. 推理两个bc模型

  5. 对 remove_qdq 的输出进行反量化

  6. 逐输出节点计算误差(max diff / bool mismatch),判断删除 qdq 前后模型是否一致

1.1 输入构造与量化处理

对于 quantized_remove_qdq.bc,它的输入可能是 int8 或 int16,因此需要:

  1. 根据量化 scale 手动量化

  2. clip 到对应 dtype 的有效范围

  3. 按 dtype 存入 input_dict_part_int 作为推理输入

1.2 输出反量化处理

输出分两种量化方式:

  • Per-tensor quant

只需使用一个 scale 乘回去。

  • Per-channel quant(带 axis 参数)

需要构造一个可广播的 scale shape:例如输出 shape 为 [1, 64, 128, 128],axis=1,scale shape 必须 reshape 为 [1, 64, 1, 1] 才能让 numpy 按通道广播。如果 scale 数与 channel 数不一致,直接报错。

1.3 误差对比

  • 对于 bool 输出 必须使用 logical_xor

  • 对于 浮点或量化数据 使用 abs(a - b),查看 max error

2. 完整代码

运行如下代码,注意:加载模型的地方,替换成自己的删除qdq前的quantized.bc 与删除qdq后的quantized_remove_qdq.bc即可。

算法工具链
社区征文杂谈技术深度解析
评论0
0/1000