专栏算法工具链【QAT查表算子调优-1】如何定位引起误差的查表算子

【QAT查表算子调优-1】如何定位引起误差的查表算子

momo(社区版)2025-05-22
310
0

前言

在端侧部署时(如在移动设备、嵌入式芯片上),为了加速模型推理、减少功耗和资源开销,往往会将某些计算复杂的函数(如 exp、log、tanh、sigmoid、softmax 等)转为查表操作。查表算子在转成定点计算时不可避免地会出现误差,此时就需要定位引起精度下降的具体算子以及对其进行针对性的优化。

本文将讲述在使用地平线QAT链路基于J6 系列平台进行模型部署时,对查表算子进行精度调优的相关手段,主要包括以下内容:

  • 如何确定是定点查表导致的误差?

  • 如何确定具体的定点查表算子导致的误差?

 

如何确定是定点查表导致的误差

当QAT模型的精度处于正常状态,然而QAT模型export出来的qat.bc 文件精度却出现异常情况时,并且在这种情况下,我们已经对导出 qat.bc 文件的整个流程进行了全面且细致的检验,确认该流程不存在任何错误。那么在这样的前提条件之下,我们此时就可以开始着手验证是否是由于查表算子的因素导致了精度下降。
horizon_plugin_pytorch提供了api来辅助进行查表算子精度的验证,具体思路是将qat model中所有的查表算子转成定点,然后在验证集上进行精度的评测,如果和qat.bc的现象一样都出现了比较严重的精度下降问题,那么就说明是因为查表算子导致的误差。
以下是horizon_plugin_pytorch提供的api的使用示例,如下所示:

如何确定引起误差的查表算子?

在确定是查表算子导致的精度误差后,我们需要进一步确定是哪些查表算子导致的误差。一般来说,模型中会包含多个多种查表算子。

具体方法是结合QAT精度debug工具horizon_plugin_profile来做qat_model和qat_lut_model(查表转定点的qat model)的精度debug,然后根据敏感度来确定具体的查表算子。

以下是QAT精度debug工具的使用示例,如下所示:

debug工具运行完成后,在out_dir会生成系列产物,这里我们主要关注逐层相似度和输出敏感度,compare_per_layer_out.csv和output_xxxx_L1_sensitive_ops.txt文件。

在获得敏感度txt文件后,我们就根据敏感度顺序逐步来确认引起误差的算子,具体思路如下:

  1. 将qat mode中所有的查表算子转成定点;

  2. 然后将敏感度靠前的差表算子回退到浮点进行精度评测;

如果在将某个/类别查表算子回退到浮点以后,精度指标与qat model区别不大,那么就说明是这个/类查表导致的精度下降。

下面为具体的操作代码:

这边补充说明两点:

  • 侧重关注output_xxxx_L1_sensitive_ops.txt中L1误差较大的算子,可以先回退L1数值较大的算子到浮点;
  • 确定具体的查表算子可能要进行多次精度评测,建议采用二分法,即在第一次进行精度评测的时候尽可能选择较多的算子进行回退(理想情况是第一次精度就恢复),然后使用二分法进一步确定具体的算子;

在下一篇文章中,我们将演示在定位到具体算子后,如何进行精度调优,敬请期待!!!

 

算法工具链
社区征文官方教程技术深度解析
评论0
0/1000