图结构dump功能

功能简介

当模型执行异常(如模型精度不准确)时,可通过导出图结构信息,进行模型问题分析和排查。

图1 图dump功能介绍

使用方法

  1. 图执行过程中,开启Python层日志,支持打印原生FX图结构信息。

    from torchair import logger
    logger.setLevel(logging.DEBUG)

    图结构信息示例如下:

    [INFO] TORCHAIR(2476445,python):2025-04-09 16:02:54.452.689 [npu_fx_compiler.py:364]2476445   graph: graph():
        %arg0_1 : [num_users=1] = placeholder[target=arg0_1]
        %arg1_1 : [num_users=1] = placeholder[target=arg1_1]
        %select_scatter : [num_users=1] = call_function[target=torch.ops.aten.select_scatter.default](args = (%arg0_1, %arg1_1, 0, 1), kwargs = {})
        %mul : [num_users=1] = call_function[target=torch.ops.aten.mul.Tensor](args = (%select_scatter, 10), kwargs = {})
        return (mul,)

  2. 图执行完成后,支持dump TorchAir构图信息。

    该功能通过torchair.get_npu_backend中compiler_config配置,示例如下,参数介绍参见表1

    1
    2
    3
    4
    5
    6
    import torch_npu, torchair
    config = torchair.CompilerConfig()
    # 设置导出图结构文件格式
    config.debug.graph_dump.type = "pbtxt"
    npu_backend = torchair.get_npu_backend(compiler_config=config)
    opt_model = torch.compile(model, backend=npu_backend)
    
    表1 参数说明

    参数名

    参数说明

    graph_dump.type

    开启图结构信息dump,并指定导出文件格式。支持的格式如下:

    • py:dump Aten IR转换为Ascend IR后的构图信息,即图1阶段2构图信息,可通过Vscode等工具查看。
    • txt:dump最终接收到的TorchAir构图结果,可通过Vscode等工具查看。
    • pbtxt:dump最终接收到的TorchAir构图结果,为protobuf格式,可通过TensorBoard等工具查看。

    graph_dump.type缺省值为“None”,表示不导出图结构信息。

    说明:
    • 多次定义导出格式时,以最后一次定义的格式为准。
    • 不支持txt、pbtxt、py三种格式同时导出。

产物说明

指定图dump格式后,生成的图结构文件缺省路径为当前脚本所在路径。

其中${timestamp}表示时间戳,${graph_dump_type}表示导图文件格式,不同格式的样例如下:
  • py文件样例
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from torch import tensor
    from torchair._ge_concrete_graph import ge_apis as ge
    from torchair.ge._ge_graph import get_default_ge_graph
    
    arg0_1_0 = ge.Data(index=0, dtype=0, shape=[2, 2, 2], placement="NPU", node_name="arg0_1")
    arg1_1_0 = ge.Data(index=1, dtype=0, shape=[2], placement="NPU", node_name="arg1_1")
    
    # File "/home/torchair_example/tests/examples/example_select_scatter.py", line 23, in forward    output = torch.ops.aten.select_scatter(x, y, 0,1)
    ## FX Code: select_scatter = torch.ops.aten.select_scatter.default(arg0_1, arg1_1, 0, 1)
    Shape_0 = ge.Shape(arg0_1_0, node_name="Shape")
    BroadcastTo_0 = ge.BroadcastTo(1, Shape_0, node_name="BroadcastTo")
    ExpandDims_0 = ge.ExpandDims(arg1_1_0, 0, node_name="ExpandDims")
    BroadcastTo_1_0 = ge.BroadcastTo(ExpandDims_0, Shape_0, node_name="BroadcastTo_1")
    ScatterElements_0 = ge.ScatterElements(arg0_1_0, BroadcastTo_0, BroadcastTo_1_0, axis=0, node_name="ScatterElements")
    
    # File "/home/torchair_example/tests/examples/example_select_scatter.py", line 24, in forward    return output*10
    ## FX Code: mul = torch.ops.aten.mul.Tensor(select_scatter, 10)
    Mul_0 = ge.Mul(ScatterElements_0, ge.Const(10, dtype=0), node_name="Mul")
    Cast_0 = ge.Cast(Mul_0, dst_type=0, node_name="Cast")
    
    _ = ge.NetOutput([Cast_0], dependencies=[])
    
  • pbtxt文件样例