1.6K Star 6K Fork 2.3K

GVPMindSpore / mindspore

 / 详情

A910上训练过程中,静态图Run task error,动态图Sync stream error!

DONE
Bug-Report
Opened this issue  
2021-10-21 22:36
name about labels
Bug Report A910设备上进行训练,训练几个epoch后报错 kind/bug

Environment

  • Hardware Environment(Ascend/GPU/CPU):

/device ascend

  • Software Environment:
    -- MindSpore version :Mindspore-ascend 1.3.0
    -- Python version :Python 3.7.5
    -- OS platform and distribution :EulerOS 4.8.5-28
    -- GCC/Compiler version: gcc 4.8.5

Describe the current behavior

同样逻辑和实现的代码,在GPU设备上训练没有问题。迁移到A910设备上训练时,在运行几个epoch之后(可以产生loss,并且有明显下降趋势),突然报错。我分别在动态图和静态图上都试了一下,动态图报错Call runtime rtStreamSynchronize error和Sync stream error,静态图报错run task error。

Related log / screenshot

动态图报错信息大致如下:
动态图报错信息

静态图报错信息大致如下:
静态图报错信息

Special notes for this issue

静态图下run task error报错指向的算子都是gather,但是指向使用的此算子的位置并不固定。将task_error_dump里的npy文件加载查看,发现里面出现了nan值,但是同样的代码在GPU设备上并不会出现这样的问题。
具体log文件和task_error_debug.ir文件在链接:https://pan.baidu.com/s/1tR31VxFJM-N_toeXona3LA 提取码:w4n3

2021.10.22 plus

我尝试将反向传播求梯度的类(我使用的是nn.TrainOneStepWithLossScaleCell)去掉,只使用loss_net(这种情况loss基本固定不下降),目前这样可以运行50个epoch不报错。具体地,

        manager_head = nn.DynamicLossScaleUpdateCell(
            loss_scale_value=2 ** 10,
            scale_factor=2,
            scale_window=2000
        )
        weights_head = ParameterTuple(loss_net_head.trainable_params())
        optimizer_head = Adam(weights_head, learning_rate=self.model_config.lr)
        train_net_head = nn.TrainOneStepWithLossScaleCell(
            network=loss_net_head,
            optimizer=optimizer_head,
            scale_sense=manager_head
        )

2021.10.26 plus

我尝试将所有的数据类型都改成float16,不会报此错误,但是loss并不会下降。

Comments (22)

Kakarotto createdBug-Report

Please assign maintainer to check this issue.
请为这个issue分配处理人, @fangwenyi @chengxiaoli

Please add labels (comp or sig),also you can visit "https://gitee.com/mindspore/community/blob/master/sigs/dx/docs/labels.md" to find more.
为了让问题更快得到响应,请您为该issue打上 组件(comp)或兴趣组(sig) 标签,打上标签的问题可以直接推送给责任人进行处理。更多的标签可以查看
https://gitee.com/mindspore/community/blob/master/sigs/dx/docs/labels.md
以组件问题为例,如果你发现问题是data组件造成的,你可以这样评论:
//comp/data
当然你也可以向data SIG组求助,可以这样写:
//comp/data
//sig/data
如果是一个简单的问题,你可以留给刚进入社区的小伙伴来回答,这时候你可以这样写:
//good-first-issue
恭喜你,你已经学会了使用命令来打标签,接下来就在下面的评论里打上标签吧!

i-robot added
 
kind/bug
label

问题已经收到,还请耐心等待下分析答复

chengxiaoli set assignee to chengxiaoli
chengxiaoli changed issue state from TODO to ACCEPTED
chengxiaoli added
 
mindspore-assistant
label
chengxiaoli set priority to Main
Kakarotto changed description
Kakarotto changed description
Kakarotto changed description

建议开启 loss scale 试试,是否存在溢出,导致算子报错

nn.DynamicLossScaleUpdateCell和nn.FixedLossScaleUpdateCell,以及直接调用nn.TrainOneStepCell我都试过,还是会有这个错误。目前我个人初步判断是数据类型导致的梯度计算或者底层算子执行出错。

nn.DynamicLossScaleUpdateCell和nn.FixedLossScaleUpdateCell,以及直接调用nn.TrainOneStepCell我都试过,还是会有这个错误。目前我个人初步判断是数据类型导致的梯度计算或者底层算子执行出错。

@Kakarotto amp_level="O2" 试试

我试了一下更改amp_level="O2",产生的loss并不会下降,跟我直接把所有参数以及输入数据改成float16类似。
设置代码如下:

if self.model_config.use_dynamic_loss_scale:
    loss_scale_manager = DynamicLossScaleManager(init_loss_scale=65536, scale_factor=2, scale_window=2000)
else:
    loss_scale_manager = FixedLossScaleManager(1024, drop_overflow_update=False)
train_net_head = Model(network=loss_net_head, optimizer=optimizer_head, metrics=None,
                       loss_scale_manager=loss_scale_manager, amp_level="O2")

你的报错算子不是Gather,是UnsortedSegmentSum,是gather算子对应的反向。

gahter算子在rotate.py:66行定义,具体调用位置看不太清,应该首先检查Gather操作是否存在越界的情况,如果index越界了,可能地址能访问不会报错,但是脏数据容易导致计算异常。

经过检查,index并没有越界,是input_params里面出现了nan值。出现这种情况的原因不得而知,并且同样的代码在GPU设备上并不会报错。

fangwenyi changed assignee from chengxiaoli to chenhaozhe
fangwenyi assigned collaborator chengxiaoli
fangwenyi added
 
DFX/start-analysis
label
fangwenyi changed issue state from ACCEPTED to WIP

经过检查,index并没有越界,是input_params里面出现了nan值。出现这种情况的原因不得而知,并且同样的代码在GPU设备上并不会报错。

@Kakarotto 好吧,input_params中出现异常值,就应该是之前的计算已经出现了错误导致的了。由于不熟悉具体网络结构所以我也并没有针对性的思路。

一般性的解决思路就是网络逐层排查,因为nan的计算是有传染性的,解决问题就需要溯源nan的产生源点了。有两种方法:

  1. https://www.mindspore.cn/docs/programming_guide/zh-CN/r1.5/dump_in_graph_mode.html#id11 使用异步dump功能,在出现错误的时候把全图的输入输出数据都导出,然后根据网络结果逐个查找,主要是配置比较多,操作稍微复杂,而且需要理解图结构。 @wenkai 看一下现在的异步dump能不能处理这种task error的情况下现场保存。
  2. 使用print的功能,逐步打印缩小范围来处理,主要是可能需要多次复现,不能一次得到结果。

目前经过打印测试,在出现run task error这一个step前向的网络输出和loss都是正常有数值的,并且我也检查了一下中间结果也没有nan,应该是反向传播有异常。

step: 129, loss is 744.6643
Tensor(shape=[], dtype=Float32, value=1423.06)
Tensor(shape=[], dtype=Float32, value=42.3435)
[ERROR] GE(1521,7fe1d3fff700,python):2021-11-01-19:40:09.719.736 [mindspore/ccsrc/runtime/device/ascend/ge_runtime/runtime_model.cc:232] Run] Call rt api rtStreamSynchronize failed, ret: 507011
[ERROR] DEVICE(1521,7fe1d3fff700,python):2021-11-01-19:40:09.794.021 [mindspore/ccsrc/runtime/device/ascend/ascend_kernel_runtime.cc:570] DumpTaskExceptionInfo] Task fail infos task_id: 127, stream_id: 94, tid: 1821, device_id: 3, retcode: 507011
[ERROR] DEVICE(1521,7fe1d3fff700,python):2021-11-01-19:40:09.795.824 [mindspore/ccsrc/runtime/device/ascend/ascend_kernel_runtime.cc:579] DumpTaskExceptionInfo] Dump node (Gradients/Default/network-NetWithLossClass_head/network-RotatE_Graph/gradGather/UnsortedSegmentSum-op1831) task error input/output data to: ./task_error_dump/3 trace:
In file /root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/ops/_grad/grad_array_ops.py(416)/ params_grad = unsorted_segment_sum(values_transpose, indices, shape_op(x)[axis])/
Corresponding forward node candidate:
In file /disk2/mabiao/RotatE-Ascend/src/rotate.py(131)/ tail = self.gather(/
In file /disk2/mabiao/RotatE-Ascend/src/rotate.py(282)/ negative_score = self.network.construct_tail((positive_sample, negative_sample))/
In file /disk2/mabiao/RotatE-Ascend/src/train_one_step_with_scale_and_clip_global_norm.py(68)/ loss = self.network(*inputs)/
[ERROR] DEVICE(1521,7fe1d3fff700,python):2021-11-01-19:40:10.194.601 [mindspore/ccsrc/runtime/device/ascend/ascend_kernel_runtime.cc:693] RunTask] RunModel error msg: mindspore/ccsrc/runtime/device/ascend/ge_runtime/runtime_model.cc:232 Run] Call rt api rtStreamSynchronize failed, ret: 507011
[ERROR] SESSION(1521,7fe1d3fff700,python):2021-11-01-19:40:10.197.552 [mindspore/ccsrc/backend/session/ascend_session.cc:1137] Execute] run task error!
Traceback (most recent call last):
File "train.py", line 100, in
train_kge()
File "/disk2/mabiao/RotatE-Ascend/src/model_utils/moxing_adapter.py", line 110, in wrapped_func
run_func(*args, **kwargs)
File "train.py", line 81, in train_kge
dataset_sink_mode=False
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/train/model.py", line 649, in train
sink_size=sink_size)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/train/model.py", line 433, in _train
self._train_process(epoch, train_dataset, list_callback, cb_params)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/train/model.py", line 558, in _train_process
outputs = self._train_network(*next_element)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/nn/cell.py", line 386, in call
out = self.compile_and_run(*inputs)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/nn/cell.py", line 660, in compile_and_run
return _executor(self, *new_inputs, phase=self.phase)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/common/api.py", line 611, in call
return self.run(obj, *args, phase=phase)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/common/api.py", line 639, in run
return self._exec_pip(obj, *args, phase=phase_real)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/common/api.py", line 75, in wrapper
results = fn(*arg, **kwargs)
File "/root/miniconda3/envs/ci3.7/lib/python3.7/site-packages/mindspore/common/api.py", line 622, in _exec_pip
return self._executor(args_list, phase)
RuntimeError: mindspore/ccsrc/backend/session/ascend_session.cc:1137 Execute] run task error!

异步dump 在task error场景下可以保存 task error发生前的网络运行数据。

可以参考下面的文档尝试稳定复现task error 问题: https://mindspore.cn/docs/programming_guide/zh-CN/master/fixing_randomness.html

获取异步dump数据后,如需要可视化分析,可以使用 调试器 https://mindspore.cn/mindinsight/docs/zh-CN/master/debugger_offline.html

您好,建议您尝试用离线调试器对异步dump数据做可视化分析,通过“检查张量溢出”监测点来确定NaN的最早出现位置,从而判断和问题相关的算子。

使用文档: https://mindspore.cn/mindinsight/docs/zh-CN/master/debugger_offline.html

我尝试使用同步dump在net.to_float(float15)设置下导出数据,由于文件较多并没有发现哪个地方有异常,但是nn.TrainOneStepWithLossScaleCell输出的cond是溢出的。

oacjiewen added
 
v1.5.1
label

我尝试使用同步dump在net.to_float(float15)设置下导出数据,由于文件较多并没有发现哪个地方有异常,但是nn.TrainOneStepWithLossScaleCell输出的cond是溢出的。

@Kakarotto 文件较多的情况下,使用调试器来做可视化分析会比较方便。为了高效解决问题,我这边可以为您安排一个远程会议来讨论问题,请问您什么时候方便?

具体你们定时间吧

wenkai assigned collaborator wenkai
wenkai assigned collaborator maning202007

明天周二下午 2:15 您有空吗?

建议先尝试 固定随机性,确定问题发生的step,然后dump该step的数据,使用调试器分析出错算子的输入数据是否有异常。

固定随机性后,问题发生较为确定,有较大概率(10次里面有8次)发生在第726个迭代,从而可以进行异步dump

基于异步dump数据进行分析,发现run task error算子存在NAN输出,进一步溯源,发现sqrtgrad输出-INF,原因是计算 self.norm时,存在开平方输入数据为0,求导后,0变成分母,导致-INF

修改建议:自行实现self.norm的计算逻辑,开平方前加一个小数 1e-6,确保开平方输入数据不是0

https://mindspore.cn/docs/api/zh-CN/r1.5/api_python/nn/mindspore.nn.Norm.html#mindspore.nn.Norm

https://mindspore.cn/docs/api/zh-CN/r1.5/api_python/nn/mindspore.nn.Norm.html#mindspore.nn.Norm

x = self.sqrt(VERY_SMALL_NUMBER + self.reduce_sum(F.square(x), self.axis))

fangwenyi changed issue state from WIP to VALIDATION

用户反馈,通过修正Norm方法来规避对0开平方,测试结果已经比较合理

fangwenyi changed issue state from VALIDATION to DONE
ms_yan added
 
usability
label
ms_yan added
 
attr/serviceability
label
ms_yan added
 
user/individual
label

Sign in to comment

Status
Assignees
Projects
Milestones
Pull Requests
Successfully merging a pull request will close this issue.
Branches
Planed to start   -   Planed to end
-
Top level
Priority
Duration (hours)
Confirm
参与者(8)
6574854 jjfeing 1584438580 2049741 peacepeace 1578965104 5644189 c 34 1586403335
Python
1
https://git.oschina.net/mindspore/mindspore.git
git@git.oschina.net:mindspore/mindspore.git
mindspore
mindspore
mindspore

Search

182229 41614e54 1850385 182230 7885ed45 1850385