离青 GMTC 端侧推理引擎面临的挑战与应对
2020-03-01 261浏览
- 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/MetalShaderTools3. 反汇编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 ; FunctionAttrs: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 CodeGendevice 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 CodeGendevice 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/BenchmarkInceptionV3
- 80.应⽤用场景 拍⽴立淘 ⼈人脸贴纸 ⽯石头剪⼑刀布
- 81.应⽤用场景 拍⽴立淘 ⼈人脸贴纸 ⽯石头剪⼑刀布
- 82.Github开源 项⽬目发展 经历双⼗十⼀一 项⽬目开源 规范化改造 2017 2018 2019 项⽬目启动 开源启动 正式开源
- 83.Roadmap • 转换 • 追加算⼦子⽀支持 • 追加图优化匹配模板 • 模型压缩⼯工具 • 调度 • 端侧训练 • 联合学习 • 设备⾃自动选择 • 执⾏行行 • 持续优化各后端算⼦子实现 • 优化量量化的卷积、矩阵乘算法 • CV⽀支持GPU • ⾼高性能计算库 • 算法⾃自动选择 • 其他 • 更更多⽂文档、示例例
- 84.Join Us!https://github.com/alibaba/mnn群号:23329087 ⼆二维码:
- 85.THANKS THANKS! THANKS!