算子融合规则配置功能
功能简介
使用图模式运行模型时会自动融合算子,以降低训练或推理整体运行时间。算子融合分为图融合和UB融合两种,更详细介绍参考《CANN 图融合和UB融合规则参考》。
- 图融合(Graph Fusion):指融合引擎根据融合规则进行改图的过程,该过程主要通过拆分/合并计算图中的算子来提升计算效率,以实现加速运算的目的,与硬件无关。
- UB融合(Unified Buffer Fusion):指对图上算子进行硬件UB相关的融合,UB是昇腾AI处理器上的Unified Buffer。例如两个算子a和b单独运行时,算子a的计算结果在UB上,需要搬移到DDR(Double Data Rate,双倍速率同步动态随机存储器)。算子b再执行时,需要将算子a的输出由DDR再搬移到UB,进行算子b的计算逻辑,计算完之后,又从UB搬移回DDR。
算子融合是整网性能提升的一种关键手段,目前系统内置了一些算子融合规则,缺省情况下均为开启(如有缺省关闭,会有特殊说明)。TorchAir在npu_backend中额外提供了config配置项,允许用户自定义关闭/开启部分融合算子。
使用方法
- 创建算子融合规则配置文件(*.cfg)。文件名自定义(例如fusion_switch.cfg),内容示例如下,其中on表示开启融合规则,off表示关闭融合规则。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "Switch":{ "GraphFusion":{ "ConvToFullyConnectionFusionPass":"on", "SoftmaxFusionPass":"on", "ConvConcatFusionPass":"on", "MatMulBiasAddFusionPass":"on", "PoolingFusionPass":"on", "ZConcatv2dFusionPass":"on", "ZConcatExt2FusionPass":"on", "TfMergeSubFusionPass":"on" }, "UBFusion":{ "FusionVirtualOpSetSwitch":"on" } } }
同时支持用户一键关闭/开启融合规则,一键关闭操作示例如下:
1 2 3 4 5 6 7 8 9 10
{ "Switch":{ "GraphFusion":{ "ALL":"off" }, "UBFusion":{ "ALL":"off" } } }
一键式关闭融合规则仅是关闭系统部分融合规则,而非全部融合规则,即便是配置"ALL": "off"后,部分融合算子仍旧会生效,因为关闭某些融合规则可能会导致功能问题。
- 使能算子融合规则配置文件。
该配置文件生效通过torchair.get_npu_backend中compiler_config参数配置,示例如下,参数介绍参见表1。
1 2 3 4 5
import torch_npu, torchair config = torchair.CompilerConfig() # 指定融合配置文件的路径 config.fusion_config.fusion_switch_file = "/home/test/fusion_switch.cfg npu_backend = torchair.get_npu_backend(compiler_config=config)
若想确认该功能配置是否生效,在运行之前需要提前设置日志环境变量,该环境变量会打印图初始化时的一些开关配置。
1
export TNG_LOG_LEVEL=0
若配置正确,在日志信息中搜索“ge.fusionSwitchFile:”关键字,可以看见类似的屏显信息。
1
concrete_graph/session.cpp:28 ge.fusionSwitchFile: /home/test/fusion_switch.cfg
产物说明
算子融合规则配置文件生效后,缺省情况下在当前操作目录下生成名为"fusion_result.json"的文件,结果示例如下:
{ "session_and_graph_id_0_0": { "graph_fusion": { "pass1": { "effect_times": "1", "match_times": "1" }, "pass2": { "effect_times": "2", "match_times": "2" } }, "ub_fusion": { "pass3": { "effect_times": "3", "match_times": "3", "repository_hit_times": "0" } } }, "session_and_graph_id_1_1": { "graph_fusion": { "pass1": { "effect_times": "5", "match_times": "5" } }, "ub_fusion": { "pass2": { "effect_times": "7", "match_times": "7", "repository_hit_times": "0" } } } }
- session_and_graph_id_xx_xx:表示融合结果所属线程和图编号。
- graph_fusion:表示图融合。
- ub_fusion:表示UB融合。
- match_times:表示图编译过程中匹配到的融合规则次数。
- effect_times:表示实际生效的次数。
- repository_hit_times:优化UB融合知识库命中的次数。
父主题: 更多功能