算子融合规则配置功能

功能简介

图模式场景下执行模型时会自动融合算子,以降低训练或推理运行时间、提高整网性能。算子融合方式主要包括如下两种:

更详细的介绍请参考CANN 图融合和UB融合规则参考。目前系统内置了一些算子融合规则,缺省情况下均为开启(如有缺省关闭,会有特殊说明)。TorchAir在npu_backend中额外提供了config配置项,允许用户自定义关闭/开启部分融合算子。

使用方法

  1. 创建算子融合规则配置文件(*.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"后,部分融合算子仍旧会生效,因为关闭某些融合规则可能会导致功能问题。

  2. 使能算子融合规则配置文件。

    该配置文件生效通过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)
    
    表1 参数说明

    参数名

    参数说明

    fusion_switch_file

    指定算子融合规则文件。

    若想确认该功能配置是否生效,在运行之前需要提前设置日志环境变量,该环境变量会打印图初始化时的一些开关配置。

    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"
            }
        }
    }
}