一次诡异的numpy数组越界访问

改动了某模型的python脚本后,训练过程中总是不定期出现程序崩溃,有时能完整跑完几个epoch,有时一个epoch每跑完就崩溃了,错误类似如下:

Traceback (most recent call last):
  File "tools/train.py", line 311, in <module>
    raise e
  File "tools/train.py", line 305, in <module>
    args.level,
  File "/usr/local/lib/python3.6/site-packages/at/engine/ddptrainer.py", line 234, in launch
    args,
  File "/root/.local/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 230, in spawn
    return start_processes(fn, args, nprocs, join, daemon, start_method='spawn')
  File "/root/.local/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 188, in start_processes
    while not context.join():
  File "/root/.local/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 136, in join
    signal_name=name
torch.multiprocessing.spawn.ProcessExitedException: process 0 terminated with signal SIGSEGV

非常讨厌pytorch的multiprocessing里这个用于发起多进程并发调用的spawn,当某个process里出错了,spawn不能返回发生错误的准确位置!而是类似上面这样给出spawn里的发起调用的位置这种没用的信息,再就是进程出错的粗略原因,后者稍微有点用,但是只有这个信息很难快速定位出错的根本原因!像上面这个SIGSEGV错误,花了好一阵时间才定位到出错的地方,居然是一个numpy数组越界访问了,很简单:  m =  ms[j, i],而python没有任何out of bounds这样的错误抛出来!单步跟踪发现,越界非法访问其实不止崩溃时(譬如说 j = 1649),前面很多索引访问都已经越界了(第一个维度合法最大值应该是12,所以从13-1649都是非法的索引值)但是居然没有报错!而且每次运行程序后崩溃时j的值还不一样,真的是很诡异,平常写个numpy数组然后使用非法的索引值去访问其值总是能抛出类似下面的IndexError:

b[100,200]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: index 100 is out of bounds for axis 0 with size 100

不知为何上面的情况下抛不出IndexError,而是允许非法越界访问直到某个时候发生SIGSEGV错误而崩溃。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值