模型优化工具 opt

Paddle-Lite 提供了多种策略来自动优化原始的训练模型,其中包括量化、子图融合、混合调度、Kernel优选等等方法。为了使优化过程更加方便易用,我们提供了opt 工具来自动完成优化步骤,输出一个轻量的、最优的可执行模型。

具体使用方法介绍如下:

注意v2.2.0 之前的模型转化工具名称为model_optimize_tool,从 v2.3 开始模型转化工具名称修改为 opt

准备opt

当前获得opt方法有三种:

  1. 推荐! 可以进入Paddle-Lite Github仓库的release界面,选择release版本下载对应的转化工具opt(release/v2.2.0之前的转化工具为model_optimize_tool、release/v2.3.0之后为opt)
  2. 本文提供release/v2.3release/v2.2.0版本的优化工具下载
版本LinuxMacOS
release/v2.3optopt_mac
release/v2.2.0model_optimize_toolmodel_optimize_tool_mac
  1. 如果 release 列表里的工具不符合您的环境,可以下载Paddle-Lite 源码,源码编译出opt工具
  1. git clone https://github.com/PaddlePaddle/Paddle-Lite.git
  2. cd Paddle-Lite
  3. git checkout <release-version-tag>
  4. ./lite/tools/build.sh build_optimize_tool

编译结果位于Paddle-Lite/build.opt/lite/api/opt 注意:从源码编译opt前需要先安装Paddle-Lite的开发环境

使用opt

opt是 x86 平台上的可执行文件,需要在PC端运行:支持Linux终端和Mac终端。

帮助信息

执行opt时不加入任何输入选项,会输出帮助信息,提示当前支持的选项:

  1. ./opt

https://paddlelite-data.bj.bcebos.com/doc_images/1.png

功能一:转化模型为Paddle-Lite格式

opt可以将PaddlePaddle的部署模型格式转化为Paddle-Lite 支持的模型格式,期间执行的操作包括:

  • 将protobuf格式的模型文件转化为naive_buffer格式的模型文件,有效降低模型体积
  • 执行“量化、子图融合、混合调度、Kernel优选”等图优化操作,提升其在Paddle-Lite上的运行速度、内存占用等效果

模型优化过程:

(1)准备待优化的PaddlePaddle模型

PaddlePaddle模型有两种保存格式: Combined Param:所有参数信息保存在单个文件params中,模型的拓扑信息保存在__model__文件中。

https://paddlelite-data.bj.bcebos.com/doc_images%2Fcombined_model.pngopt_combined_model

Seperated Param:参数信息分开保存在多个参数文件中,模型的拓扑信息保存在__model__文件中。 https://paddlelite-data.bj.bcebos.com/doc_images%2Fseperated_model.pngopt_seperated_model

(2) 终端中执行opt优化模型 使用示例:转化mobilenet_v1模型

  1. ./opt --model_dir=./mobilenet_v1 \
  2. --valid_targets=arm \
  3. --optimize_out_type=naive_buffer \
  4. --optimize_out=mobilenet_v1_opt

以上命令可以将mobilenet_v1模型转化为arm硬件平台、naive_buffer格式的Paddle_Lite支持模型,优化后的模型文件为mobilenet_v1_opt.nb,转化结果如下图所示:

https://paddlelite-data.bj.bcebos.com/doc_images/2.pngopt_resulted_model

(3) 更详尽的转化命令总结:

  1. ./opt \
  2. --model_dir=<model_param_dir> \
  3. --model_file=<model_path> \
  4. --param_file=<param_path> \
  5. --optimize_out_type=(protobuf|naive_buffer) \
  6. --optimize_out=<output_optimize_model_dir> \
  7. --valid_targets=(arm|opencl|x86|npu|xpu) \
  8. --prefer_int8_kernel=(true|false) \
  9. --record_tailoring_info =(true|false)
选项说明
—model_dir待优化的PaddlePaddle模型(非combined形式)的路径
—model_file待优化的PaddlePaddle模型(combined形式)的网络结构文件路径。
—param_file待优化的PaddlePaddle模型(combined形式)的权重文件路径。
—optimize_out_type输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化实现。若您需要在mobile端执行模型预测,请将此选项设置为naive_buffer。默认为protobuf。
—optimize_out优化模型的输出路径。
—valid_targets指定模型可执行的backend,默认为arm。目前可支持x86、arm、opencl、npu、xpu,可以同时指定多个backend(以空格分隔),Model Optimize Tool将会自动选择最佳方式。如果需要支持华为NPU(Kirin 810/990 Soc搭载的达芬奇架构NPU),应当设置为npu, arm。
—prefer_int8_kernel若待优化模型为int8量化模型(如量化训练得到的量化模型),则设置该选项为true以使用int8内核函数进行推理加速,默认为false。
—record_tailoring_info当使用 根据模型裁剪库文件 功能时,则设置该选项为true,以记录优化后模型含有的kernel和OP信息,默认为false。
  • 如果待优化的fluid模型是非combined形式,请设置--model_dir,忽略--model_file--param_file
  • 如果待优化的fluid模型是combined形式,请设置--model_file--param_file,忽略--model_dir
  • 优化后的模型为以.nb名称结尾的单个文件。

功能二:统计模型算子信息、判断是否支持

opt可以统计并打印出model中的算子信息、判断Paddle-Lite是否支持该模型。并可以打印出当前Paddle-Lite的算子支持情况。

(1)使用opt统计模型中算子信息

下面命令可以打印出mobilenet_v1模型中包含的所有算子,并判断在硬件平台valid_targets下Paddle-Lite是否支持该模型

./opt --print_model_ops=true --model_dir=mobilenet_v1 --valid_targets=arm

https://paddlelite-data.bj.bcebos.com/doc_images/3.pngopt_print_modelops

(2)使用opt打印当前Paddle-Lite支持的算子信息

./opt --print_all_ops=true

以上命令可以打印出当前Paddle-Lite支持的所有算子信息,包括OP的数量和每个OP支持哪些硬件平台:

https://paddlelite-data.bj.bcebos.com/doc_images/4.pngopt_print_allops

./opt ----print_supported_ops=true --valid_targets=x86

以上命令可以打印出当valid_targets=x86时Paddle-Lite支持的所有OP:

https://paddlelite-data.bj.bcebos.com/doc_images/5.pngopt_print_supportedops

其他功能:合并x2paddle和opt的一键脚本

背景:如果想用Paddle-Lite运行第三方来源(tensorflow、caffe、onnx)模型,一般需要经过两次转化。即使用x2paddle工具将第三方模型转化为PaddlePaddle格式,再使用opt将PaddlePaddle模型转化为Padde-Lite可支持格式。 为了简化这一过程,我们提供一键脚本,将x2paddle转化和opt转化合并:

一键转化脚本auto_transform.sh

环境要求:使用auto_transform.sh脚本转化第三方模型时,需要先安装x2paddle环境,请参考x2paddle环境安装方法 安装x2paddle和x2paddle依赖项(tensorflow、caffe等)。

使用方法

(1)打印帮助帮助信息:sh ./auto_transform.sh

(2)转化模型方法

  1. USAGE:
  2. auto_transform.sh combines the function of x2paddle and opt, it can
  3. tranform model from tensorflow/caffe/onnx form into paddle-lite naive-buffer form.
  4. ----------------------------------------
  5. example:
  6. sh ./auto_transform.sh --framework=tensorflow --model=tf_model.pb --optimize_out=opt_model_result
  7. ----------------------------------------
  8. Arguments about x2paddle:
  9. --framework=(tensorflow|caffe|onnx);
  10. --model='model file for tensorflow or onnx';
  11. --prototxt='proto file for caffe' --weight='weight file for caffe'
  12. For TensorFlow:
  13. --framework=tensorflow --model=tf_model.pb
  14. For Caffe:
  15. --framework=caffe --prototxt=deploy.prototxt --weight=deploy.caffemodel
  16. For ONNX
  17. --framework=onnx --model=onnx_model.onnx
  18. Arguments about opt:
  19. --valid_targets=(arm|opencl|x86|npu|xpu); valid targets on Paddle-Lite.
  20. --fluid_save_dir='path to outputed model after x2paddle'
  21. --optimize_out='path to outputed Paddle-Lite model'
  22. ----------------------------------------