【他山之石】怎样才能让你的模型更加高效运行?

2021-01-13 14:27:01 浏览数 (1)

“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。

作者:知乎—qiuqiuqiu

地址:https://www.zhihu.com/people/qiuqiuqiu-52

大家好,我又来了。这次来大家探讨几个问题: 轻量化的模型就真的一定快吗? 怎样才能让你的模型更加高效运行?

随着现在NPU大规模普及开来,动辄几TOPS的算力,让边缘端设备算力资源大幅度提高,但是大家往往在这些设备最后实际测试性能表现却和自己预估的有很大出入,为什么我的模型计算量参数量特别小,却在动辄算力 2、3Tops的NPU上跑不了想象中的那么快?那么疑问来了,在NPU的推理效率就一定比ARM CPU高吗?来我们来举个栗子,咱们比较下yolo-fastest-xl与yolov4-tiny模型在ARM CPU:Kirin 990平台下NCNN推理基准对比:

显而易见,计算量参数量小的模型速度就快

那么我们在RK1808 NPU平台上进行比对,平台算力为3TOPS,很强!

大家发现了yolo-fastest-xl却反而更慢了,那么这是为什么呢? 明明计算量和参数量都有很大优势啊

其实我们来思考一个问题,怎样去衡量一个模型所消耗的计算资源,是计算量还是参数量吗?计算量和参数量小的模型就一定快吗?其实这就引入第一个问题: 轻量化的模型就真的一定快吗? 在这里引入一个非常非常非常重要且大家容易忽视的概念,就是模型的访存量,访存量的值会非常严重地影响模型的性能,那么什么是访存量呢?

访存量:模型完成一次前向传播过程中所发生的内存交换总量,也可以理解为模型的空间复杂度。在理想情况下[在这里我们忽视片上cache],模型的访存量就是模型各层权重参数的内存占用(读) 每层所输入的特征图的内存占用(读) 每层所输出的特征图的内存占用(写),单位是Byte,通常数据类型是float32所以要x4

参数量其实就是模型各层权重参数的内存占用,访存量就是比他多了个每层所输入和输出的特征图的内存占用,计算量就不说,大家都耳熟能详。那么我们从访存量这个角度来分析这两个模型,看看是否能解答前面我们的疑问:

显而易见,访存量大了好几倍,大家把两个模型拖到Nerton可视化也能看出来,一个是长的高的瘦子,一个是长的矮的胖子

yolo-fastest-xl在RK1808上陷入所谓的带宽瓶颈,形象点举个栗子: 有个叫RK1808工厂,产能特别高,每小时能生产100件产品(算力3TOPS),有一天厂里接了个订单,要生产1000件产品,但是厂里的都是用小货车送货,每小时只能送10件产品到客户那(内存DDR3),厂里一共用了100个小时才完成了订单,而且工厂里的90%的产线都在摸鱼。

另一个工厂叫Kirin 990,产能特别低,每小时能生产20件产品,有一天厂里也接了个订单,也要生产1000件产品,但是这个厂里的都是用重卡送货,每小时能送100件产品到客户那(内存LPDDR4),厂里一共用了50个小时才完成了订单,而且工厂里的产线都是轮轴转。

举完这个例子大家应该明白为什么yolo-fastest-xl模型计算量和参数量很有优势,为啥RK1808这个平台上反而更慢了吧。其实这种情况不光在一些NPU上出现,在一些低性能的GPU也会存在,例如Jeston Nano...(因为没有独立显存啊,也是得去访问内存),同时这也是为啥NPU动辄几TOPS的算力实际跑起来感觉没那么快啊(估计要交换数据全部缓存在片上cache才会发挥真正的实力吧)

其实总结下,模型运行的高不高效一定要结合自身运行的硬件平台去考虑,而不是想当然的去做设计模型算法,要从模型计算量/参数量/访存量以及框架软硬件本身对于OP的优化去实际考虑,前期先作好评估,毕竟大家炼丹的成本还是很高的,啊哈哈哈。

那么疑问又来了,有没有个相比于计算量和参数量更能衡量模型平台运行效率的基准,大家可以参考下面的文章:

https://zhuanlan.zhihu.com/p/33693725

https://zhuanlan.zhihu.com/p/34204282

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。

0 人点赞