当前位置: 首页 > news >正文

一次诡异的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错误而崩溃。

相关文章:

  • cmd炫技小方法
  • kafka搭建单机开发教程
  • 如果你需要用Python搞个二维码,那应该收藏这篇博客
  • Linux权限的认识
  • 【JavaScript】五个常用功能/案例:判断特定结尾字符串 | 获取指定字符串 | 颜色字符串转换 | 字符串转驼峰格式 | 简易购物车
  • Kotlin 字符串与空值判断
  • 【NLP开发】Python实现聊天机器人(ALICE)
  • 【题解】同济线代习题二 8.1
  • 【C语言】五分钟彻底搞定字符串
  • 【极客日常】PyQt5的QListView兼容左键双击事件和右键上下文菜单的方法
  • 基于遗传优化算法的小车障碍物避障路线规划matlab仿真(包括matlab仿真录像)
  • vue后台系统管理项目-openlayers地图定位、港口数据标记功能
  • 通讯录的文件版本(产品经理又来加需求了!)
  • 基于Java+SpringBoot+Thymeleaf+Mysql医院预约挂号系统设计与实现
  • 计算机网络-网络层篇-IP协议
  • github指令
  • js
  • js 实现textarea输入字数提示
  • mac修复ab及siege安装
  • MySQL数据库运维之数据恢复
  • PAT A1050
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 给github项目添加CI badge
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 微服务框架lagom
  • 阿里云ACE认证学习知识点梳理
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​2021半年盘点,不想你错过的重磅新书
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $ git push -u origin master 推送到远程库出错
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)nginx 配置(nginx.conf)
  • (ZT)一个美国文科博士的YardLife
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Sql Server 保留几位小数的两种做法
  • (转)VC++中ondraw在什么时候调用的
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • @Not - Empty-Null-Blank
  • [ Linux ] Linux信号概述 信号的产生
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [C++]Leetcode17电话号码的字母组合
  • [codeforces]Checkpoints
  • [codeforces]Levko and Permutation
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [FC][常见Mapper IRQ研究]
  • [IMX6DL] CPU频率调节模式以及降频方法
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用