深⼊浅出谈 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

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.132.0. UTC+08:00, 2024-09-21 20:31
浙ICP备14020137号-1 $Map of visitor$