常见使用误区

设置类错误

错误

无需量化的模块设置了非 None 的 qconfig,例如 前后处理,loss function 等。

正确做法:只对需要量化的模块设置 qconfig。


错误

没有正确设置 march,这样可能导致模型编译失败或部署精度不一致。

正确做法:根据要部署的处理器选择正确的 BPU 架构,如 J6 需要使用 Nash:

horizon.march.set_march(horizon.march.March.NASH)

错误

模型输出节点没有设置成高精度输出,导致量化精度不符合预期。

错误示例如下:

假设模型定义如下:

class ToyNet(nn.Module): def __init__(self): self.conv0 = nn.Conv2d(4,4,3,3) self.relu0 = nn.ReLU() self.classifier = nn.Conv2d(4,4,3,3) def forward(self, x): out = self.conv0(x) out = self.relu(out) out = self.classifier(out) return out # 错误的设置 qconfig 示例: float_model = ToyNet() # 整网设置成 int8 量化 float_model.qconfig = default_qat_8bit_fake_quant_qconfig qat_model = prepare(float_model, example_input)

正确做法:为了提高模型精度,模型输出节点设置成高精度,示例如下:

qat_model = horizon.quantization.prepare( float_model, example_input, # 使用默认模板,自动为输出设置高精度 qconfig_setter = horizon.quantization.qconfig_template.default_qat_qconfig_setter, )

方法类错误

错误

Calibration 过程使用多卡。

由于底层限制,Calibration 目前不支持多卡,请使用单卡进行 Calibration 操作。


错误

模型输入图像数据采用数据格式为 RGB 等非 centered YUV444 格式,这样可能导致模型部署精度不一致。

正确做法:由于 Horizon 硬件支持的图像格式为 centered YUV444,因此建议您从模型训练开始就直接使用 YUV444 格式作为网络输入进行训练。


错误

量化感知训练中使用 qat 模型进行模型精测评测和监控,导致不能及时发现部署时精度异常的问题。

正确做法:导致 QAT 与 Quantized 误差的原因是 QAT 阶段不能完全模拟 Quantized 中纯定点计算逻辑,建议使用 quantized 模型进行模型精度评测和监控。

quantized_hbir_model = hbdk4.compiler.convert(qat_hbir_model) acc = evaluate(quantized_hbir_model, eval_data_loader)

网络类错误

错误

多次调用同一个通过 FloatFunctional()定义的成员。

错误示例如下:

class ToyNet(nn.Module): def __init__(self): self.add = FloatFunctional() def forward(self, x, y, z) out = self.add(x, y) return self.add(out, z)

正确做法:禁止在 forward 中多次调用同一个通过 FloatFunctional() 定义的变量。

class ToyNet(nn.Module): def __init__(self): self.add0 = FloatFunctional() self.add1 = FloatFunctional() def forward(self, x, y, z) out = self.add0.add(x, y) return self.add1.add(out, z)

算子类错误

错误

Quantized 模型中部分算子没有经过前期的 calibration 或 QAT,如某后处理算子想要在 BPU 上加速,但是没有经过量化阶段,这时候会导致量化 Inference 失败或部署时的精度异常。

正确做法:Quantized 阶段并非完全不能直接添加算子,如颜色空间转换算子等,具体添加指南详见文档。但是并非所有算子都可以直接添加,比如 cat,这种算子必须在 calibration 或 QAT 阶段统计获得的真实量化参数才能不影响最终精度,有类似需求需要调整网络结构,可以咨询框架研发。

模型类错误

错误

浮点模型过拟合。

模型过拟合常见判定方法:

  • 对输入数据稍加变换之后,输出结果变化较大。
  • 模型参数赋值较大。
  • 模型 activation 较大。

正确做法:自行解决浮点模型过拟合问题。