快捷方式

量化精度调试

本文档提供了提高量化精度的策略。如果量化模型与原始模型相比存在错误,我们可以将错误归类为

  1. 数据无关错误 - 由固有模型量化错误引起,大部分输入数据具有较大错误

  2. 数据相关错误 - 由异常输入数据引起,小部分输入数据具有较大错误

  3. 实现错误 - 量化内核与参考实现不匹配

数据不敏感错误

一般提示

  1. 对于 PTQ,确保用于校准的数据代表数据集。例如,对于分类问题,一般原则是每个类别中有多个样本,并且样本的总数应至少为 100。使用更多数据进行校准不会受到校准时间以外的任何惩罚。

  2. 如果模型具有 Conv-BN 或 Linear-BN 模式,请考虑融合它们。如果使用 FX 图模式量化,则工作流会自动完成此操作。如果使用 Eager 模式量化,可以使用 torch.ao.quantization.fuse_modules API 手动执行此操作。

  3. 提高有问题的操作的 dtype 精度。通常,fp32 的精度最高,其次是 fp16,其次是动态量化的 int8,其次是静态量化的 int8。

    1. 注意:这是以性能换取精度。

    2. 注意:每个操作的每个 dtype 的内核可用性可能因后端而异。

    3. 注意:dtype 转换会增加额外的性能成本。例如,fp32_op -> quant -> int8_op -> dequant -> fp32_op -> quant -> int8_op -> dequantfp32_op -> fp32_op -> quant -> int8_op -> int8_op -> dequant 相比,由于所需的 dtype 转换数量更多,因此会有性能损失。

  4. 如果使用 PTQ,请考虑使用 QAT 来恢复量化造成的某些精度损失。

Int8 量化提示

  1. 如果使用逐张量权重量化,请考虑使用逐通道权重量化。

  2. 如果您在 fbgemm 上进行推理,请确保将 reduce_range 参数设置为 False(如果您的 CPU 是 Cooperlake 或更新版本)或 True(否则)。

  3. 审核不同样本中的输入激活分布变化。如果此变化较大,则该层可能适合动态量化,但不适合静态量化。

数据敏感错误

如果您使用静态量化,并且您的输入数据中很小一部分导致量化错误较高,则可以尝试

  1. 调整您的校准数据集,使其更能代表您的推理数据集。

  2. 手动检查(使用数字套件)哪些层具有较高的量化错误。对于这些层,请考虑将它们保留在浮点中或调整观察者设置以选择更好的比例和零点。

实现错误

如果您在自己的后端使用 PyTorch 量化,您可能会看到操作的参考实现(例如 dequant -> op_fp32 -> quant)与目标硬件上 op 的量化实现(例如 op_int8)之间的差异。这可能意味着以下两件事之一

  1. 差异(通常很小)是由于目标内核在目标硬件上的特定行为与 fp32/cpu 相比而导致的。一个例子是在整数数据类型中累加。除非内核保证与参考实现的按位等效性,否则这是预期的。

  2. 目标硬件上的内核存在精度问题。在这种情况下,请联系内核开发人员。

数值调试工具(原型)

警告

数值调试工具是早期原型,可能会发生变化。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题的解答

查看资源