移动深度学习的几个问题

移动深度学习的几个问题

  本文主要概括了在移动端深度学习与服务端深度学习的几个重要差异。

一、在移动端和服务器应用深度学习的难点对比

对比点

服务器端

移动端

内存

内存较大,一般不构成限制

内存有限

耗电量

不构成限制

移动设备的耗电量是一个很重要的限制因素

依赖库体积

不构成限制

存储空间有限,所有依赖库体积容易构成限制

模型体积

常规模型体积200MB

模型体积不宜超过10MB

性能

GPU box等集群式计算量很容易超过百级别的Tflops(每秒一万亿次浮点运算)

移动CPU和GPU极少能达到Tfops级别的算力,多数集中在Gflops级别

 

 

二、移动端常见的网络结构

MobileNet v1 、MobileNet V2、 MobileNet+SSD 、MobileNet+FSSD

GooleLeNet V1 、GoogLeNet v2 、GooleLeNet v3

YOLO

SqueezeNet

ResNet 34、ResNet 32

AlexNet

ShuffleNet v2

模型

模型参数级别

模型体积

GoogLeNet

500万

23.9MB

AlexNet

6000万

220MB

 

 

 

 

 

三、模型体积压缩

3.1 将32位float参数转化为8位int参数

即简单映射法,将原模型32位float类型强制转换到8位int类型。核心思想是先找到模型参数的最大值和最小值,然后用最大值减去最小值得到整个模型的跨度,再平均分为255份,就可以得到映射了。

经过转化后,一个GoogLe模型的体积从23.9MB一下子减少到了6MB,再将该模型6MB文件使用zip纬缩之后,最终的体积仅为4.5MB。

在运行过程中,由于模型框架使用的仍然是32位float类型,所以还要从8位int类型反向转换到32位float类型,这会导致精度降低。在实际使用过程中,如果是对精度敏感的模型,就要慎重使用该方法。

 

3.2 减少参数量

  1)减枝。去掉权重很小的边;

  2)量化。一些参数并不需要32位float这么高的精度,可以将这部分参数转化为8位int类型。这种方法并不适合所有算子,比如sigmoid计算过程显然是需要浮点数参与计算的。

3)二值神经网络。模型的权重都用一个二进制数表示。

 

四、减少框架依赖库

 

 深度学习框架依赖库通常几十MB大小,所以通常从服务器端框架移值到移动端,需要做一些精简化的工作。比如:

  1. 删掉后向传播过程。由于是在移动设备上运行预测过程的,因而不需要用于训练的后向传播过程。将代码文件精简,只保留预测过程,进一步减小了框架体积。
  2. 精简protobuf依赖库;
  3. 调整其他第三方依赖。

你可能感兴趣的:(深度学习)