OE Agent“天工”新版本发布,请前往论坛顶部查看,欢迎试用并反馈~
查看OE-Skills
专栏算法工具链【地平线J6工具链进阶教程】多阶段模型量化方案简介

【地平线J6工具链进阶教程】多阶段模型量化方案简介

芯链情报局2026-07-02
23
0

1. 问题描述

智驾算法模型训练过程中,可能存在如下情况:使用Data1完成一阶段浮点模型model_stage1_float训练后,更换训练数据为Data2,固定model_stage1_float权重,用model_stage1_float模型浮点输出,训练二阶段模型model_stage2_float,最后拼到一起成 model_all_float 用于量化部署。

在进行量化时,按需使用对应的Data用于不同阶段模型的校准。如果model_stage1仅进行calib,model_stage2很容易想到如下两套量化方案:

方案1:model_stage2接model_stage1的浮点输出进行calib/qat。但这存在问题:model_stage2 calib/qat时未感知到 stage1伪量化的误差。
方案2:model_stage2接model_stage1的calib输出进行calib/qat。但这存在问题:对model_stage1_calib的精度要求很高,例如当model_stage1 calib + model_stage2 float存在badcase时,需要增加model_stage1敏感int16,造成model_stage1延迟增加。

对于上述两种方案遇到的问题,都可以通过对model_stage2_float进行finetune来解决,下面进行详细描述。

2. 多阶段模型量化方案

如果上述“方案2”的模型精度与延迟均满足预期,则不需要使用下面的方案。

当model_stage1仅需要calib时,推荐在model_stage2进行calib前,先使用model_stage1 calib后的输出,对model_stage2进行浮点finetune,保证model_stage1_calib+model_stage2_float指标与可视化符合预期。然后,再对finetune后的 model_stage2_float进行calib。这样可以让model_stage1的伪量化误差被model_stage2浮点finetune“消化”,让最终部署的多阶段模型量化损失最小。

强烈建议在latency达标的情况下,将model_stage1输出尽可能设置高精度类型,例如linear/conv输出建议配置为int16,这里有两点需要注意:

  1. model_stage1输出直接作为model_stage2输入时,需要保证model_stage1输出dtype与model_stage2输入dtype一致。例如model_stage1是linear输出,model_stage2第一个算子是conv,即使model_stage1 linear输出支持int32/fp32更高精度类型,由于model_stage2 conv输入最高仅支持int16类型,所以model_stage1 linear输出也只能设置为int16。

  2. model_stage1输出直接作为model_stage2输入时,需要保证model_stage1输出scale与model_stage2输入scale一致。具体做法是:读取model_stage1输出scale,转换得到threshold,然后通过ModuleNameTemplate配置model_stage2对应输入quant的threshold。

关于这两点的代码示例详见下一节。

当model_stage1需要calib+qat才能达标时,则推荐在model_stage2进行calib前,先使用model_stage1 qat后的输出,对model_stage2进行浮点finetune,保证model_stage1_qat+model_stage2_float指标与可视化符合预期。后续做法与上小节一致。

注意

  1. 多阶段模型量化部署,一定要做好代码模块化管理。

  2. 每个阶段的模型,分别prepare。

在进行model_stage2_float finetune 和 model_stage2 calib时,都应该冻结model_stage1_calib/qat模型,此时,一定要确保冻结住(相同输入时,每次推理结果不变),例如对model_stage1_calib进行冻结,示例如下。

3. 全流程代码示例

3.1 非hat用户

非hat用户可参考如下示例(代码可直接运行):

  1. Stage1: CNN Backbone,末尾为 Conv2d(无 BN/ReLU)

  2. Stage2: CNN Head,开头为 Conv2d

关键点:

  1. Stage1 输出 dtype 必须与 Stage2 输入 dtype 一致(均为 qint16)

  2. Stage1 输出 scale 必须与 Stage2 输入 scale 一致(通过 threshold 传递)

  3. Stage2 应先用 Stage1 calib 输出做 float finetune,再进行自身校准

如下图,查看stage1.hbm输出scale/dtype 和stage2.hbm输入scale/dtype,可以发现是匹配的。

3.2 hat用户

hat用户可参考如下示例(代码可直接运行):

算法工具链
技术深度解析官方教程征程6
评论0
0/600