代码优化方法论

为什么需要代码优化

  • 提升体验,扩展玩法

image.png

  • 减少限制跟要求,降低门槛 ,覆盖更多群体

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

image.png

  • 场景限制必须进行优化

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

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

传统代码优化

rnnoise优化举例

  • 函数近似和查表优化sigmoid函数计算
    image.png
    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);
}

最粗暴的函数近似方法:
image.png
image.png

1
2
3
4
5
6
7
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机制

image.png

image.png

深度学习移动端优化

image.png

网络剪枝

  • 网络的参数都存在冗余的,所以可以进行网络剪枝

image.png

  • 网络剪枝的流程
    权值的重要性:计算L1或者L2
    神经元的重要性:不为零的次数
    image.png
  • 剪权值VS剪神经元

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

精简模型设计

  • 标准CNN

image.png

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

image.png

image.png

  • 参数比较

image.png

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

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

4.1 硬件厂商

公司 硬件架构 开发工具
海思 NPU HiAI Foundation
高通 CPU/GPU/DSP Snapdragon Neural Processing Engine SDK
Apple CPU/GPU/NeualEngine CoreML
ARM CPU/GPU ARM NN SDK
MediaTek CPU/GPU/APU NeuroPilot SDK

4.2 软件厂商

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

mnist_cnn_demo.gif

五、参考