forked from mindspore-Ecosystem/mindspore
update_dump_map
This commit is contained in:
parent
878614e6d8
commit
af2a798905
|
@ -16,7 +16,7 @@
|
|||
"""Selu op"""
|
||||
from mindspore.ops.op_info_register import op_info_register, TBERegOp, DataType
|
||||
|
||||
selu_op_info = TBERegOp("Selu") \
|
||||
selu_op_info = TBERegOp("SeLU") \
|
||||
.fusion_type("ELEMWISE") \
|
||||
.async_flag(False) \
|
||||
.binfile_name("selu.so") \
|
||||
|
|
|
@ -9,20 +9,21 @@
|
|||
## 辅助工具使用
|
||||
|
||||
1. 使用脚本的3步操作:
|
||||
① 用户在训练脚本里设置context.set_context(mode=context.GRAPH_MODE, save_graphs=True),进行图文件的保存。
|
||||
② 用户开启dump数据功能,参考<https://www.mindspore.cn/tutorial/training/zh-CN/r1.0/advanced_use/custom_debugging_info.html>
|
||||
③ 获取dump数据文件的op_num,然后通过辅助脚本进行解析。如数据文件:Default--network-TrainOneStepCell--network-WithLossCell--_backbone-
|
||||
ResNet--layer2-SequentialCell--0-ResidualBlock--conv2-Conv2d--Cast-op954_input_0_shape_128_128_3_3_kNumberTypeFloat32_DefaultFormat.bin.
|
||||
可观察到Cast-op954,说明该算子的op_num为op954。
|
||||
脚本名: **map_file_to_code.py**; 执行方式:
|
||||
- 用户在训练脚本里设置context.set_context(mode=context.GRAPH_MODE, save_graphs=True),进行图文件的保存。
|
||||
- 用户开启dump数据功能,参考<https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/custom_debugging_info.html#dump>
|
||||
- 获取dump数据文件的op_num,然后通过辅助脚本进行解析。如数据文件:`Default--network-TrainOneStepCell--network-WithLossCell--_backbone-
|
||||
ResNet--layer2-SequentialCell--0-ResidualBlock--conv2-Conv2d--Cast-op954_input_0_shape_128_128_3_3_kNumberTypeFloat32_DefaultFormat.bin`.
|
||||
可观察到Cast-op954,说明该算子的op_num为op954, 如下图所示。
|
||||
![image](./images/op_image.png)
|
||||
脚本名: **[map_file_to_code.py](https://gitee.com/mindspore/mindspore/blob/master/scripts/map_dump_file_to_code/map_file_to_code.py)**; 执行方式:
|
||||
|
||||
```ruby
|
||||
python3 map_file_to_code.py
|
||||
--graph_path(-p) [the graph path, default is the current path](option)
|
||||
--dump_op(-o) [Dump operator id, case insensitive, such as 'op954'.](required)
|
||||
For example:
|
||||
python3 map_file_to_code.py -p graph_path -o op954
|
||||
```
|
||||
```ruby
|
||||
python3 map_file_to_code.py
|
||||
--graph_path(-p) [the graph path, default is the current path](option)
|
||||
--dump_op(-o) [Dump operator id, case insensitive, such as 'op954'.](required)
|
||||
For example:
|
||||
python3 map_file_to_code.py -p graph_path -o op954
|
||||
```
|
||||
|
||||
2. 解析效果
|
||||
解析文件时通常有2种情况:
|
||||
|
@ -55,10 +56,12 @@
|
|||
```
|
||||
|
||||
3. 手动代码查找
|
||||
这里还会存在些特殊情况,需要用户进行自行查找。通过将dump的数据文件名中的'--'替换为'/'可获取到算子的full_name。input和output文件名shape后面的数据为对应算子的输入输出shape信息。然后利用算子的full_name和输入输出信息回到源码中进行对应代码的查找。
|
||||
举个例子说明如何手动在代码中查找指定full_name和shape的算子,例如full_name为: Default/network/network/aspp/aspp_pooling/ResizeNearestNeighbor,输入的shape为[8, 256, 1, 1], dtype为float32。
|
||||
可以观察到其scope为: Default/network/network/aspp/aspp_pooling,算子名为: ResizeNearestNeighbor。注意:scope中会存在Default、network自动填充,Default表示正向,network为网络名。
|
||||
查看以下用户定义的代码,首先我们先分析scope: Default/network/network/aspp/aspp_pooling。由network/aspp可定位到算子的定义与调用处分别为26行与31行,继续由network/aspp/aspp_pooling,可以定位到定义与调用处分别为4行与8行,然后通过算子名ResizeNearestNeighbor可以定位至定义与调用处分别为16行与19行。最后若存在相同scope下存在相同的算子名时,需要通过输入的shape进行进一步判断。
|
||||
这里还会存在些特殊情况,需要用户进行自行查找。通过将dump的数据文件名中的'--'替换为'/'可获取到算子的full_name, 如下图所示:
|
||||
![image](./images/replace_symbol.png)
|
||||
input和output文件名shape后面的数据为对应算子的输入输出shape信息。然后利用算子的full_name和输入输出信息回到源码中进行对应代码的查找。
|
||||
举个例子说明如何手动在代码中查找指定full_name和shape的算子,例如full_name为: `Default/network/network/aspp/aspp_pooling/ResizeNearestNeighbor`,输入的shape为[8, 256, 1, 1], dtype为float32。
|
||||
可以观察到其scope为: `Default/network/network/aspp/aspp_pooling`,算子名为: `ResizeNearestNeighbor`。注意:scope中会存在Default、network自动填充,Default表示正向,network为网络名。
|
||||
查看以下用户定义的代码,首先我们先分析scope: `Default/network/network/aspp/aspp_pooling`。由network/aspp可定位到算子的定义与调用处分别为26行与31行,继续由`network/aspp/aspp_pooling`,可以定位到定义与调用处分别为4行与8行,然后通过算子名`ResizeNearestNeighbor`可以定位至定义与调用处分别为16行与19行。最后若存在相同scope下存在相同的算子名时,需要通过输入的shape进行进一步判断。
|
||||
|
||||
```ruby
|
||||
1 class ASPP(nn.Cell):
|
||||
|
@ -68,7 +71,7 @@
|
|||
5 self.drop = nn.Dropout(0.3)
|
||||
6
|
||||
7 def construct(self, x):
|
||||
8 x5 = self.aspp_pooling(x)
|
||||
8 x = self.aspp_pooling(x)
|
||||
9 x = self.drop(x)
|
||||
10 return x
|
||||
11
|
||||
|
@ -79,7 +82,7 @@
|
|||
16 self.resizenearestneighbor = P.ResizeNearestNeighbor((size[2], size[3]), True)
|
||||
17 def construct(self, x):
|
||||
18 size = self.shape(x)
|
||||
19 out = self.resizenearestneighbor(out)
|
||||
19 out = self.resizenearestneighbor(x)
|
||||
20 return out
|
||||
21
|
||||
22 # 主结构
|
||||
|
@ -91,6 +94,6 @@
|
|||
28
|
||||
29 def construct(self, x):
|
||||
30 size = self.shape(x)
|
||||
31 out = self.aspp(out)
|
||||
31 out = self.aspp(x)
|
||||
32 return out
|
||||
```
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
Binary file not shown.
After Width: | Height: | Size: 7.2 KiB |
|
@ -149,8 +149,8 @@ def start_find(dump_op, map_code_file):
|
|||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description='Find the dump operator in the user code')
|
||||
parser.add_argument('--graph_path', '-p', type=str.lower, default="", help='Save graph files path (option)')
|
||||
parser.add_argument('--dump_op', '-o', type=str.lower, default="", required=True,
|
||||
parser.add_argument('--graph_path', '-p', type=str, default="", help='Save graph files path (option)')
|
||||
parser.add_argument('--dump_op', '-o', type=str, default="", required=True,
|
||||
help="Dump operator id, case insensitive, such as 'op3352'.")
|
||||
args_opt = parser.parse_args()
|
||||
start_find(args_opt.dump_op, args_opt.graph_path)
|
||||
|
|
Loading…
Reference in New Issue