使用图模式运行模型时会自动融合算子,以降低推理的整体运行时间。算子融合是整网性能提升的一种关键手段,目前系统内置了一些算子融合规则,且均为自动开启。TorchAir在用户侧额外提供了接口,允许用户自定义关闭/开启部分融合算子。
算子融合分为图融合(Graph Fusion)和UB融合(Unified Buffer Fusion)两种,详情请参见《CANN 图融合和UB融合规则参考》。
{ "Switch":{ "GraphFusion":{ "ConvToFullyConnectionFusionPass":"on", "SoftmaxFusionPass":"on", "ConvConcatFusionPass":"on", "MatMulBiasAddFusionPass":"on", "PoolingFusionPass":"on", "ZConcatv2dFusionPass":"on", "ZConcatExt2FusionPass":"on", "TfMergeSubFusionPass":"on" }, "UBFusion":{ "FusionVirtualOpSetSwitch":"on" } } }
同时支持用户一键关闭/开启融合规则,以一键关闭为例:
{ "Switch":{ "GraphFusion":{ "ALL":"off" }, "UBFusion":{ "ALL":"off" } } }
一键式关闭融合规则仅是关闭系统部分融合规则,而非全部融合规则,即便是配置"ALL": "off"后,部分融合算子仍旧会生效,因为关闭某些融合规则可能会导致功能问题。
import torch_npu import torchair as tng config = tng.CompilerConfig() # 指定融合配置文件的路径 config.fusion_config.fusion_switch_file = "/home/test/fusion_switch.cfg" npu_backend = tng.get_npu_backend(compiler_config=config) ... model = Model() model = torch.compile(model, backend=npu_backend, dynamic=False)
若想确认配置本身是否生效,在运行之前需要提前设置环境变量,该环境变量会打印图初始化时的一些开关配置。
export TNG_LOG_LEVEL=0
若配置正确,在日志信息中搜索“ge.fusionSwitchFile:”关键字,可以看见类似的屏显信息。
concrete_graph/session.cpp:28 ge.fusionSwitchFile: /home/test/fusion_switch.cfg
[{ "graph_fusion": { "RefreshInt64ToInt32FusionPass": { "effect_times": "1", "match_times": "1" } }, "session_and_graph_id": "0_0", "ub_fusion": { "MatmulAtomicAddUbFusion": { "effect_times": "36", "match_times": "72", } } }]
当前图找到1次满足“RefreshInt64ToInt32FusionPass”条件的情况,成功融合了1次。找到了72次满足“MatmulAtomicAddUbFusion”融合条件的情况,成功融合了36次。
若用户未自定义配置融合算子文件,系统会采用默认配置运行图模式,默认配置文件的路径为“${HOME}/Ascend/ascend-toolkit/latest/opp/built-in/fusion_pass/config/fusion_config.json”,其中${HOME}为CANN软件安装目录。