原文链接:https://machinethink.net/blog/how-fast-is-my-model/
在移动设备上进行深度学习时,模型预测能力有多好并不是唯一的考虑因素。你还需要考虑:
- 空间占用:单个模型的参数文件要占用多大空间
- 运行时内存占用:在iPad和iPhone上,GPU会使用大部分的RAM,留下部分。如果模型全部使用了,该应用程序会被操作系统终止
- 运行速度:特别是在处理实时视频或大型图像时(如果模型需要几秒钟来处理一张图像,你可能会更好地使用云服务)
- 耗电情况:设备耗电快热得快
衡量一个模型速度的最好方法是连续运行多次,并取平均耗时。您测量任何一次运行的时间可能会有相当大的误差范围–CPU或GPU可能正忙于执行其他任务(例如绘制屏幕)–但当您对多次运行进行平均时,这将显著缩小该误差。
在开始训练模型之前,先对模型的运行状况进行理论分析是非常有用的,因为训练成本很高。
案例分析
我的一个客户最近用MobileNetV2层替换了他们模型中的MobileNetV1层。V2使用的计算量比V1少很多,所以你会认为这种变化会使模型的速度快很多(模型中有很多额外的层,但这些层没有改变)。仅管修改之后的模型参数变少了,但效果可能并不会提升。
原因分析
1、计算量
我们常用 FLOPs(floating point operations per second,每秒浮点运算数)来衡量模型的速度;还有MACCs (multiply-accumulate operations), 也叫MADDs.(矩阵运算-乘加运算)
由于MACC操作有n次乘法和n-1次加法,乘加执行(2n - 1)FLOPS。所以一个MACC大概是FLOPS的二倍。
由于乘积累加运算是否普遍,在计算机中MACC是一个指令。
不同层的MACC计算方法
- 全卷积层
- 激活函数
- 卷积层
- 深度可分离层
- 批量归一化(Batch normalization)
- 其它层(池化层)
2、内存消耗
计算量只是整个其中一个评估因素。一个更重要的影响因素是内存带宽。目前的计算机结构下,单次内存访问比单次运算慢得多的多。
您刚刚看到这些神经网络执行了大量计算,但是它们执行多少次内存访问?
对于每一层,设备需要:
- 从主内存中读取输入向量 / feature map
- 计算点积ーー也包括从主存储器读取图层的权重
- 将输出向量或 feature map 写回主内存
内存读取相对于计算量是十分耗时的。
2.1 权重的内存占用
2.2 feature map和中间结果的内存占用
2.3 融合Fusion
这一节的意思是,像 ReLU 这样比较简单的运算,如果不做优化,在计算时近乎是从输入到输出做了一次拷贝。计算可以认为不耗时间,但内存访问还是有消耗的,所以可以把这一步同卷积层的计算合成,从而节省了一轮内存读写