BMNETT 使用¶
编译TensorFlow模型¶
BMNETT是针对tensorflow的模型编译器,可以将模型文件(*.pb)编译成BMRuntime所需的文件。而且在编译的同时,可选择将每一个操作的NPU模型计算结果和CPU的计算结果进行对比,保证正确性。下面分别介绍该编译器的安装需求、安装步骤和使用方法。
安装需求
python 3.x
tensorflow>=1.10.0
linux
安装步骤
参见bmnnsdk初始化步骤(https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/)
使用方法
方式一:命令形式
Command name: python -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说明。
方式二: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优化选项,可能其它优化级别会成功,从而不会耽误用户部署。 然后请用户将失败的问题告知我们的客户支持。