7.4.9. 常见使用误区¶
7.4.9.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.9.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.9.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.9.4. 算子类错误¶
错误
Quantized 模型中部分算子没有经过前期的 calibration 或 QAT,如某后处理算子想要在 BPU 上加速,但是没有经过量化阶段,这时候会导致量化 Inference 失败或部署时的精度异常。
正确做法:Quantized 阶段并非完全不能直接添加算子,如颜色空间转换算子等,具体添加指南详见文档。但是并非所有算子都可以直接添加,比如 cat,这种算子必须在 calibration 或 QAT 阶段统计获得的真实量化参数才能不影响最终精度,有类似需求需要调整网络结构,可以咨询框架研发。
7.4.9.5. 模型类错误¶
错误
浮点模型过拟合。
模型过拟合常见判定方法:
对输入数据稍加变换之后,输出结果变化较大
模型参数赋值较大
模型 activation 较大
正确做法:自行解决浮点模型过拟合问题。