Eval bug: Qwen 3.5 Loading checkpoints causes a crash

该报错通常出现在 llama.cpp 的 llama-server 以 HIP 后端、多 GPU 运行 Qwen3.5 系(如 Qwen3.5-35B-A3B)模型并启用 context checkpoint( --ctx-checkpoints )后,加载或匹配检查点时触发 GPU 内存访问故障。

快速结论:该报错通常出现在 llama.cpp 的 llama-server 以 HIP 后端、多 GPU 运行 Qwen3.5 系(如 Qwen3.5-35B-A3B)模型并启用 context checkpoint(--ctx-checkpoints)后,加载或匹配检查点时触发 GPU 内存访问故障。优先排查 context checkpoint 机制与 HIP 多卡拆分组合,最直接的规避方向是禁用 context checkpoints。

适用环境:Linux;HIP/ROCm(原帖为 CDNA 架构如 MI100,另有社区在 2× MI50 gfx906、ROCm 7.2.4 下复现);双 GPU 及以上;模型为 Qwen3.5-35B-A3B-UD-Q6_K_XL.gguf(qwen35moe 混合架构)。原帖未给出 Python、PyTorch、CUDA 版本。

最快修复方案:暂无确认的一步修复方案。已有复现者报告设置 --ctx-checkpoints 0 后可持续运行数周不再出现该 fault,可作为规避选项(该配置并非上游确认的正式修复)。

注意事项:禁用 context checkpoint 对混合循环模型影响较大:社区实测在“同 prompt 追加 512 token”的续写场景下,开启检查点时仅需重新预处理 516 token、prefill 约 0.75 s;关闭后需重跑全部 8954 token、prefill 约 7.44 s。此外原帖作者在单卡或 --device ROCm0,ROCm0 下未能复现,说明该问题与真实多卡环境相关;根因尚未定位。

问题场景

用户使用 llama.cpp 的 llama-server 以 -ngl 99 -fa 1 加载 Qwen3.5-35B-A3B 模型,配合 --ctx-checkpoints 128 --checkpoint-every-n-tokens 4096、-np 2、-ub 2048 -c 48000 等参数,在两块 AMD GPU(HIP/CDNA)上运行。当服务在后续请求中根据 LCP 相似度复用 slot、创建并匹配上下文检查点时(日志中 Checking checkpoint with [4052, 4052] against 4560...),进程发生 GPU 内存访问故障崩溃。报告者指出自 PR #20087 合入后问题被暴露,并提供了 requesttest.py 复现脚本。

报错原文

slot update_slots: id  0 | task 111 | Checking checkpoint with [4052, 4052] against 4560...
Memory access fault by GPU node-4 (Agent handle: 0x55aa5dbd9e30) on address 0x7f6615a2a000. Reason: Page not present or supervisor privilege.

社区在 2× MI50 上复现到同类报错:

Memory access fault by GPU node-1 (Agent handle: 0x...) on address 0x... Reason: Page not present or supervisor privilege.

原因分析

目前根因未确定。可确认的事实与线索如下:

  • 崩溃发生在检查点匹配/加载阶段,因此问题与 context checkpoint 数据在 HIP 多卡环境下的读写有关(可能原因,尚未证实)。
  • 原帖作者排除了与 Issue #20433 的关联:回退对应 commit 后问题依旧。PR #20087 更可能是暴露该问题,而非引入。
  • 仅在真实多卡环境出现;作者在单卡及 --device ROCm0,ROCm0 下均无法复现,Mac 上用虚拟设备模拟也未复现,倾向为 HIP 特有的行为,但评论者认为也可能是 llama.cpp 代码中的缺陷被 HIP 路径触发。
  • 调试手段受限:rocgdb 未能定位问题;ROCm asan 需要 xnack+,作者的 MI100 机器内混有 gfx1100 GPU 而无条件启用,且 asan 仅限 CDNA Instinct 显卡。
  • 有社区报告 Windows 下 HIP + CUDA 混用加载 3.5 397B 时,创建 context checkpoint 也会冻结,但该报告与本案是否为同一问题尚未确认。

环境排查

  • 确认是否确实使用多块 AMD GPU 运行,且是否使用 --split-mode layer(有复现者指出 -sm tensor 会段错误,-sm layer 正常)。
  • 确认 llama.cpp 构建版本与后端(HIP/ROCm 版本、是否为社区构建如 gfx906 分支)。
  • 确认是否启用了 context checkpoint:--ctx-checkpoints、--checkpoint-every-n-tokens。
  • 确认模型名称与量化格式(Qwen3.5 系 qwen35moe 混合架构)。
  • 原帖未提供 Python、PyTorch、CUDA 版本,这些项目无法据此排查。
  • 可参考复现命令,逐项核对:./bin/llama-server -ngl 99 -fa 1 -m Qwen3.5-35B-A3B-UD-Q6_K_XL.gguf -c 48000 -np 2 -sps 0.3 -cram 65536 --port 8080 -ub 2048 --ctx-checkpoints 128 --checkpoint-every-n-tokens 4096。报告者强调其中每个参数都很关键,改动任一参数都可能无法用复现脚本触发(但正常使用中大多数时候仍会失败)。

解决步骤

  1. 若需要先恢复可用服务,可优先尝试在启动参数中加入 --ctx-checkpoints 0 关闭 context checkpoint。社区复现者表示该配置下已连续运行数周未再出现 fault,可直接绕开崩溃路径。
  2. 评估关闭检查点的性能代价:在混合循环模型上,检查点是目前唯一有效的 prompt 复用手段。续写测试中关闭后需重新 prefill 全部 8954 token(约 7.44 s),开启时仅需 516 token(约 0.75 s)。对长上下文服务,可同时设置 --cache-ram 0 观察缓存行为是否变化,但这不改变检查点被关闭的事实。
  3. 用 Issue 提供的 requesttest.py 与上述 llama-server 命令做最小复现前,先记录可稳定触发的参数组合,作为后续验证对照。
  4. 如具备多卡 AMD 环境,可向 Issue 反馈硬件(7900XTX、MI50 等)与复现结果,协助上游定位;注意只有 CDNA 架构可运行 ROCm asan。
  5. 关注该 Issue 上游进展;截至目前没有确认的代码级修复方案。

验证方法

以相同请求脚本和相同 llama-server 参数连续发起多轮对话,观察日志中是否仍出现 Checking checkpoint with [..., ...] against ... 后紧跟 Memory access fault by GPU node-...。若使用 --ctx-checkpoints 0 后数周内不再出现 fault,可视为规避成功,但这不代表根因已修复。

参考来源

ggml-org/llama.cpp #20176

相关讨论中提及的其他 Issue 与资源:#20433、#22351、PR #20087、requesttest.py 复现脚本

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29432

发表回复

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