DUMP_GRAPH_FORMAT
功能描述
控制需要生成的dump文件类型。
支持的取值包括:
- onnx:基于ONNX的模型描述结构,可以使用Netron等可视化软件打开,生成文件名为ge_onnx*.pbtxt。
- ge_proto:protobuf格式存储的文本文件,生成文件名为ge_proto*.txt。
- readable:类似Dynamo fx图风格的高可读性文本文件,生成文件名为ge_readable*.txt。文件内容解析请参见readable文件解析。
使用方式:
配置按照“|”分隔的字符串,类型全部为小写,支持组合配置,例如“ge_proto|onnx|readable”,表示dump全量类型的文件;也支持单独配置,例如“ge_proto”,表示只dump ge_proto类型的文件ge_proto*.txt。
DUMP_GRAPH_FORMAT环境变量只有在DUMP_GE_GRAPH开启时才生效,默认为“ge_proto|onnx”。
配置示例
export DUMP_GRAPH_FORMAT="ge_proto|onnx"
使用约束
readable文件解析
如下为一个完整的ge_readable*.txt文件:
graph("MakeTransformerSubGraph"):
%input_0 : [#users=1] = Node[type=Data] (attrs = {index: 0})
%input_1 : [#users=1] = Node[type=Data] (attrs = {index: 1})
%input_2 : [#users=1] = Node[type=Data] (attrs = {index: 2})
%Const_0 : [#users=1] = Node[type=Const] (attrs = {value: [-1 7168]})
%Reshape_1 : [#users=1] = Node[type=Reshape] (inputs = (%input_0, %Const_0), attrs = {axis: 0, num_axes: -1})
%Cast_2 : [#users=1] = Node[type=Cast] (inputs = (%Reshape_1), attrs = {dst_type: 0})
%Cast_3 : [#users=1] = Node[type=Cast] (inputs = (%input_1), attrs = {dst_type: 0})
%Const_4 : [#users=1] = Node[type=Const] (attrs = {value: [1 0]})
%Transpose_5 : [#users=1] = Node[type=Transpose] (inputs = (%Cast_3, %Const_4))
%MatMul_6 : [#users=1] = Node[type=MatMul] (inputs = (%Cast_2, %Transpose_5), attrs = {transpose_x1: false, transpose_x2: false})
%Sigmoid_7 : [#users=1] = Node[type=Sigmoid] (inputs = (%MatMul_6))
%Const_8 : [#users=1] = Node[type=Const] (attrs = {value: [-1 256]})
%Reshape_9 : [#users=1] = Node[type=Reshape] (inputs = (%Sigmoid_7, %Const_8), attrs = {axis: 0, num_axes: -1})
%Unsqueeze_10 : [#users=1] = Node[type=Unsqueeze] (inputs = (%input_2), attrs = {axes: {0}})
%Cast_11 : [#users=1] = Node[type=Cast] (inputs = (%Unsqueeze_10), attrs = {dst_type: 0})
%Add_12 : [#users=1] = Node[type=Add] (inputs = (%Reshape_9, %Cast_11))
%Const_13 : [#users=1] = Node[type=Const] (attrs = {value: [2]})
%TopKV2_14 : [#users=2] = Node[type=TopKV2] (inputs = (%Add_12, %Const_13), attrs = {sorted: true, dim: -1, largest: true, indices_dtype: 3})
%ret : [#users=1] = get_element[node=%TopKV2_14](0)
%ret_1 : [#users=0] = get_element[node=%TopKV2_14](1)
%Const_15 : [#users=1] = Node[type=Const] (attrs = {value: [-1]})
%ReduceSum_16 : [#users=1] = Node[type=ReduceSum] (inputs = (%ret, %Const_15), attrs = {keep_dims: false, noop_with_empty_axes: true})
%Const_17 : [#users=1] = Node[type=Const] (attrs = {value: [4]})
%TopKV2_18 : [#users=2] = Node[type=TopKV2] (inputs = (%ReduceSum_16, %Const_17), attrs = {sorted: false, dim: -1, largest: true, indices_dtype: 3})
%ret_2 : [#users=0] = get_element[node=%TopKV2_18](0)
%ret_3 : [#users=1] = get_element[node=%TopKV2_18](1)
%Cast_19 : [#users=1] = Node[type=Cast] (inputs = (%ret_3), attrs = {dst_type: 9})
%ZerosLike_20 : [#users=1] = Node[type=ZerosLike] (inputs = (%ReduceSum_16))
%Shape_21 : [#users=1] = Node[type=Shape] (inputs = (%Cast_19), attrs = {dtype: 3})
%Const_22 : [#users=1] = Node[type=Const] (attrs = {value: [1.000000]})
%Cast_23 : [#users=1] = Node[type=Cast] (inputs = (%Const_22), attrs = {dst_type: 0})
%Fill_24 : [#users=1] = Node[type=Fill] (inputs = (%Shape_21, %Cast_23))
%ScatterElements_25 : [#users=1] = Node[type=ScatterElements] (inputs = (%ZerosLike_20, %Cast_19, %Fill_24), attrs = {axis: 0, reduction: "none"})
%Unsqueeze_26 : [#users=1] = Node[type=Unsqueeze] (inputs = (%ScatterElements_25), attrs = {axes: {-1}})
%Const_27 : [#users=1] = Node[type=Const] (attrs = {value: [256 256]})
%BroadcastTo_28 : [#users=1] = Node[type=BroadcastTo] (inputs = (%Unsqueeze_26, %Const_27))
%Identity_29 : [#users=1] = Node[type=Identity] (inputs = (%BroadcastTo_28))
%Const_30 : [#users=1] = Node[type=Const] (attrs = {value: [256 256]})
%Reshape_31 : [#users=1] = Node[type=Reshape] (inputs = (%Identity_29, %Const_30), attrs = {axis: 0, num_axes: -1})
%Cast_32 : [#users=1] = Node[type=Cast] (inputs = (%Reshape_31), attrs = {dst_type: 12})
%LogicalNot_33 : [#users=1] = Node[type=LogicalNot] (inputs = (%Cast_32))
%Const_34 : [#users=1] = Node[type=Const] (attrs = {value: [0.000000]})
%MaskedFill_35 : [#users=1] = Node[type=MaskedFill] (inputs = (%Add_12, %LogicalNot_33, %Const_34))
%Const_36 : [#users=1] = Node[type=Const] (attrs = {value: [4]})
%TopKV2_37 : [#users=2] = Node[type=TopKV2] (inputs = (%MaskedFill_35, %Const_36), attrs = {sorted: false, dim: -1, largest: true, indices_dtype: 3})
%ret_4 : [#users=0] = get_element[node=%TopKV2_37](0)
%ret_5 : [#users=1] = get_element[node=%TopKV2_37](1)
%Cast_38 : [#users=1] = Node[type=Cast] (inputs = (%ret_5), attrs = {dst_type: 9})
%GatherElements_39 : [#users=1] = Node[type=GatherElements] (inputs = (%Sigmoid_7, %Cast_38), attrs = {dim: 1})
%Const_40 : [#users=1] = Node[type=Const] (attrs = {value: [0.000001]})
%RealDiv_41 : [#users=1] = Node[type=RealDiv] (inputs = (%GatherElements_39, %Const_40))
%Const_42 : [#users=1] = Node[type=Const] (attrs = {value: [2.500000]})
%Mul_43 : [#users=1] = Node[type=Mul] (inputs = (%RealDiv_41, %Const_42))
%Cast_44 : [#users=1] = Node[type=Cast] (inputs = (%Mul_43), attrs = {dst_type: 0})
return (%Cast_38, %Cast_44)
字段解释如下:
- 图名称:graph("<图名称>")。
- 节点实例:%<节点实例名称> : [#users=<出度>] = Node[type=<节点类型>](inputs = (%<节点输入实例1>, %<节点输入实例2>, ...), attrs = {<属性名称1>: <属性值>, <属性名称2>: <属性值>, ...})。
- <节点实例名称>:节点实例名称。
- #users=<出度> :节点输出个数。
- Node[type=<节点类型>]:节点对应OP算子类型,比如算子MatMul对应Node[type=MatMul]。
- inputs = (<input节点输入实例#num>, ...) :节点的输入节点实例,不区分可选与必选输入,如果为空则缺省。
- attrs = {<属性名称1>: <属性值>, ...}:节点对应的属性名称与属性值,不区分可选与必选属性,如果为空则缺省。
- 包含多输出的节点:%ret/ret_#cnt : [#users=<消费者个数>] = get_element[node=%<节点实例名称>](<输出index>)。
- %ret/ret_#cnt:统一用ret来表示多输出情况,按照ret、ret_1、ret_2的格式递增。
- #users=<出度>:此输出有几个消费者。
- get_element[node=%<节点实例名称>]:该输出对应的节点名称,以get_element表示输出,通过node=%<节点实例名称>表示这是哪个节点实例的输出。
- <输出index>:输出对应的index。
- 图输出:return (%<图输出1>, %<图输出2>, ...)
表示图的输出,对应图NetOutput的输入。
父主题: 图编译