Eval bug: llama-server hard crash (cublasSgemm INVALID_VALUE) with –spec-type draft-mtp under KV-cache saturation

llama-server 在使用 --spec-type draft-mtp 且 KV cache 长期饱和时,会发生 cuBLAS 流指针损坏导致的硬崩溃(非优雅的上下文超限返回)。优先排查 MTP 双上下文路径中的主机端内存越界或悬垂指针问题,而不是 KV 容量配置。

快速结论:llama-server 在使用 --spec-type draft-mtp 且 KV cache 长期饱和时,会发生 cuBLAS 流指针损坏导致的硬崩溃(非优雅的上下文超限返回)。优先排查 MTP 双上下文路径中的主机端内存越界或悬垂指针问题,而不是 KV 容量配置。

适用环境:llama.cpp version 3645 (commit 6c8dcaa7ae);Linux Ubuntu 24.04;NVIDIA RTX 4090(24GB);驱动 595.84;CUDA 13.2;GGML CUDA 后端,CMAKE_CUDA_ARCHITECTURES=89;模型 unsloth/Qwen3.5-0.8B-MTP-GGUF(Q4_K_XL,含 MTP/NextN 头)。

最快修复方案:暂无确认的一步修复方案。Issue 确认 LLAMA_GRAPH_REUSE_DISABLE=1 与在 MTP::process() 中插入 llama_synchronize(ctx_tgt) 均不能避免崩溃,只能按服务器减速比例推迟崩溃时间。

注意事项:该崩溃为 GPU API 硬中止(GGML_ABORT),不是正常的 “context size exceeded” 返回;崩溃点稳定在 layer-0 线性注意力 ssm_alpha 投影的首次 F32 cuBLAS GEMM,且参数在 cuBLAS 校验层面完全合法,指向确定性内存损坏而非时序竞争。

问题场景

llama-server 以 --spec-type draft-mtp 运行 Qwen3.5 统一解码器模型(含 MTP/NextN 头),在多个并发 /completion 请求长期压满 KV cache 时(日志中持续出现 failed to find free space in the KV cache, retrying with smaller batch sizeContext size has been exceeded),服务器硬崩溃。不加 --spec-type 时同负载不崩溃,可确认问题局限在 MTP 双上下文路径。

报错原文

Eval bug: llama-server hard crash (cublasSgemm INVALID_VALUE) with --spec-type draft-mtp under KV-cache saturation

GEMM-FAIL: status=7 src0="blk.0.ssm_alpha.weight"(0) ne00=1024 ne01=16 nb00=4 nb01=4096
           src1="attn_norm-0"(0) ne10=1024 ne11=16 nb10=4 nb11=4096
           dst="node_43" ne0=16 | s01=1024 s11=1024 ne0=16
           align0=0 align1=0 alignD=0 src0_ptr=0x7f0900d64100 src1_ptr=0x7f0934018300 dst_ptr=0x7f09340c8300
           
cublasSgemm_v2 → CUDA_ERROR_INVALID_VALUE → GGML_ABORT

原因分析

崩溃机制已定位到 CUDA 流指针损坏:在崩溃点探测显示 cudaPeekAtLastError() 返回 0(无前置内核错误)、cublasGetStream() 返回成功(cuBLAS handle 结构本身完好),但 handle 中保存的流指针是主机进程堆地址(如 0x624c1f0e6fc0),而非正常的 CUDA driver 流句柄(该系统上为 0x7f... 范围)。cuBLAS 在无效流上启动 GEMM 导致 cudaErrorInvalidValue。可能原因:MTP 目标上下文与草稿上下文使用独立 CUDA 流、共享显存分配器时发生主机端缓冲区溢出或 use-after-free,确定性损坏了流指针。此问题自 MTP 代码合并以来一直存在,并非 KV 容量配置错误。

环境排查

  • 确认 llama.cpp 版本及 commit:version 3645 (6c8dcaa7ae)
  • 确认 CUDA 构建参数:CMAKE_BUILD_TYPE=ReleaseGGML_CUDA=ONCMAKE_CUDA_ARCHITECTURES=89
  • 确认 GPU、驱动、CUDA 版本:RTX 4090 (24GB)、driver 595.84、CUDA 13.2
  • 确认操作系统:Linux Ubuntu 24.04 (kernel 7.0.0-28-generic)
  • 确认模型文件:Qwen3.5-0.8B-UD-Q4_K_XL.gguf(unified decoder 架构,含 nextn 块)

解决步骤

  1. 考虑暂时规避:不使用 --spec-type draft-mtp 运行同负载(Issue 确认无此参数不崩溃)。
  2. 若必须使用 MTP,可优先尝试减少并发请求数或增大 -c 上下文,降低 KV 饱和频率,但这只能推迟崩溃而非根治。
  3. 已知无效方案,无需重复测试:LLAMA_GRAPH_REUSE_DISABLE=1(延迟至 ~51 分钟崩溃);在 common/speculative.cpp:1450 MTP process()llama_get_embeddings_nextn 前插入 llama_synchronize(ctx_tgt)(延迟至 ~57 分钟崩溃)。
  4. 若需临时定位,可尝试 ASAN 构建复现(Issue 中 ASAN 构建同样崩溃在相同失败 op)。

验证方法

以 Issue 中的稳定复现方式(-c 1024 -np 4 --kv-unified + 10 并发 soak 客户端)运行约 20-25 分钟。若不再出现 GEMM-FAIL: status=7GGML_ABORT,且日志中上下文超限时能优雅返回 decode() == 1,则可判定问题已解决。修复前可用崩溃点探测确认流指针为 0x7f... 正常驱动句柄。

参考来源

ggml-org/llama.cpp #26558

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21319

发表回复

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