深⼊浅出谈 MNN 原理,为什么能这么快?
如果无法正常显示,请先停止浏览器的去广告插件。
1. 深⼊浅出谈 MNN 原理,为什么能这么快?
讲师:吴⼦奇(花名:明弈)
阿⾥巴巴淘系技术⽆线开发专家
2. 推理引擎架构师
⽆线AR专家
• 深⼊了解tensorflow/pytorch的核⼼, 对其有突出的贡献, 或主导过类似框架的核⼼架构设计 • 从事移动端AR相关工作2年以上,对AR算法及工程有深刻理解;
• 深⼊了解tvm的核⼼,对其有突出的贡献,对模型编译/IR设计/端上⾼性能代码⽣成有深⼊洞察 • 熟悉计算机视觉相关领域算法,以及图形学、图像渲染OpenGL等领域知识;
• 对机器学习理论有深⼊研究,特别模型架构搜索/模型结构优化/模型压缩有较⾼的理论功底 • 具有扎实的工程实现能力,熟练使用C/C++及一门脚本语言;
对卷积/矩阵乘法/图像/视频编解码等⾼性能计算有深⼊的理解和洞察 • 有好奇心,创新思维,敢承担,可实战,团队合作,沟通能力佳;
深度学习领域3年以上⼯作经验,有⼀定的知名度和影响⼒ • 有AR试穿试戴、AR互动玩法及其他商业化AR产品研发经验优先;
•
•
shuhui.sh@alibaba-inc.com
zhaomi.zm@alibaba-inc.com
淘系技术部 - 基础平台部
⼴纳贤才
Android 客户端
• 熟悉Android Framework层,并有⼀定Android源码阅读经验
• 了解响应式编程思想,了解 flutter, weex ,kotlin 等技术优先考虑
• 热爱技术,较强逻辑思维能⼒, 快速学习能⼒;
• 做事情严谨踏实,团队协作能⼒强,良好的沟通能⼒和团队合作精神
difei.zdf@alibaba-inc.com
3. Agenda
1 MNN 整体架构优势
2 MNN 核⼼细节优化
MNN 为什么快?
3
MNN 标准性能评测
4. MNN 整体架构优势
适⽤于移动端⾼效推理的半⾃动搜索架构
1
计算图线性拆分
2
预分配资源
3
在线⽅案选择
5. MNN - 整体架构概览
Pixel2 MI6 Mate
Valid Valid Valid
OpenCL Invalid Valid Valid
Vulkan Valid Valid Valid
ARM82 Invalid Invalid Valid
ARM
MNN
Model
A1
A2 B1
A3 B2
A4 B3
computational
graph
validation
B4
model info
Backend-Independent API
Pre-inference
search
optimal computation scheme
A1 B1 A1 B1 A1 B1
A2 B2 A2 B2 A2 B2
A3 B3
A4 B4 A3 B3
A4 B4 A3 B3
A4 B4
allocated memory
backend info
ARM ARM ARM82
ARM
Vulkan OpenCL OpenCL
Vulkan Vulkan
PCC
Session
match
Fill Input
Inference
Output
reuse
6. MNN - 直观意义上理解的神经⽹络
7. MNN - 计算图线性拆分
输⼊
Conv1
Conv1
Pool
Pool
Conv2_0
Conv2_0
Conv2_1
更进⼀步 ⼦图拆分
⼦图0
⼦图2
⼦图1
Conv2_1
Concat
Concat
模型⽂件
模型加载
线性化
⼈脸关键点
⼈脸⻆度
⼈脸遮挡
• 从实现逻辑上,⼤幅度降低图计算依赖所需的相关判断,线性执⾏即可。
MultiTask模型多backend并⾏
8. MNN - 预分配资源
Input
Conv1
Pool
alloc
alloc
1x3x224x224
1x16x224x224
1x16x112x112
动静分离
内存分配对于⾼效推理是不可忽略的⼀环
alloc
alloc
free
Conv2_0
Conv2_1
Concat
……
……
内存池
9. MNN - 预分配资源(GPU)
Commands
Commands
function
GPU 适合⾼性能计算
Commands
Commands
Commands
cache ALU ALU ALU
cache ALU ALU ALU
MPSImage
cache
Commands
Commands
MPSImage
ALU
ALU
ALU
DRAM
预推理统⼀处理相关的CommandBuffer / CommandDescription,节省后续推理耗时
10. MNN - 在线⽅案选择 (以卷积为例)
11. MNN - 在线⽅案选择
GPU
Conv
(3x3s1d1)
Conv
(3x3s2d1)
cost1
Conv
(3x3s1d2)
1x1conv
cost2,3,4...
Sliding Window
Winograd
Strassen
scheme pool
Search
(Pre-inference)
CPU
basic matrix mul
SIMD
mulG-threading
data re-ordering
pipelining
…
Optimization Techniques
op#mal scheme
(least cost)
Kirin 910
根据输⼊选择最优的计算⽅案
Kirin 920
Kirin 950
Kirin 970
Kirlin980
Kirlin990
根据Flops + 配置建⽴时间选择最优后端
12. MNN 核⼼细节优化
1
⾼性能⼿写汇编
2
并⾏数据排布
3
核⼼算法优化
13. push {lr}
vmov.i32 q15, #0
MNN - ⾼性能⼿写汇编
L4:
cmp r2, #3
ble L1
void ReluForward(float* dst, const float* src, size_t sizeDiv4)
{
for (int i=0; i<4*sizeDiv4; ++i)
{
dst[i] = src[i] >0 ? src[i] : 0;
}
}
纯 C 实现
push {lr}
vmov.i32 q15, #0
cmp r2, #0
beq End //跳转:beq 表示 r2 等于0时跳转
Loop://标志,供跳转⽤
vld1.32 {q0}, [r1]!
vmax.f32 q0, q0, q15
vst1.32 {q0}, [r0]!
subs r2, r2, #1// 这⼀句 相当于 sub r2, r2, #1 && cmp r2, #0
bne Loop //跳转:bne 表示 r2 不等于0时跳转
End:
pop {pc}
基础汇编
vld1.32 {q0, q1}, [r1]!
vmax.f32 q0, q0, q15
vld1.32 {q2, q3}, [r1]!
vmax.f32 q1, q1, q15
sub r2, r2, #4
cmp r2, #3
ble L4End
L4Loop:
vst1.32 {q0, q1}, [r0]!
vmax.f32 q2, q2, q15
vld1.32 {q0, q1}, [r1]!
vmax.f32 q3, q3, q15
vst1.32 {q2, q3}, [r0]!
vmax.f32 q0, q0, q15
vld1.32 {q2, q3}, [r1]!
sub r2, r2, #4
vmax.f32 q1, q1, q15
cmp r2, #4
bge L4Loop
L4End:
vst1.32 {q0, q1}, [r0]!
vmax.f32 q2, q2, q15
vmax.f32 q3, q3, q15
vst1.32 {q2, q3}, [r0]!
L1:
cmp r2, #0
beq End
L1Loop:
vld1.32 {q0}, [r1]!
vmax.f32 q0, q0, q15
vst1.32 {q0}, [r0]!
subs r2, r2, #1
bne L1Loop
End:
pop {pc}
汇编优化
14. MNN - 合理数据排布
特征重排
适合利⽤SIMD并⾏加速
ic0
ic1
ic2
ic3
1 2 3 1 2 3 1 2 3 1 2 3
4 5 6 4 5 6 4 5 6 4 5 6
7 8 9 7 8 9 7 8 9 7 8 9
1 1 1 1 2 2 2 2
3 3 3 3 4 4 4 4
5 5 5 5 6 6 6 6
7 7 7 7 8 8 8 8
9 9 9 9 0 0 0 0
ic c
o
NC4HW4
权重重排
0 1 2 3
0 1 2
3 4 1 2
3 4 1 2
3 4 1 2
3 4
1 5 6
7 8 5 6
7 8 5 6
7 8 5 6
7 8
2 9 10 9 10 9 10 9 10
11 12 11 12 11 12 11 12
3 13 14 13 14 13 14 13 14
15 16 15 16 15 16 15 16
1 1 1 1 2 2 2 2
5 5 5 5 6 6 6 6
9 9 9 9 10 10 10 10
13 13 13 13 14 14 14 14
3 3 3 3 4 4 4 4
7 7 7 7 8 8 8 8
11 11 11 11 12 12 12 12
15 15 15 15 16 16 16 16
15. MNN - ⼤矩阵乘法优化
SQUARE-MATRIX-MULTIPLY(A, B)
n = A.rows
let C be a new nxn matrix
for i = 1 to n
for j = 1 to n
c[i][j] = 0
for k = 1 to n
c[i][j] += a[i][k] * b[k][j]
return C
朴素的 NxN 矩阵乘法,复杂度O(n 3 )
C11 = A11 • B11 + A12 • B21
C12 = A11 • B12 + A12 • B22
C21 = A21 • B11 + A22 • B21
C22 = A21 • B12 + A22 • B22
复杂度仍然是O(n 3 )
16. MNN - ⼤矩阵乘法优化
a11 a12
c11 c12
b11 b12
( a21 a22 ) ( b21 b22 ) ( c21 c22 )
C1 C2 C3 C4
A1 A2 A3 A4
B1 B2 B3 B4
C5 C6 C7 C8
A5 A6 A7 A8
B5 B6 B7 B8
=
*
A9 A10 A11 A12
B9 B10 B11 B12
C9 C10 C11 C12
A13 A14 A15 A16
B13 B14 B15 B16
C13 C14 C15 C16
O(n 3 )
c
=
u
u
=
m
+
m
a 21 11 + + a a 22
c
=
v
+
v
−
v
+
v
v s 1 = (a
)(b
+
b
)
m
=
a
b
11
1
11 1
1 2
4
5
7 1
22
11
22 1
11 11
c
=
u
s v 2 =
s
−
a
u
=
m
+
m
m
=
a
b
12
5
1
11
2
1
6
c
=
v
+
v
=
(a
+
a
)(b
)
2
12
21
21
2
4
2
21
22
11
c
=
u
s 3 = a 11 − a 21
u
=
u
+
m
m
=
s
b
21
6
3
2
7
3
4
22
c 12 = v 3 + v 5
v 3 = (a 11 )(b 12 − b 22 )
c 22 = u 7
s 4 = a 12 − s 2
m 4 = a 22 t 4
u 4 = u 2 + m 5
2.81
c 22 = v 1 + v 3 − v 2 + v 6
v 4 = (a 22 )(b 21 − b 11 )
O(n
)
m 5 = s 1 t 1
u 5 = u 4 + m 3
t 1 = b 21 − b 11
v t 5 =
= b (a 11 − + t a 12 )(b 22 ) m = s t
u
=
u
−
m
6
3
4
6
2 2
2
22
1
矩阵较⼤时
v t 3 6 =
= b (a 22 21 − − b a 12 11 )(b 11 + b m
u 7 = u 3 + m 5
12 7 ) = s 3 t 3
矩阵乘法远慢于矩阵加减
使⽤
10 4 + + 8 4 次矩阵加减替代1次矩阵乘法(原先8次乘法,现在7次)
使⽤
+ 7 次矩阵加减替代1次矩阵乘法(占⽐1/8)
收益较为明显
−
b
v t 4 7 =
= t (a
−
a
)(b
+
b
)
2 12 21 22
21
22
17.
18. MNN
标准性能评测
19. 标准性能评测 CPU
NCNN
400
MACE
TF-Lite
CoreML
MNN
300
370
600
519
256
350
250 500
200 400
300
单线程
MobileNet v1 / SqueezeNet v1.1 / ResNet-18
250
200
150
150
115
100
50
101
29 21 27 28 21 27
iPhoneX iPhone8
37
21 16 15 21 16 14
iPhoneX iPhone8
28
38
MI6
579
MI6
iPhone8
69
Mate20
MI6
916
800
700
400
600
300
300
251
400
200
120
65
27 15
21
26 14
22
28 25
58
0
iPhoneX
iPhone8
Mate20
300
100
19
MI6
16 9
12
iPhoneX
400
16 8
12
iPhone8
17 20
12
300 300
250 250
194
200
150
100 100
23 14
23 14
29
25
13
51
41
0
31
50
iPhone8
Mate20
MI6
100
68 47
37
62 47
39
150
132
44 48
118
38
iPhoneX
iPhone8
Mate20
MI6
600
477
500
400
330
190
300
200
17
9
17
8
0
iPhoneX
33
367
200
150
200
MI6
400
350
64
39
0
Mate20
356
350
456
500
230
100
50
iPhoneX
87
76
1000
548
500
200
MobileNet v1 / SqueezeNet v1.1 / ResNet-18
62 63 68
0
Mate20
400
0
62 61 70
900
500
四线程
100
21
600
600
208
58
0
Mate20
236
218
200
66
50
700
MobileNet v1 / SqueezeNet v1.1 / ResNet-18
100
79
48
42
252
115
113
0
双线程
300
156
iPhoneX
iPhone8
15
20
8
Mate20
40
26
100
20
62
34
57
34
39
32
30
48
40
0
MI6
iPhoneX
iPhone8
Mate20
MI6
34
20. 标准性能评测 GPU
CoreML
iOS:
30
TF-Lite
MNN
35
60
26
MACE (OpenCL)
Android:
33
27
51
25
50
30
TF-Lite (OpenGL)
35
22
20
19
25
40
18
16
15
30
10
20
25 26
23
21 23
21
19
16
15
23
18
18 19
17
38 39
35
19
15
25
120
31
10
0
5
20
17 16
13
15
16
15
12
iPhoneX iPhone8
Mate20
MI6
0
iPhoneX iPhone8
400
60
Mate20
MI6
262
199
200
40
25 27
5
0
0
500
80
10
5
518
116
100
24
MNN (Vulkan)
600
300
15
10
MNN (OpenGL)
105
30
20
MNN (OpenCL)
140
45
40
29
NCNN (Vulkan)
25 28
20 100
0 0
80
32
iPhoneX iPhone8
34 36 34
Mate20
56
78
54
34
MI6
21. MNN - SysML 2020 Accepted
https://mlsys.org/Conferences/2020/AcceptedPapersInitial
22. MNN
未来演进⽅向
23. 深度学习编译优化
MNN 构图 + 训练
Python ⼯具包
MNN.js
低⻔槛机器学习平台
24. Thanks
「淘系技术」微信公众号
25. 推理引擎架构师
⽆线AR专家
• 深⼊了解tensorflow/pytorch的核⼼, 对其有突出的贡献, 或主导过类似框架的核⼼架构设计 • 从事移动端AR相关工作2年以上,对AR算法及工程有深刻理解;
• 深⼊了解tvm的核⼼,对其有突出的贡献,对模型编译/IR设计/端上⾼性能代码⽣成有深⼊洞察 • 熟悉计算机视觉相关领域算法,以及图形学、图像渲染OpenGL等领域知识;
• 对机器学习理论有深⼊研究,特别模型架构搜索/模型结构优化/模型压缩有较⾼的理论功底 • 具有扎实的工程实现能力,熟练使用C/C++及一门脚本语言;
对卷积/矩阵乘法/图像/视频编解码等⾼性能计算有深⼊的理解和洞察 • 有好奇心,创新思维,敢承担,可实战,团队合作,沟通能力佳;
深度学习领域3年以上⼯作经验,有⼀定的知名度和影响⼒ • 有AR试穿试戴、AR互动玩法及其他商业化AR产品研发经验优先;
•
•
shuhui.sh@alibaba-inc.com
zhaomi.zm@alibaba-inc.com
淘系技术部 - 基础平台部
⼴纳贤才
Android 客户端
• 熟悉Android Framework层,并有⼀定Android源码阅读经验
• 了解响应式编程思想,了解 flutter, weex ,kotlin 等技术优先考虑
• 热爱技术,较强逻辑思维能⼒, 快速学习能⼒;
• 做事情严谨踏实,团队协作能⼒强,良好的沟通能⼒和团队合作精神
difei.zdf@alibaba-inc.com