# MindSpore Dump功能使用经验

**1. 系统环境**

硬件环境\(Ascend/GPU/CPU\): Ascend/GPU/CPU

软件环境: MindSpore 版本: 1.7.0

执行模式（静态图/动态图）： 不限

Python 版本: 3.7.6

操作系统平台: linux

**2. 报错信息**

2.1 问题描述

使用MindSpore开发算法时，发现算法的执行结果和预期不一致，原始脚本逻辑如下：

```
init()  # 初始化集合通信... prob = net1(...) # net1执行结果正常... score = net2(...)   # net2结果和预期不一致
```

由于算法需要使用模型并行功能，不太适合使用PyNative方式定位这个问题。这种情况下，可以采用[异步Dump](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.0/debug/dump.html#%E5%BC%82%E6%AD%A5dump)，将net2的计算过程dump到文件中，用于进一步分析。 备注：MindSpore提供了Dump功能，用来将模型训练中的图以及算子的输入输出数据保存到磁盘文件。

考虑到dump数据会降低执行速度，导致问题复现较慢；而且dump过多的数据，导致后期筛选困难。因此只想要dump net2的计算结果。按照官方文档，只需要导出环境变量MINDSPORE\_DUMP\_CONFIG，即可导出计算中间数据：

```
init()  # 初始化集合通信... prob = net1(...) # net1执行结果正常... os.environ["MINDSPORE_DUMP_CONFIG"]="/path/dump.json"score = net2(...)   # net2结果和预期不一致
```

重新执行完毕后，发现在指定目录下并未生成数据文件。

**3. 根因分析**

阅读MindSpore源码，发现框架只会在GeDeviceContext::InitGe\(\)中读取MINDSPORE\_DUMP\_CONFIG环境变量的信息，而每个MindSpore进程只会执行一次GeDeviceContext初始化。

通过export GLOG\_v=1打开info级别日志，发现MindSpore是在初始化集合通信时执行GeDeviceContext初始化。

```
[INFO] DISTRIBUTED(153924,ffff94c6da70,python3):2023-07-22-11:00:35.823.355 [mindspore/ccsrc/distributed/collective/collective_manager.cc:157] Initialize] Start initializing collective communication for backend: Ascend
...
[INFO] DEVICE(153924,ffff94c6da70,python3):2023-07-22-11:00:43.723.045 [mindspore/ccsrc/plugin/device/ascend/hal/hardware/ge_device_context.cc:124] InitGe] Init ge successful, ge reference = 1.
```

也就是说，在init\(\)之后再导出MINDSPORE\_DUMP\_CONFIG并不会真正生效

**4. 解决方案**

基于当前MindSpore实现，并不能精确dump某个net的计算过程数据。最终还需要在执行脚本前，先export MINDSPORE\_DUMP\_CONFIG="/path/dump.json"来实现全量dump。

