• 文档 >
  • 量化 >
  • 量化精度调试
快捷键

量化精度调试 ¶

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

  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. 注意:数据类型转换会增加额外的性能成本。例如,与 fp32_op -> fp32_op -> quant -> int8_op -> int8_op -> dequant 相比, fp32_op -> quant -> int8_op -> dequant -> fp32_op -> quant -> int8_op -> dequant 将会有性能惩罚,因为需要更多的数据类型转换。

  4. 如果您正在使用 PTQ,请考虑使用 QAT 来恢复一些量化带来的精度损失。

Int8 量化技巧 ¶

  1. 如果您正在使用按张量权重量化,请考虑使用按通道权重量化。

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

  3. 审查不同样本的输入激活分布变化。如果这种变化很大,该层可能适合动态量化,但不适合静态量化。

数据敏感错误 ¶

如果您正在使用静态量化,并且您输入数据的一小部分导致量化误差较高,您可以尝试:

  1. 调整您的校准数据集,使其更具有代表性。

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

实现错误

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

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

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

数值调试工具(原型)

警告

数值调试工具处于早期原型阶段,可能发生变化。

  • torch.ao.ns._numeric_suite 贪婪模式数值套件

  • torch.ao.ns._numeric_suite_fx FX 数值套件


© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,主题由 Read the Docs 提供。

文档

PyTorch 开发者文档全面访问

查看文档

教程

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

查看教程

资源

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

查看资源