MindSpore Dump功能使用经验

在使用异步Dump功能,发现在指定目录下,并未生成相应的数据文件。

接下来的记录问题定位和解决方法:

1. 问题描述:

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

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

由于算法需要使用模型并行功能,不太适合使用PyNative方式定位这个问题。这种情况下,可以采用异步Dump,将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结果和预期不一致

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

2. 根因分析

阅读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并不会真正生效

3. 解决方案

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