复现VarBERT库CMLM训练时遇CUDA/索引错误求助
排查VarBERT CMLM训练词汇量不匹配报错的步骤
确认tokenizer与模型词汇量完全对齐
直接打印两者的词汇量做对比:print("Tokenizer vocab size:", tokenizer.vocab_size) print("Model config vocab size:", model.config.vocab_size)VarBERT在CMLM阶段大概率会新增变异相关的特殊token,别直接复用MLM阶段的基础BERT tokenizer,要确认CMLM用的tokenizer已经包含所有新增token,且模型嵌入层大小同步更新了。
检查CMLM训练数据的预处理逻辑
报错里的目标值50001超出范围,说明数据里有token ID大于等于模型词汇量的情况。抽样检查训练数据的token IDs:# 取一批训练数据 batch = next(iter(train_dataloader)) print("Max token ID in targets:", batch["labels"].max().item())如果发现ID大于
model.config.vocab_size-1,就回溯预处理流程:是不是生成CMLM约束标签时,引入了没加入tokenizer的新token?或者tokenizer的add_special_tokens配置在CMLM阶段没设对?验证CMLM模型的初始化流程
基于预训练MLM模型扩展CMLM时,这两步必须做对:- 调用
tokenizer.add_tokens()添加CMLM所需的特殊变异token - 调用
model.resize_token_embeddings(len(tokenizer))同步模型嵌入层大小
注意要先加载预训练MLM权重,再执行这两步,别搞反顺序导致扩展后的参数被覆盖。
- 调用
先解决CPU端的索引错误
GPU上的RuntimeError: CUDA error: device-side assert triggered本质是CPU端索引越界的镜像问题,先在CPU上调试定位:
在计算损失前加个断言:assert (batch["labels"] < model.config.vocab_size).all(), "Found out-of-bounds target IDs"触发断言时直接查看对应样本,就能找到问题出在哪个数据上。
核对官方仓库的CMLM配置细节
翻VarBERT仓库里的CMLM训练脚本(比如run_cmlm.py),确保自己的配置和官方一致:- 是不是用了官方提供的CMLM专用tokenizer文件
- 训练参数里的词汇量配置有没有正确传给模型
- 数据生成脚本是不是正确生成了带CMLM约束标签的数据
内容的提问来源于stack exchange,提问作者user25031131
相关产品推荐
相关产品推荐

