BMNETM 使用

编译MxNet模型

BMNETM是针对mxnet的模型编译器,可以将mxnet格式的模型结构文件和参数文件(比如:lenet-symbol.json和lenet-0100.params)在经过图编译优化后,转换成BMRuntime所需的文件。可选择将每一个操作的NPU模型计算结果和原始模型在mxnet框架上的计算结果进行对比,保证模型转换的正确性。下面分别介绍该编译器的安装需求、配置步骤和使用方法及命令参数简介。

  1. 安装需求

    • python 3.x

    • mxnet>=1.3.0

    • linux

  2. 配置步骤

    参见bmnnsdk初始化步骤(https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/)

  3. 使用方法

    1. 方式一:命令形式

    Command name: python3 -m bmnetm - BMNet compiler command for MxNet model

    python3 -m bmnetm [--model=<path>] \
                      [--weight=<path>] \
                      [--shapes=<string>] \
                      [--input_names=<string>] \
                      [--net_name=<name>] \
                      [--opt=<value>] \
                      [--dyn=<bool>] \
                      [--outdir=<path>] \
                      [--target=<name>] \
                      [--cmp=<bool>] \
                      [--mode=<string>] \
                      [--enable_profile=<bool>] \
                      [--input_data=<path>] \
                      [--log_dir=<path>] \
                      [--v=<int>] \
                      [--list_ops]
    

    参数介绍如下:

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

    表 2 bmnetm参数说明

    args

    type

    Description

    model

    string

    Necessary. MxNet symbol .json path

    weight

    string

    Necessary. MxNet weight .params path

    shapes

    string

    Necessary. 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

    input_names

    string

    Optional. Set input name according to .json. They correspond to shapes one by one. Default: “data”. Format “name1,name2,…”.

    net_name

    string

    Necessary. Name of the network, default use the name in prototxt

    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 bmnetm mode. Option: compile, GenUmodel, check. Default: compile.

    enable_profile

    bool

    Optional. Enable profile log. Default: false

    input_data

    int

    Optional. Specify input data from a data file path

    log_dir

    string

    Optional. Log Output directory

    v

    string

    Optional. Option: set verbose level

    list_ops

    Optional. List supported ops.

    1. 方式二:python接口

    bmnetm的python接口如下:

    import bmnetm
    ## compile fp32 model
    bmnetm.compile(
      model = "/path/to/.json",       ## Necessary
      weight = "/path/to/.params",    ## Necessary
      outdir = "xxx",                 ## Necessary
      target = "BM1684",              ## Necessary
      shapes = [[x,x,x,x], [x,x,x]],  ## Necessary
      net_name = "name",              ## Necessary
      input_names=["name1","name2"]   ## optional, if not set, default is "data"
      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
    )
    

    以下是list_ops的python接口。

    import bmnetm
    ## List all supported ops
    bmnetm.list_ops()
    

    以下是check_graph的python接口。

    import bmnetm
    ## Check supported ops in model
    bmnetm.check_graph(MODEL_FILE)
    
    1. bmnetm输出和log

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

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

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

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

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

实现MxNet自定义layer

详细请见BMNETM插件工具 BMNET 前端插件