本期是由百度飞桨资深研发工程师为大家带来飞桨高性能端侧推理引擎Paddle Lite技术解析,敬请观看。
视频关键知识点Notes:
01
背景介绍
近年来,深度学习模型推理部署的场景已经发生了很大的变化,从类别有限的服务器端,到目前碎片化的终端分布,比如智能手表、智能手机、音箱等等。除了终端设备形态本身,硬件架构也迅速发展,有更多移动端的芯片选择,对AI的推理引擎提出了更高的要求。
为了应对这些要求,飞桨孵化出一款高性能端侧推理引擎Paddle Lite,特性是支持多硬件多平台、轻量化部署、方便移动端的上线、还有高性能实现。2019年8月份初始发布,10月末发布2.0正式版,为开发者提供与百度内部项目相同的能力。
02
基本特性
2.1 多硬件支持
- ARM CPU V7、V8
- Mali、Adreno、Metal GPU
- Huawei NPU
- FPGA
- X86 CPU
- Nvidia GPU Server、Tegra系列、Jetson系列
2.2 多平台支持
Paddle Lite 自上而下支持两个层次的多平台支持,一个是上层的多种训练平台支持,除了飞桨训练出的原生模型,还可以通过 X2Paddle 工具将Caffe, TensorFlow, ONNX 等第三方平台的模型转化为飞桨(PaddlePaddle) 的模型格式,从而加载进 Paddle Lite 部署。
2.3 轻量级部署
Paddle Lite把整个架构拆分成了分析和执行两大阶段,分析阶段的一系列功能会作为离线工具,而执行阶段可以单独拆开来部署到移动端。
2.4 高性能实现
Paddle Lite 的实现也是比较高效的,比如在端侧推理非常主流的硬件 ARM CPU上,MobileNetV1 的性能优势明显。
2.5 量化计算支持
量化计算是神经网络计算的趋势。神经网络有信息冗余的特点,即使使用低精度计算也能保证效果,基于这个优点,各硬件平台都通过量化计算来提供更快,功耗体积更有优势的硬件。Paddle Lite 在这方面也有很好的支持。
03
通用硬件平台的架构设计
Paddle Lite 在架构的设计中,重点考虑了相对广泛的多硬件平台支持的能力。首先在Kernel 层,一种算法可以为多个硬件或者实现方法注册多个实现。
3.1 Kernel重载
执行模型,特别在预测时,会在底层转化为一系列OP算子序列,序列会展开成一个Graph静态图,静态图会进一步确定具体分硬件的Kernel。有时候有多种硬件可选,所以可能会有X86 CPU和NV GPU混合执行,这在Paddle Lite来讲是非常容易的。
3.2 类型推导
在一个具体的模型里,多种硬件的Kernel混合执行是类似编译器或编译语言里类型推导的过程。过程中每一步都可以定位到一个Kernel,在每一步Paddle Lite都会做一个类型推导,来确定我们具体需要其选择的硬件的Kernel种类以及它的精度、数据排布能力。
3.3 适度的硬件抽象
Paddle Lite大部分的代码都是Kernel算子具体的实现。算子数量有一百多十个。另外图分析有几十种模块化的分析优化,我们叫Pass。这两个都会随着持续的优化而不断的增加。
04
用户接口及案例
获取模型的方法以下几种:
- 参考PaddlePaddle 文档训练新的模型
https://www.paddlepaddle.org.cn/start
- 直接使用Paddle/models标准模型库中提供的模型
https://github.com/PaddlePaddle/models
- X2Paddle 模型转换工具转化第三方模型
https://github.com/PaddlePaddle/X2Paddle
- PaddleSlim 模型压缩工具集二次压缩PaddlePaddle模型
https://github.com/PaddlePaddle/models/tree/develop/PaddleSlim
- Paddle Lite提供APP(Android, iOS)以及树莓派上做的演示
https://github.com/PaddlePaddle/Paddle-Lite-Demo
05
Roadmap
Paddle Lite在10月31日的时候发布了2.0的正式版本,11月底又发布了2.1版本,目前的节奏是每个月会有一个新版本。持续加强的方向包括框架功能强化、硬件支持范围持续增大、整体性能优化、量化部署方案的完善等,未来也会有越来越多的INT8的模型出来。最后是持续增加更多的Demo、代码和文档。
06
附Paddle Lite 2.1版本 Release Notes
重点功能
- 新增ARM端图像预处理库。
- 支持多种颜色空间转换,如 NV12_To_RGB、GRAR_To_RGB 等。
- 支持多种图像预处理操作,如图像旋转、翻转等。
- 支持图像数据到tensor的转换,如RGB_To_NCHW(Tensor)等。
- 相关功能性能优于 OpenCV 处理速度。
- 增加多个模型裁剪预测库功能。用户给定多个模型,按需裁剪预测库的算子,只保留提供模型线上预测所需要的功能,最大化压缩预测库体积。相关文档可参考裁剪预测库方法。
- 加强报错信息,Android 中支持原生系统报错。
基础功能升级
- 新增op
- x86 tanh,gelu。
- x86 stack。
- 新增模型
- X86增加MobileNet_v1,MobileNet_v2支持。
- op升级,与飞桨核心框架(以下简称Paddle)对齐
- reshape支持输入ShapeTensor、Tensor。
- slice支持输入StartsTensor、StartsTensorList。
- lookup_table根据Paddle 升级修改,去除最后一维必须为1的限制,保留原op,新op为lookup_table_v2。
- resize_bilinear和resize_nearest根据 Paddle 升级,增加对list的Tensor输入shape和对Tensor输入scale的支持。
- api对齐
- python、java、C 三种 api核心接口对齐:其中,python和 C 完整对齐了 MobileConfig 和 CxxConfig 两个模式;Java 定位为Android端使用,只对其了 MobileConfig。
- 升级量化模型支持
- 支持PaddlePaddle训练后量化方法产出的量化模型,比如mobilenet_v1、 mobilenet_v2、resnet50,使用方法请参考文档。
- 支持PaddlePaddle量化训练方法产出权重量化方式为channel_wise_abs_max的量化模型。
- 预测库整理:重新整理核心库包含的(basic) OP&Kernel,使基础预测库(build_extra=OFF)完整支持CV相关9个核心模型(包括Paddle原生模型和对应的 X2Paddle第三方转化模型)和三个量化模型。且tiny_publish下预测动态库体积不变。支持模型如下:
- 9个基础模型及其 Paddle 转化模型:mobileNetV1、mobileNetV2、mnasnet、resnet50、yolov3、ssd_mobilenetv1、 unet、squeezenet_v11、shufflenet_v2。
- 三个int8量化模型:mobilenet_v1、mobilenet_v2、resnet50性能。
性能
- ARM CPU Conv3x3 性能提升。改进ARM CPU Conv3x3实现方式,在Resnet、Squeezenet等模型上提升性能。
编译
- X86与 CUDA 编译时第三方库下载加速 (X86编译相关的第三方库eigen、mklml、xxhash改为从百度云地址下载,加速编译过程)。
- NPU的编译支持华为官方最新版HiAI DDK 310。
文档
- 新增Pass介绍与注册方法文档。
- 补齐了 Cxx API文档。
- 新增CV图像预处理库API接口介绍文档。
- 新增部署训练后量化模型的使用示例文档。
Bug 修复
- 修复 jit::matmul 特定尺寸下计算错误的bug:输入x, shape(m, k) weight, shape(k, n),当k < 512,m==1, 且n是16的倍数时,jit分组group计算错误。
- 修复yolo_box cuda kernel多次运行结果出错的bug:多次运行时没有将上一次的结果清零,会保留之前计算的结果。
- 修复fill_constant kernel的bug:没有用到dtype属性,默认输出floattensor,修复后根据dtype属性判断输出类型。
- 修复convolution X86 kernel由于share_data_with导致的运行多次以后输出结果不正确的bug。
- 修复多线程跑模型会随机crash的问题。
进入网盘获取视频中的PPT,链接:
https://pan.baidu.com/s/1ABDngOHQDoWcl15QLqswng 密码:d43b