模型编译
BMNETC 使用
BMNETC是针对caffe的模型编译器,可将某网络的caffemodel和prototxt编译 成BMRuntime所需要的文件。而且在编译的同时,支持每一层的NPU模型计算结 果都会和CPU的计算结果进行对比,保证正确性。下面介绍该编译器的使用方式。
使用方法
方式一:命令形式
Command name: bmnetc - BMNet compiler command for Caffe model
/path/to/bmnetc [--model=<path>] \ [--weight=<path>] \ [--shapes=<string>] \ [--net_name=<name>] \ [--opt=<value>] \ [--dyn=<bool>] \ [--outdir=<path>] \ [--target=<name>] \ [--cmp=<bool>] \ [--mode=<string>] \ [--enable_profile=<bool>] \ [--show_args] \ [--list_ops]
参数介绍如下:
其中mode为compile表示编译float模型。 为GenUmodel表示生成SOPHGO定义的统一model,可后续通过SOPHGO定点化工具进行INT8定点化生成INT8 model。 为check表示检查网络graph算子是否支持。
GenUmodel模式下,参数opt、dyn、target、cmp将没有意义,无需指定。
参数dyn=False表示使用静态编译,dyn=True表示使用动态编译。静态编译意思是model编译后,在runtime时只能运行编译所设置的shapes。 动态编译意思是model编译后,runtime时可以运行任意shapes,只要实际shapes中的数值小于等于编译所设置shapes中的数值。 一般来说,动态编译后神经网络在芯片上的性能要小于等于静态编译。所以一般建议动态编译用于实际网络的shapes会大范围变化的情况, 如果shapes固定或者只需要几种shapes,建议采用静态编译。关于静态编译下如何支持若干种shapes,请见bmodel说明。
args
type
Description
model
string
Necessary. Caffe prototxt path
weight
string
Necessary. Caffemodel(weight) path
shapes
string
Optional. 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
net_name
string
Optional. Name of the network, default use the name in prototxt
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 2.
dyn
bool
Optional. Use dynamic compilation, default False.
outdir
string
Optional. Output directory, default “compilation”
target
string
Optional. BM168X or BM1684X; default: BM168X
cmp
bool
Optional.Check result during compilation. Default: True
mode
string
Optional. Set bmnetc mode. Option: compile, GenUmodel, check. Default: compile.
enable_profile
bool
Optional. Enable profile log. Default: False
show_args
Optional. Display arguments passed to bmnetc compiler.
list_ops
Optional. List bmnetc supported ops.
examples:
以下是编译float32的caffe model命令示例
/path/to/bmnetc --model=/path/to/prototxt --weight=/path/to/caffemodel --shapes=[1,3,224,224] --net_name=resnet18 --outdir=./resnet18 target=BM1684
以下是生成Umodel的示例
/path/to/bmnetc --mode=GenUmodel --model=/path/to/prototxt --weight=/path/to/caffemodel --shapes=[1,3,224,224] --net_name=resnet18 --outdir=./resnet18
方式二:python接口
bmnetc的python接口如下, 需要
pip3 install --user bmnetc-x.x.x-py2.py3-none-any.whl
。以下是编译float32的caffe model的python接口。
import bmnetc ## compile fp32 model bmnetc.compile( model = "/path/to/prototxt", ## Necessary weight = "/path/to/caffemodel", ## Necessary target = "BM1684", ## Necessary outdir = "xxx", ## optional, default 'compilation' shapes = [[x,x,x,x], [x,x,x]], ## optional, if not set, default use shape in prototxt net_name = "name", ## optional, if not set, default use the network name in prototxt opt = 2, ## optional, if not set, default equal to 2 dyn = False, ## optional, if not set, default equal to False cmp = True, ## optional, if not set, default equal to True enable_profile = False ## optional, if not set, default equal to False )
以下是生成Umodel的python接口。
import bmnetc ## Generate SOPHGO U model bmnetc.GenUmodel( model = "/path/to/prototxt", ## Necessary weight = "/path/to/caffemodel", ## Necessary outdir = "xxx", ## optional, default 'compilation' shapes = [[x,x,x,x], [x,x,x]], ## optional, if not set, default use shape in prototxt net_name = "name" ## optional, if not set, default use the network name in prototxt )
以下是使用bmnetc python的例子:
import bmnetc model = r'../../../nnmodel/caffe_models/lenet/lenet_train_test_thin_4.prototxt' weight = r'../../../nnmodel/caffe_models/lenet/lenet_thin_iter_1000.caffemodel' target = r"BM1684" export_dir = r"./compilation" shapes = [[1,1,28,28],[1]] bmnetc.compile(model = model, weight = weight, target = target, outdir = export_dir, shapes = shapes) bmnetc.GenUmodel(weight = weight, model = model, net_name = "lenet")
以下是list_ops的python接口。
import bmnetc ## List all supported ops bmnetc.list_ops()
以下是check_graph的python接口。
import bmnetc ## Check supported ops in model bmnetc.check_graph(MODEL_FILE)
bmnetc输出和log
bmnetc若成功,输出的log最后会看到以下信息。
###################################### # Store bmodel of BMCompiler. ######################################
bmnetc成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的bmodel,用户可以重命名。
若用户在bmnetc时使用了cmp=True模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是Caffe产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。
若没有上述信息,则bmnetc失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
BMNETD 使用
BMNETD是针对Darknet的模型编译器,可将某网络的weight和cfg编译 成BMRuntime所需要的文件(目前只支持yolo)。而且在编译的同时,支持每一层的NPU模型计算结 果都会和CPU的计算结果进行对比,保证正确性。下面介绍该编译器的使用方式。
环境需求
python 3.x
linux
使用方法
方式一:命令形式
Command name: bmnetd - BMNet compiler command for Darknet model
/path/to/bmnetd [--model=<path>] \ [--weight=<path>] \ [--shapes=<string>] \ [--net_name=<name>] \ [--opt=<value>] \ [--dyn=<bool>] \ [--outdir=<path>] \ [--target=<name>] \ [--cmp=<bool>] \ [--mode=<string>] \ [--enable_profile=<bool>]
参数介绍如下:
其中mode为compile表示编译float模型。为GenUmodel表示生成SOPHGO定义的统一model,可后续通过SOPHGO定点化工具进行INT8定点化生成INT8 model。
GenUmodel模式下,参数opt、dyn、target、cmp将没有意义,无需指定。
参数dyn=False表示使用静态编译,dyn=True表示使用动态编译。静态编译意思是model编译后,在runtime时只能运行编译所设置的shapes。 动态编译意思是model编译后,runtime时可以运行任意shapes,只要实际shapes中的数值小于等于编译所设置shapes中的数值。 一般来说,动态编译后神经网络在芯片上的性能要小于等于静态编译。所以一般建议动态编译用于实际网络的shapes会大范围变化的情况, 如果shapes固定或者只需要几种shapes,建议采用静态编译。关于静态编译下如何支持若干种shapes,请见bmodel说明。
args
type
Description
model
string
Necessary. Darknet cfg path
weight
string
Necessary. Darknet weight path
target
string
Optional. BM168X or BM1684X; default: BM168X
shapes
string
Optional. 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
net_name
string
Optional. Name of the network, default “network”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 2.
dyn
bool
Optional. Use dynamic compilation, default False.
outdir
string
Optional. Output directory, default “compilation”
cmp
bool
Optional.Check result during compilation. Default: True
mode
string
Optional. Set bmnetd mode. Option: compile, GenUmodel. Default: compile.
enable_profile
bool
Optional. Enable profile log. Default: False
log_dir
string
Optional. Specify the log directory Default: “\”
v
string
Optional. Set log verbose level. Default: 0 (0: FATAL, 1: ERROR, 2: WARNING, 3: INFO, 4: DEBUG).
dump_ref
bool
Optional. Enable dump input&output ref data when compile without compare. Default: False.
examples:
以下是编译float32的Darknet model命令示例
/path/to/bmnetd --model=/path/to/cfg --weight=/path/to/weight --net_name=net_name --outdir=./net_name --target=BM1684
以下是生成Umodel的示例
/path/to/bmnetd --mode=GenUmodel --model=/path/to/cfg --weight=/path/to/weight --net_name=net_name --outdir=./net_name
方式二:python接口
bmnetd的python接口如下, 需要pip3 install –user bmnetd-x.x.x-py2.py3-none-any.whl。
以下是编译float32的Darknet model的python接口。
import bmnetd ## compile fp32 model bmnetd.compile( model = "/path/to/cfg", ## Necessary weight = "/path/to/weight", ## Necessary outdir = "xxx", ## Necessary target = "BM1684", ## Necessary net_name = "name", ## optional, if not set, default use the path of cfg shapes = [[x,x,x,x], [x,x,x]], ## optional, if not set, default use shape in weights opt = 2, ## optional, if not set, default equal to 2 dyn = False, ## optional, if not set, default equal to False cmp = True, ## optional, if not set, default equal to True enable_profile = False ## optional, if not set, default equal to False )
以下是生成Umodel的python接口。
import bmnetd ## Generate SOPHGO U model bmnetd.GenUmodel( model = "/path/to/cfg", ## Necessary weight = "/path/to/weight", ## Necessary outdir = "xxx", ## Necessary net_name = "name", ## optional, if not set, default use the path of cfg shapes = [[x,x,x,x], [x,x,x]], ## optional, if not set, default use shape in weights )
以下是使用bmnetd python的例子:
import bmnetd model = r'../../../nnmodel/darknet_models/yolov3-tiny/yolov3-tiny.cfg' weight = r'../../../nnmodel/darknet_models/yolov3-tiny/yolov3-tiny.weights' target = r"BM1684" export_dir = r"./compilation" shapes = [[1,3,416,416]] bmnetd.compile(model = model, weight = weight, target = target, outdir = export_dir, shapes = shapes) bmnetd.GenUmodel(weight = weight, model = model, net_name = "yolov3-tiny")
bmnetd输出和log
bmnetd若成功,输出的log最后会看到以下信息。
###################################### # Store bmodel of BMCompiler. ######################################
bmnetd成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的bmodel,用户可以重命名。
若用户在bmnetd时使用了cmp=True模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是Darknet产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。
若没有上述信息,则bmnetd失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
常见问题
编译模型段错误 检查xxx.cfg文件,是否是在windows系统下保存或修改的,由于和linux系统对换行符表示不同,会导致解析出错引起段错误 可以用dos2unix xxx.cfg命令转换一下
BMNETM 使用
BMNETM是针对mxnet的模型编译器,可以将mxnet格式的模型结构文件和参数文件(比如:lenet-symbol.json和lenet-0100.params)在经过图编译优化后,转换成BMRuntime所需的文件。可选择将每一个操作的NPU模型计算结果和原始模型在mxnet框架上的计算结果进行对比,保证模型转换的正确性。下面分别介绍该编译器的环境需求、配置步骤和使用方法及命令参数简介。
环境需求
python 3.x
mxnet>=1.3.0
linux
使用方法
方式一:命令形式
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
target
string
Optional. BM168X or BM1684X; default: BM168X
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
Optional. Name of the network, default “network”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 1.
dyn
bool
Optional. Use dynamic compilation, default False.
outdir
string
Optional. Output directory, default “compilation”
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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
BMNETO 使用
BMNETO是针对ONNX的模型编译器,可以把ONNX格式的model经过图编译优化后,转换成BMRuntime所需的文件。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。
环境需求
python 3.x
linux
onnx == 1.7.0 (Opset version == 12)
onnxruntime == 1.3.0
protobuf >= 3.8.0
使用方法
方式一:命令形式
Command name: python3 -m bmneto - BMNet compiler command for ONNX model
python3 -m bmneto [--model=<path>] \ [--input_names=<string>] \ [--shapes=<string>] \ [--outdir=<path>] \ [--target=<name>] \ [--net_name=<name>] \ [--opt=<value>] \ [--dyn=<bool>] \ [--cmp=<bool>] \ [--mode=<string>] \ [--descs=<string>] \ [--enable_profile=<bool>] \ [--output_names=<string>] \ [--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. ONNX model (.onnx) path
input_names
string
Optional. Set name of all network inputs one by one in sequence. Format “name1,name2,name3”
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
target
string
Optional. BM168X or BM1684X; default: BM168X
outdir
string
Optional. Output directory, default “compilation”
net_name
string
Optional. Name of the network, default “network”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 1.
dyn
bool
Optional. Use dynamic compilation, default False.
cmp
bool
Optional. Check result during compilation. Default: True
mode
string
Optional. Set bmneto mode. Option: compile, GenUmodel, check. Default: compile.
descs
string
Optional. Describe data type and value range of some input in format: “[ index, data format, lower bound, upper bound ]”, where data format could be fp32, int64. For example, [0, int64, 0, 100], meaning input of index 0 has data type as int64 and values in [0, 100). If no description of some input given, the data type will be fp32 as default and uniformly distributed in 0 ~ 1.
enable_profile
bool
Optional. Enable profile log. Default: False
output_names
string
Optional. Set name of all network outputs one by one in sequence. Format “name1,name2,name3”
list_ops
Optional. List supported ops.
方式二:python接口
bmneto的python接口如下:
import bmneto ## compile fp32 model bmneto.compile( model = "/path/to/.onnx", ## Necessary outdir = "xxx", ## Necessary target = "BM1684", ## Necessary shapes = [[x,x,x,x], [x,x,x]], ## Necessary net_name = "name", ## optional input_names = ['name0','name1'] ## optional 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 descs = "[0, int32, 0, 128]" ## optional, if not set, default equal to [[x, float32, 0, 1]] output_names = ['oname0','oname1'] ## optional, if not set, default equal to graph output names )
以下是list_ops的python接口。
import bmneto ## List all supported ops bmneto.list_ops()
以下是check_graph的python接口。
import bmneto ## Check supported ops in model bmneto.check_graph(MODEL_FILE)
bmneto输出和log
bmneto若成功,输出的log最后会看到以下信息。
###################################### # Store bmodel of BMCompiler. ######################################
bmneto成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的bmodel,用户可以重命名。
若用户在bmneto时使用了cmp=True模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是ONNXruntime产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。
若没有上述信息,则bmneto失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
常见问题
pytorch转换onnx示例
model = ExampleModel() # or torch.load(model_path) dummy_input = Variable(torch.randn(input_shape)) dummy_output = model(dummy_input) torch.onnx.export(model, dummy_input, new_name, opset_version=12, # opset version must be 12 example_outputs = dummy_output, )
BMNETP 使用
BMNETP是针对pytorch的模型编译器,可以把pytorch的model直接编译成BMRuntime所需的执行指令。pytorch的模型在编译前要经过torch.jit.trace(见pytorch文档),trace后的模型才能用于编译。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。
环境需求
python 3.x
linux
使用方法
方式一:命令形式
Command name: python3 -m bmnetp - BMNet compiler command for PyTorch model
python3 -m bmnetp [--model=<path>] \ [--shapes=<string>] \ [--net_name=<name>] \ [--opt=<value>] \ [--dyn=<bool>] \ [--outdir=<path>] \ [--target=<name>] \ [--cmp=<bool>] \ [--enable_profile=<bool>]
参数介绍如下:
参数dyn=False表示使用静态编译,dyn=True表示使用动态编译。静态编译意思是model编译后,在runtime时只能运行编译所设置的shapes。 动态编译意思是model编译后,runtime时可以运行任意shapes,只要实际shapes中的数值小于等于编译所设置shapes中的数值。 一般来说,动态编译后神经网络在芯片上的性能要小于等于静态编译。所以一般建议动态编译用于实际网络的shapes会大范围变化的情况, 如果shapes固定或者只需要几种shapes,建议采用静态编译。关于静态编译下如何支持若干种shapes,请见bmodel说明。
args
type
Description
model
string
Necessary. Traced PyTorch model (.pt) 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
target
string
Optional. BM168X or BM1684X; default: BM168X
outdir
string
Optional. Output directory, default “compilation”
net_name
string
Optional. Name of the network, default “network”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 1.
dyn
bool
Optional. Use dynamic compilation, default False.
cmp
bool
Optional. Check result during compilation. Default: True
mode
string
Optional. Set bmnetp mode. Option: compile, GenUmodel, dump. Default: compile.
descs
string
Optional. Describe data type and value range of some input in format: “[ index, data format, lower bound, upper bound ]”, where data format could be fp32, int64. For example, [0, int64, 0, 100], meaning input of index 0 has data type as int64 and values in [0, 100). If no description of some input given, the data type will be fp32 as default and uniformly distributed in 0 ~ 1.
enable_profile
bool
Optional. Enable profile log. Default: False
list_ops
Optional. List supported ops.
方式二:python接口
bmnetp的python接口如下:
import bmnetp ## compile fp32 model bmnetp.compile( model = "/path/to/.pth", ## Necessary outdir = "xxx", ## Necessary target = "BM1684", ## Necessary shapes = [[x,x,x,x], [x,x,x]], ## Necessary net_name = "name", ## Necessary 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 bmnetp ## List all supported ops bmnetp.list_ops()
以下是check_graph的python接口。
import bmnetp ## Check supported ops in model bmnetp.check_graph(MODEL_FILE)
bmnetp输出和log
bmnetp若成功,输出的log最后会看到以下信息。
###################################### # Store bmodel of BMCompiler. ######################################
bmnetp成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的bmodel,用户可以重命名。
若用户在bmnetp时使用了cmp=True模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是Pytorch产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。
若没有上述信息,则bmnetp失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
查看原始模型结构
以下命令可以将模型结构以文本方式打印出来,方便看到原始模型的输入与输出,以及内部连接关系
python -m bmnetp --mode dump --model model.pt
常见问题
模型格式问题
pytorch预训练模型通常是以pt或pth为后缀名,但可能文件中只包含权重字典,并不包含完整网络信息,可以通过import torch; torch.jit.load(pt_file_path)是否报错来测试 创建model的实例,并恢复权重,具体可以见项目源码,然后用以下代码保存:
import torch model = ... input_data = torch.randn(input_shape) model.cpu() # 将权重放置到cpu上 model.eval() # 采用推理模式 traced_model = torch.jit.trace(model, [iput_data]) traced_model_name = "traced_model.pt" traced_model.save(traced_modelname)如果权值在gpu上的traced_model如何处理?
我们支持的是用torch.jit.trace函数保存出来的模型,并且权值要在cpu上,不能放到gpu上。可以通过以下代码转到cpu上
model = torch.jit.load(gpu_traced_model_name, map_location="cpu") # 转成cpu模型 model.eval() # 采用推理模式 # 重新trace input_data = torch.randn(input_shape) traced_model = torch.jit.trace(model, [iput_data]) traced_model_name = "traced_model.pt" traced_model.save(traced_modelname)
BMNETT 使用
BMNETT是针对tensorflow的模型编译器,可以将模型文件(*.pb)编译成BMRuntime所需的文件。而且在编译的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。
环境需求
python 3.x
tensorflow>=1.10.0
linux
使用方法
方式一:命令形式
Command name: python3 -m bmnett - BMNet compiler command for TensorFlow model
python3 -m bmnett [--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说明。
args
type
Description
model
string
Necessary. Tensorflow .pb path
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
target
string
Optional. BM168X or BM1684X; default: BM168X
outdir
string
Optional. Output directory, default “compilation”
net_name
string
Optional. Name of the network, default “network”
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
Optional. Set name of all network outputs one by one in sequence. Format “name1,name2,name3”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 1.
dyn
bool
Optional. Use dynamic compilation, default False.
cmp
bool
Optional.Check result during compilation. Default: True
mode
string
Optional. Set bmnett mode. Option: compile, GenUmodel, summary, show, check. Default: compile.
enable_profile
bool
Optional. Enable profile log. Default: False
list_ops
Optional. List supported ops.
方式二:python接口
bmnett编译float32 tf model的python接口如下:
import bmnett ## compile fp32 model bmnett.compile( model = "/path/to/model(.pb)", ## 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 )
bmnett转化float32 tf model为SOPHGO U Model的python接口如下:
import bmnett ## compile fp32 model bmnett.GenUmodel( model = "/path/to/model(.pb,.h5)", ## 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 bmnett ## List all supported ops bmnett.list_ops()
bmnett输出和log
bmnett若成功,输出的log最后会看到以下信息。
###################################### # Store bmodel of BMCompiler. ######################################
bmnett成功后,将在指定的文件夹中生成一个compilation.bmodel的文件,该文件则是转换成功的bmodel,用户可以重命名。
若用户在bmnett时使用了cmp=True模式,则会在指定的文件夹中生成一个input_ref_data.dat和一个output_ref_data.dat, 分别是Tensorflow产生的网络输入参考数据和网络输出参考数据,可用于bmrt_test验证生成的bmodel在芯片运行时结果是否正确。
若没有上述信息,则bmnett失败。目前失败的话,用户可以修改opt优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
BMPADDLE 使用
BMPADDLE是针对paddlepaddle的模型编译器,可以将模型文件(inference.pdmodel inference.pdiparams)编译成BMRuntime所需的文件。而且在编译的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。
环境需求
python 3.x
paddlepaddle>=1.8.0
linux
安装步骤
安装该编译器的安装包。选择以下命令其一使用。使用命令(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
使用方法
方式一:命令形式
Command name: python3 -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说明。
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
Optional. Name of the network, default “network”
opt
int
Optional. Optimization level. Option: 0, 1, 2, default 1.
dyn
bool
Optional. Use dynamic compilation, default False.
outdir
string
Optional. Output directory, default “compilation”
target
string
Optional. BM168X or BM1684X; default: BM168X
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.
方式二: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()
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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。