8.1. 模型性能调优¶
基于前文的性能分析工作,您可能发现性能结果不及预期,本章节内容介绍了地瓜机器人对提升模型性能的建议与措施,包括: 检查 yaml 配置参数、 处理 CPU 算子、 高性能模型设计建议、 使用地瓜机器人平台友好结构&模型 等内容。
注解
检查 yaml 配置参数、处理 CPU 算子仅适用于使用 hb_mapper makertbin 进行模型转换编译的使用场景。
部分修改可能会影响原始浮点模型的参数空间,意味着需要您重训模型,为了避免性能调优过程中反复调整并训练的代价, 在得到满意性能效果前,建议您使用随机参数导出模型来验证性能即可。
8.1.1. 检查影响模型性能的 yaml 参数¶
在模型转换的 yaml 配置文件中,部分参数会实际影响模型的最终性能,可以先检查下是否已正确按照预期配置, 各参数的具体含义和作用请参考 配置文件具体参数信息 小节的内容。
layer_out_dump:指定模型转换过程中是否输出模型的中间结果,一般仅用于调试功能。 如果将其配置为True,则会为每个卷积算子增加一个反量化输出节点,它会显著的降低模型上板后的性能。 所以在性能评测时,务必要将该参数配置为False。compile_mode:该参数用于选择模型编译时的优化方向为带宽还是时延,关注性能时请配置为latency。optimize_level:该参数用于选择编译器的优化等级,实际生产中应配置为O3获取最佳性能。max_time_per_fc:该参数用于控制编译后的模型数据指令的 function-call 的执行时长,从而实现模型优先级抢占功能。 设置此参数更改被抢占模型的 function-call 执行时长会影响该模型的上板性能。
8.1.2. 处理 CPU 算子¶
如果根据 hrt_model_exec perf 的评估,确认了突出的性能瓶颈是由于当前算子在 CPU 上运行导致的。 那么此种情况下,我们建议您先查看 工具链算子支持约束列表 章节,确认当前运行在 CPU 上的算子是否具备 BPU 支持的能力。
如果所使用的算子参数超出了 BPU 支持的约束范围,建议先将原始浮点模型计算参数调整到 BPU 约束范围内。 为了方便您快速知晓超出约束的具体参数,建议您再使用 验证模型 部分介绍的方法做一遍检查, 工具将会直接给出超出 BPU 支持范围的参数提示。
注解
修改原始浮点模型参数对模型计算精度的影响需要您自己把控,
例如 Convolution 的 input_channel 或 output_channel 超出范围就是一种较典型的情况,
减少 channel 快速使得该算子被 BPU 支持,单单只做这一处修改也预计会对模型精度产生影响。
如果算子并不具备 BPU 支持能力,就需要您根据以下情况做出对应优化操作:
CPU 算子处于模型中部
对于 CPU 算子处于模型中部的情况,建议您优先尝试参数调整、算子替换或修改模型。
CPU 算子处于模型首尾部
对于 CPU 算子处于模型首尾部的情况,请参考以下示例,下面以量化/反量化节点为例:
对于与模型输入输出相连的节点,可以在 yaml 文件 model_parameters 配置组(模型参数组)中增加
remove_node_type参数,并重新编译模型。remove_node_type: "Quantize; Dequantize"
或使用 hb_model_modifier 工具对 bin 模型进行修改:
hb_model_modifier x.bin -a Quantize -a Dequantize
对于下图这种没有与输入输出节点相连的模型,则需要使用 hb_model_modifier 工具判断相连节点是否支持删除后按照顺序逐个进行删除。
先使用 hb_perf 工具获取模型结构图片,然后使用以下两条命令可以自上而下移除 Quantize 节点, 对于 Dequantize 节点自下而上逐个删除即可,每一步可删除节点的名称可以通过
hb_model_modifier x.bin进行查看。hb_model_modifier x.bin -r res2a_branch1_NCHW2NHWC_LayoutConvert_Input0 hb_model_modifier x_modified.bin -r data_res2a_branch1_HzQuantize
8.1.3. 高性能模型设计建议¶
根据性能评估结果,CPU 上耗时占比可能很小,主要的性能瓶颈还是 BPU 推理时间过长。 这种情况下,我们已经把计算器件都用上了,发力的空间就在于提升计算资源的利用率。 每种处理器都有自己的硬件特性,算法模型的计算参数是否很好地符合了硬件特性, 直接决定了计算资源的利用率,符合度越高则利用率越高,反之则低。 本部分介绍重点在于阐明地瓜机器人的硬件特性。 首先,地瓜机器人的计算平台旨在加速 CNN(卷积神经网络),主要的计算资源都集中在处理各种卷积计算。 所以,我们希望您的模型是以卷积计算为主的模型,卷积之外的算子都会导致计算资源的利用率降低,不同 OP 的影响程度会有所不同。
另外,在模型设计时,我们应尽量让模型 BPU 段的输入输出维度降低,以减少量化、反量化节点的耗时和硬件的带宽压力。 以典型的分割模型为例,我们可以将 Argmax 算子直接合入模型本身。 但需注意,只有满足以下条件,Argmax 才支持 BPU 加速:
Caffe 中的 Softmax 层默认 axis=1,而 ArgMax 层则默认 axis=0,算子替换时要保持 axis 的一致。
Argmax 的 Channel 需小于等于 64,否则只能在 CPU 上计算。