文字内容
1. 嵌入式深度学习研发与落地实践 李永会 百度大搜索资深工程师
2. 个人介绍 • 2014年加入百度 • 多模搜索部 • 关注ARM架构 • 深度学习移动端落地 • 计算机视觉移动应用 李永会
3. 大纲 • 深度学习框架Paddle-Mobile介绍 • 移动端深度学习优化过程 • 移动端深度学习APP上线过程
4. Paddle-Mobile
5. Paddle-Mobile介绍 • 定位: 致力于嵌入式平台的深度学习预测框架 • 优势: 高性能 预测API! 体积小 对移动端工程师友好 ⼯工程实现! ⽀支持Linux-ARM/iOS/Android/DuerOS! • 覆盖: CPU ARM GPU Apple 模型压缩! 底层算法优化! Mali Adreno FPGA Web 平台! CPU! GPU! NPU! Paddle-mobile web! FPGA!
6. Paddle-Mobile • 训练和预测结合 • 与PaddlePaddle统一API • 亿级用户支撑
7. Paddle-Mobile ARM CPU Armv7\v8手机。以及树莓派、 RK3399系列等硬件, Paddle-Mobile做了支持,解 决了很多问题,目前在其平 台上的cpu版本一键编译即可 完美运行。 Mali&Adreno&Apple • IOS GPU使用metal支持直 接编写,支持的系统范围 向下到ios 9。这比coreml 支持的范围有所扩大。目 前该代码也已全面开放在 github。 • Mali GPU&Adreno 使用了 OpenCL对GPU做Paddle 模型支持。在较高端的 Mali GPU上已经可以得到 非常高的性能。 FPGA Web 该项工作代码由百度智能驾 驶团队提供的可以运行部分 功能。在Github可以找到相 关代码。对于ZU9和ZU5等开 发板完全支持。感兴趣的工 程师们可以去了解。 Paddle-Mobile正在实现底层 基于WebGL的网页版深度学 习框架。我们使用了ES6。后 续会使用WebAssembly和 WebGL并行融合的设计,在 性能上进一步提高。该功能 近期也会在Github开源,欢 迎关注。
8. 优化篇
9. 体积优化 • 服务端和客户端框架结合优化模型体积 8bit量化 8bit映射 • 移动端的敏感神经 - 包体积 protobuf 按模型定制编译 无第三方依赖 代码体积控制 编译选项优化,隐藏符号表
10. CPU优化 • SIMD NEON优化技术 • 片上缓存命中优化 • 矩阵合理分块 • pld汇编指令优化 • 循环展开 • 重排流水线
11. Mali & Adreno GPU优化 • 卷积优化: CPU中运算复杂度:O(n^3) GPU中运算复杂度:O(n) • 降低每个 ALU 运算的复杂度: 简化算法 16bit 替代32bit 尽量少使用逻辑判断与循环 • 优化内存传输: 使用占用内存更小的数据类型 尽量使用向量类型
12. Apple GPU Matel直接实现 IOS 9 以上系统 使用16bit量化计算 对可融合op进行op融合 相对于 CPU 预处理部分同样使用 GPU 进行运算, 省去了CPU预处理部分 • 输出结果时使用 GPU 进行数据结构转 换 • • • • •
13. 模型覆盖
14. OP融合 Mobilenet! 麒麟960/armv7(ms)! 1线程! ! 2线程! ! 4线程! ! 融合前! 139.796! 98.9725! 87.7417! 融合后! 108.588! 63.073! 36.822!
15. Web深度学习
16. FPGA预测框架 • 基于resnet50进行10000张图片测试 • Resnet50算子融合后,共有75个算子 PaddleMobile及驱动程序共耗时1.4 ms • 实战中的车道线识别网络。右图是使用 Paddle-Mobile在ZU5 上跑通的效果 224x224x3 Resnet50 110 fps
17. 落地篇
18. AR实时翻译
19. AR实时翻译 • 文本检测 获取文本位置 • 文本识别 识别出文字 端侧OCR • 图像技术 追踪、视图变换 提取前景背景、贴合
20. AR实时翻译Trick List • 无结果时需 1 s 请求一次, 有结果时 3s(可根据情况自行调整) 请求一次; • 加速器 陀螺仪 发起请求时, 过滤此次请求; 有结果的时候, 手机运动幅度过大, 清屏; 捕获手机的运动状态(通过追踪提供的方法获取offset); 监测陀螺仪, 加速器, 如果请求期间运动过大, 则过滤此次请求; 如果手机在前后运动, 则过滤此次请求; • 追踪初始化, 传入的初始化位置值, 需要加上手机请求过程中的 offset; • 如果服务端返回文本行数为多行,左对齐显示,自行调整行数和字号,填充满区 域; • 如果服务端返回文本行数为单行,居中显示,尽可能保持单行显示,但若字符数/ 区域宽度小于0.1(可根据情况自行调整),则显示为多行;
21. 视频流式搜索
23. 上线障碍 • 多线程问题 • 设备基线 冷启动和热启动差别大 不能用游戏模式看数据 • UI性能瓶颈 android平台yuv转rgb等矩阵操作需要放在native层做,否则性能堪忧 相机的预览回调中不能做耗时工作,会干扰帧频,放子线程 • SDK native层的生命周期相关操作中有耗时逻辑,否则主线程很容易产生ANR • 缓存jvm指针,在子线程回调时通过jvm指针获取当前线程的env指针来进行操作 (缓存主线程的env指针是不行的)。同时,结束回调前需让jvm指针detach当前 线程,否则在Dalvik上会crash • JNI层,需要在使用完之后立即删除local ref, JNI ERROR:local reference table overflow (max=某个阈值)
24. 上线障碍 • Android N系统so限制 paddle GPU版依赖的OpenCL /vendor/etc/public.libraries.txt • arm-v8的问题 • 被降频 • ROM • 性能的善意谎言
25. 其他落地场景