模型量化编译

针对不同部署需求设计,为适配边缘计算平台、实现模型的高效部署与运行,地平线依据是否需要对量化后的参数进行调整,推出了两种量化方案:训练后量化(PTQ)和量化感知训练(QAT)。 两种方法的操作区别如下图所示(图左为 PTQ,图右为 QAT):

训练后量化(PTQ) 是使用一批校准数据对训练好的模型进行校准,将训练过的FP32模型直接转换为定点计算的模型,过程中无需对原始模型进行任何训练。 只对几个超参数调整就可完成量化过程,且过程简单快速,无需训练,因此此方法已被广泛应用于大量的端侧和云侧部署场景,我们优先推荐您尝试PTQ方法来查看是否满足您的部署精度和性能要求

量化感知训练(QAT) 是将训练过的模型量化后又再进行重训练。由于定点数值无法用于反向梯度计算,实际操作过程是在某些op前插入伪量化节点(fake quantization nodes),用于在训练时获取流经该op的数据的截断值, 便于在部署量化模型时对节点进行量化时使用。我们需要在训练中通过不断优化精度来获取最佳的量化参数。由于它需要对模型进行训练,对操作人员技术要求较高。

PTQ与QAT链路对比

J6工具链虽然支持PTQ与QAT这两套模型转换链路,但是在实现工具、操作流程、性能表现及适用场景上各有侧重,核心差异如下:

训练后量化(PTQ):基于hb_compile命令行工具转换模型,只需配置yaml文件和校准数据集,即可一站式完成模型的图优化、校准、量化、编译全流程。 该量化方式快捷易用,但仅基于数学统计方式的离线量化不利于模型迭代,还可能引发难以解决的特殊问题,因此通常用于模型的早期评测,或结构简单的模型量化场景

量化感知训练(QAT):基于PyTorch开源框架,以plugin插件的形式提供模型量化能力,并调用hbdk编译器的API实现模型的定点化和编译。 该链路支持对校准后的模型进行进一步的finetune训练,尽管上手难度和训练成本相对较高,但对应地,精度上限也会更高,更适用于模型迭代优化需求

推荐使用流程

综合上文对PTQ、QAT两条链路的特性总结与优缺点对比,针对在不同平台上进行浮点模型量化的场景,我们给出如下推荐的工具链使用流程:

  1. 首先,需导出浮点ONNX模型(opset10~19),建议优先基于PTQ链路进行快速的模型结构验证及全int8性能上限评估。如果性能和精度均满足预期,可直接进行板端部署;如精度不符合预期,可进一步进行 PTQ 精度调优。

    • 在J6 B/E/M平台上,直接在int8+int16混合精度下进行精度调优,直至精度符合预期,最终进行板端部署。

    • 在J6 H/P平台上,直接在int8+int16+float16混合精度下进行精度调优,直至精度符合预期,最终进行板端部署。

  2. 若遇到PTQ链路无法解决模型精度的特殊问题,需切换到QAT链路对模型进行量化。同样建议您先完成模型结构验证及全int8性能上限评估。如果性能和精度均满足预期,可直接进行板端部署;如精度不符合预期,可进一步进行 QAT 精度调优。

    • 在J6 B/E/M平台上,优先在全int16配置下将精度训练至符合预期,然后再降低int16比例,实现int8+int16混合精度下性能和精度的调优,最终进行板端部署。

    • 在J6 H/P平台上,优先在全int16+float16配置下将精度训练至符合预期,然后再降低int16+float16比例,实现int8+int16+float16混合精度下性能和精度的调优,最终进行板端部署。

以上为推荐使用流程,您可以根据实际需求灵活选择使用PTQ或QAT方案。后文中,我们将对训练后量化(PTQ),量化感知训练(QAT),模型转换编译过程中可能涉及的模型修改场景以及X86仿真环境下的进一步操作进行详细的介绍。