BMNETP 使用¶
编译Pytorch模型¶
BMNETP是针对pytorch的模型编译器,可以把pytorch的model直接编译成BMRuntime所需的执行指令。pytorch的模型在编译前要经过torch.jit.trace(见pytorch文档),trace后的模型才能用于编译。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的安装需求、安装步骤和使用方法。
安装需求
python 3.x
linux
安装步骤
参见bmnnsdk初始化步骤(https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/)
使用方法
方式一:命令形式
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
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.
desc
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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。
常见问题¶
模型格式问题
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)