为什么需要代码优化

  • 提升体验,扩展玩法
  • 减少限制跟要求,降低门槛 ,覆盖更多群体

在谷歌内部,打造AI应用有两条思路,一是让更多人受惠,二是尽可能减少限制和要求

  • 场景限制必须进行优化

个人隐私越来越被重视,以往的云端处理方案存在局限性 一些场景要求算法要有极低的延时,如实时通信项目

Flag终极目标:让算法随手可得

传统代码优化

rnnoise优化举例

  • 函数近似和查表优化sigmoid函数计算

image.png

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static OPUS_INLINE float tansig_approx(float x)
{
    int i;
    float y, dy;
    float sign=1;
    /* Tests are reversed to catch NaNs */
    if (!(x<8))
        return 1;
    if (!(x>-8))
        return -1;
#ifndef FIXED_POINT
    /* Another check in case of -ffast-math */
    if (celt_isnan(x))
       return 0;
#endif
    if (x<0)
    {
       x=-x;
       sign=-1;
    }
    i = (int)floor(.5f+25*x);
    x -= .04f*i;
    y = tansig_table[i];
    dy = 1-y*y;
    y = y + x*dy*(1 - y*x);
    return sign*y;
}

static OPUS_INLINE float sigmoid_approx(float x)
{
   return .5 + .5*tansig_approx(.5*x);
}

最粗暴的函数近似方法:


``` atan(pi*x/2)*2/pi 24.1 ns atan(x) 23.0 ns 1/(1+exp(-x)) 20.4 ns 1/sqrt(1+x^2) 13.4 ns erf(sqrt(pi)*x/2) 6.7 ns tanh(x) 5.5 ns x/(1+|x|) 5.5 ns ```
  • 减少程序跳转优化RNN计算

CPU多级Cache机制

深度学习移动端优化

网络剪枝

  • 网络的参数都存在冗余的,所以可以进行网络剪枝
  • 网络剪枝的流程 权值的重要性:计算L1或者L2
    神经元的重要性:不为零的次数
  • 剪权值VS剪神经元

image.png
剪权值                                                                           剪神经元
             image.png                                  image.png
剪权值:模型不规则,不便于实现和加速
剪神经元:模型规则,便于实现和加速

精简模型设计

  • 标准CNN

image.png

  • 深度分离卷积Depthwise Separable Convolution 【参见MobileNet】

image.png

image.png

  • 参数比较

image.png

四、深度学习移动端部署工具

      与PC端深度学习环境被大厂垄断不同,移动端的部署工具可以说是百家争鸣,很多深度学习的厂商都会推出自家的推理加速工具。

4.1 硬件厂商

公司硬件架构开发工具
海思NPUHiAI Foundation
高通CPU/GPU/DSPSnapdragon Neural Processing Engine SDK
AppleCPU/GPU/NeualEngineCoreML
ARMCPU/GPUARM NN SDK
MediaTekCPU/GPU/APUNeuroPilot SDK

4.2 软件厂商

工具公司系统支持情况特点
TensorFlow LiteGoogleAndroid/IOSAndroid结合比较密,支持GPU加速
CoreMLAppleIOS软件硬件结合紧密,更新快
Caffe2FacebookAndroid/IOS
NCNNTencentAndroid/IOS支持大部分CNN网络,已经落地的应用多
MACE小米Android
MNN阿里Android/IOS
  • 利用Caffe2进行手写数字识别在Android端的部署

mnist_cnn_demo.gif

五、参考