update_dump_map

This commit is contained in:
jiangzhenguang 2021-01-22 10:50:16 +08:00
parent 878614e6d8
commit af2a798905
5 changed files with 26 additions and 23 deletions

View File

@ -16,7 +16,7 @@
"""Selu op""" """Selu op"""
from mindspore.ops.op_info_register import op_info_register, TBERegOp, DataType 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") \ .fusion_type("ELEMWISE") \
.async_flag(False) \ .async_flag(False) \
.binfile_name("selu.so") \ .binfile_name("selu.so") \

View File

@ -9,20 +9,21 @@
## 辅助工具使用 ## 辅助工具使用
1. 使用脚本的3步操作 1. 使用脚本的3步操作
① 用户在训练脚本里设置context.set_context(mode=context.GRAPH_MODE, save_graphs=True),进行图文件的保存。 - 用户在训练脚本里设置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数据功能参考<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- - 获取dump数据文件的op_num然后通过辅助脚本进行解析。如数据文件`Default--network-TrainOneStepCell--network-WithLossCell--_backbone-
&nbsp; &nbsp; ResNet--layer2-SequentialCell--0-ResidualBlock--conv2-Conv2d--Cast-op954_input_0_shape_128_128_3_3_kNumberTypeFloat32_DefaultFormat.bin. ResNet--layer2-SequentialCell--0-ResidualBlock--conv2-Conv2d--Cast-op954_input_0_shape_128_128_3_3_kNumberTypeFloat32_DefaultFormat.bin`.
&nbsp; &nbsp; 可观察到Cast-op954说明该算子的op_num为op954。 可观察到Cast-op954说明该算子的op_num为op954, 如下图所示。
脚本名: **map_file_to_code.py**; &nbsp; 执行方式: ![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)**; &nbsp; 执行方式:
```ruby ```ruby
python3 map_file_to_code.py python3 map_file_to_code.py
--graph_path(-p) [the graph path, default is the current path](option) --graph_path(-p) [the graph path, default is the current path](option)
--dump_op(-o) [Dump operator id, case insensitive, such as 'op954'.](required) --dump_op(-o) [Dump operator id, case insensitive, such as 'op954'.](required)
For example: For example:
python3 map_file_to_code.py -p graph_path -o op954 python3 map_file_to_code.py -p graph_path -o op954
``` ```
2. 解析效果 2. 解析效果
解析文件时通常有2种情况 解析文件时通常有2种情况
@ -55,10 +56,12 @@
``` ```
3. 手动代码查找 3. 手动代码查找
这里还会存在些特殊情况需要用户进行自行查找。通过将dump的数据文件名中的'--'替换为'/'可获取到算子的full_name。input和output文件名shape后面的数据为对应算子的输入输出shape信息。然后利用算子的full_name和输入输出信息回到源码中进行对应代码的查找。 这里还会存在些特殊情况需要用户进行自行查找。通过将dump的数据文件名中的'--'替换为'/'可获取到算子的full_name, 如下图所示:
举个例子说明如何手动在代码中查找指定full_name和shape的算子例如full_name为: Default/network/network/aspp/aspp_pooling/ResizeNearestNeighbor输入的shape为[8, 256, 1, 1] dtype为float32。 ![image](./images/replace_symbol.png)
可以观察到其scope为: Default/network/network/aspp/aspp_pooling算子名为: ResizeNearestNeighbor。注意scope中会存在Default、network自动填充Default表示正向network为网络名。 input和output文件名shape后面的数据为对应算子的输入输出shape信息。然后利用算子的full_name和输入输出信息回到源码中进行对应代码的查找。
查看以下用户定义的代码首先我们先分析scope: Default/network/network/aspp/aspp_pooling。由network/aspp可定位到算子的定义与调用处分别为26行与31行继续由network/aspp/aspp_pooling可以定位到定义与调用处分别为4行与8行然后通过算子名ResizeNearestNeighbor可以定位至定义与调用处分别为16行与19行。最后若存在相同scope下存在相同的算子名时需要通过输入的shape进行进一步判断。 举个例子说明如何手动在代码中查找指定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 ```ruby
1 class ASPP(nn.Cell): 1 class ASPP(nn.Cell):
@ -68,7 +71,7 @@
5 self.drop = nn.Dropout(0.3) 5 self.drop = nn.Dropout(0.3)
6 6
7 def construct(self, x): 7 def construct(self, x):
8 x5 = self.aspp_pooling(x) 8 x = self.aspp_pooling(x)
9 x = self.drop(x) 9 x = self.drop(x)
10 return x 10 return x
11 11
@ -79,7 +82,7 @@
16 self.resizenearestneighbor = P.ResizeNearestNeighbor((size[2], size[3]), True) 16 self.resizenearestneighbor = P.ResizeNearestNeighbor((size[2], size[3]), True)
17 def construct(self, x): 17 def construct(self, x):
18 size = self.shape(x) 18 size = self.shape(x)
19 out = self.resizenearestneighbor(out) 19 out = self.resizenearestneighbor(x)
20 return out 20 return out
21 21
22 # 主结构 22 # 主结构
@ -91,6 +94,6 @@
28 28
29 def construct(self, x): 29 def construct(self, x):
30 size = self.shape(x) 30 size = self.shape(x)
31 out = self.aspp(out) 31 out = self.aspp(x)
32 return out 32 return out
``` ```

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@ -149,8 +149,8 @@ def start_find(dump_op, map_code_file):
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Find the dump operator in the user code') 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('--graph_path', '-p', type=str, default="", help='Save graph files path (option)')
parser.add_argument('--dump_op', '-o', type=str.lower, default="", required=True, parser.add_argument('--dump_op', '-o', type=str, default="", required=True,
help="Dump operator id, case insensitive, such as 'op3352'.") help="Dump operator id, case insensitive, such as 'op3352'.")
args_opt = parser.parse_args() args_opt = parser.parse_args()
start_find(args_opt.dump_op, args_opt.graph_path) start_find(args_opt.dump_op, args_opt.graph_path)