昇腾社区首页
中文
注册

图结构dump功能

功能简介

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

图1 图dump功能介绍

使用方法

  1. 图执行过程中,开启Python层日志,支持打印原生FX图结构信息。
    1
    2
    3
    import logging
    from torchair import logger
    logger.setLevel(logging.DEBUG)
    

    图结构信息示例如下:

    1
    2
    3
    4
    5
    6
    [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
    7
    import torch_npu, torchair
    config = torchair.CompilerConfig()
    # 设置图结构导出参数
    config.debug.graph_dump.type = "pbtxt"
    config.debug.graph_dump.path = "./test"
    npu_backend = torchair.get_npu_backend(compiler_config=config)
    opt_model = torch.compile(model, backend=npu_backend)
    
    表1 参数说明

    参数名

    参数说明

    graph_dump.type

    设置导出图结构文件的格式,字符串型,支持如下选项:

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

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

    说明:
    • 多次定义导出格式时,以最后一次定义的格式为准。
    • 不支持txt、pbtxt、py三种格式同时导出。
    • config.mode为aclgraph(reduce-overhead模式),该场景仅支持py文件格式。

    graph_dump.path

    设置图结构文件生成的路径,字符串型。可选配置,如果不设置,缺省路径为当前执行路径。

    说明:

    注意,请确保该参数指定的路径确实存在,并且运行用户具有读、写操作权限。

产物说明

图结构dump的结果文件如下:

  • dynamo_original_graph_${graph_id}_rank_${rank_id}_pid_${pid}_ts_${timestamp}.${graph_dump_type}:模型原始图结构文件。
  • dynamo_optimized_graph__${graph_id}_rank_{rank_id}_pid_{pid}_ts_{timestamp}.${graph_dump_type}:优化后的模型图结构文件。
其中${graph_id}表示第几张图,${rank_id}表示图执行的通信卡id,${pid}表示图执行的进程号,${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文件样例

  • txt文件样例
    name: "graph_1"
    op {
      name: "arg0_1"
      type: "Data"
      attr {
        key: "_input_name_key"
        value {
          list {
            s: "x"
          }
        }
      }
      input_desc {
        name: "x"
        dtype: DT_FLOAT
        shape {
          dim: 2
          dim: 2
          dim: 2
        }
        layout: "ND"
        device_type: "NPU"
      }
      output_desc {
        name: "y"
        dtype: DT_FLOAT
        shape {
          dim: 2
          dim: 2
          dim: 2
        }
        layout: "ND"
        attr {
          key: "_meta"
          value {
            s: "Tensor(dtype=torch.float32, shape=torch.Size([2, 2, 2]))"
          }
        }
        attr {
          key: "format_for_int"
          value {
            i: 2
          }
        }
        device_type: "NPU"
      }
    }
    .........
    op {
      name: "arg1_1"
      type: "Data"
      attr {
        key: "_input_name_key"
        value {
          list {
            s: "x"
          }
        }
      }
      ......
    }