如何定位报错: 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

相关文章

无人叉车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

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef‘ of undefined“

vue 父组件调用子组件的方法报错,“TypeError: Cannot read property ‘subDialogRef’ of undefined” 最近用vue做的一个界面,引入了一个子组件,在父组件中调用子组件的方法时,报错提示: [Vue warn]: Error in v-on handler: “TypeError: Cannot read property ‘methods

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

笔记本电脑开机报错故障的原因及解决办法

笔记本电脑开机报错故障是指笔记本电脑开机自检时或启动操作系统前停止启动,在显示屏 出现一些错误提示的故障。   笔记本电脑开机报错故障的原因及解决办法   造成此类故障的原因一般是笔记本电脑在启动自检时,检测到硬件设备不能正常工作或在自 检通过后从硬盘启动时,出现硬盘的分区表损坏、硬盘主引导记录损坏、硬盘分区结束标志丢失 等故障,笔记本电脑出现相应的故障提示。   维修此类故障时