You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 5.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # 映射数据文件到对应的脚本源码
  2. ## 文档功能与适用场景
  3. 在MindSpore进行计算调试,怀疑遇到精度问题时可以选择dump文件进行对比。此时用户希望知道dump文件夹下的每个数据文件对应的Python源码。
  4. 本文的主要目的为指导用户使用该工具进行数据文件到python源码的映射。
  5. 此指导文档适合运行在 **Ascend硬件** 环境下的计算。
  6. ## 辅助工具使用
  7. 1. 使用脚本的3步操作:
  8. ① 用户在训练脚本里设置context.set_context(mode=context.GRAPH_MODE, save_graphs=True),进行图文件的保存。
  9. ② 用户开启dump数据功能,参考<https://www.mindspore.cn/tutorial/training/zh-CN/r1.0/advanced_use/custom_debugging_info.html>
  10. ③ 获取dump数据文件的op_num,然后通过辅助脚本进行解析。如数据文件:Default--network-TrainOneStepCell--network-WithLossCell--_backbone-
  11. &nbsp; &nbsp; ResNet--layer2-SequentialCell--0-ResidualBlock--conv2-Conv2d--Cast-op954_input_0_shape_128_128_3_3_kNumberTypeFloat32_DefaultFormat.bin.
  12. &nbsp; &nbsp; 可观察到Cast-op954,说明该算子的op_num为op954。
  13. 脚本名: **map_file_to_code.py**; &nbsp; 执行方式:
  14. ```ruby
  15. python3 map_file_to_code.py
  16. --graph_path(-p) [the graph path, default is the current path](option)
  17. --dump_op(-o) [Dump operator id, case insensitive, such as 'op954'.](required)
  18. For example:
  19. python3 map_file_to_code.py -p graph_path -o op954
  20. ```
  21. 2. 解析效果
  22. 解析文件时通常有2种情况:
  23. ① 匹配时会显示出调用栈过程,需要用户在调用栈中查找自己的源码:
  24. ```ruby
  25. [INFO] Start to map the dump file to source code.
  26. [INFO] Find operation 'Cast'.
  27. In file /data1/jzg/mindspore/mindspore/nn/layer/conv.py(253)/
  28. output = self.conv2d(x, self.weight)
  29. In file /data1/jzg/dump_to_code/resnet/scripts/train/src/resnet.py(166)/
  30. out = self.conv2(out)
  31. In file /data1/jzg/mindspore/mindspore/nn/layer/container.py(173)/
  32. for cell in self.cell_list:
  33. In file /data1/jzg/dump_to_code/resnet/scripts/train/src/resnet.py(323)/ # 用户代码行
  34. c3 = self.layer2(c2)
  35. In file /data1/jzg/mindspore/mindspore/train/amp.py(101)/
  36. out = self._backbone(data)
  37. In file /data1/jzg/mindspore/mindspore/nn/wrap/cell_wrapper.py(247)/
  38. loss = self.network(*inputs)
  39. In file /data1/jzg/mindspore/mindspore/train/dataset_helper.py(87)/
  40. return self.network(*outputs)
  41. ```
  42. ② 未匹配,在图中未找对应节点的调用栈:
  43. ```ruby
  44. [INFO] Start to map the dump file to source code.
  45. [WARNING] Cannot find cast's source code in ir file. # 未找到cast算子的信息
  46. ```
  47. 3. 手动代码查找
  48. 这里还会存在些特殊情况,需要用户进行自行查找。通过将dump的数据文件名中的'--'替换为'/'可获取到算子的full_name。input和output文件名shape后面的数据为对应算子的输入输出shape信息。然后利用算子的full_name和输入输出信息回到源码中进行对应代码的查找。
  49. 举个例子说明如何手动在代码中查找指定full_name和shape的算子,例如full_name为: Default/network/network/aspp/aspp_pooling/ResizeNearestNeighbor,输入的shape为[8, 256, 1, 1], dtype为float32。
  50. 可以观察到其scope为: Default/network/network/aspp/aspp_pooling,算子名为: ResizeNearestNeighbor。注意:scope中会存在Default、network自动填充,Default表示正向,network为网络名。
  51. 查看以下用户定义的代码,首先我们先分析scope: Default/network/network/aspp/aspp_pooling。由network/aspp可定位到算子的定义与调用处分别为26行与31行,继续由network/aspp/aspp_pooling,可以定位到定义与调用处分别为4行与8行,然后通过算子名ResizeNearestNeighbor可以定位至定义与调用处分别为16行与19行。最后若存在相同scope下存在相同的算子名时,需要通过输入的shape进行进一步判断。
  52. ```ruby
  53. 1 class ASPP(nn.Cell):
  54. 2 def __init__(self):
  55. 3 super(ASPP, self).__init__()
  56. 4 self.aspp_pooling = ASPPPooling()
  57. 5 self.drop = nn.Dropout(0.3)
  58. 6
  59. 7 def construct(self, x):
  60. 8 x5 = self.aspp_pooling(x)
  61. 9 x = self.drop(x)
  62. 10 return x
  63. 11
  64. 12 class ASPPPooling(nn.Cell):
  65. 13 def __init__(self):
  66. 14 super(ASPPPooling, self).__init__()
  67. 15 self.shape = P.Shape()
  68. 16 self.resizenearestneighbor = P.ResizeNearestNeighbor((size[2], size[3]), True)
  69. 17 def construct(self, x):
  70. 18 size = self.shape(x)
  71. 19 out = self.resizenearestneighbor(out)
  72. 20 return out
  73. 21
  74. 22 # 主结构
  75. 23 class DeepLabV3(nn.Cell):
  76. 24 def __init__(self, phase='train', num_classes=21, output_stride=16, freeze_bn=False):
  77. 25 super(DeepLabV3, self).__init__()
  78. 26 self.aspp = ASPP()
  79. 27 self.shape = P.Shape()
  80. 28
  81. 29 def construct(self, x):
  82. 30 size = self.shape(x)
  83. 31 out = self.aspp(out)
  84. 32 return out
  85. ```