依据美团方针检测模型开源结构 YOLOv6,本文供给了一种通用的量化布置计划,在坚持精度的一起大幅进步了检测的速度,为通用检测的工业化布置探究出一条可行之路,期望能给大家带来一些启示或许协助。
1. 背景和难点
YOLOv6 是美团发布的一款开源的面向工业运用的 2D 方针检测模型 [1],主要特点是速度快、精度高、布置友爱,在美团许多视觉事务场景中都有着广泛的运用。经过量化(Quantization)进步推理速度是实践工业运用中的根本操作,但由于 YOLOv6 系列模型选用了很多的重参数化模块,怎么针对 YOLOv6 进行高效和高精度的量化成为一个亟待处理的问题。本文旨在处理 YOLOv6 量化方面的难题,并以 YOLOv6s 模型为例,从练习后量化(Post-Training Quantization, PTQ)和量化感知练习(Quantization-Aware Training, QAT)两个方面进行剖析,探究出了一条切实可行的量化计划。
YOLOv6 选用了多分支的重参数化结构 [2](如图 1A 所示),经过在网络结构层面参加人工先验能够在练习阶段让模型更好收敛。在推理阶段,多分支能够等价兼并为单路,然后进步运转速度。但现有的练习后量化办法,不能很好应对多分支结构带来的剧烈变动的数值规模,导致量化后发生严峻的精度丢失 [3]。别的,怎么针对多分支结构规划量化感知练习(QAT)办法也面临着较大的应战。蒸馏常被用来辅佐 QAT 进步功能,但怎么运用 2D 方针检测的蒸馏办法来辅佐 YOLOv6 模型的量化,也需求规划合理的计划在实践运用中进行查验。
2. 量化计划实战
2.1 重参数化优化器
YOLOv6 网络中很多运用重参数化结构,在进步模型练习精度的一起能够明显下降模型布置推理延时,但也带来了模型量化布置方面的难题。对重参数化网络的直接量化一般会带来不可承受的精度丢失,例如 RepVGG-B1 [2] 网络在 ImageNet 数据集上的浮点精度为 78.42%,选用 TensorRT 后量化(PTQ)的量化模型精度则下降为 54.55%。
此外,由于重参数化结构在练习和布置时结构不同,因而无法直接适配现有的量化感知练习(QAT)办法,怎么运用 QAT 办法来进步 YOLOv6 量化模型的精度,相同存在着应战。近期,一篇重参数化优化器的作业 RepOpt [3] 较好地处理了重参数化结构的量化问题。
2.1.1 RepOpt
RepOpt [3] 对重参数化结构量化困难的问题进行了研讨,发现重参数结构的分支交融操作,明显放大了权重参数散布的规范差。异常的权重散布发生了过大的网络激活层数值散布,进一步导致该层量化丢失过大,因而模型精度丢失严峻。
鉴于此,咱们统计了依据 RepVGG 结构的 YOLOv6 模型(YOLOv6s_repvgg)各层的权重及激活数值散布,剖析了 YOLOv6 中的重参数化层的数据散布。下图 2 以 “Rep_p4.block.0.rbr_reparam” 层为例,给出其特征图数值散布直方图,咱们发现其数值广泛散布在 [0, 57] 的区间内。显然,选用现有的 INT8 量化办法,无论怎样挑选量化缩放参数 (scale),都会发生较大的量化误差。
为处理这一问题,RepOpt 提出了一种依据优化器的重参数化规划(如下图 3 所示),经过梯度掩码(Gradient Mask)的办法在网络练习反向传播的进程中参加先验,确保了练习精度可到达 RepVGG 相近的水平,而网络结构则在练习和推理阶段始终坚持普通的 VGG 结构,这种练习办法请参阅 RepOpt [3]。该作业中提出的 RepOpt-B1 网络模型,在浮点精度与 RepVGG-B1根本共同的情况下,量化模型精度进步超过 20%,极大地改进了重参数化网络的量化掉点问题。此外,RepOpt模型的练习速度快,内存占用也比较低。
2.1.2 RepOpt 版别的 PTQ
咱们完成了 RepOpt 版别的 YOLOv6s网络(YOLOv6s_repopt),到达了与 YOLOv6s_repvgg 共同的浮点精度 42.4%(300 epochs),两个版别的网络结构在布置阶段坚持共同。咱们首要剖析了 YOLOv6s_repopt 模型的数据散布特征。
如图 2 所示,给出了“Rep_p4.block.0.rbr_reparam” 层的特征图数值散布直方图,能够看到数值严密散布在 [0, 10] 的区间内,比较 YOLOv6s_repvgg 的数值散布关于量化操作更加友爱。进一步选用 TRT 的后量化办法进行模型量化布置,能够看到 YOLOv6s_repvgg 的量化网络精度下降了 7.4%,在实践工程中根本不可用。而 YOLOv6s_repopt 网络的量化模型精度为 40.9%,精度丢失仅为 1.5%,比较原版模型有了极大的改进。
2.1.3 RepOpt 版别的 QAT
此外,运用 RepOpt 结构处理了本来的 RepVGG 网络无法直接运用现有量化感知练习的问题。关于结构重参数化的 RepVGG 网络,怎么运用 QAT 来康复量化模型精度,咱们一直存有困扰。如下图 4(左)所示,假如对重参数化操作之前的多分支网络进行 QAT,对每个分支分别增加伪量化算子进行量化感知练习,由于每个分支的量化参数不同,导致多分支结构无法等效交融进行高功能布置;假如对重参数化操作之后的单分支网络进行 QAT, 由于网络中不再有 BN 层,运用 QAT 办法进行微调并不简略康复到浮点精度。而关于 RepOpt 结构网络则不存在这一问题,由于 RepOpt 在练习和布置中网络结构是坚持共同的。
如图 4 (右)所示,对 RepOpt 的卷积等算子参加伪量化节点进行量化感知练习,进步量化模型精度,然后直接布置该量化模型,而不需求再进行模型交融的操作。后文,咱们将给出具体的 QAT 算法及对模型精度的进步成果。
2.2 依据量化灵敏度剖析的部分量化
YOLOv6s_repopt 在 PTQ 后的 mAP 到达了 40.9%,尽管比之前的 35.0% 有了很大的改进,但仍然有 1.5% 的精度丢失,还无法满意事务需求。因而,咱们选用了部分量化(Partial PTQ),一种使网络中的部分量化灵敏层康复浮点核算,来快速康复量化模型精度的办法。首要需求对网络中的每一层都进行量化灵敏度剖析。
咱们在 YOLOv6s-repopt 网络上对常用的灵敏度剖析办法均方误差(MSE)、信噪比(SNR)、余弦相似度(Cosine Similarity)进行了比照测验。量化校准(calibration)测验运用 4 个 batch 的数据,灵敏度核算用 1 个 batch,batch 巨细设置为 32。
测验时,每次只对一层进行量化,获取该层的激活数据后核算灵敏度数值,代表了该层的量化灵敏度。作为比照,咱们能够直接核算网络在 COCO val 数据集上的 mAP,运用检测精度作为该层的量化灵敏度,即检测精度越高,该层灵敏度越低(下文称为 mAP 办法)。
测验成果如下图 5 所示,咱们对测验成果进行归一化后,从不同灵敏度剖析成果中挑选灵敏性最高的 6 层跳过,核算部分量化精度。
部分量化精度如下表 3 所示,能够看到:mAP 办法取得了最好的作用,能够有用代表 YOLOv6 灵敏度剖析成果。但由于 mAP 办法需求频频地核算验证集精度,耗时太久且简略过拟合验证集,因而在实践项目中为了寻求功率,咱们建议运用 MSE 办法。
2.3 依据通道蒸馏的量化感知练习
至此,咱们优化后的 PTQ 的精度到达了 42.0%,进一步进步模型精度需求引进量化感知练习( QAT)。量化感知练习(Quantization Aware Training, QAT)能够改进 PTQ 量化精度丢失,经过在练习进程中对卷积等算子参加伪量化操作(如图 4 所示),使得网络参数能更好地习惯量化带来的信息丢失,然后明显下降量化后的精度丢失。
模型蒸馏作为一种有用的进步小模型精度的办法,在 QAT 进程中被广泛运用,来进步量化模型的精度。以下,咱们将探究针对 YOLOv6 网络的量化感知练习办法。
2.3.1 通道蒸馏
传统的分类网络在蒸馏时,往往对最终一层输出的 logits 进行蒸馏;可是在检测网络中一般选用“特征图”蒸馏的办法,直接让学生网络(student)输出的特征图拟合教师网络(teacher)输出的特征图(一般不会选取整个特征图,而是一些感兴趣区域)。
这种办法的缺陷是特征图中的每个 pixel 对蒸馏的丢失贡献相同。咱们选用了每通道散布蒸馏 [6],即让 student 输出的每个通道的散布拟合 teacher 输出的每个通道的散布。两种办法的区别如下图 6 所示:
2.3.2 YOLOv6 量化感知蒸馏结构
针对 YOLOv6s,咱们挑选对 Neck(Rep-PAN)输出的特征图进行通道蒸馏(channel-wise distillation, CW)。别的,咱们选用“自蒸馏”的办法,教师模型是 FP32 精度的 YOLOv6s,学生模型是 INT8 精度的 YOLOv6s。下图 7 是一个简化暗示图,只画出了 Neck 的一个分支:
如下表 4 所示,在 Partial QAT 中引进通道蒸馏计划(CW),量化精度进一步进步了 0.3%。
3. 布置时优化
3.1 图优化
量化布置时,能够直接运用 TensorRT 的 PTQ 接口进行生成量化引擎,可是这种办法往往精度丢失较大。因而,一般要先进行 QAT,使量化模型精度满意事务需求,然后导出带有“Quant”、“DeQuant”节点的 ONNX,最终再运用 TensorRT 构建量化引擎。咱们发现这两种计划最终生成的图结构并不相同,导致布置模型的实践运转功率存在很大的差异,一般 QAT 办法生成的模型功率更低。
咱们在 NVIDIA T4 机器上对量化模型进行了比照测验(见下表 5)。尽管 QAT INT8 模型的 QPS 比 FP16 高了~27%,可是离 PTQ INT8 还有较大差距。咱们对此现象进行了详尽的剖析,发现原因是 QAT 引进的“Quant”,“DeQuant”节点打破了原有 TensorRT 的交融战略,导致了许多算子无法交融,然后影响了最终量化引擎的功能。在这一节中,咱们以 YOLOv6s_repopt 为例,展现一种定位具体瓶颈的图优化办法。在量化实践中,图优化是一个很有用的手法,咱们能够依法炮制,进步模型的 QPS。
3.1.1 功能剖析
首要,咱们运用 nsys 东西 [5] 对 QAT INT8 的模型和 PTQ INT8 模型进行了功能剖析,如下表所示:
从中咱们发现,QAT INT8 有 10.8% 的 kernel 执行了 permutationKernelPLC3 操作,这些操作对应 quantize_scale_node 节点,如下图 8 所示:
3.1.2 图结构剖析
为什么 QAT INT8会有很多的 permutationKernelPLC3 操作?咱们运用 trtexec 和 pltEngine 东西,画出了 PTQ INT8 和 QAT INT8 的核算图,并进行了细心的剖析。下图 9 是其间一个子图的比照:
QAT INT8 核算图中 neck.reduce_layer1.conv 交融节点输出精度是 FP32,而且跟了 2 个 quantize_scale_node 节点,而 PTQ INT8 图中的 neck.reduce_layer1.conv 交融节点输出的是 INT8。很显然,QAT 图中 FP32 和 INT8 之间的转换会带来额定的开销。咱们又运用 Netron 来剖析 QAT INT8 的 ONNX 图结构,找到了 neck.reduce_layer1.conv 这个方位,图 10 给出该节点暗示。
经过剖析 ONNX 图结构,咱们发现了QAT INT8 引擎中 neck.reduce_layer1.conv 输出为 FP32,而且为两个分支保留了quantize_scale_node 的原因。由于 neck.upsample1.upsample_transpose 分支的输入量化 scale 为 0.083,而 neck.Rep_n3.conv1 分支的输入量化 scale 为 0.105,这两个节点输入尺度是不同的,导致 neck.reduce_layer1.conv 无法直接输出为 INT8。
能够看出,关于同一个输出,输入到多路分支后为何 scale 不同的,原因是右边的分支经过了 concat 操作,会导致输出的数据散布发生改变,再进行激活校准(Activation Calibration)时,会得到的不同的最佳截断值 (Activaition Max)。
3.1.3 图结构优化
依据上面的剖析,假如一个节点的输出,输入到不同的分支节点中,而且分支节点的量化 scale 不同,则 quantize_scale_node 节点无法交融,进而导致了额定的开销。怎么处理这个问题?咱们运用了一个简略的办法,便是强制使所有分支节点的量化 scale 相同(依据经验,在同一数量级上的 scale 能够安全兼并),即直接修改 QAT 网络中的 Quantizer 节点的参数。
咱们整理了 YOLOv6s_repopt 中所有需求进行 scale 交融的节点(如表 7 所示),由于 TensorRT 的 8 bit 的量化规模是[-127,127],所以只需求将多路分支的 Activation Amax 设为同一个值,一般取多路分支中的最大值。
3.1.4 功能测验
经过以上的多路分支的 scale 交融后,咱们再次运用 trtexec 和 pltEngine 东西,画出了 QAT INT8 进行优化前后的图结构。能够发现,quantize_scale_node 节点现已悉数被交融。
咱们测验了经过图优化的 QAT 模型,QPS 到达了 528,功能十分接近 PTQ 的 556,而且 mAP 仍然坚持优化前的 42.1%。
3.2 线上服务优化
咱们在 NVIDIA T4 服务器上进行了端到端的吞吐测验,运用“多实例”并发处理的技能,YOLOv6s_repopt INT8 QPS 到达了 552,相较 FP16 进步了~40%。咱们对服务器的各项方针进行了监测,发现此时 T4 GPU 的运用率只要 95%,还有压榨空间,而 16 核 CPU 运用率现已超过了 1500%,几乎满负荷运转。咱们估测整个线上服务的“瓶颈”可能在 CPU,而图片预处理会运用很多 CPU 资源。
3.2.1 DALI 预处理
为了处理 CPU 预处理带来的“瓶颈”,咱们选用了 NVIDIA 的 DALI 库,将预处理直接放到 GPU 中运算。该库能够在 GPU 上对二进制图片进行解码和预处理,极大的缓解 CPU 瓶颈,下图 12 为 DALI 的经典流程。
3.2.2 吞吐测验
如下图 13 所示,INT8 + DALI 的吞吐到达了 1182 imgs/s,比 INT8 吞吐进步了 1.14 倍。引进 DALI 预处理后,T4 GPU 运用率到达了100%,而 16 核 CPU 的运用率则下降到了 1100% 左右,部分 CPU 资源得到了“解放”。别的,咱们也测验 FP16 + DALI 的吞吐,反而有略微的下降。咱们估测是 DALI 抢占了部分 GPU 核算资源,而 FP16 服务的瓶颈在 GPU,所以对整体功能发生了负面影响。
4. 总结
综上所述,本文依据 YOLOv6 V1.0 版别,以 YOLOv6s 为例探讨了依据重参数化结构规划的 2D 检测模型的量化难点和具体计划,在模型精度根本坚持的前提下,经过量化加快,进步了约 40% 的 QPS。布置时的预处理优化则额定进步了 214%,极大地进步了工业布置吞吐能力。下表列出了本文测验的办法及叠加作用。
本文运用的速度测验环境见表 11, 测验输入 batch size 为 1,尺度为 640×640。
YOLOv6 版别更新
近来,YOLOv6 现已更新了 V2.0 版别,并新增了中大型网络,对轻量级和小网络的功能进行了全面升级,进一步进步归纳功能,量化作用也得到大幅进步,其间 YOLOv6-S 量化模型到达了 43.3mAP 和 869 FPS (TensorRT 8.4)。更多具体内容请关注官方出品的技能陈述 [7]。
咱们期望经过共享本文的实践,进一步推动最新通用方针检测算法的落地。未来,咱们会和业界同行一道,探究更优的量化计划,继续进步量化精度和推理速度,助力降本增效,深化事务价值。
5. 参阅文献
- [1]YOLOv6:又快又准的方针检测结构开源啦
- [2] RepVGG: Making VGG-style ConvNets Great Again,arxiv.org/abs/2101.03…
- [3] ReOpt: Re-parameterizing Your Optimizers rather than Architectures
- [4] SNR: github.com/openppl-pub…
- [5] Nsight-systems: docs.nvidia.com/nsight-syst…
- [6] Channel-wise Knowledge Distillation for Dense Prediction, arxiv.org/abs/2011.13…
- [7] YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications, arxiv.org/abs/2209.02…
6. 本文作者
庆源、李亮、奕铎、张勃、王新、祥祥等,来自美团根底研制平台数据科学与平台部和视觉智能部。
阅览美团技能团队更多技能文章合集
前端 | 算法 | 后端 | 数据 | 安全 | 运维 | iOS | Android | 测验
| 在公众号菜单栏对话框回复【2021年货】、【2020年货】、【2019年货】、【2018年货】、【2017年货】等关键词,可检查美团技能团队历年技能文章合集。
| 本文系美团技能团队出品,著作权归属美团。欢迎出于共享和沟通等非商业意图转载或运用本文内容,敬请注明“内容转载自美团技能团队”。本文未经许可,不得进行商业性转载或许运用。任何商用行为,请发送邮件至tech@meituan.com请求授权。