model_optimize_tool.md 8.5 KB
Newer Older
J
juncaipeng 已提交
1 2 3 4 5
---
layout: post
title: 模型转化方法
---

6
Lite架构在预测过程中表现出来的高性能得益于其丰富的优化组件,其中包括量化、子图融合、混合调度、Kernel优选等等策略。为了使优化过程更加方便易用,我们提供了**opt**来自动完成优化步骤,输出一个轻量的、最优的可执行模型。具体使用方法介绍如下:
J
juncaipeng 已提交
7

8
**注意**:release/v2.2.0之前的模型转化工具名称为`model_optimize_tool`,从release/v2.3.0开始模型转化工具名称修改为`opt`
H
huzhiqiang 已提交
9

10 11
## 准备opt
当前获得opt方法有三种:
J
juncaipeng 已提交
12

13 14
1. 我们提供当前develop分支编译结果下载:[opt](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/opt)[opt_mac](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/opt_mac)
release/v2.2.0之前版本的model_optimize_tool: [model_optimize_tool](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/model_optimize_tool)[model_optimize_tool_mac](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/model_optimize_tool_mac)
J
juncaipeng 已提交
15

16 17 18 19
2. 可以进入Paddle-Lite Github仓库的[release界面](https://github.com/PaddlePaddle/Paddle-Lite/releases),选择release版本下载对应的转化工具`opt`
   (release/v2.2.0之前的转化工具为model_optimize_tool、release/v2.3.0之后为opt)

3. 可以下载Paddle-Lite源码,从源码编译出opt工具
H
huzhiqiang 已提交
20 21 22 23 24 25
```bash
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
cd Paddle-Lite
git checkout <release-version-tag>
./lite/tools/build.sh build_optimize_tool
```
26 27
编译结果位于`Paddle-Lite/build.opt/lite/api/opt`
**注意**:从源码编译opt前需要先[安装Paddle-Lite的开发环境](../source_compile)
J
juncaipeng 已提交
28

29
## 使用opt
J
juncaipeng 已提交
30

31
opt是x86平台上的可执行文件,需要在PC端运行:包括Linux终端和Mac终端。
J
juncaipeng 已提交
32

H
huzhiqiang 已提交
33
### 帮助信息
34
 执行opt时不加入任何输入选项,会输出帮助信息,提示当前支持的选项:
H
huzhiqiang 已提交
35
```bash
36
 ./opt
J
juncaipeng 已提交
37
```
38
![](https://paddlelite-data.bj.bcebos.com/doc_images/1.png)
H
huzhiqiang 已提交
39

H
huzhiqiang 已提交
40
### 功能一:转化模型为Paddle-Lite格式
41
opt可以将PaddlePaddle支持的模型转化为Paddle-Lite支持的模型格式,期间执行的操作包括:将protobuf格式的模型文件转化为naive_buffer格式的模型文件,有效降低模型体积;执行“量化、子图融合、混合调度、Kernel优选”等图优化操作,提升其在Paddle-Lite上的运行速度、内存占用等性能指标。
J
juncaipeng 已提交
42

H
huzhiqiang 已提交
43
模型优化过程:
J
juncaipeng 已提交
44

H
huzhiqiang 已提交
45
(1)准备待优化的PaddlePaddle模型
J
juncaipeng 已提交
46

H
huzhiqiang 已提交
47 48
PaddlePaddle模型有两种保存格式:
   Combined Param:所有参数信息保存在单个文件`params`中,模型的拓扑信息保存在`__model__`文件中。
J
juncaipeng 已提交
49

H
huzhiqiang 已提交
50
![opt_combined_model](https://paddlelite-data.bj.bcebos.com/doc_images%2Fcombined_model.png)
H
huzhiqiang 已提交
51 52

   Seperated Param:参数信息分开保存在多个参数文件中,模型的拓扑信息保存在`__model__`文件中。
H
huzhiqiang 已提交
53
![opt_seperated_model](https://paddlelite-data.bj.bcebos.com/doc_images%2Fseperated_model.png)
J
juncaipeng 已提交
54

55
(2) 终端中执行`opt`优化模型
H
huzhiqiang 已提交
56
**使用示例**:转化`mobilenet_v1`模型
H
huzhiqiang 已提交
57

H
huzhiqiang 已提交
58
```
59
./opt --model_dir=./mobilenet_v1 --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=mobilenet_v1_opt
H
huzhiqiang 已提交
60
```
61
以上命令可以将`mobilenet_v1`模型转化为arm硬件平台、naive_buffer格式的Paddle_Lite支持模型,优化后的模型文件为`mobilenet_v1_opt.nb`,转化结果如下图所示:
J
juncaipeng 已提交
62

63
![opt_resulted_model](https://paddlelite-data.bj.bcebos.com/doc_images/2.png)
J
juncaipeng 已提交
64 65


H
huzhiqiang 已提交
66
(3) **更详尽的转化命令**总结:
J
juncaipeng 已提交
67 68

```shell
69
./opt \
J
juncaipeng 已提交
70 71 72 73 74
    --model_dir=<model_param_dir> \
    --model_file=<model_path> \
    --param_file=<param_path> \
    --optimize_out_type=(protobuf|naive_buffer) \
    --optimize_out=<output_optimize_model_dir> \
H
huzhiqiang 已提交
75
    --valid_targets=(arm|opencl|x86|npu|xpu) \
J
juncaipeng 已提交
76 77 78 79 80 81
    --prefer_int8_kernel=(true|false) \
    --record_tailoring_info =(true|false)
```

| 选项         | 说明 |
| ------------------- | ------------------------------------------------------------ |
H
huzhiqiang 已提交
82 83 84
| --model_dir         | 待优化的PaddlePaddle模型(非combined形式)的路径 |
| --model_file        | 待优化的PaddlePaddle模型(combined形式)的网络结构文件路径。 |
| --param_file        | 待优化的PaddlePaddle模型(combined形式)的权重文件路径。 |
J
juncaipeng 已提交
85 86
| --optimize_out_type | 输出模型类型,目前支持两种类型:protobuf和naive_buffer,其中naive_buffer是一种更轻量级的序列化/反序列化实现。若您需要在mobile端执行模型预测,请将此选项设置为naive_buffer。默认为protobuf。 |
| --optimize_out      | 优化模型的输出路径。                                         |
H
huzhiqiang 已提交
87
| --valid_targets     | 指定模型可执行的backend,默认为arm。目前可支持x86、arm、opencl、npu、xpu,可以同时指定多个backend(以空格分隔),Model Optimize Tool将会自动选择最佳方式。如果需要支持华为NPU(Kirin 810/990 Soc搭载的达芬奇架构NPU),应当设置为npu, arm。 |
J
juncaipeng 已提交
88
| --prefer_int8_kernel | 若待优化模型为int8量化模型(如量化训练得到的量化模型),则设置该选项为true以使用int8内核函数进行推理加速,默认为false。                          |
H
huzhiqiang 已提交
89
| --record_tailoring_info | 当使用[根据模型裁剪库文件](../library_tailoring)功能时,则设置该选项为true,以记录优化后模型含有的kernel和OP信息,默认为false。 |
J
juncaipeng 已提交
90 91 92 93

* 如果待优化的fluid模型是非combined形式,请设置`--model_dir`,忽略`--model_file``--param_file`
* 如果待优化的fluid模型是combined形式,请设置`--model_file``--param_file`,忽略`--model_dir`
* 优化后的模型包括__model__.nb和param.nb文件。
H
huzhiqiang 已提交
94 95 96

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

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

99
(1)使用opt统计模型中算子信息
H
huzhiqiang 已提交
100 101 102

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

103
`./opt --print_model_ops=true  --model_dir=mobilenet_v1 --valid_targets=arm`
H
huzhiqiang 已提交
104

105
![opt_print_modelops](https://paddlelite-data.bj.bcebos.com/doc_images/3.png)
H
huzhiqiang 已提交
106

107
(2)使用opt打印当前Paddle-Lite支持的算子信息
H
huzhiqiang 已提交
108

109
`./opt --print_all_ops=true`
H
huzhiqiang 已提交
110 111 112

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

113
![opt_print_allops](https://paddlelite-data.bj.bcebos.com/doc_images/4.png)
H
huzhiqiang 已提交
114

115
`./opt ----print_supported_ops=true  --valid_targets=x86`
H
huzhiqiang 已提交
116

H
huzhiqiang 已提交
117
以上命令可以打印出当`valid_targets=x86`时Paddle-Lite支持的所有OP:
H
huzhiqiang 已提交
118

119
![opt_print_supportedops](https://paddlelite-data.bj.bcebos.com/doc_images/5.png)
H
huzhiqiang 已提交
120

121
## 其他功能:合并x2paddle和opt的一键脚本
H
huzhiqiang 已提交
122

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

H
huzhiqiang 已提交
126 127
**一键转化脚本**[auto_transform.sh](https://paddlelite-data.bj.bcebos.com/model_optimize_tool/auto_transform.sh)

H
huzhiqiang 已提交
128

H
huzhiqiang 已提交
129
**环境要求**:使用`auto_transform.sh`脚本转化第三方模型时,需要先安装x2paddle环境,请参考[x2paddle环境安装方法](https://github.com/PaddlePaddle/X2Paddle#环境依赖) 安装x2paddle和其环境依赖项。
H
huzhiqiang 已提交
130 131 132 133 134 135 136 137 138

**使用方法**

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

(2)转化模型方法

```bash
USAGE:
139
    auto_transform.sh combines the function of x2paddle and opt, it can 
H
huzhiqiang 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
    tranform model from tensorflow/caffe/onnx form into paddle-lite naive-buffer form.
----------------------------------------
example:
    ./auto_transform.sh --framework=tensorflow --model=tf_model.pb --optimize_out=opt_model_result
----------------------------------------
Arguments about x2paddle:
    --framework=(tensorflow|caffe|onnx);
    --model='model file for tensorflow or onnx';
    --prototxt='proto file for caffe' --weight='weight file for caffe'
 For TensorFlow:
   --framework=tensorflow --model=tf_model.pb

 For Caffe:
   --framework=caffe --prototxt=deploy.prototxt --weight=deploy.caffemodel

 For ONNX
   --framework=onnx --model=onnx_model.onnx

158
Arguments about opt:
H
huzhiqiang 已提交
159 160 161 162 163
    --valid_targets=(arm|opencl|x86|npu|xpu); valid targets on Paddle-Lite.
    --fluid_save_dir='path to outputed model after x2paddle'
    --optimize_out='path to outputed Paddle-Lite model'
----------------------------------------
```