深度剖析多任务模型 QAT 策略

本文为笔者个人见解,如有不同意见欢迎评论

1.引言

为了节省端侧计算资源以及简化部署工作,目前智驾方案中多采用动静态任务融合网络,地平线也释放了 Lidar-Camera 融合多任务 BEVFusion 参考算法。这种多任务融合网络的浮点训练策略可以简述为:

首先在大量数据的条件下完成多任务模型 backbone 部分的浮点训练;

然后,固定 backbone 的权重,分别接多个 task head 进行单独的训练。

在这种浮点训练策略下,QAT(量化感知训练)里的 calibration(校准)和量化训练策略跟常规的单 task 模型差别较大。常规的单 task 模型一般就是用那种比较固定、普遍适用的训练办法,不过碰到复杂多变又有特定需求的情况,它的局限性就慢慢显现出来了。

这篇文章会结合具体的场景,对 calibration 和量化训练策略进行分析,然后提出一些笔者个人独特的看法,希望相关领域的研究和实践提供点有用的参考和启发。

2.量化训练策略

本文将以具有两个任务头 task_head1 和 task_head_2 的多任务模型为例进行描述。

2.1 步骤描述

此步骤的前提是模型已完成浮点训练。

在进行后续操作之前,必须确保模型已经成功地完成了浮点训练。只有在这个前提条件得到满足的情况下,才能保证后续的工作能够顺利进行,并且得到准确和可靠的结果。

step1:

首先对骨干网络(backbone)进行校准/量化感知训练(calibration/qat),在满足量化精度要求后,保存校准/量化感知训练的权重(calib/qat 权重)。

step2:

验证 step1 中 backbone 在部署 head 上的精度,具体操作是对 backbone 进行伪量化处理,而 task_head1 和 task_head2 保持浮点计算,然后在验证集上测试这两个 head 的精度。

step3:

step2 验证出的 task_head1 精度不符合预期,则说明 backbone 的伪量化对 task_head1 的浮点精度不够友好,所以需要对模型做以下调整,具体操作方案如下:

对部署的 task_head1 和 task_head2 做 finetune,从而使得 task_head1 和 task_head2 去适应 backbone,直到浮点精度符合预期;

固定 backbone,对 task_head1 做 calib 和 QAT(backbone 的 weight 和 scale 不更新)

固定 backbone,对 task_hea2 做 calib 和 QAT(backbone 的 weight 和 scale 不更新)

固定 backbone 的 weight 和 scale 的方式见下文。

step4:

step2 验证出的 head 精度符合预期,则使用以下方案:

固定 backbone 的 weight 和 scale,然后分别对 task_head1 和 task_head2 做 calib/qat;

2.2 固定 weight 的方式

固定 weight 采用 pytorch 的方法,包括固定 bn 和 stop 梯度更新这两个操作,如下所示:

#固定bn` `model.eval()` `disable grad` `for param in model.parameters():` `    param.requires_grad = False

2.3 Fix weight 和 activation scale 的方式

征程 6 工具链中具有多种 Fix scale 的方式,本文将介绍其中的一种。自定义固定weightactivation的激活 scale 的 qconfig,即配置"averaging_constant": 0,如下为自定义的int8 weightint8/int16 activation固定 scale 的方式:

from horizon_plugin_pytorch.quantization.qconfig import get_default_qconfig
qat_8bit_fixed_weight_16bit_fixed_act_fake_quant_qconfig = (get_default_qconfig(weight_qkwargs={"dtype": qint8,#weight采用int8量化"averaging_constant": 0,#averaging_constant 置为 0 以固定 scale},activation_qkwargs={"dtype": qint16,#采activation用int16量化"averaging_constant": 0,#averaging_constant 置为 0 以固定 scale},)
)
qat_8bit_fixed_weight_8bit_fixed_act_fake_quant_qconfig = (get_default_qconfig(weight_qkwargs={"dtype": qint8,"averaging_constant": 0,},activation_qkwargs={"dtype": qint8,"averaging_constant": 0,},)
)

2.4 示意图

本节将会针对上述步骤展开详尽且全面的图文阐释,通过清晰直观的图片和详细准确的文字说明,为您逐步剖析每个步骤的关键要点和操作细节。

2.4.1 验证 backbone 变化对 head 的影响

此步骤的验证前提是 backbone 已经完成了 calib/qat,并且伪量化精度已经满足预期,这里建议 backbone 的伪量化精度要达到浮点精度的 90% 以上。

模型改造:在 backbone 的 forward 代码的输入端插入 Quanstub,输出端插入 Dequanstub;

加载权重:在 prepare 之前加载 task_head1 或者 task_head2 的浮点权重, 在 prepare 之后加载 backbone 的 calib/qat 权重,这里要特别注意加载权重的顺序;

calibration:配置模型状态(如下图),注意这里模型的状态要配置为 VALIDATION,然后进行伪量化的精度的验证;

如果某个 head 的精度较差,那么将固定 backbone 的权重,对此 head 的权重进行微调。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886910.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON

猫步简历是一款免费开源的AI简历生成与制作神器,旨在帮助求职者轻松创建独特、优美且专业的简历。无论是应届毕业生、职场新人,还是资深专业人士,猫步简历都能满足您的需求。它支持导出超高清PDF、图片、源码级JSON数据等多种格式,并提供AI智能创作、AI语种切换、AI润色等强…

老年人能力评估uni-app

登录界面 (https://img2024.cnblogs.com/blog/3474174/202502/3474174-20250219211712486-62129844.png) 老年人信息界面添加老年人信息界面这个不知道哪里写错了,选择器的选项看不到。我本来想和web端一样,用弹出对话框来添加老年人信息的,结果整了半天,对话框弹不出来,然…

ICLR 2025 时间序列

1. TimeMixer++: A General Time Series Pattern Machine for Universal Predictive Analysis 链接:https://openreview.net/forum?id=1CLzLXSFNn 关键词:多任务(预测,分类,插补,异常检测)、基础模型 TL;DR:TimeMixer++ 是一种时间序列模式机器,它采用多尺度和多分辨…

用于 Qt 的 OpenCV 编译 (CMake 方式) 问题解决

本文主要参考 《QT+opencv源码编译》:https://blog.csdn.net/m0_49156395/article/details/135721596 详细步骤请阅读上面文章,本文主要着重强调其中的关键步骤。 一、Configure(CMakeList.txt)和 generate(Makefile) 过程(11)先进行初次Configure "Where to build th…

【硬件测试】基于FPGA的2ASK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR

1.算法仿真效果 本文是之前写的文章基于FPGA的2ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR的硬件测试版本。在系统在仿真版本基础上增加了ila在线数据采集模块,vio在线SNR设置模块,数据源模块。硬件ila测试结果如下:(完整代码运行后无水印…

即将迎来全民编程时代

最近,我的这种情绪现在越来越强烈了。 还记得我刚开始使用AI辅助编程的时候,写出来的代码能运行就不错了,还别想着要他理解需求和修改bug了。直到2024年年底到2025年年初这短短两个多月的时间,我对它的想法变成了,它是我们的编程搭子,甚至可以说是免费劳动力了。 再试编程…

.net8:拦截器Interceptors

在C#12中,引入了拦截器,但一直是试验性的功能,所以自己初步看了一下,没有写文章,最近在看AOT时,发现Dapper.AOT已经用上了这个功能,觉得还是整理一下,分享出来吧,如果以后这个功能改变了,或移除了,请无视这篇文章。下面是微软官方文档的提示:拦截器是一项试验性功能…

基于电压矢量变换的锁相环simulink建模与仿真

1.课题概述 基于电压矢量变换的锁相环simulink建模与仿真,这个模型的基本构架如下所示:2.系统仿真结果由图中锁相结果可以看出,利用新型锁相环技术在电网电压平衡条件和不平衡条件下均可对基波正序电压分量实现快速准确的锁相输出。这将在后面研究系统 电压不平衡环境下负序…

Spatial Data Analysis简易教程

1. 因子的多重共线性 (1)Perason相关系数(不推荐) SPSS-分析-》相关-》双变量-》确定,选择相关系数较小的因子:但是在分析-》回归-》线性中共线性诊断中,仍有3个变量的VIF>10,因此,该方法不可取。(2)共线性诊断 分析-》回归-》线性,在选项中勾选共线性诊断,方法…

基于线性核函数的SVM数据分类算法matlab仿真

1.程序功能描述 基于线性核函数的SVM数据分类算法matlab仿真,通过程序产生随机的二维数据,然后通过SVM对数据进行分类,SVM通过编程实现,不使用MATLAB自带的工具箱函数。 2.测试软件版本以及运行结果展示MATLAB2022A版本运行 (完整程序运行后无水印) 3.核心程序 % …

服务器 压测cpu

一. 使用的工具 1. taskset简单理解为: -c 找 cpu核心 -p 找 已存在进程2. stress 二 . 查看cpu核心个数 ,命令 lscpu 三. 使用taskset 与 yes 命令简单测试,htop查看cpu使用率 1. 测试第一个cpu核心 taskset -c 0 yes >> 1.txt 2. 测试第二个cpu核心taskset -c 1 y…

宽字节注入 sqli-lab lesson 32

1.判断注入 1.输入 1,addslashes函数将 进行转义变为 \ ,此时的单引号仅作为普通的字符2.输入1%df,addslashes 函数将 进行转义变为 \ ,此时 %df%5c会进行结合变成了一个汉字 運,因此SQL查询语句成功被改变了从而引起了报错 1%df =>1%df%5c3.将多余的进行注释然后按照…