模型性能调优

基于前文的性能分析工作,您可能发现性能结果不及预期,本章节内容介绍了地平线对提升模型性能的建议与措施,包括:检查yaml配置参数、处理CPU算子等内容。

注解

检查yaml配置参数、处理CPU算子仅适用于使用 hb_compile 进行模型转换编译的使用场景。

检查影响模型性能的yaml参数

在模型转换的yaml配置文件中,部分参数会实际影响模型的最终性能,可以先检查下是否已正确按照预期配置,各参数的具体含义和作用请参考 配置文件具体参数信息 小节的内容。

  • debug_mode:该参数用于精度调试分析。如果配置了dump_all_layers_output,则会为每个卷积和矩阵乘算子增加一个反量化输出节点以输出模型的中间结果,它会显著的降低模型上板后的性能。所以在性能评测时,务必要将dump_all_layers_output参数从debug_mode中移除。

  • compile_mode:该参数用于选择模型编译时的优化方向为带宽还是时延,关注性能时请配置为 latency

  • optimize_level:该参数用于选择编译器的优化等级,O0不做任何优化, 编译速度最快,优化程度最低,O1-O2随着优化等级提高,预期编译后的模型的执行速度会更快,但是所需编译时间也会变长。

  • max_time_per_fc:该参数用于控制编译后的模型数据指令的function-call的执行时长,从而实现模型优先级抢占功能。设置此参数更改被抢占模型的function-call执行时长会影响该模型的上板性能。

处理CPU算子

如果根据hrt_model_exec perf的评估,确认了突出的性能瓶颈是由于当前算子在CPU上运行导致的。那么此种情况下,我们建议您先查看 工具链算子支持约束列表 章节,确认当前运行在CPU上的算子是否具备BPU支持的能力。

如果所使用的算子参数超出了BPU支持的约束范围,建议先将原始浮点模型计算参数调整到BPU约束范围内。 为了方便您快速知晓超出约束的具体参数,建议您再使用 验证模型 部分介绍的方法做一遍检查,工具将会直接给出超出BPU支持范围的参数提示。

注释

修改原始浮点模型参数对模型计算精度的影响需要您自己把控,例如Convolution的 input_channeloutput_channel 超出范围就是一种较典型的情况,减少channel快速使得该算子被BPU支持,单单只做这一处修改也预计会对模型精度产生影响。

如果算子并不具备BPU支持能力,就需要您根据以下情况做出对应优化操作:

  • CPU算子处于模型中部

    对于CPU算子处于模型中部的情况,建议您优先尝试参数调整、算子替换或修改模型。

  • CPU算子处于模型首尾部

    对于CPU算子处于模型首尾部的情况,请参考以下示例,下面以量化/反量化节点为例:

    • 对于与模型输入输出相连的节点,可以在yaml文件model_parameters配置组(模型参数组)中增加 remove_node_type 参数,并重新编译模型。

      remove_node_type: "Quantize; Dequantize"

BPU面向高效率模型优化

学术界在持续优化算法模型的计算效率(同样算法精度下所需的理论计算量越小越高效)、参数效率(同样算法精度下所用参数量越小越高效)。 这方面的代表工作有EfficientNet和ResNeXt,二者分别使用了Depthwise Convolution和Group Convolution。 面对这样的高效率模型,GPU/TPU支持效率很低,不能充分发挥算法效果,学术界被迫针对GPU/TPU分别优化了EfficientNet V2/X和NFNet,优化过程主要是通过减少Depthwise Convolution的使用以及大幅扩大Group Convolution中的Group大小,这些调整都降低了原本模型的计算效率和参数效率。

更多高效模型设计指导建议可参考 高效模型设计指导 章节内容。