Blog:http://machinethink.net/blog/how-fast-is-my-model/ https://www.jianshu.com/p/0a195604c7ad
在移动设备上运行深度学习时,模型预测的准确性并不是唯一要考虑的因素,还需要注意以下问题:
- 在App发布包中占用的空间——单个模型有能会使你的App下载体积增加几百MB。
- 运行时占用的内存量——在iPhone和iPad上,GPU可以使用设备中的所有RAM,但是总共也只有几GB,当空闲内存用完时,应用程序会被操作系统终止。
- 模型运行速度——尤其是在处理实时视频或大图像时(如果模型需要几秒钟来处理单个图像,那么使用云服务可能更好)。
- 耗电速度——多久会把电池耗干,或使设备热得难以接受。
学术论文的作者通常不担心这些事情。他们可以在有多块GPU的服务器或计算集群上运行他们的模型。但如果您计划将这种模型转换到移动设备上运行,您将需要了解该模型在目标设备上的运行速度以及使用的电池电量。
测量模型速度的最好方法是连续运行多次,并取平均运行时间。单一测量结果可能有相当大的误差——CPU或GPU可能正忙于执行其他任务(例如绘制屏幕)—— 多次运行取平均值,将大大减少该误差。
当然,这假设您已经有了一个可以在设备上运行的模型。
在开始训练模型之前,对您的模型多做一些理论上的分析是非常有价值的,因为训练非常耗费资源。
案例研究:我的一个客户最近用MobileNetV2层替换了他们模型中的MobileNetV1层。V2使用的运算比V1少得多的,所以您可能会认为这种改变会使模型更快(模型中有许多额外的层,但是这些层没有改变)。
在V2中,他们设定depth multiplier值为1.4,这给每层增加了更多的滤波器,但是这仍然导致网络比以前具有更少的参数。即便如此,我还是预感到,V2层的特定配置不会比原来的V1层快很多。
结果证明我的预感是正确的——这个V2模型实际上更慢!在这篇文章中,我将展示为什么会这样,以及如何在理论层面用数学预估时间。
计算
获得模型的速度的一种方法是概括地统计它的计算量。我们通常统计计算量使用FLOPs(浮点运算数),但是这里我们使用MACCs或乘法累加数(multiply-accumulate operations )。
译者注:FLOPS和FLOPs的区别:
- FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
- FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
注意:在继续之前,我必须指出,单独统计计算数量并不能告诉您需要知道的所有信息。计算计算数量只是为了大致了解模型的计算成本是有用的,但是其他因素,例如内存带宽,通常更重要(稍后我们将进行讨论)。
点积
我们为什么要统计乘法累加(multiply-accumulate)呢?因为神经网络中的很多操作都是点乘,像下面这样:
y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[n-1]*x[n-1]
这里,w和x是两个向量,结果y是一个标量(单个数字)。
在卷积层或全连接层(现代神经网络中的两种主要层)中,W是层的学习权重,X是层的输入。
Y是层的输出之一。通常一个层会有多个输出,所以我们需要计算许多点积。
我们把 w[0]*x[0]+… 计作一次乘法累加(multiply-accumulate&#