故事背景:笔者开发了一个端侧的模型,是在mobilnetV3-small-0.75(Flops:52M)的基础上魔改出来的,其Flops比mbv3-large-1.0(Flops:58M)是低的,但是其在端侧手机GPU上面的初始化时间却高很多,推理时间甚至是后者的两倍,带着这个问题,以及需要优化模型性能的目标,分析并调研了以下的内容。
一、当下比较流行的轻量级模型以及其优化策略
在学术界中,往往使用Flops来评估模型算力,其优化也是针对这一方面来优化的
- MobileNet:将传统conv替换为DWconv与PWconv,降低Flops,DW+PW = 传统conv,但是所需要的Flops更低,在论文中,V3Flops低于V2,且效果更好一些;
- octConv: 将传统conv替换为octConv,可以进一步降低Flops,其原理为卷积得到的特征中,存在高频特征与低频特征,而低频特征在卷积时可以降低分辨率,在论文中,ocv-mobilenet其Flops更低,且效果略好一些;
- GhostNet:将传统conv替换为ghost module,可以降低Flops,其原理特征映射之间的相关性与冗余性,即部分特征可以直接通过对其他特征进行简单的线性变换得到,而不用进行卷积;
- SkipNet:顾名思义,即认为多层的cnn,是为了解决部分cornercase而设计的,一部分case并不需要走完网络全程,所以可以通过“跳跃”的形式来提高性能;
- MobileVit:针对Mobile优化的VIT,其为transformer,并非传统cnn,故这里并没有多研究;
- TineNet: 其主要阐述了一个观点,即在轻量级网络上面,对于模型效果影响最多的因素,主要为分辨率>网络深度>网络宽度。
所以,理论上如果我们对于当前的模型,如果设计为skip-ghost-oct-mobilnet-sod的形式(融合怪哈哈哈),其Flops可以进一步降低;
但是此时笔者想到了另外两个问题:
1、之前兄弟团队基于NAS优化mbv3-large-1.0,其搜索出来的模型Flops优化了50%,性能优化却只有8%~20%之间,功耗优化只有1~2mA(测试平台为三星9815、sm8350,功耗不排除测试误差);
2、学术界mbv3性能和效果都优于mbv2,但是工业界却普遍反馈并非如此,为了验证,我们在一个回归任务上,使用训练集训练mbv2和mbv3(两个都经过imagenet预训练),v2误差比v3低2%,同时v2的性能确实比v3要高。
据此分析,Flops和性能功耗成正相关,但是并不是严格正比的关系;
二、实测不同模型的性能
基于高通8450平台,批跑一批图片,测试结果如下:
mobilnet 模型大小,Flops,op种类,层数等对于初始化以及推理性能的影响
| 模型类别 |
当前模型 |
mbv3-small-1.0 |
mbv2-1.0 |
mbv2-0.5 |
mbv3-large-1.0 |
|---|---|---|---|---|---|
| Flops | 52M | 58M | 314M | 103M | 224M |
| 模型大小(float 32,output1~35之间) | 4.85M | 5.93M | 8.46M | 2.62M | 16M |
| 初始化(无缓存) | 1.66s | 1.02s | 0.656s | 0.645s | 1.16s< |

本文分析了一款端侧模型在MBV3-Small-0.75与MBV3-Large-1.0之间的性能差异,指出Flops与性能并非正比,强调了计算密度、访存量和硬件特性的关键作用。通过RoofLine模型揭示推理时间的影响因素,提出在高算力平台优化时应注意访存量而非一味降低Flops。

596

被折叠的 条评论
为什么被折叠?



