如何定位报错: indexSelectLargeIndex:... Assertion `srcIndex < srcSelectDimSize` fail

本文主要是介绍如何定位报错: indexSelectLargeIndex:... Assertion `srcIndex < srcSelectDimSize` fail,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1. 背景
  • 2. 准备工作
    • 2.1 debug工具
    • 2.2 设置准备工作
  • 3. 开启 debug


1. 背景

在使用 cuda 在 gpu 计算的过程中,出现索引超过最大长度。

indexSelectLargeIndex:... Assertion `srcIndex < srcSelectDimSize` fail

通常这种时候堆栈底部还伴随以下报错:

RuntimeError: CUDA error: device-side assert triggered

如果你明确你的输入是什么,那么这种问题不难排查。

困难的是,如果你调用了一些封装很深的库,例如模型训练库,比如 transformer 。特别是你还是用多 gpu 跑这种代码,那么这种问题排查起来尤其困难。

ps:
对于这种隐藏太深的问题,在网上(包含外网)几乎搜索不到太多的解决方法。

2. 准备工作

目前遇到这种问题,最好的解决方法只有对代码 debug。千万别害怕 debug,这是当你遇到疑难杂症时,理解代码、解决问题的最佳方法!

2.1 debug工具

当然 debug 也有方法的,掌握合适的工具事半功倍:
(1)本地代码可以用 IDE 编码的,那么直接用 IDE 的 debug 方便
(2)远程部署在服务器上的,如果本地可以通过内网 ssh 连接服务器,建议部署用 VSCode,远程连接进行 debug
(3)远程部署在服务器上的,本地没有任何办法连接服务器的,那么可以借助 python 的 pdb 库。详细用法请参考《Python内置debug库: pdb用法详解》
(4)当然,肯定有其他方法,更多的方法我就没用过了~

2.2 设置准备工作

为了可以高效的 debug,需要简单配置以下设置:
(1)将 gpu 运算替换成 cpu 运算
(2)将多线程改成单线程
(3)如果是深度学习模型训练,请调低模型参数、减少训练的数据量

下面依次解释以上操作:
(1)将 gpu 运算替换成 cpu 运算

  • model.to(torch.device("cpu"))
  • 如果你使用 transformer 库,在 TrainingArgumentsuse_cpu = True

(2)将多线程改成单线程;例如此前你使用多机多卡训练,请调整成一张卡

(3)调低模型参数、减少训练的数据量

  • 现在的大模型的参数量巨大,可能导入会爆内存,请调低模型的参数,例如 attention 的head数、网络隐藏层数、embedding维度、max_seq_length 等
  • 另外,为了提高效率,训练 load 的数据可以少一些,加速 debug 效率

3. 开启 debug

由于我们并不知道是哪里的问题引起的索引超过最大长度,因此我们需要从头开始 debug,那么是不是一步一步来 debug 呢?

这里有一个加速的方法,我们采用二分法。
(1)在大致代码1/2的位置打上断点,然后放行代码,看代码是否可以运行到这个断点。
(2)如果可以,那么在后半部分的1/2再打断点,再运行;
(3)否则在前半部分的1/2再打断点。
(4)直到可以定位到是哪一行函数报错,再追踪进去重复上面的步骤

举个例子:
这是transformer的内置的train 的内部代码,明确是这里出现了问题,现在就需要找到是哪一行有问题。我们可以找一个大致的位置打上断点,然后放行 debug 代码
在这里插入图片描述
找到报错的一行代码以后,再具体根据里面的变量之间的关系具体分析。


欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

欢迎关注知乎/CSDN:SmallerFL

也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤
在这里插入图片描述

这篇关于如何定位报错: indexSelectLargeIndex:... Assertion `srcIndex < srcSelectDimSize` fail的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074291

相关文章

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

PHP执行php.exe -v命令报错的解决方案

《PHP执行php.exe-v命令报错的解决方案》:本文主要介绍PHP执行php.exe-v命令报错的解决方案,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录执行phpandroid.exe -v命令报错解决方案执行php.exe -v命令报错-PHP War

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is