7.4.8. 常见使用误区

7.4.8.1. 设置类错误

错误

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

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


错误

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

正确做法:根据要部署的处理器选择正确的 BPU 架构。

horizon.march.set_march(horizon.march.March.XXX)

错误

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

错误示例如下: 假设模型定义如下:

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()

qat_model = prepare_qat_fx(
    float_model,
    {
        "": default_qat_8bit_fake_quant_qconfig, # 整网设置成 int8 量化
    },
)

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

qat_model = prepare_qat_fx(
    float_model,
    {
        "module_name": {
            "classifier": default_qat_out_8bit_fake_quant_qconfig, # 网络输出 classifier 层设置为高精度
        },
        "": default_qat_8bit_fake_quant_qconfig, # 其它层设置成 int8 量化
    },
)

7.4.8.2. 方法类错误

错误

Calibration 过程使用多卡。

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


错误

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

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


错误

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

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

quantized_model = convert_fx(qat_model.eval())
acc = evaluate(quantized_model, eval_data_loader, device)

7.4.8.3. 网络类错误

错误

多次调用同一个通过 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)

7.4.8.4. 算子类错误

错误

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

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


7.4.8.5. 模型类错误

错误

浮点模型过拟合。

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

  • 对输入数据稍加变换之后,输出结果变化较大

  • 模型参数赋值较大

  • 模型 activation 较大

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