模型量化编译

模型量化编译过程中,hb_compile工具会根据配置文件的具体信息,生成中间阶段onnx模型文件以及仿真上板情况的runtime模型。

使用方法

使用hb_compile工具对模型进行量化编译时,提供两种模式,快速性能评测模式(开启fast-perf)和传统模型转换编译模式(不开启fast-perf)。

快速性能评测模式开启后,会在转换过程中生成可以在板端运行最高性能的hbm模型,工具内部主要进行以下操作:

  • 将BPU可执行算子尽可能运行在BPU上(即可通过yaml文件中node_info参数指定在BPU上运行的算子)。
  • 删除模型首尾可删除的CPU算子,包括:Quantize/Dequantize、Transpose、Cast、Reshape等。

如您想使用快速性能评测模式(开启fast-perf),使用方式如下:

hb_compile --fast-perf --model ${caffe_model/onnx_model} \ --proto ${caffe_proto} \ --march ${march} \ --input-shape ${input_node_name} ${input_shape}
注意
  • 请注意,如您开启快速性能评测模式,由于该模式下,工具会使用内置的高性能配置,请勿对 --config 参数进行配置。
  • 在使用hb_compile做模型量化编译时, --input-shape 参数配置仅在快速性能评测模式(即开启fast-perf)时生效。

如您想使用传统模型转换编译模式(不开启fast-perf),使用方式如下:

hb_compile --config ${config_file}

命令行参数

参数名称参数说明
-h, --help显示帮助信息并退出。
-c, --config模型编译的配置文件,为yaml格式,文件名使用.yaml后缀。
--fast-perf开启fast-perf,开启后,会在转换过程中生成可以在板端运行最高性能的hbm模型,方便您用于后续的模型性能评测。
如您开启了fast-perf,还需要进行如下配置:
-m, --model,Caffe或ONNX浮点模型文件。
--proto,用于指定Caffe模型prototxt文件。
--march,BPU的微架构。使用J6E处理器需设置为nash-e,使用J6M处理器需设置为nash-m
-i, --input-shape,可选参数,指定模型的输入节点的shape信息。
使用方式为:
  • 指定单个输入节点的shape信息,使用方式为--input-shape input_1 1x3x224x224
  • 指定多个输入节点的shape信息,使用方式为--input-shape input_1 1x3x224x224 --input-shape input_2 1x3x224x224
注意:模型为单个输入节点情况时,--input-shape可以不做配置,工具会自动读取模型文件中的尺寸信息。但对于动态输入节点而言,如未指定--input-shape,此时工具将仅动态输入节点第一维为[-1, 0, ?]的模型,默认会将动态输入节点的第一维设置为1。

编译产生的log文件会储存在命令执行路径下面,名称为 hb_compile.log

配置文件模板

一份完整的配置文件模板如下:

注解

此处配置文件仅作展示,在实际模型配置文件中 caffe_modelonnx_model 两种只存在其中之一。

即,要么是Caffe模型,要么是ONNX模型。即 caffe_model + prototxt 或者 onnx_model 二选一。

# 模型参数组 model_parameters: # 原始Caffe浮点模型描述文件 prototxt: '***.prototxt' # 原始Caffe浮点模型数据模型文件 caffe_model: '****.caffemodel' # 原始Onnx浮点模型文件 onnx_model: '****.onnx' # 转换的目标处理器架构 march: 'nash-e' # 模型转换输出的用于上板执行的模型文件的名称前缀 output_model_file_prefix: 'mobilenetv1' # 模型转换输出的结果的存放目录 working_dir: './model_output_dir' # 指定转换后混合异构模型是否保留输出各层的中间结果的能力 layer_out_dump: False # 指定模型的输出节点 output_nodes: "OP_name" # 批量删除某一类型的节点 remove_node_type: "Dequantize" # 删除指定名称的节点 remove_node_name: "OP_name" # 输入信息参数组 input_parameters: # 原始浮点模型的输入节点名称 input_name: "data" # 原始浮点模型的输入数据格式(数量/顺序与input_name一致) input_type_train: 'bgr' # 原始浮点模型的输入数据排布(数量/顺序与input_name一致) input_layout_train: 'NCHW' # 原始浮点模型的输入数据尺寸 input_shape: '1x3x224x224' # 网络实际执行时,输入给网络的batch_size, 默认值为1 input_batch: 1 # 在模型中添加的输入数据预处理方法 norm_type: 'data_mean_and_scale' # 预处理方法的图像减去的均值, 如果是通道均值,value之间必须用空格分隔 mean_value: '103.94 116.78 123.68' # 预处理方法的图像缩放比例,如果是通道缩放比例,value之间必须用空格分隔 scale_value: '0.017' # 转换后混合异构模型需要适配的输入数据格式(数量/顺序与input_name一致) input_type_rt: 'yuv444' # 输入数据格式的特殊制式 input_space_and_range: 'regular' # 校准参数组 calibration_parameters: # 模型校准使用的标定样本的存放目录 cal_data_dir: './calibration_data' # 校准使用的算法类型 calibration_type: 'kl' # max 校准方式的参数 max_percentile: 1.0 # 指定是否针对每个channel进行校准 per_channel: False # 编译参数组 compiler_parameters: # 编译策略选择 compile_mode: 'latency' # 模型运行核心数 core_num: 1 # 模型编译的优化等级选择 optimize_level: 'O2' # 指定名称为data的输入数据来源 input_source: {"data": "pyramid"} # 指定模型的每个function call的最大可连续执行时间 max_time_per_fc: 1000 # 指定编译模型时的进程数 jobs: 8

配置文件主要包含模型参数组、输入信息参数组、校准参数组、编译参数组。在您的配置文件中,每个参数组位置都需要存在,具体参数分为可选和必选,可选参数可以不配置。

以下是具体参数信息,参数会比较多,我们依照上述的参数组次序介绍。可选/必选表示该参数项在配置文件中是否必须进行配置。

配置文件具体参数信息

模型参数组

参数名称参数配置说明可选/必选
prototxt参数作用:指定Caffe浮点模型的prototxt文件名称。
参数类型:String。
取值范围:模型路径。
默认配置:无。
参数说明:模型为Caffe模型时必须配置。
Caffe模型必选
caffe_model参数作用:指定Caffe浮点模型的caffemodel文件名称。
参数类型:String。
取值范围:模型路径。
默认配置:无。
参数说明:模型为Caffe模型时必须配置。
Caffe模型必选
onnx_model参数作用:指定ONNX浮点模型的onnx文件名称。
参数类型:String。
取值范围:模型路径。
默认配置:无。
参数说明:模型为ONNX模型时必须配置。
ONNX模型必选
march参数作用:指定产出混合异构模型需要支持的平台架构。
参数类型:String。
取值范围'nash-e''nash-m'
默认配置:无。
参数说明:两个可选配置值依次对应J6E和J6M处理器,根据您使用的平台选择。
必选
output_model_file_prefix参数作用:指定转换产出混合异构模型的名称前缀。
参数类型:String。
取值范围:无。
默认配置'model'
参数说明:输出的定点模型文件的名称前缀。
可选
working_dir参数作用:指定模型转换输出的结果的存放目录。
参数类型:String。
取值范围:无。
默认配置'model_output'
参数说明:若该目录不存在,则工具会自动创建目录。
可选
layer_out_dump参数作用:指定混合异构模型是否保留输出中间层值的能力。
参数类型:Bool。
取值范围TrueFalse
默认配置False
参数说明:输出中间层的值是调试需要用到的手段,常规状态下请不要开启。
注意:请您注意,在layer_out_dump为True时,暂时不支持配置input_source为resizer。
可选
output_nodes参数作用:指定模型的输出节点。
参数类型:String。
取值范围:模型中的节点名称 。
默认配置:无。
参数说明:此参数用于支持您指定节点作为模型输出,设置值需为模型中的具体节点名称。
多个值的配置方法请参考 param_value配置 小节的说明。
可选
remove_node_type参数作用:设置删除节点的类型。
参数类型:String。
取值范围"Quantize""Transpose""Dequantize""Cast""Reshape""Softmax"。不同类型用;分割。
默认配置:无。
参数说明:不设置或设置为空不影响模型转换过程。此参数用于支持您设置待删除节点的类型信息。
被删除的节点必须在模型的开头或者末尾,与模型的输入或输出连接。
注意:设置此参数后,我们会根据您的设置对模型的可删除节点进行匹配,如果您配置的待删除节点类型符合删除条件,即会进行删除,并重复此操作,直到可删除节点不能与配置的节点类型匹配为止。
可选
remove_node_name参数作用:设置删除节点的名称。
参数类型:String。
取值范围:模型中待删除的节点名称,不同类型用;分割。
默认配置:无。
参数说明:不设置或设置为空不影响模型转换过程。此参数用于支持您设置待删除节点的名称。
被删除的节点必须在模型的开头或者末尾,与模型的输入或输出连接。
注意:设置此参数后,我们会根据您的设置对模型的可删除节点进行匹配,如果您配置的待删除节点名称符合删除条件,即会进行删除,并重复此操作,直到可删除节点不能与配置的节点名称匹配为止。
可选
debug_mode参数作用:保存用于精度debug分析的校准数据。
参数类型:String。
取值范围"dump_calibration_data"
默认配置:无。
参数说明:该参数作用为保存用于精度debug分析的校准数据,数据格式为.npy。该数据通过np.load()可直接送入模型进行推理。若不设置此参数,您也可自行保存数据并使用精度debug工具进行精度分析。
可选
node_info

参数作用:支持配置指定op的输入输出数据类型为int16以及强制指定算子在CPU或BPU上运行。
参数类型:String。
取值范围:支持配置int16的算子范围您可参考 工具链算子支持约束列表-ONNX Operator Support List 。可指定在CPU或BPU运行的算子需为模型中包含的算子。
默认配置:无。
参数说明
node_info 参数使用方式:

  • 仅指定OP运行在BPU/CPU上(下以BPU为例,CPU方法一致):

node_info: { "node_name": { 'ON': 'BPU', } }
  • 仅配置节点数据类型:
node_info: 'node_name1:int16;node_name2:int16'

多个值的配置方法请参考 param_value配置

  • 指定OP运行在BPU上,同时配置OP的输入输出数据类型:

node_info: { "node_name": { 'ON': 'BPU', 'InputType': 'int16', 'OutputType': 'int16' } }

'InputType': 'int16'代表指定算子的所有输入数据类型为int16。
如需指定算子特定输入的 InputType,可在 InputType 后通过指定数字来进行配置。如:

  • 'InputType0': 'int16'代表指定算子的第一个输入数据类型为int16,
  • 'InputType1': 'int16'代表指定算子的第二个输入数据类型为int16,以此类推。
注意'OutputType' 不支持指定算子特定输出的 OutputType,配置后对算子的所有输出生效,不支持配置 'OutputType0''OutputType1' 等。

可选

输入信息参数组

参数名称参数配置说明可选/必选
input_name参数作用:指定原始浮点模型的输入节点名称。
参数类型:String。
取值范围:单输入时 "" 或输入节点名称,多输入时 "input_name1; input_name2; input_name3..."
默认配置:无。
参数说明:浮点模型只有一个输入节点情况时可选配置, 多于一个输入节点时必须配置以保证后续类型及校准数据输入顺序的准确性。
多个值的配置方法请参考 param_value配置
单输入时可选
多输入时必选
input_type_train参数作用:指定原始浮点模型的输入数据类型。
参数类型:String。
取值范围'rgb''bgr''yuv444''gray''featuremap'
默认配置'featuremap'
参数说明:每一个输入节点都需要配置一个确定的输入数据类型, 存在多个输入节点时,设置的节点顺序需要与 input_name 里的顺序严格保持一致。
多个值的配置方法请参考 param_value配置
数据类型的选择请参考:转换内部过程解读 部分的介绍。
可选
input_type_rt参数作用:转换后混合异构模型需要适配的输入数据格式。
参数类型:String。
取值范围'rgb''bgr''yuv444''nv12''gray''featuremap'
默认配置'featuremap'
参数说明:这里是指明您需要使用的数据格式。
不要求与原始模型的数据格式一致。
但是需要注意在边缘平台喂给模型的数据是使用这个格式。
每一个输入节点都需要配置一个确定的输入数据类型,存在多个输入节点时,设置的节点顺序需要与 input_name 里的顺序严格保持一致。
多个值的配置方法请参考 param_value配置
数据类型的选择请参考: 转换内部过程解读 部分的介绍。
可选
input_layout_train参数作用:指定原始浮点模型的输入数据排布。
参数类型:String。
取值范围'NHWC''NCHW'
默认配置:无。
参数说明:每一个输入节点都需要配置一个确定的输入数据排布, 这个排布必须与原始浮点模型所采用的数据排布相同。存在多个输入节点时, 设置的节点顺序需要与 input_name 里的顺序严格保持一致。
多个值的配置方法请参考 param_value配置
什么是数据排布请参考: 转换内部过程解读 部分的介绍。
必选
input_space_and_range参数作用:指定输入数据格式的特殊制式。
参数类型:String。
取值范围'regular''bt601_video'
默认配置'regular'
参数说明:这个参数是为了适配不同ISP输出的yuv420格式, 在相应 input_type_rtnv12 时,该配置才有效,非 nv12 时会报错并退出。
  • regular 是常见的yuv420格式,数值范围为 [0,255]
  • bt601_video 是另一种视频制式yuv420,数值范围为 [16,235]。 更多关于bt601的信息可以通过网络资料进行了解。
    bt601_video 仅在 input_type_train 配置为bgr或rgb时支持指定。
注意:在没有明确需要的情况下,您不要配置此参数。
可选
input_shape参数作用:指定原始浮点模型的输入数据尺寸。
参数类型:String。
取值范围:无。
默认配置:无。
参数说明:shape的几个维度以 x 连接,例如 '1x3x224x224'
原始浮点模型只有一个输入节点情况时可以不配置, 工具会自动读取模型文件中的尺寸信息。
配置多个输入节点时,设置的节点顺序需要与 input_name 里的顺序严格保持一致。
多个值的配置方法请参考 param_value配置
可选
input_batch参数作用:指定转换后混合异构模型需要适配的输入batch数量。
参数类型:Int。
取值范围1-4096
默认配置1
参数说明:输出中间层的值是调试需要用到的手段,常规状态下请不要开启。
这里input_batch为转换后混合异构hbm模型输入batch数量, 但不影响转换后bc的模型的输入batch数量。
此参数不配置时默认为1。
注意:
  • 此参数仅在单输入且 input_shape 第一维为1的时候可以使用。
  • 此参数仅在原始onnx模型本身支持多batch推理时才能生效。 但是由于算子情况复杂,若在模型转换过程中, 遇到提示模型不支持配置input_batch参数的转换失败log,请您尝试直接导出一个多batch的onnx模型并正确配置校准数据大小重新进行转换 (此时不再需要配置此参数)。
可选
separate_batch参数作用:设置是否开启独立batch模式。
参数类型:Bool。
取值范围TrueFalse
默认配置False
参数说明:此参数不配置时,默认为False,即不开启独立batch模式。
独立batch模式不开启的情况下,输入需要被分配到一个连续的内存区域内。 例如,模型输入为1x3x224x224,input_batch设置为N, 则您需要准备的上板模型输入为Nx3x224x224。
而独立batch模式开启的情况下,内部会对开启此模式的输入节点做拆分, 拆分数量为您通过input_batch指定的数值,您可以针对每个batch单独准备输入, 此模式下不再要求输入必须被分配在连续的内存区域内。 例如,模型输入为1x3x224x224,input_batch设置为N, 此时您需要准备的上板模型输入则为N个1x3x224x224。
可选
norm_type参数作用:在模型中添加的输入数据预处理方法。
参数类型:String。
取值范围'data_mean_and_scale''data_mean''data_scale''no_preprocess'
默认配置'no_preprocess'
参数说明
  • no_preprocess 表示不添加任何数据预处理。
  • data_mean 表示提供减均值预处理。
  • data_scale 表示提供乘scale系数预处理。
  • data_mean_and_scale 表示提供先减均值再乘scale系数前处理。
输入节点多于一个时,设置的节点顺序需要与 input_name 里的顺序严格保持一致, 多个值的配置方法请参考 param_value配置
配置该参数的影响请参考:转换内部过程解读 部分的介绍。
注意:input_type_rt 配置为featuremap非四维输入时, norm_type只能配置为no_preprocess。
可选
mean_value参数作用:指定预处理方法的图像减去的均值。
参数类型:Float。
取值范围:无。
默认配置:无。
参数说明:当 norm_type 存在 data_mean_and_scaledata_mean 时需要配置该参数。
对于每一个输入节点而言,存在两种配置方式。
第一种是仅配置一个数值,表示所有通道都减去这个均值;
第二种是提供与通道数量一致的数值(这些数值以空格分隔开), 表示每个通道都会减去不同的均值。
配置的输入节点数量必须与 norm_type 配置的节点数量一致。
如果存在某个节点不需要 mean 处理,则为该节点配置 'None'.
多个值的配置方法请参考 param_value配置
可选
scale_value参数作用:指定预处理方法的数值scale系数。
参数类型:Float。
取值范围:无。
默认配置:无。
参数说明:当 norm_type 存在 data_mean_and_scaledata_scale 时需要配置该参数。
对于每一个输入节点而言,存在两种配置方式。
第一种是仅配置一个数值,表示所有通道都乘以这个系数;
第二种是提供与通道数量一致的数值(这些数值以空格分隔开), 表示每个通道都会乘以不同的系数。
配置的输入节点数量必须与 norm_type 配置的节点数量一致。
如果存在某个节点不需要 scale 处理,则为该节点配置 'None'.
多个值的配置方法请参考 param_value配置
可选

input_type_rt/ input_type_train补充说明

地平线的计算平台架构,在设计时为了提升性能,做了两点假设:

  1. 假设输入的数据都是int8的量化数据。

  2. 摄像头获取到的数据是nv12。

因此,如果您在模型训练时使用rgb(NCHW)输入格式,但是想使这个模型能够高效处理nv12数据,只需要在模型转换时做如下配置:

input_parameters: input_type_rt: 'nv12' input_type_train: 'rgb' input_layout_train: 'NCHW'
小技巧

若您在训练模型时使用gray格式,而实际使用中输入的数据格式为nv12格式,则用户可以将模型转换时的 input_type_rtinput_type_train 均配置为 gray,在嵌入式应用开发时仅使用nv12的y通道地址作为输入即可。

除了将输入数据转换为nv12,我们还支持您在训练和runtime infer时使用不同的rgb-order。工具会根据 input_type_rtinput_type_train 指定的数据格式自动添加数据转换节点,根据地平线的实际生产经验,并不是任意type组合都是需要的,为了避免您误用,我们只开放了一些固定的type组合如下表(Y为已支持类型,N为暂不支持类型,表格中第一行是 input_type_rt 中支持的类型,第一列是 input_type_train 支持的类型):

input_type_train \ input_type_rtnv12yuv444rgbbgrgrayfeaturemap
yuv444YYNNNN
rgbYYYYNN
bgrYYYYNN
grayNNNNYN
featuremapNNNNNY
注解

为了配合计算平台对于输入数据类型的要求(int8),减小推理开销,对于 input_type_rt 类型为 rgb(NHWC/NCHW)/bgr(NHWC/NCHW) 的配置,转换工具转换出的模型,其输入数据类型均为 int8。也就是说,对于常规的图像数据,需要-128使用(该操作在API中已自动进行,无需再进行该操作)。

在转换得到的最终产出hbm模型中, input_type_rtinput_type_train 是一个内部的过程,您只需要关注 input_type_rt 的数据格式即可。正确理解每种input_type_rt的要求,对于嵌入式应用准备推理数据很重要,以下是对input_type_rt每种格式的说明:

  • rgb、bgr和gray都是比较常见的图像格式,注意每个数值都采用UINT8表示。

  • yuv444是一种常见的图像格式,注意每个数值都采用UINT8表示。

  • nv12是常见的yuv420图像格式,每个数值都采用UINT8表示。

  • nv12有个比较特别的情况是 input_space_and_range 设置 bt601_video 时,较于常规nv12情况,它的数值范围由[0,255]变成了[16,235],每个数值仍然采用UINT8表示。请注意, bt601_video 仅在 input_type_trainbgrrgb 时支持通过 input_space_and_range 进行配置。

  • featuremap适用于以上列举格式不满足您需求的情况,此type每个数值采用float32表示。例如雷达和语音等模型处理就常用这个格式。

小技巧

以上 input_type_rtinput_type_train 是固化在工具链的处理流程中,如果您非常确定不需要转换,将两个 input_type 设置成一样就可以了,一样的 input_type 会做直通处理,不会影响模型的实际执行性能。 同样的,数据前处理也是固化在流程中,如果您不需要做任何前处理,通过 norm_type 配置关闭这个功能即可,不会影响模型的实际执行性能。

校准参数组

参数名称参数配置说明可选/必选
cal_data_dir参数作用:指定模型校准使用的标定样本的存放目录。
参数类型:String。
取值范围:无。
默认配置:无。
参数说明:目录内校准数据需要符合输入配置的要求。
具体请参考 校准数据准备 部分的介绍。配置多个输入节点时, 设置的节点顺序需要与 input_name 里的顺序严格保持一致。
多个值的配置方法请参考 param_value配置
当calibration_type为 skip 时,cal_data_dir无需配置。
可选
calibration_type参数作用:校准使用的算法类型。
参数类型:String。
取值范围'default''mix''kl''max''skip'
默认配置'default'
参数说明klmax 都是公开的校准量化算法,其基本原理可以通过网络资料查阅。
default 是一个自动搜索的策略,会尝试从系列校准量化参数中获得一个相对效果较好的组合。
mix 是一个集成多种校准方法的搜索策略,能够自动确定量化敏感节点,并在节点粒度上从不同的校准方法 中挑选出最佳方法,最终构建一个融合了多种校准方法优势的组合校准方式。
建议您先尝试 default,如果最终的精度结果不满足预期,再根据 PTQ模型精度调优 章节的建议配置不同的校准参数。
若您只想尝试对模型性能进行验证,但对精度没有要求,则可以尝试 skip 方式进行校准。该方式会使用max+内部生成的随机校准数据进行校准,不需要您准备校准数据,比较适合初次尝试对模型结构进行验证。
注意: 使用skip方式时,因其使用max+内部生成的随机校准数据进行校准,得到的模型不可用于精度验证。
可选
max_percentile参数作用:该参数为max校准方法的参数, 用以调整max校准的截取点。
参数类型:Float。
取值范围0.5 ~ 1.0
默认配置1.0
参数说明:此参数仅在 calibration_typemax 时有效,
常用配置选项有:0.99999/0.99995/0.99990/0.99950/0.99900。
建议您先尝试 calibration_type 配置 default, 如果最终的精度结果不满足预期,再根据 PTQ模型精度调优 部分建议调整该参数。
可选
per_channel参数作用:控制是否针对featuremap的每个channel进行校准。
参数类型:Bool。
取值范围TrueFalse
默认配置False
参数说明calibration_type 设置非default、非mix时有效。
建议您先尝试 default,如果最终的精度结果不满足预期, 再根据 PTQ模型精度调优 章节建议调整该参数。
可选
optimization参数作用:此参数为您提供一些调优可配置选项, 通过该参数可配置不同的模式对模型精度/性能进行调优。
参数类型:String。
取值范围set_model_output_int8set_model_output_int16set_{NodeKind}_input_int16set_{NodeKind}_output_int16set_Softmax_input_int8set_Softmax_output_int8asymmetricbias_correctionlstm_batch_last
注:此处Nodekind为标准ONNX算子类型写法如Conv,Mul,Sigmoid等(区分大小写)。 具体请参考onnx官方op文档或 工具链算子支持约束列表-ONNX Operator Support List
默认配置:无。
参数说明:注:具体算子类型的int16支持情况可参考 工具链算子支持约束列表-ONNX Operator Support List
  • 指定值为set_model_output_int8时,设置模型为int8格式低精度输出。
  • 指定值为set_model_output_int16时,设置模型为int16格式低精度输出。
  • 指定值为set_{NodeKind}_input_int16时, 会将模型中某类算子输入量化成int16,如出现因节点上下文不支持int16的情况,则会回退int8计算并打印log。
  • 指定值为set_{NodeKind}_output_int16时,会将模型中某类算子输出量化成int16,如出现因节点上下文不支持int16的情况,则会回退int8计算并打印log。
  • 指定值为set_Softmax_input_int8/set_Softmax_output_int8时,由于当前softmax 默认为float计算非量化节点。这两个指定值会将softmax算子量化成int8并在BPU上计算。二者没有使用上的区别。
  • 指定值为asymmetric时,会尝试开启非对称量化,在某些模型上可以提升量化精度。
  • 在calibration_type配置为default时,该参数将由算法自动选择,此时无法显性配置。
  • 指定值为bias_correction时,使用BiasCorrection量化方法, 在部分模型上可以提升量化精度。
  • 指定值为lstm_batch_last时,针对J6 BPU,对于LSTM的batch-input size较大时, 可以将batch维度转换到W维度进行计算(保障等价性),更贴合硬件计算逻辑, 一些场景下可以实现对J6 BPU推理性能加速的效果。
  • 由于模型部署推理性能与多种层次的优化有关, 因此此方法无法保证一定可以实现性能加速效果。
可选
quant_config参数作用:J6平台支持对一个算子配置多种计算类型,此参数用于支持您配置算子的计算类型,在不同层级配置模型中算子的计算精度,以生成所需混合精度模型。
参数类型:String。
取值范围:json文件路径。
默认配置:无。
参数说明:参数支持从多个层面(model_configop_confignode_config)对计算精度进行配置,支持多种计算精度数据类型(int8/int16/float16)的配置,详细说明请参考下方quant_config补充说明。
可选

quant_config补充说明

  1. quant_config支持多个层面对计算精度进行配置:

    支持从 model_configop_confignode_config 三个层面配置计算精度。 配置时三个层面存在优先级关系,配置粒度越小优先级越高,即优先级model_config<op_config<node_config。 当某个节点同时被多个维度配置时,优先级高的维度最终生效。 例如在op_config配置所有Add类型节点为int16计算,在node_config配置Add_2为int8计算,那么最终,Add_2节点为int8计算,其余Add算子int16计算。

  2. quant_config支持多种计算精度数据类型的配置:

    支持配置 int8/int16/float16 三种计算精度数据类型,关于这三种数据类型的具体说明如下:

    • int8:大部分算子的默认量化类型,一般无需您主动进行配置。

    • int16:请参考下方 int16配置说明

    • float16:配置为float16类型时,工具内部将仅配置该算子为float16计算精度类型(不会对float16计算算子上下文算子进行计算广播更新)。

  3. quant_config的json文件各层级参数说明:

一级参数二级参数三级参数是否必填说明
model_configall_node_typeoptional一次性将模型中所有节点的输入设为指定类型,可选配置int16/float16。
model_output_typeoptional将模型的输出tensor设为指定类型,可选配置int8/int16。
op_configNodeKindtypeoptional配置某一类型的节点的输入数据类型,可选配置int8/int16/float16。
node_configNodeNametypeoptional配置指定名称的节点的输入数据类型,可选配置int8/int16/float16。
  1. quant_config的json模板配置示例:

    如下所示为quant_config的json模板配置示例,包含所有可配置选项,您可参考此模板进行配置。

    { // 配置模型层面的参数 "model_config":{ // 一次性配置所有节点的输入数据类型 "all_node_type":"int16/float16", // 配置模型输出的数据类型 "model_output_type":"int8/int16" }, // 配置某一类型节点的参数,将op_name修改为节点类型名,例如"Conv","Add","Softmax"... "op_config":{ // 配置某一类型节点的输入数据类型 "op_name1":{"type":"int8/int16/float16"}, "op_name2":{"type":"int8/int16/float16"} }, // 配置某个节点的参数,,将node_name修改为节点名称,例如"Conv_0","Add_1"... "node_config":{ // 配置某个节点的输入数据类型 "node_name1":{"type":"int8/int16/float16"}, "node_name2":{"type":"int8/int16/float16"} } }

编译参数组

参数名称参数配置说明可选/必选
compile_mode参数作用:编译策略选择。
参数类型:String。
取值范围'latency''bandwidth''balance'
默认配置'latency'
参数说明latency 以优化推理时间为目标。
bandwidth 以优化ddr的访问带宽为目标。
balance 平衡优化目标latency和bandwidth,设置为此项需指定balance_factor。
如果模型没有严重超过预期的带宽占用,建议您使用 latency 策略。
可选
balance_factor参数作用:当compile_mode被指定为balance时,用于指定balance比率。
参数类型:Int。
取值范围0-100
默认配置:无。
参数说明:该参数仅在compile_mode被指定为balance时配套使用, 其余模式下配置不生效。
  • 配置为0表示带宽最优,对应compile_mode为bandwidth的编译策略。
  • 配置为100表示​​性能最优,对应compile_mode为latency的编译策略。
可选
core_num参数作用:模型运行核心数。
参数类型:Int。
取值范围1
默认配置1
参数说明:用于配置模型运行在地平线平台的核心数。
可选
optimize_level参数作用:模型编译的优化等级选择。
参数类型:String。
取值范围'O0''O1''O2'
默认配置'O0'
参数说明:优化等级可选范围为 O0 ~ O2
O0 不做任何优化, 编译速度最快,优化程度最低。
O1 - O2 随着优化等级提高, 预期编译后的模型的执行速度会更快, 但是所需编译时间也会变长。
可选
input_source参数作用:设置上板hbm模型的输入数据来源。
参数类型:String。
取值范围ddrpyramidresizer
默认配置:无,默认会根据input_type_rt的值从可选范围中自动选择:
  • input_type_rt配置为nv12或gray时,input_source默认自动选择为pyramid。
  • input_type_rt配置为其他值时,input_source默认自动选择为ddr。
  • 该参数配置为resizer时,input_type_rt仅支持配置为nv12或gray。
参数说明:这个参数是适配工程环境的选项, 建议您已经全部完成模型检查后再配置。
ddr 表示数据来自内存,pyramidresizer 表示来自处理器上的固定硬件。
在具体的工程环境中适配resizer数据源需要调用专有接口, 相关约束条件及说明请您参考 hbDNNRoiInferV2接口说明
此参数配置有些特殊,例如模型输入名称为 data,数据源为内存(ddr),则此处应该配置值为 {"data": "ddr"}
可选
max_time_per_fc参数作用:指定模型的每个function call的最大可连续执行时间(单位μs)。
参数类型:Int。
取值范围01000-4294967295
默认配置0
参数说明:编译后的数据指令模型在BPU上进行推理计算时, 它将表现为1个或者多个function-call(BPU的执行粒度)的调用。 取值为0代表不做限制。
该参数用来限制每个function-call最大的执行时间, 模型只有在单个function-call执行完时才有机会被抢占。
详情参见 模型优先级控制 部分的介绍。
注意:
  • 此参数仅用于实现模型抢占功能,如无需实现该功能则可以忽略。
  • 模型抢占功能仅支持在板端实现,不支持模拟器实现。
可选
jobs参数作用:设置编译hbm模型时的进程数。
参数类型:Int。
取值范围:机器支持的最大核心数范围内。
默认配置:16。
参数说明:在编译hbm模型时,用于设置进程数。 一定程度上可提高编译速度。
可选
advice参数作用:用于提示模型编译后预估的耗时增加的情况,单位是微秒。
参数类型:Int。
取值范围:自然数。
默认配置:0。
参数说明:模型在编译过程中,工具链内部会进行耗时分析。而实际过程中, 如算子做数据对齐等操作时会导致耗时有所增加,设置该参数后, 当某个OP的实际计算耗时与理论计算耗时的偏差大于您指定的值时,会打印相关log, 包括耗时变化的信息、数据对齐前后的shape以及padding比例等信息。
可选

param_value配置

具体参数的设置形式为:param_name: 'param_value' ,参数存在多个值时使用 ';' 符号分隔:param_name: 'param_value1; param_value2; param_value3'

小技巧

当模型为多输入模型时,强烈建议您将 input_shape 等参数们显式的写出,以免造成参数对应顺序上的错误。

注意

请注意,如果设置 input_type_rtnv12,则模型的输入尺寸中不能出现奇数。

int16配置说明

在模型转换的过程中,模型中的大部分算子都会被量化到int8进行计算,而通过配置 node_infoquant_config 参数, 可以详细指定某个op的输入/输出数据类型为int16计算(具体支持的算子范围可参考 工具链算子支持约束列表-ONNX Operator Support List,基本原理如下:

在您配置了某个op输入/输出数据类型为int16后,模型转换内部会自动进行op输入输出上下文(context)int16配置的更新和检查。 例如,当配置op_1输入/输出数据类型为int16时,实际上潜在同时指定了op_1的上/下一个op需要支持以int16计算。 对于不支持的场景,模型转换工具会打印log提示该int16配置组合暂时不被支持并回退到int8计算。