forked from mindspore-Ecosystem/mindspore
update_dump_map
This commit is contained in:
parent
878614e6d8
commit
af2a798905
|
@ -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") \
|
||||||
|
|
|
@ -9,12 +9,13 @@
|
||||||
## 辅助工具使用
|
## 辅助工具使用
|
||||||
|
|
||||||
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-
|
||||||
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`.
|
||||||
可观察到Cast-op954,说明该算子的op_num为op954。
|
可观察到Cast-op954,说明该算子的op_num为op954, 如下图所示。
|
||||||
脚本名: **map_file_to_code.py**; 执行方式:
|
![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
|
```ruby
|
||||||
python3 map_file_to_code.py
|
python3 map_file_to_code.py
|
||||||
|
@ -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 |
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue