离青 GMTC 端侧推理引擎面临的挑战与应对

前端狗

2019/07/09 发布于 编程 分类

GMTC2019 

文字内容
1. 端侧推理理引擎 ⾯面临的挑战与应对 离⻘青 淘宝⽆无线开发专家
2. ⾃自我介绍 • 陈以鎏,花名离⻘青 • 淘宝⽆无线开发专家 • 2015 - 2019 • 阿⾥里里百川 • ⼿手机淘宝架构 • MNN
3. ⽬目录 • • • • • 现状与挑战 应对之道 编译⽅方案与⽐比较 应⽤用场景 开源与规划
4. 背景 GoogLeNet VGG AlexNet ResNet Inception V3 MobileNet V1 ShuffleNet V1 SqueezeNet DenseNet PolyNet DPN Google TPU 华为 麒麟970 NPU MobileNet V2 ShuffleNet V2 MobileNet V3 2018 2019 NCNN Torch 7 CoreML NNAPI 2011 2012 2013 2014 2015 2016 2017
5. 移动AI 云端AI 端侧AI
6. 移动AI 云端AI 端侧AI
7. 移动AI …… 交互⾏行行为 地理理位置 云端AI 陀螺仪 端侧AI 实时⼼心率
8. 移动AI …… 交互⾏行行为 地理理位置 云端AI 陀螺仪 端侧AI 实时⼼心率
9. 挑战 训练模型 转换 部署模型 调度 计算⼦子图 执⾏行行 输出结果
10. 挑战 训练模型 碎 ⽚片 化 转换 训练框架 部署模型 调度 计算⼦子图 执⾏行行 Caffe CPU kernel TensorFlow GPU stride PyTorch 设备环境 NPU 算⼦子分⽀支 pad MXNet DSP dilation … … … 输出结果
11. 应对 训练模型 资 源 & 性 能 转换 部署模型 模型优化 调度 计算⼦子图 执⾏行行 输出结果 统⼀一可拓拓展描述 常量量识别 SIMT/SIMD 图优化/算⼦子融合 资源/缓存管理理 忽略略异常/低精度计算/近似算法 布局优化 模型压缩 智能调度 混合/并发调度 算⼒力力/负载 ⾃自动选择 计算加速 带宽/缓存/参数/输⼊入 ⾃自动选择 链路路优化
12. 应对 - 模型优化 TensorFlow 前端 Caffe 前端 ONNX ONNX 前端 模型 图优化 模型 模型 模型 优化器器 算⼦子融合 算⼦子替换 布局调整 模型 模型 压缩 暂未开源 模型 Flatbuffer Writer 部署模型
13. 应对 - 图优化
14. 应对 - 图优化
15. 应对 - 图优化 GRU
16. 应对 - 图优化 优化前耗时 优化后耗时 60 50 40 GRU 30 20 10 0 华为P10 红⽶米3x ⼩小⽶米6
17. 应对 - 算⼦子融合 ReLU Scale Bn Conv
18. 应对 - 算⼦子融合 ReLU ReLU Scale Scale Bn Conv Conv
19. 应对 - 算⼦子融合 ReLU ReLU Scale ReLU Scale Bn Conv Conv Conv
20. 应对 - 算⼦子融合 ReLU ReLU Scale ReLU Scale Bn Conv Conv Conv Conv
21. 应对 - 算⼦子融合 ReLU Scale Conv Bn Conv
22. 应对 - 算⼦子融合 优化前耗时 优化后耗时 50 ReLU 40 Scale 30 Conv 20 Bn 10 Conv 0 ⼩小⽶米5 华为P10 MobileNet v1.10224
23. 应对 - 智能调度 CPU GPU 其他
24. 应对 - 智能调度 模型 CPU 混合调度 ⼦子图 GPU 创建执⾏行行器器 其他 管线
25. 应对 - 智能调度 模型 CPU 混合调度 GPU ⼦子图 创建执⾏行行器器 其他 管线
26. 应对 - 智能调度 x86 模型 CPU armv7 混合调度 arm64 GPU ⼦子图 创建执⾏行行器器 其他 管线 i386
27. 应对 - 智能调度 x86 模型 CPU armv7 混合调度 arm64 GPU ⼦子图 创建执⾏行行器器 其他 管线 i386 Metal OpenGL OpenCL Vulkan
28. 应对 - 智能调度 x86 模型 混合调度 CPU armv7 76 GPU ⼦子图 创建执⾏行行器器 其他 管线 i386 arm64 Metal OpenGL OpenCL Vulkan 55 11 29 31
29. 应对 - 智能调度 x86 模型 混合调度 CPU i386 armv7 76 GPU ⼦子图 arm64 Metal OpenGL OpenCL Vulkan 55 11 29 31 armv82 NPU DSP FPGA 创建执⾏行行器器 其他 管线 • 平台隔离 • 易易于拓拓展 • 扬⻓长避短 • 混合调度 • 并发调度
30. 应对 - 缓存管理理 (管线内串串⾏行行) 管线 模型 调度 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) ⼦子图 ⼦子图 创建 执⾏行行器器
31. 应对 - 缓存管理理 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors 模型 调度 (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) ⼦子图 ⼦子图 ⼦子图 创建 执⾏行行器器 形状 计算
32. 应对 - 缓存管理理 100 150 100 … buffers 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 3 4 0 5 4 tensors 模型 调度 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 管线 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) ⼦子图 ⼦子图 ⼦子图 ⼦子图 形状 计算 4 5 4 5 4 4 5 tensors (管线内串串⾏行行) 创建 执⾏行行器器 4 4 准备 执⾏行行器器
33. 应对 - 缓存管理理 100 150 100 … buffers 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 3 4 0 5 4 tensors 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors (管线内串串⾏行行) (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 管线 3 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 0 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 4 模型 调度 ⼦子图 创建 执⾏行行器器 ⼦子图 形状 计算 ⼦子图 准备 执⾏行行器器 ⼦子图 运⾏行行 执⾏行行器器 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors
34. 应对 - 缓存管理理 100 150 100 … buffers 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 3 4 0 5 4 tensors 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 7 0 0 1 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors (管线内串串⾏行行) (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 管线 3 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 0 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 4 模型 调度 ⼦子图 创建 执⾏行行器器 ⼦子图 形状 计算 ⼦子图 准备 执⾏行行器器 ⼦子图 后 理理 推 续 运⾏行行 执⾏行行器器 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors
35. 应对 - 缓存管理理 100 150 100 … buffers 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 3 4 0 5 4 tensors 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors (管线内串串⾏行行) (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 管线 3 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 0 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 4 模型 调度 ⼦子图 创建 执⾏行行器器 ⼦子图 响 变 形 应 形状 计算 ⼦子图 准备 执⾏行行器器 ⼦子图 运⾏行行 执⾏行行器器 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors
36. 应对 - 缓存管理理 100 150 • 100 … • buffers 3 0 4 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 3 4 0 5 4 tensors 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 • tensor / buffer 内存由后端分配 内存在后端内的 执⾏行行器器间复⽤用 内存分配默认按 照32位对⻬齐 tensors (管线内串串⾏行行) (管线内串串⾏行行) (管线内串串⾏行行) 管线 管线 管线 3 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 0 (串串⾏行行/并⾏行行) (串串⾏行行/并⾏行行) 4 模型 调度 ⼦子图 创建 执⾏行行器器 ⼦子图 响 变 形 应 形状 计算 ⼦子图 准备 执⾏行行器器 ⼦子图 运⾏行行 执⾏行行器器 3 0 4 3 0 4 1 1 4 1 1 4 1 1 4 5 0 1 5 0 1 5 0 1 7 0 2 7 0 2 7 0 2 4 4 5 4 4 5 4 4 5 tensors
37. 应对 - ⼯工具集 1. 单元测试 # ./run_test.out matching substring ./run_test.out op/convolution 单元测试 1. 持续集成 业务回归 2. Profiler # ./timeProfile.out model loops backend dims ./timeProfile.out model.mnn 10 0 1x3x448x448 3. 单端⽐比较 模型评估 2. 部署平台 灰度部署 # ./MNNV2Basic.out model loops outputs backend dims # ./checkDir.out output comparison tolerance ./MNNV2Basic.out model.mnn 10 1 0 1x3x224x224 ./checkDir.out output comparison 1 4. 端间⽐比较 # ./backendTest.out model, backend, tolerance ./backendTest.out model.mnn 3 0.15 模型回归 部署报表 报表系统 成功率 模型报表 3. 监控平台 告警系统 耗时 内存占⽤用
38. 应对 - 分析MetalPerformanceShaders 1. 下载固件并解压 2. 拆解metallib MPSNeuralNetwork.framework $ pwd /Volumes/PeaceF16F203.D22D221OS/System/Library/ Frameworks/MetalPerformanceShaders.framework/Frameworks/ MPSNeuralNetwork.framework MPSNeuralNetwork.framework $ cp default.metallib path/ to/airs && cd path/to/airs airs $ python3 unmetallib.py default.metallib ⼯工具参考: https://github.com/zhuowei/MetalShaderTools 3. 反汇编air airs $ ls out_cnnConvArray_3xIn_8xOut_3_1.air out_cnnConvArray_3xIn_8xOut_4_1.air out_cnnConvArray_4xIn_16xOut_1_1.air out_cnnConvArray_4xIn_16xOut_1_2.air out_cnnConvArray_4xIn_16xOut_1_3.air out_cnnConvArray_4xIn_16xOut_1_4.air out_cnnConvArray_4xIn_16xOut_2_1.air out_cnnConvArray_4xIn_16xOut_2_2.air out_cnnConvArray_4xIn_16xOut_3_1.air out_cnnConvArray_4xIn_16xOut_4_1.air out_cnnConvArray_4xIn_4xOut_1_1.air out_cnnConvArray_4xIn_4xOut_1_2.air … airs $ llvm-dis out_cnnConvArray_3xIn_8xOut_3_1.air airs $ cat out_cnnConvArray_3xIn_8xOut_3_1.air.ll ; Function Attrs: convergent nounwind define void @cnnConvArray_3xIn_8xOut_3_1( %struct._texture_2d_array_t addrspace(1)*, %struct._texture_2d_t addrspace(1)*, %struct._texture_2d_array_t addrspace(1)*, %struct._texture_2d_t addrspace(1)*, %struct.cnnConvArrayParams addrspace(2)* noalias readonly dereferenceable(176), half addrspace(2)* noalias nocapture readonly, half addrspace(2)* noalias nocapture readonly, <3 x i16>, <3 x i16>, <3 x i16>, <3 x i16>, <3 x i16>, <3 x i16>,
39. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 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 * k1 k2 k3 k4 k5 k6 k7 k8 k9
40. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1 2 3 4 * k1 k2 k3 k4 k5 k6 k7 k8 k9
41. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 5 1 2 3 4 10 6 7 8 9 15 11 12 13 14 16 17 18 19 20 21 22 23 24 25 * k1 k2 k3 k4 k5 k6 k7 k8 k9
42. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 21 22 23 24 5 1 2 3 4 10 6 7 8 9 15 11 12 13 14 20 16 17 18 19 25 * k1 k2 k3 k4 k5 k6 k7 k8 k9
43. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 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 * k1 k2 k3 k4 k5 k6 k7 k8 k9
44. 应对 - 数据布局 NCHW布局下,如何利利⽤用SIMD加速卷积? 1 1 1 37 3 3 3 48 4 4 4 59 5 5 5 10 6 7 8 9 10 6 7 8 9 10 11 12 13 14 15 6 7 8 9 10 11 12 13 14 15 11 12 13 14 15 16 13 17 14 18 15 19 20 11 12 16 17 18 19 20 16 17 18 19 20 21 18 22 19 23 20 24 25 16 17 21 22 23 24 25 21 22 23 24 25 21 22 23 24 25 1 26 2 2 2 * k1 k2 k3 k1 k2 k3 k1 k2 k3 k4 k3 k5 k6 k1 k2 k4 k5 k6 k4 k5 k6 k7 k6 k8 k9 k4 k5 k7 k8 k9 k7 k8 k9 k7 k8 k9 • • • kernel、stride、dilation影响 • 数据读写指令 • 数据加载有效性 • 数据复⽤用逻辑 • 寄存器器开销 边缘数据⽆无法利利⽤用SIMD加速 优化分⽀支多,影响包⼤大⼩小
45. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 1 1 1 37 3 3 3 48 4 4 4 59 5 5 5 10 6 7 8 9 10 6 7 8 9 10 11 12 13 14 15 6 7 8 9 10 11 12 13 14 15 11 12 13 14 15 16 13 17 14 18 15 19 20 11 12 16 17 18 19 20 16 17 18 19 20 21 18 22 19 23 20 24 25 16 17 21 22 23 24 25 21 22 23 24 25 21 22 23 24 25 1 26 2 2 2
46. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 26 2 2 2 37 3 3 3 48 4 4 4 59 5 5 5 10 6 7 8 9 10 6 7 8 9 10 11 12 13 14 15 6 7 8 9 10 11 12 13 14 15 11 12 13 14 15 16 13 17 14 18 15 19 20 11 12 16 17 18 19 20 16 17 18 19 20 21 18 22 19 23 20 24 25 16 17 21 22 23 24 25 21 22 23 24 25 21 22 23 24 25 1 1 1 1
47. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 23 24 24 25 25 21 21 22 22 23 23 24 24 25 25
48. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 21 21 22 22 23 23 24 24 25 25 21 21 22 22 23 23 24 24 25 25 *
49. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 21 21 22 22 23 23 24 24 25 25 21 21 22 22 23 23 24 24 25 25 *
50. 应对 - 数据布局 NC/4HW4布局下,如何利利⽤用SIMD加速卷积? 1 1 2 2 3 3 4 4 5 5 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 6 6 7 7 8 8 9 9 10 10 k1 k1 k2 k2 k3 k3 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 11 11 12 12 13 13 14 14 15 15 k4 k4 k5 k5 k6 k6 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 16 16 17 17 18 18 19 19 20 20 k7 k7 k8 k8 k9 k9 21 21 22 22 23 23 24 24 25 25 21 21 22 22 23 23 24 24 25 25 * • • • • • • • 适应任何kernel、stride、dilation 充分利利⽤用SIMD 数据复⽤用更更简单 适应任何pad、输⼊入⼤大⼩小 NEON、汇编编写难度下降 适应GPU数据布局 轻量量化,包⼤大⼩小增量量低 • • 最⾼高3通道内存/算⼒力力浪费 部分Op需要额外布局转换
51. 应对 - Winograd 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 K 5 10 15 20 25 k1 * K k4 k7 k2 k5 k8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 k3 k6 = k9
52. 应对 - Winograd 1 6 2 7 3 8 4 9 10 12 13 14 15 16 17 18 19 20 21 22 23 24 K 5 11 25 N k1 * K k2 k3 k4 k5 k6 k7 k8 k9 = N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
53. 应对 - Winograd N+K-1 N + K 1 1 2 3 4 2 3 4 5 6 7 8 9 7 8 9 10 11 16 6 12 17 7 13 18 8 14 19 9 12 17 7 13 18 8 14 19 9 K 15 20 10 11 12 13 14 12 13 14 15 16 17 18 19 17 18 19 20 21 22 23 24 22 23 24 25 N k1 * K k2 k3 k4 k5 k6 k7 k8 k9 = N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
54. 应对 - Winograd N+K-1 N + K 1 1 6 11 16 2 7 12 17 3 8 13 18 K N 4 9 14 19 k1 * K k4 k7 k2 k5 k8 k3 k6 k9 = N 1 2 5 6
55. 应对 - Winograd N+K-1 N + K 1 1 6 11 16 2 7 12 17 3 8 13 18 K N 4 9 14 19 k1 * K k4 k7 k2 k5 k8 k3 k6 k9 = N 1 2 5 6
56. 应对 - Winograd T T T Y = A [(GgG ) ⊙ (B dB)]A N+K-1 N + K 1 1 2 6 11 16 3 7 17 N 4 8 12 K k1 9 13 18 * 14 K k4 k7 19 k2 k3 k5 k8 GgG B dB 4x4 4x4 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 T 4x3 N 2 5 6 k9 T 4x4 = k6 1 3x3 T 3x4 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T A Y′A T 2x4 4x4 4x2 = Y′ 1 2 3 4 1 2 3 4 1 2 3 4 6 7 8 9 6 7 8 9 6 7 8 9 11 12 13 14 11 12 13 14 11 12 13 14 16 17 18 19 16 17 18 19 16 17 18 19
57. 应对 - Winograd T T T Y = A [(GgG ) ⊙ (B dB)]A N+K-1 N + K 1 1 2 6 11 16 3 7 17 N 4 8 12 K k1 9 13 18 * 14 K k4 k7 19 k2 k3 k5 k8 4x4 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 5 6 G由中国剩余数定理理计算 GgG B dB 4x4 N 2 k9 T 4x4 = k6 1 T T A Y′A GgGT提前计算 T 4x3 3x3 3x4 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T 2x4 4x4 4x2 = Y′ 1 2 3 4 1 2 3 4 1 2 3 4 6 7 8 9 6 7 8 9 6 7 8 9 11 12 13 14 11 12 13 14 11 12 13 14 16 17 18 19 16 17 18 19 16 17 18 19
58. 应对 - Winograd T T T Y = A [(GgG ) ⊙ (B dB)]A N+K-1 N + K 1 1 2 6 11 16 3 7 17 N 4 8 12 K k1 9 13 18 * 14 K k4 k7 19 k2 k3 k5 k8 GgG B dB 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 T 6 A根据N和K计算 T T A Y′A GgGT提前计算 BTdB即时计算 4x4 5 G由中国剩余数定理理计算 T 4x4 N 2 k9 B根据N和K计算 4x4 = k6 1 4x3 3x3 3x4 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T ATY`A即时计算 2x4 4x4 4x2 = Y′ 1 2 3 4 1 2 3 4 1 2 3 4 6 7 8 9 6 7 8 9 6 7 8 9 11 12 13 14 11 12 13 14 11 12 13 14 16 17 18 19 16 17 18 19 16 17 18 19
59. 应对 - Winograd T T T Y = A [(GgG ) ⊙ (B dB)]A N+K-1 N + K 1 1 2 6 11 16 3 7 17 N 4 8 12 K k1 9 13 18 * 14 K k4 k7 19 k2 k3 k5 k8 GgG B dB 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 T 6 A根据N和K计算 T T A Y′A GgGT提前计算 BTdB即时计算 4x4 5 G由中国剩余数定理理计算 T 4x4 N 2 k9 B根据N和K计算 4x4 = k6 1 4x3 3x3 3x4 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T ATY`A即时计算 2x4 4x4 4x2 = Y′ 1 2 3 4 1 2 3 4 1 2 3 4 6 7 8 9 6 7 8 9 6 7 8 9 11 12 13 14 11 12 13 14 11 12 13 14 16 17 18 19 16 17 18 19 16 17 18 19
60. 应对 - Winograd N+K-1 N + K 1 1 6 11 16 2 7 12 17 3 8 13 18 K N 4 k1 9 * 14 K k4 k7 19 k2 k5 k8 k3 k6 = N 1 2 5 6 k9 9 x 4 = 36 次乘法计算 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 4 x 4 = 16 次乘法计算 36 / 16 = 2.25 T 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T = Y′
61. 应对 - Winograd N+K-1 N + K 1 1 6 11 16 2 7 12 17 3 8 13 18 K N 4 k1 9 * 14 K k4 k7 19 k2 k5 k8 k6 = N 1 2 5 6 k9 9 x 4 = 36 次乘法计算 1 0 −1 0 1 0 −1 0 0 1 1 0 0 1 1 0 d 0 −1 1 0 0 −1 1 0 0 1 0 −1 0 1 0 −1 4 x 4 = 16 次乘法计算 36 / 16 = 2.25 T 以内存换取性能 k3 1 0 0 1 0 0 1/2 1/2 1/2 1/2 1/2 1/2 ⊙ g 1/2 −1/2 1/2 1/2 −1/2 1/2 0 0 1 0 0 1 T = Y′ N K 加速倍率 内存增加倍数 2 3 2.25 0.78 4 3 4.00 3.00 6 3 5.06 6.11
62. 应对 - Strassen 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
63. 应对 - Strassen a11 a12 b11 b12 = c11 c12 * (a21 a22) (b21 b22) (c21 c22)
64. 应对 - Strassen a11 a12 b11 b12 = c11 c12 * (a21 a22) (b21 b22) (c21 c22) v1 = (a11 + a22)(b11 + b22) v2 = (a21 + a22)(b11) v3 = (a11)(b12 − b22) v4 = (a22)(b21 − b11) v5 = (a11 + a12)(b22) c11 = v1 + v4 − v5 + v7 c21 = v2 + v4 c12 = v3 + v5 c22 = v1 + v3 − v2 + v6 v6 = (a21 − a11)(b11 + b12) v7 = (a12 − a22)(b21 + b22) 使⽤用 10 + 8 次矩阵加减替代1次矩阵乘法(占⽐比1/8)
65. 应对 - Strassen a11 a12 b11 b12 = c11 c12 * (a21 a22) (b21 b22) (c21 c22) s1 = a21 + a22 s2 = s1 − a11 s3 = a11 − a21 s4 = a12 − s2 t1 = b21 − b11 t2 = b22 − t1 t3 = b22 − b12 t4 = t2 − b21 m1 = a11b11 m2 = a12b21 m3 = s4b22 m4 = a22t4 m5 = s1t1 m6 = s2t2 m7 = s3t3 u1 = m1 + m2 u2 = m1 + m6 u3 = u2 + m7 u4 = u2 + m5 u5 = u4 + m3 u6 = u3 − m4 u7 = u3 + m5 c11 = u1 c12 = u5 c21 = u6 c22 = u7 使⽤用 4 + 4 + 7 次矩阵加减替代1次矩阵乘法(占⽐比1/8)
66. 应对 - Strassen a11 a12 b11 b12 = c11 c12 * (a21 a22) (b21 b22) (c21 c22) s1 = a21 + a22 s2 = s1 − a11 s3 = a11 − a21 s4 = a12 − s2 t1 = b21 − b11 t2 = b22 − t1 t3 = b22 − b12 t4 = t2 − b21 m1 = a11b11 m2 = a12b21 m3 = s4b22 m4 = a22t4 m5 = s1t1 m6 = s2t2 m7 = s3t3 u1 = m1 + m2 u2 = m1 + m6 u3 = u2 + m7 u4 = u2 + m5 u5 = u4 + m3 u6 = u3 − m4 u7 = u3 + m5 c11 = u1 c12 = u5 c21 = u6 c22 = u7 O(n 3) O(n 2.81) 矩阵较⼤大时 矩阵乘法远慢于矩阵加减 使⽤用 4 + 4 + 7 次矩阵加减替代1次矩阵乘法(占⽐比1/8) 收益较为明显
67. 应对 - 递归Strassen 递归分割 m k m n n k * =
68. 应对 - 递归Strassen 递归分割 m k m n n k * =
69. 应对 - 递归Strassen 递归分割 m k m n n k * = 递归条件 减免矩阵乘法收益 = m * n * k / 8 S矩阵加减代价 = 4 * m / 2 * k / 2 * 3 = 3 * m * k T矩阵加减代价 = 4 * n / 2 * k / 2 * 3 = 3 * n * k U矩阵加减代价 = 7 * m / 2 * n / 2 * 3 = 5.25 * m * n ∴ m * n * k / 8 > 3 * m * k + 3 * n * k + 5.25 * m * n
70. 应对 - 链路路优化 相机输⼊入 图⽚片预处理理 预处理理数据 年年货检测推理理 有⽆无年年货 获得福卡
71. 应对 - 链路路优化 相机输⼊入 图⽚片预处理理 预处理理数据 年年货检测推理理 有⽆无年年货 获得福卡
72. 应对 - 链路路优化 相机输⼊入 图⽚片预处理理 预处理理数据 年年货检测推理理 有⽆无年年货 获得福卡 ⾊色值变化 ⾊色彩空间转换 GRAY RGBA BGRA YUV 仿射变换
73. 应对 - 链路路优化 相机输⼊入 图⽚片预处理理 预处理理数据 年年货检测推理理 有⽆无年年货 获得福卡 ⾊色值变化 ⾊色彩空间转换 GRAY RGBA BGRA YUV 仿射变换
74. 应对 - 链路路优化 相机输⼊入 图⽚片预处理理 预处理理数据 年年货检测推理理 有⽆无年年货 获得福卡 ⾊色值变化 ⾊色彩空间转换 GRAY RGBA BGRA YUV 仿射变换
75. 性能⽐比较 MobileNet v2, MNN vs NCNN, TFLite, Mace, on OPPO r17 time cost(ms) 200 183 150 100 79 50 0 22 23 25 MNN CPU MNN OpenCL MNN Vulkan NCNN CPU TF Lite CPU 43 50 Mace CPU Mace OpenCL time cost(ms) MobileNet v2, MNN vs NCNN, TFLite, Caffe2 on iPhone 7 Plus 100 75 60.2 50 25 0 18.5 22.1 21.6 MNN CPU MNN Metal NCNN CPU 31.4 32.2 TF Lite CPU TF Lite Metal Caffe2 CPU
76. ⼩小结 对⽐比 拓拓展性 模型 后端 缓存 CPU 算⼦子 flatbuffer 完全解耦 适应输⼊入 ⾃自动⽣生成 动态导⼊入 内存池 76 TensorFlow Lite flatbuffer 部分解耦 ⾃自动⽣生成 编译确定 X 93 Mace protobuf 部分解耦 ⾃自动⽣生成 编译确定 会话级 内存池 NCNN ⾃自定义 框架耦合 ⼿手⼯工编写 编译确定 会话级 内存池 MNN 多线程 GPU 核⼼心 通⽤用优化 GCD/ OpenMP 体积较⼩小 CV Metal OpenGL OpenCL Vulkan 55 11 33 35 O 17 19 X X X 61 特定优化 OpenMP 体积较⼤大 X X 29 X X 65 特定优化 OpenMP 体积较⼤大 X X X 32 O 线程池 BLAS
77. 基于编译器器优化的⽅方案 nnvm opt tvm build func_list graph optimizations graph GraphFuseCompile InferBound bound ScheduleOps stmt IR passes export & save tuning stmt MakeAPI lowered func IR passes host module LLVMPassManager host & device func CodeGen<mode> device module save meta & binary object shader meta json object AutoTuning shader meta json
78. 基于编译器器优化的⽅方案 nnvm opt tvm build func_list graph optimizations GraphFuseCompile tuning stmt InferBound MakeAPI bound graph export & save lowered func ScheduleOps stmt host module IR passes LLVMPassManager host & device func IR passes CodeGen<mode> device module 输⼊入变化 save meta & binary 模型变化 object object shader meta json 硬件变化 AutoTuning shader meta json 基本单元 实现 时间 成本 推理理引擎 算⼦子 通⽤用算法 + 特定优化 运⾏行行时 有限规则 固定 编译优化 表达式 有限带参模板 编译时 AutoTuning 与设备类型数成正⽐比
79. 性能⽐比较 TVM CPU Time / ms MNN CPU 444.7 297.1 232.5 184.6 33.6 41.3 MobileNet V1 22.9 33.4 MobileNet V2 47.7 51.4 21.9 26 SqueezeNet V1.0 SqueezeNet V1.1 ResNetV2 50 (Soc: HiSilicon Kirin 970) : (4 x Cortex A73 2.36GHz) TVM数据来源:https://github.com/dmlc/tvm/wiki/Benchmark InceptionV3
80. 应⽤用场景 拍⽴立淘 ⼈人脸贴纸 ⽯石头剪⼑刀布
81. 应⽤用场景 拍⽴立淘 ⼈人脸贴纸 ⽯石头剪⼑刀布
82. Github开源 项⽬目发展 经历双⼗十⼀一 项⽬目开源 规范化改造 2017 2018 2019 项⽬目启动 开源启动 正式开源
83. Roadmap • 转换 • 追加算⼦子⽀支持 • 追加图优化匹配模板 • 模型压缩⼯工具 • 调度 • 端侧训练 • 联合学习 • 设备⾃自动选择 • 执⾏行行 • 持续优化各后端算⼦子实现 • 优化量量化的卷积、矩阵乘算法 • CV⽀支持GPU • ⾼高性能计算库 • 算法⾃自动选择 • 其他 • 更更多⽂文档、示例例
84. Join Us! https://github.com/alibaba/mnn 群号:23329087 ⼆二维码:
85. THANKS THANKS! THANKS!