You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复现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时,这两步必须做对:

    1. 调用tokenizer.add_tokens()添加CMLM所需的特殊变异token
    2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:22:44