BMPADDLE 使用

编译PADDLE模型

BMPADDLE是针对paddlepaddle的模型编译器,可以将模型文件(inference.pdmodel inference.pdiparams)编译成BMRuntime所需的文件。而且在编译的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的安装需求、安装步骤和使用方法。

  1. 安装需求

    • python 3.x

    • paddlepaddle>=2.1.1

    • linux

  2. 安装步骤

安装该编译器的安装包。选择以下命令其一使用。使用命令(1)则安装在本地目录中,不需要root权限,而命令(2)则安装在系统目录中,需要root权限。

pip install --user bmpaddle-x.x.x-py2.py3-none-any.whl

pip install bmpaddle-x.x.x-py2.py3-none-any.whl

设置LD_LIBRARY_PATH。可以使用以下方式在当前shell中设置该库的路径,或者也可以选择将该路径的设置永久地添加到 .bashrc 文件中。

export LD_LIBRARY_PATH=path_to_bmcompiler_lib

  1. 使用方法

    1. 方式一:命令形式

    Command name: python -m bmpaddle - BMNet compiler command for paddlepaddle model

    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]
    

    参数介绍如下:

    其中mode为compile表示编译float模型。为GenUmodel表示生成SOPHGO定义的统一model,可后续通过SOPHGO定点化工具进行INT8定点化生成INT8 model。 为summay或者show模式表示显示网络graph。 为check表示检查网络graph算子是否支持。

    GenUmodel模式下,参数opt、dyn、target、cmp将没有意义,无需指定。

    参数dyn=false表示使用静态编译,dyn=true表示使用动态编译。静态编译意思是model编译后,在runtime时只能运行编译所设置的shapes。 动态编译意思是model编译后,runtime时可以运行任意shapes,只要实际shapes中的数值小于等于编译所设置shapes中的数值。 一般来说,动态编译后神经网络在芯片上的性能要小于等于静态编译。所以一般建议动态编译用于实际网络的shapes会大范围变化的情况, 如果shapes固定或者只需要几种shapes,建议采用静态编译。关于静态编译下如何支持若干种shapes,请见bmodel说明。

    表 7 bmpaddle参数说明

    args

    type

    Description

    model

    string

    Necessary. paddlepaddle model directory

    input_names

    string

    Necessary. Set name of all network inputs one by one in sequence. Format “name1,name2,name3”

    shapes

    string

    Necessary. Shapes of all inputs, format [x,x,x,x],[x,x]…, these correspond to inputs one by one in sequence

    descs

    string

    Optional. Descriptions of inputs, format [serial number, data type, lower bound, upper bound], e.g., [0, uint8, 0, 256], default [x, float, 0, 1]

    output_names

    string

    Necessary. Set name of all network outputs one by one in sequence. Format “name1,name2,name3”

    net_name

    string

    Necessary. Name of the network.

    opt

    int

    Optional. Optimization level. Option: 0, 1, 2, default 1.

    dyn

    bool

    Optional. Use dynamic compilation, default false.

    outdir

    string

    Necessary. Output directory

    target

    string

    Necessary. Option: BM1682, BM1684; default: BM1682

    cmp

    bool

    Optional.Check result during compilation. Default: true

    mode

    string

    Optional. Set bmpaddle mode. Option: compile, GenUmodel, summary, show, check. Default: compile.

    enable_profile

    bool

    Optional. Enable profile log. Default: false

    list_ops

    Optional. List supported ops.

    1. 方式二:python接口

    bmpaddle编译float32 paddle model的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
    )
    

    bmpaddle转化float32 paddle model为SOPHGO U Model的python接口如下:

    import bmpaddle
    ## compile fp32 model
    bmpaddle.GenUmodel(
      model = "/path/to/model(directory)",     ## Necessary
      outdir = "xxx",                    ## Necessary
      shapes = [[x,x,x,x],[x,x,x]],     ## Necessary
      net_name = "name",                 ## Necessary
      input_names=["name1","name2"],    ## Necessary
      output_names=["out_name1","out_name2"] ## Necessary
    )
    

    以下是list_ops的python接口。

    import bmpaddle
    ## List all supported ops
    bmpaddle.list_ops()
    
    1. bmpaddle输出和log

    bmpaddle若成功,输出的log最后会看到以下信息。

    ######################################
    # Store bmodel of BMCompiler.
    ######################################
    

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

    若用户在bmpaddle时使用了cmp=true模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是paddlepaddle产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。

    若没有上述信息,则bmpaddle失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。