1. 整体介绍
在模型量化部署流程中,quantized.bc包含 qdq(Quantize/DeQuant)算子,在某些场景中,这些 qdq 算子可以删除融合到前后处理使用c++实现,但必须确保删除前后的 quantized.bc vs quantized_remove.bc 推理结果保持一致。
quantized.bc:包含完整 qdq 的量化模型
quantized_remove_qdq.bc:将 qdq 删除后的版本
本文将介绍如何验证 只删除 qdq 前后的 bc 是否一致,验证思路如下:
加载两个 bc 模型
根据包含 qdq 模型输入类型构造随机输入
对 remove_qdq 版本进行手动量化输入构造
推理两个bc模型
对 remove_qdq 的输出进行反量化
逐输出节点计算误差(max diff / bool mismatch),判断删除 qdq 前后模型是否一致
1.1 输入构造与量化处理
对于 quantized_remove_qdq.bc,它的输入可能是 int8 或 int16,因此需要:
根据量化 scale 手动量化
clip 到对应 dtype 的有效范围
按 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即可。
