BMNETD 使用¶
编译Darknet模型¶
BMNETD是针对Darknet的模型编译器,可将某网络的weight和cfg编译 成BMRuntime所需要的文件(目前只支持yolo)。而且在编译的同时,支持每一层的NPU模型计算结 果都会和CPU的计算结果进行对比,保证正确性。下面介绍该编译器的使用方式。
安装需求
python 3.x
linux
配置步骤
参见sdk初始化步骤(https://sophgo-doc.gitbook.io/sophonsdk3/)
使用方法
方式一:命令形式
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. BM1684 or BM1684X; default: BM1684
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`命令转换一下