# 3.2.7 编译Paddle模型

BMPADDLE是针对Paddle Paddle的模型编译器，可以将模型文件(inference.pdmodel，inference.pdiparams）编译成 BMRuntime 所需的文件。而且在编译的同时，可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比，保证正确性。

* 命令行形式：

```bash
python3 -m bmpaddle [--model=<path>] \ 
                    [--input_names=<string>] \ 
                    [--shapes=<string>] \ 
                    [--descs=<string>] \ 
                    [--output_names=<string>] \
                    [--net_name=<name>] \ 
                    [--opt=<value>] \ 
                    [--dyn=<bool>] \ 
                    [--outdir=<path>] \ 
                    [--target=<name>] \ 
                    [--cmp=<bool>] \ 
                    [--mode=<string>] \ 
                    [--enable_profile=<bool>] \ 
                    [--list_ops]
```

参数介绍：

<table data-header-hidden><thead><tr><th width="205.66666666666666">args</th><th>type</th><th>Description</th></tr></thead><tbody><tr><td>args</td><td>type</td><td>Description</td></tr><tr><td>model</td><td>string</td><td><strong>Necessary.</strong>paddlepaddle model directory</td></tr><tr><td>input_names</td><td>string</td><td><strong>Necessary.</strong>Set name of all network inputs one by one in sequence. Format “name1,name2,name3”</td></tr><tr><td>shapes</td><td>string</td><td><strong>Necessary.</strong> Shapes of all inputs, default use the shape in prototxt, format [[x,x,x,x],[x,x],…], these correspond to inputs one by one in sequence</td></tr><tr><td>descs</td><td>string</td><td><strong>Optional.</strong> Descriptions of inputs, format "[serial number, data type, lower bound, upper bound]", e.g., "[0, uint8, 0, 256]", default "[x, float, 0, 1]"</td></tr><tr><td>output_names</td><td>string</td><td><strong>Necessary.</strong> Set name of all network outputs one by one in sequence. Format “name1,name2,name3”</td></tr><tr><td>net_name</td><td>string</td><td><strong>Necessary.</strong> Name of the network</td></tr><tr><td>opt</td><td>int</td><td><strong>Optional.</strong> Optimization level. Option: 0, 1, 2, default 1.</td></tr><tr><td>dyn</td><td>bool</td><td><strong>Optional.</strong> Use dynamic compilation, default false.</td></tr><tr><td>outdir</td><td>string</td><td><strong>Necessary.</strong> Output directory</td></tr><tr><td>target</td><td>string</td><td><strong>Necessary.</strong> Option: BM1682, BM1684; default: BM1682</td></tr><tr><td>cmp</td><td>bool</td><td><strong>Optional.</strong>Check result during compilation. Default: true</td></tr><tr><td>mode</td><td>string</td><td><strong>Optional.</strong> Set bmpaddle mode. Option: compile, GenUmodel,summary, show, check. Default: compile.</td></tr><tr><td>enable_profile</td><td>bool</td><td><strong>Optional.</strong> Enable profile log. Default: false</td></tr><tr><td>list_ops</td><td></td><td><strong>Optional.</strong> List supported ops.</td></tr></tbody></table>

* Python模式：

```python
import bmpaddle
## compile fp32 model
bmpaddle.compile(
    model = "/path/to/model(directory)", ## Necessary
    outdir = "xxx", ## Necessary
    target = "BM1684", ## Necessary
    shapes = [[x,x,x,x],[x,x,x]], ## Necessary
    net_name = "name", ## Necessary
    input_names=["name1","name2"], ## Necessary, when .h5 use None
    output_names=["out_name1","out_name2"], ## Necessary, when .h5 use None
    opt = 2, ## optional, if not set, default equal to 1
    dyn = False, ## optional, if not set, default equal to False
    cmp = True, ## optional, if not set, default equal to True
    enable_profile = True ## optional, if not set, default equal to False
    )
```

{% hint style="info" %}
**注意：**

* \--model 参数指定到模型所在文件夹那一级，但要特别注意，PaddlePaddle模型有2种：组合式(combined model)和非复合式(uncombined model)；组合式就是*model + 权重，\_\_model\_\_文件夹下有很多文件，每一个文件是一层，这种模型名称必须用*\_\_*model\_\_*；如果是非组合式，一定要把模型名称修改为\*.pdmodel和\*.pdiparams
* shapes和descs中的变量顺序、名称要和实际模型一致，不能写错
* 对于模型中带nms操作的，并且cmp==true时descs参数必填；对于int32类型，范围不能填重复的值，比如608\*608的输入，要填608,609，但生效的就是608；对于float类型，则没有这个限制；对于不填的输入，其取值范围默认都是0-1。
  {% endhint %}

若成功，输出的 log 最后会看到以下信息：

```bash
######################################
# Store bmodel of BMCompiler.
######################################
```

成功后，将在指定的文件夹中生成一个compilation.bmodel的文件，该文件则是转换成功的 bmodel，用户可以重命名。
