图模式场景下执行模型时会自动融合算子,以降低训练或推理运行时间、提高整网性能。算子融合方式主要包括如下两种:
更详细的介绍请参考《CANN 图融合和UB融合规则参考》。目前系统内置了一些算子融合规则,缺省情况下均为开启(如有缺省关闭,会有特殊说明)。TorchAir在npu_backend中额外提供了config配置项,允许用户自定义关闭/开启部分融合算子。
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 6 | 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) opt_model = torch.compile(model, backend=npu_backend) |
若想确认该功能配置是否生效,在运行之前需要提前设置日志环境变量,该环境变量会打印图初始化时的一些开关配置。
export TNG_LOG_LEVEL=0
若配置正确,在日志信息中搜索“ge.fusionSwitchFile:”关键字,可以看见类似的屏显信息。
1 | concrete_graph/session.cpp:28 ge.fusionSwitchFile: /home/test/fusion_switch.cfg |
缺省情况下,图编译完成后默认在脚本执行路径下生成fusion_result.json,可以通过查看json文件判断自定义配置的融合规则是否生效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | { "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" } } } } |