模型编译

BMNETC 使用

BMNETC是针对caffe的模型编译器,可将某网络的caffemodel和prototxt编译 成BMRuntime所需要的文件。而且在编译的同时,支持每一层的NPU模型计算结 果都会和CPU的计算结果进行对比,保证正确性。下面介绍该编译器的使用方式。

  • 使用方法

    1. 方式一:命令形式

    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说明。

    表 1 bmnetc参数说明

    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
    
    1. 方式二: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)
    
    1. 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的计算结果进行对比,保证正确性。下面介绍该编译器的使用方式。

  1. 环境需求

    • python 3.x

    • linux

  2. 使用方法

    1. 方式一:命令形式

    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说明。

    表 2 bmnetd参数说明

    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
    
    1. 方式二: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")
    
    1. 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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。

常见问题

  1. 编译模型段错误 检查xxx.cfg文件,是否是在windows系统下保存或修改的,由于和linux系统对换行符表示不同,会导致解析出错引起段错误 可以用dos2unix xxx.cfg命令转换一下

BMNETM 使用

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

  1. 环境需求

    • python 3.x

    • mxnet>=1.3.0

    • linux

  2. 使用方法

    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说明。

    表 3 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

    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.

    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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。

BMNETO 使用

BMNETO是针对ONNX的模型编译器,可以把ONNX格式的model经过图编译优化后,转换成BMRuntime所需的文件。在编译模型的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。

  1. 环境需求

    • python 3.x

    • linux

    • onnx == 1.7.0 (Opset version == 12)

    • onnxruntime == 1.3.0

    • protobuf >= 3.8.0

  2. 使用方法

    1. 方式一:命令形式

    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说明。

    表 4 bmneto参数说明

    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.

    1. 方式二: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)
    
    1. 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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。

常见问题

  1. 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的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。

  1. 环境需求

    • python 3.x

    • linux

  2. 使用方法

    1. 方式一:命令形式

    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说明。

    表 5 bmnetp参数说明

    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.

    1. 方式二: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)
    
    1. 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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。

    1. 查看原始模型结构

    以下命令可以将模型结构以文本方式打印出来,方便看到原始模型的输入与输出,以及内部连接关系

    python -m bmnetp --mode dump --model model.pt
    

常见问题

  1. 模型格式问题

    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)
    
  2. 如果权值在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的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。

  1. 环境需求

    • python 3.x

    • tensorflow>=1.10.0

    • linux

  2. 使用方法

    1. 方式一:命令形式

    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说明。

    表 6 bmnett参数说明

    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.

    1. 方式二: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()
    
    1. 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的计算结果进行对比,保证正确性。下面分别介绍该编译器的环境需求、安装步骤和使用方法。

  1. 环境需求

    • python 3.x

    • paddlepaddle>=1.8.0

    • linux

  2. 安装步骤

安装该编译器的安装包。选择以下命令其一使用。使用命令(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

  1. 使用方法

    1. 方式一:命令形式

    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说明。

    表 7 bmpaddle参数说明

    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.

    1. 方式二: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()
    
    1. 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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。