RuntimeError: CUDA error: CUBLAS_STATUS_INTERNAL_ERROR when calling `cublasGemmEx( handle, opa, opb, m, n, k, &falpha, a, CUDA_R_16BF, lda, b, CUDA_R_16BF, ldb, &fbeta, c, CUDA_R_16BF, ldc, comp

该报错通常发生在使用 TRL 的 SFTTrainer 微调 Gemma3N 模型并添加新的特殊 token 时。优先排查 model.resize_token_embeddings() 的调用方式以及 Gemma3N 的模型结构是否支持 embedding 调整。

快速结论:该报错通常发生在使用 TRL 的 SFTTrainer 微调 Gemma3N 模型并添加新的特殊 token 时。优先排查 model.resize_token_embeddings() 的调用方式以及 Gemma3N 的模型结构是否支持 embedding 调整。

适用环境:transformers==4.54.1、Python 3.13、PyTorch 2.7.1+cu126、NVIDIA H100 80GB、TRL 0.19.1、PEFT(LoRA),模型为 google/gemma-3n-E2B-itgoogle/gemma-3n-E4B-it

最快修复方案:暂无确认的一步修复方案。Issue 中提到维护者已确认 Gemma3N 代码在处理 embedding resize 时存在问题,并计划提交 PR 修复。在使用 Gemma3nForCausalLM 时,请勿将 resize_token_embeddings()Gemma3nForConditionalGeneration 混用,并确认通过 model.language_model.resize_token_embeddings() 调用。

注意事项:该问题在 Gemma3N 的文本模型和视觉-语言模型上均可能触发;修复后仍需验证新增特殊 token 是否真正生效。

问题场景

用户在 TRL SFTTrainer 中微调 Google 的 gemma-3n-E2B-it(文本模型)和 gemma-3n-E4B-it(多模态模型)时,尝试通过 Gemma3nForCausalLM / Gemma3nForConditionalGeneration 加载模型,使用 AutoTokenizer 添加 <special1><special2> 或自定义 ChatML 工具调用 token,并调用 resize_token_embeddings() 后触发 CUDA 错误,导致训练中断。

报错原文

RuntimeError: CUDA error: CUBLAS_STATUS_INTERNAL_ERROR when calling `cublasGemmEx( handle, opa, opb, m, n, k, &falpha, a, CUDA_R_16BF, lda, b, CUDA_R_16BF, ldb, &fbeta, c, CUDA_R_16BF, ldc, comp

原因分析

可能原因:Gemma3N 模型类在考虑其多模态或特殊结构(可能包含独立的多模态投影层或文本/视觉分支)时,resize_token_embeddings() 的实现没有正确处理 embedding 的 resize,导致 embedding 与 lm_head 或投影层维度不一致。调整 embedding 后产生的非法内存访问或矩阵运算维度不匹配,触发了底层 cuBLAS 错误。

环境排查

  • 确认 transformers 版本是否为 4.54.1 或更新(修复版本可能尚未发布)。
  • 确认 PyTorch 版本为 2.7.1+cu126,CUDA 版本为 12.x 或相应兼容版本。
  • 确认识别到 GPU(NVIDIA H100),驱动及 CUDA 工具包已正确安装。
  • 检查 TRL、PEFT、Accelerate 版本与 transformers 是否兼容。
  • 核实加载的是文本模型(Gemma3nForCausalLM)还是视觉-语言模型(Gemma3nForConditionalGeneration),两者的 embedding 处理路径可能不同。

解决步骤

  1. 尝试将 model.resize_token_embeddings(len(tokenizer)) 改为 model.language_model.resize_token_embeddings(len(tokenizer)),确保 resize 的是实际的文本 embedding 层。
  2. 避免在同一个脚本中同时导入并混用 Gemma3nForCausalLMGemma3nForConditionalGeneration,仅选择与意图相符的模型类。
  3. 在训练前检查维度一致性:打印 model.get_input_embeddings().weight.shapelen(tokenizer),确认两者相等。
  4. 若问题依旧,请尝试将 attn_implementation 设为 'eager'(已如此操作)并临时移除去 device_map='cuda',改为手动 .to('cuda') 以排除加载时的映射问题。
  5. 若使用 PEFT LoRA,确保 modules_to_save 中包含了 embed_tokenslm_head,否则在训练中这些层可能不会被正确更新。
  6. 可优先尝试更新至 transformers 的最新 GitHub 主分支或等待包含修复的正式发布版本,因为 Issue 中维护者已确认代码存在缺陷并计划提交 PR。

验证方法

在模型加载和 embedding resize 后,执行一次前向传播(不训练),观察是否还抛出 CUDA 错误;随后运行一个极短的训练步骤(例如 max_steps=1),确认训练 loss 正常下降且无 CUBLAS 报错。同时,验证新增的特殊 token 是否成功被嵌入且模型能正常识别它们。

参考来源

huggingface/transformers #39921

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21581

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注