BMNETM 使用¶
编译MxNet模型¶
BMNETM是针对mxnet的模型编译器,可以将mxnet格式的模型结构文件和参数文件(比如:lenet-symbol.json和lenet-0100.params)在经过图编译优化后,转换成BMRuntime所需的文件。可选择将每一个操作的NPU模型计算结果和原始模型在mxnet框架上的计算结果进行对比,保证模型转换的正确性。下面分别介绍该编译器的安装需求、配置步骤和使用方法及命令参数简介。
安装需求
python 3.x
mxnet>=1.3.0
linux
配置步骤
参见bmnnsdk初始化步骤(https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/)
使用方法
方式一:命令形式
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说明。
¶ 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.
方式二: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)
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 前端插件 。