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

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

## 准备model_optimize_tool
9
当前获得model_optimize_tool方法有三种:
10
1. 我们提供当前develop分支编译结果下载:[model_optimize_tool](http://paddlelite-data.bj.bcebos.com/model_optimize_tool/model_optimize_tool?authorization=bce-auth-v1%2Fda8cb47e87b14fdbbf696cae71997a31%2F2020-01-03T10%3A07%3A19Z%2F300%2Fhost%2Fd9d34deb6d9338ffb68e55e10293519ecdf77dc557c109af6982f04578963d8e)[model_optimize_tool_mac](http://paddlelite-data.bj.bcebos.com/model_optimize_tool/model_optimize_tool_mac?authorization=bce-auth-v1%2Fda8cb47e87b14fdbbf696cae71997a31%2F2020-01-03T10%3A07%3A43Z%2F300%2Fhost%2F6fb8733b86d8f44e38ea7c430daefbcb3ca0d3f4de43e18202e0db69c06901dc)
J
up  
juncaipeng 已提交
11

12
2. 可以进入Paddle-Lite Github仓库的[release界面](https://github.com/PaddlePaddle/Paddle-Lite/releases),选择release版本下载对应的model_optimize_tool
J
up  
juncaipeng 已提交
13

14 15 16 17 18 19 20 21 22
3. 可以下载Paddle-Lite源码,从源码编译出model_optimize_tool工具
```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
```
编译结果位于`Paddle-Lite/build.model_optimize_tool/lite/api/model_optimize_tool`
**注意**:从源码编译model_optimize_tool前需要先[安装Paddle-Lite的开发环境](../source_compile)
H
huzhiqiang 已提交
23

24
## 使用model_optimize_tool
H
huzhiqiang 已提交
25

26
model_optimize_tool是x86平台上的可执行文件,需要在PC端运行:包括Linux终端和Mac终端。
H
huzhiqiang 已提交
27

28 29 30 31
### 帮助信息
 执行model_optimize_tool时不加入任何输入选项,会输出帮助信息,提示当前支持的选项:
```bash
 ./model_optimize_tool
H
huzhiqiang 已提交
32
```
33 34
![](https://user-images.githubusercontent.com/45189361/71724953-2842c980-2e6d-11ea-8ff5-7d20083ba297.png)

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

38
模型优化过程:
J
up  
juncaipeng 已提交
39

40
(1)准备待优化的PaddlePaddle模型
J
up  
juncaipeng 已提交
41

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

45
![opt_combined_model](https://user-images.githubusercontent.com/45189361/71725708-de0f1780-2e6f-11ea-9205-a12a0ec26e02.png)
46 47

   Seperated Param:参数信息分开保存在多个参数文件中,模型的拓扑信息保存在`__model__`文件中。
48
![opt_seperated_model](https://user-images.githubusercontent.com/45189361/71724977-47d9f200-2e6d-11ea-934b-fb068d45b700.png)
J
up  
juncaipeng 已提交
49

50 51 52 53 54 55
(2) 终端中执行`model_optimize_tool`优化模型
**使用示例**:转化`mobilenet_v1`模型
```
./model_optimize_tool --model_dir=./mobilenet_v1 --valid_targets=arm --optimize_out_type=naive_buffer --optimize_out=mobilenet_v1_opt
```
以上命令可以将`mobilenet_v1`模型转化为arm硬件平台、naive_buffer格式的Paddle_Lite支持模型,优化后的模型文件位于`mobilenet_v1_opt`,转化结果如下图所示:
J
up  
juncaipeng 已提交
56

57
![opt_resulted_model](https://user-images.githubusercontent.com/45189361/71725712-e10a0800-2e6f-11ea-8cdf-bdc1e1bc2fbc.png)
J
up  
juncaipeng 已提交
58 59


60
(3) **更详尽的转化命令**总结:
J
up  
juncaipeng 已提交
61 62 63 64 65 66 67 68

```shell
./model_optimize_tool \
    --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> \
69
    --valid_targets=(arm|opencl|x86|npu|xpu) \
70 71
    --prefer_int8_kernel=(true|false) \
    --record_tailoring_info =(true|false)
J
up  
juncaipeng 已提交
72 73 74 75
```

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

J
up  
juncaipeng 已提交
85 86
* 如果待优化的fluid模型是非combined形式,请设置`--model_dir`,忽略`--model_file``--param_file`
* 如果待优化的fluid模型是combined形式,请设置`--model_file``--param_file`,忽略`--model_dir`
J
up  
juncaipeng 已提交
87
* 优化后的模型包括__model__.nb和param.nb文件。
88 89 90 91 92 93 94 95 96 97 98

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

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

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

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

`./model_optimize_tool --print_model_ops=true  --model_dir=mobilenet_v1 --valid_targets=arm`

99
![opt_print_modelops](https://user-images.githubusercontent.com/45189361/71725716-e404f880-2e6f-11ea-8db6-81d61aaca481.png)
100 101 102 103 104 105 106

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

`./model_optimize_tool --print_all_ops=true`

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

107
![opt_print_allops](https://user-images.githubusercontent.com/45189361/71725719-e6675280-2e6f-11ea-8f03-035f3b7950cd.png)
108 109 110 111 112

`./model_optimize_tool ----print_supported_ops=true  --valid_targets=arm`

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

113
![opt_print_supportedops](https://user-images.githubusercontent.com/45189361/71725721-e8311600-2e6f-11ea-91b0-a3e014aea096.png)
114 115 116 117 118 119

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

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

120
**一键转化脚本**[auto_transform.sh](http://paddlelite-data.bj.bcebos.com/model_optimize_tool/auto_transform.sh?authorization=bce-auth-v1%2Fda8cb47e87b14fdbbf696cae71997a31%2F2020-01-03T10%3A04%3A55Z%2F300%2Fhost%2Fb67b204067ca7e0cde59ba891370961c5ef43020629f888b81ea1a5d05fcb3a4)
121

122
**环境要求**:使用`auto_transform.sh`脚本转化第三方模型时,需要先安装x2paddle环境,请参考[x2paddle环境安装方法](https://github.com/PaddlePaddle/X2Paddle#环境依赖) 安装x2paddle和其环境依赖项。
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156

**使用方法**

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

(2)转化模型方法

```bash
USAGE:
    auto_transform.sh combines the function of x2paddle and model_optimize_tool, it can 
    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

Arguments about model_optimize_tool:
    --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'
----------------------------------------
```