同一环境下PyTorch训练SAR_ResNet31触发CUDA设备端断言错误求助
解决SAR_ResNet31训练时的CUDA断言错误(indexSelectLargeIndex)
你遇到的srcIndex < srcSelectDimSize断言错误,本质是目标序列的索引超出了词嵌入表的范围,结合报错位置在SAR解码器的embed_tgt步骤,给你几个直接的排查方向:
1. 核对词表大小与目标索引范围
报错核心是嵌入层查询的索引大于等于词表的实际大小。直接做两步验证:
- 打印批次中目标序列的最大索引,对比模型嵌入层的词表尺寸:
如果前者大于等于后者,直接确认是词表大小设置错误。# 在数据加载迭代中插入这段调试代码 for batch in train_loader: tgt_labels = batch['target'] print("目标序列最大索引:", tgt_labels.max().item()) print("模型嵌入层词表大小:", model.decoder.embed_tgt.num_embeddings) break
2. 检查数据预处理的索引映射
- 确认韩文数据集里的所有字符,是否都被正确映射到词表内的索引:比如生僻字、特殊符号有没有被统一映射到
<UNK>索引(通常是0或词表最后一位),而不是生成了超出词表范围的数值。 - 排查预处理代码中,字符转索引的逻辑,是否遗漏了部分韩文字符的处理。
3. 校验模型初始化的词表参数
- 查看
train_pytorch.py中初始化SAR_ResNet31时的vocab_size参数,是否和你韩文数据集的实际词表大小完全一致?很多时候是模型用了默认的英文词表大小,和韩文词表不匹配导致的。
4. 排查填充索引的合法性
- 若训练时对序列做了填充,确认填充用的索引(比如
pad_idx)是否在词表范围内(0到vocab_size-1)。部分代码会错误地用vocab_size作为填充索引,直接触发越界。
临时调试技巧
把batch_size改成1,单样本运行训练脚本,定位到具体触发错误的样本,直接查看该样本的目标序列内容,快速锁定异常字符或索引问题。
内容的提问来源于stack exchange,提问作者Khawar Islam
相关产品推荐
相关产品推荐

