Eval bug: CUDA “unsupported value” in cublasSgemm (mul_mat_cublas) after ~2500 decoded tokens with DSpark speculative decoding (deepseek4, m

这个报错发生在 llama.cpp 使用 DSpark 投机解码( --spec-type draft-dspark )进行长文本生成时,且与解码 token 数量无直接关联,是一个偶发性 CUDA 图捕获/更新问题。优先尝试添加环境变量 GGML_CUDA_DISABLE_GRAPHS=1 作为临

快速结论:这个报错发生在 llama.cpp 使用 DSpark 投机解码(--spec-type draft-dspark)进行长文本生成时,且与解码 token 数量无直接关联,是一个偶发性 CUDA 图捕获/更新问题。优先尝试添加环境变量 GGML_CUDA_DISABLE_GRAPHS=1 作为临时规避,或直接升级到包含 #26574 补丁的版本。

适用环境:llama.cpp(b10242、b10257);DeepSeek-V4-Flash-0731 UD-Q4_K_XL GGUF 模型 + dspark 侧车模型;Linux x86_64;2× Quadro RTX 8000 (48GB) + 3× Tesla V100-PCIE-32GB 多 GPU 配置(-sm layer + --tensor-split);驱动 580.173.02,CUDA runtime 13.0,nvcc 12.0,CMAKE_CUDA_ARCHITECTURES=70;75;K/V cache f16。

最快修复方案:暂无官方已验证的一步修复方案;但根据 Issue 证据,添加环境变量 GGML_CUDA_DISABLE_GRAPHS=1 可优先尝试作为规避手段(作者测试中)。最终确认的修复为 PR #26574(已包含在后续构建中)。

注意事项:--spec-draft-n-max 3 已被证实无法避免崩溃,只能降低频率;崩溃偶发,相同请求重跑可能成功。禁用 CUDA graphs 可能影响性能,但 GGML_CUDA_GRAPH_OPT=1 开启时未复现崩溃。

问题场景

在 llama.cpp 的 llama-server 中启用 DSpark 投机解码(--spec-type draft-dspark)运行 DeepSeek-V4-Flash-0731 模型,进行长思维链(reasoning)回答时触发。用户使用 5 块 GPU(2× Quadro RTX 8000 + 3× Tesla V100)并以 -sm layer 模式拆分模型,同时将草稿模型固定在主模型输出层所在设备(--device-draft CUDA4)。短代码回答(几百 token)不会崩溃。

报错原文

/home/mp/llama.cpp/ggml/src/ggml-cuda/ggml-cuda.cu:106: CUDA error
E CUDA error: an unsupported value or parameter was passed to the function
E   current device: 0, in function ggml_cuda_mul_mat_cublas_impl at /home/mp/llama.cpp/ggml/src/ggml-cuda/ggml-cuda.cu:1541
E   cublasSgemm_v2(ctx.cublas_handle(), CUBLAS_OP_T, CUBLAS_OP_N, ne01, ne11, ne10, (const float *) alpha, (const float *) src0_ptr, s01, (const float *) src1_ptr, s11, (const float *) beta, (float *) dst_ptr, ne0)

崩溃前最后一条服务器日志(第 3 次崩溃):

I slot print_timing: id  0 | task 7 | n_decoded =   2518, tg =  20.42 t/s, tg_3s =  21.22 t/s

原因分析

可能原因:DSpark 投机解码的验证批次(verify-batch)shape 随序列长度增长而变化,导致 CUDA graph 捕获或更新时传入 cuBLAS 的矩阵维度/步长(ld)出现非法值(为 0 或低于 cuBLAS 最小值)。Decode 路径中出现 FP32 GEMM(cublasSgemm_v2)本身可疑,可能与 DSpark markov head 产生的退化 shape 有关。确认该问题与已解码 token 数量无直接关联——第 4 次崩溃在长提示(26,695 tokens)处理完成后仅解码 180 tokens 就触发;崩溃为偶发性,相同请求立即重跑可正常完成。

环境排查

  • llama.cpp 构建版本:b10242、b10257(均复现)
  • GPU:2× Quadro RTX 8000(Turing, arch 75)+ 3× Tesla V100(Volta, arch 70),多 GPU 层拆分
  • 驱动与 CUDA:驱动 580.173.02,CUDA runtime 13.0,nvcc 12.0,CMAKE_CUDA_ARCHITECTURES=70;75
  • 模型:DeepSeek-V4-Flash-0731 UD-Q4_K_XL(5 个 split 文件)+ dspark-DeepSeek-V4-Flash-0731-Q8_0.gguf 侧车
  • 启动参数:--spec-type draft-dspark --spec-draft-n-max 5-c 137728,K/V cache f16,--flash-attn on
  • 对比基线:Qwen MTP(--spec-type draft-mtp)同机同配置从未崩溃

解决步骤

  1. 升级/打补丁(确认有效):拉取 PR #26574 的分支(或包含该补丁的后续发布版)重新编译。作者在修复分支上运行长时间测试(含 GGML_CUDA_GRAPH_OPT=1 和并发 slot),原始崩溃硬件上不再出现 cublasSgemm_v2 中止。
  2. 临时规避(可优先尝试):在启动 llama-server 前设置环境变量 GGML_CUDA_DISABLE_GRAPHS=1,禁用 CUDA graphs 后作为过渡方案测试是否避免崩溃。此方案在 Issue 讨论中作为候选规避措施提出,但作者未明确回传测试结果。
  3. 已验证无效的方案:--spec-draft-n-max 从 5 降为 3 —— 仅降低崩溃频率,无法避免(第 4 次崩溃即发生在 n-max 3 时)。
  4. 对比验证(确认非 DSpark 本身问题):如条件允许,使用 Qwen MTP(--spec-type draft-mtp)长时间运行,确认同机同配置不触发此崩溃。

验证方法

使用原始崩溃配置(长思维链请求,多 GPU 层拆分,DSpark 投机解码)连续生成长回答;确认不再出现 ggml-cuda.cu:106 CUDA error / cublasSgemm_v2 / unsupported value 中止。可参考 PR #26574 评论中的测试方法:在原始崩溃硬件上开启 GGML_CUDA_GRAPH_OPT=1 并启用并发 slot 进行长时间压测。

参考来源

ggml-org/llama.cpp #26554
修复 PR:ggml-org/llama.cpp #26574

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19309

发表回复

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