如何评价美团提出的yolo v6?

您所在的位置:网站首页 yolov 如何评价美团提出的yolo v6?

如何评价美团提出的yolo v6?

2023-03-31 05:22| 来源: 网络整理| 查看: 265

我是做量化的,这个yolo6出来之后我也是第一时间收到了 @三木君 发来的模型。

我并不清楚这个网络结构设计的咋样...我主要关心推理速度和量化,我在云服务器用TRT上简单测了一下 yolo5, yolox, yolo6, ppyoloe的相关性能,可能不是特别精准,仅作参考:

首先我们看到表中最左侧,即fp32下batchsize=1时;此时yolox, yolo6, ppyoloe速度会比yolo5稍微快那么一点点,上下浮动也就在20%之内,其中yolo6的确会比yolo5快个20%。这个性能优势是存在的。

图1. TensorRT的性能测试

而后我们看到表中最右侧两列,即int8情况下的性能表现;不难发现yolo6此时性能远远高于其余的网络,甚至能快出2倍速度。但也可以同时发现,除了yolo6以外其余的网络int8量化完了基本跟fp32性能差不多(我这个卡没有fp16,如果有fp16可能int8还比fp16慢点)。

我是做量化推理的,我就只从量化和推理角度出发来分析分析yolo6与其他网络的区别。

首先结构上这几个yolo我看着都大差不差,可以说半斤八两,老实说你把他们名挡住,我根本区别不出来谁是谁。从我个人角度出发,我认为yolo6的速度比yolo5能快20%的原因可以归结于激活函数不同:yolo5采用的是swish激活,而yolo6采用了relu激活。

我们先来看为什么有这样的结论,这需要更深入去profile tensorRT的执行逻辑,我简单的用python 做了一下,结论是简单而清晰的:

图2. TensorRT 对 swish 激活的融合

对于swish激活函数,onnx里面会用 sigmoid+mul 的方式进行表示,tensorRT进行推理的时候会触发pointwise operator融合,把 sigmoid+mul 融合成一个 PWN 算子进行计算,但PWN算子不会进一步和前面的 Conv 进行融合

这导致对于这个子图,trt要启动两个kernel完成计算,profile的结果也说明了这一情况(下图3):

图3. Swish 附近的执行情况

可以看到这个swish函数的执行时间大概是卷积的30%,那么如果我使用relu作为激活函数会怎样?同样很简单的结论,relu与conv会融合,从而只需一个kernel完成所有运算。(下图4)

图4. Relu 附近的执行情况

也就是说,理论上来讲你只需要把yolo5的所有激活函数换成relu,它就可以提高20%~30%的性能。这是由于TensorRT中swish激活无法与conv进一步进行图融合优化,这一情况其实也存在于其他推理框架中,但是我听说ppl好像写了swish的融合...

关于量化性能,这是我想讨论的重点:为什么量化之后的网络性能可以差这么多,原因还是这个swish激活。这个swish激活在tensorRT,openvino,ppl cuda, ncnn等很多框架上,都是需要回浮点去算的,这一过程可能会严重影响网络量化性能

图5. 量化后 Swish 附近的执行情况

如上图5所示,这是图3的量化版本,我们看到量化后的conv204比原来快了一点点,但swish激活的执行时间却延长了,同时多了一个reformatting copynode for swish。我并不是写trt的人,我不清楚这里面到底发生了什么,但这个swish想要以fp32的精度运行,必然要在某一个地方发生从conv(int8)到swish(fp32)的精度转换,再在某一个地方去做swish(fp32)到int8的转换;首先这个swish它是fp32算的,它不可能因为你的量化而加速,于此同时这些数据转换是需要时间的,量化带来的性能提升会被这些额外引入的损耗消磨殆尽,或者换言之,如果你在量化网路中使用sigmoid, swish这种不那么线性的激活函数,那么你的量化很可能从一开始就注定了没有意义。

在这里,我必须向你补充说明,我使用的是gtx1080ti显卡,在这张显卡上的图融合情况与3090是有出入的。这篇文章想向你阐述这样一个观点:在神经网络部署过程中存在很多细节问题,这些细节麻烦而致命,如果你想取得较高的性能,我强烈建议你使用专业的性能分析工具去找出网络中存在的问题并针对性的修改。

基于这样的原因,除yolo6以外所有的网络量化完了在trt上运行都没有取得很好的性能结果。当然这一结论并不是放诸四海皆准的,会由于硬件、推理框架的不同而发生改变。

我们最后谈谈量化精度的问题,虽然yolo6的网络设计是有利于量化的,但这个网络的权重分布的很偏激,量化起来噪声极其显著,可以用惨不忍睹来形容。(下图6)

图6. yolo6 量化噪声分布情况

可以看到过半卷积层的输出都有50%以上的量化噪声,老实说我不认为这样的网络量化完了能跑出1%的map,并且这已经是trt的量化策略(trt的量化策略精度很高)下做出的结果,ncnn下这个量化噪声可以达到700%。

这里我不确定我的数据预处理和结果是100%正确的,我并没有去完整地跑yolo6网络的所有内容,也没有去测它的map,如有错误你可以联系我进行修正。

相关资料:

量化框架:https://github.com/openppl-public/ppq/tree/master/ppq

TensorRT部署:使用TensorRT部署神经网络_哔哩哔哩_bilibili

量化图融合:神经网络图优化与量化模拟_哔哩哔哩_bilibili

测试代码:略



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3