Deterministic prefill crash at a fixed token position on qwen4exp (Qwen3.8-Flash-Next) under multi-GPU layer split — 4 runtimes, FA on/off,

该问题出现在 llama.cpp / LM Studio 的 CUDA runtime 对 qwen4exp(Qwen3.8-Flash-Next)模型做长上下文 prefill 时,multi-GPU layer split( --split-mode layer )下会在固定 token 位置确

快速结论:该问题出现在 llama.cpp / LM Studio 的 CUDA runtime 对 qwen4exp(Qwen3.8-Flash-Next)模型做长上下文 prefill 时,multi-GPU layer split(--split-mode layer)下会在固定 token 位置确定性崩溃;优先排查 sparse indexer / PLE gather 等按绝对 token 位置推导 kernel launch 配置的路径,而不是先怀疑 Flash Attention 或 CUDA graphs 开关。

适用环境:Windows 11;llama.cpp CUDA backend(LM Studio 内嵌 llama-server);受影响 runtime 包括 2.33.0=b10760、2.42.0=b11087、2.45.0=b11163、2.46.0=b11189;硬件为 7x Volta sm_70(Quadro GV100 + 6x Tesla V100 32GB),driver 582.78,CUDA 12.4;模型为 Qwen3.8-Flash-Next-Uncensored Q8_0 GGUF。Issue 明确说明未启用 P2P(GGML_CUDA_P2P 未设置)。

最快修复方案:暂无确认的一步修复方案。Issue 曾认为 PR #29803(commit ec7630a)已修复,但作者在包含该 commit 的 LM Studio runtime 2.51.0 上重新测试,同一 prompt 仍在同一 token(7633,progress 0.39)确定性崩溃。

注意事项:崩溃与量化无关(Q8_0 与 Q6_K 死在完全相同的 token 7633),且内容相关(同 session 下 18K 与 138K token 的新鲜 prefill 都能正常越过 7633)。Issue 目前仍标记为 bug-unconfirmed,作者提出的 indexer / PLE gather 位置边界假设属于推测方向,尚未被官方确认。

问题场景

用户在 Windows 11 上,通过 LM Studio 内嵌的 llama.cpp CUDA llama-server 运行 Qwen3.8-Flash-Next-Uncensored Q8_0 GGUF(约 176 GB),使用 multi-GPU layer split 配置:7 路 --split-mode layer、--main-gpu 0、--parallel 1、--ubatch-size 384、ctx 260096、KV f16、kv-unified off。

复现场景有两类:

  • Session A(约 65–72K token 的 prompt):prefill 进行到约 1/3(n_tokens 约 21732~23780,progress 0.33)时确定性崩溃,4/4 复现。
  • Session B(约 19.6K token 的 prompt):prefill 进行到约 39%(n_tokens = 7633,progress 0.39)时确定性崩溃,9/9 复现,覆盖不同 runtime、Flash Attention on/off、CUDA graphs enabled/disabled、CUDA_MODULE_LOADING=EAGER 有无。

崩溃在 Flash Attention 开与关、CUDA graphs 开与关下都能复现,因此不是 FA 或非 FA kernel 路径特有的问题,也与 CUDA graphs 无关。

报错原文

CUDA error: invalid argument
  current device: 0, in function ggml_cuda_kernel_launch at ggml/src/ggml-cuda/common.cuh:1707
illegal memory access
  (at cudaStreamSynchronize, ggml-cuda.cu:2547)
# 位置随 runtime 不同略有差异:
invalid argument @ ggml_cuda_kernel_launch (common.cuh:1676)
invalid argument @ launch (common.cuh:1707)
invalid argument @ launch (common.cuh:1716)

Windows WER Application Error 事件确认 faulting module 路径包含 cuda-avx2-<runtime version>(例如 cuda-avx2-2.51.0),exitCode=0xC0000409 fail-fast,因此不是陈旧进程残留。

原因分析

目前没有官方确认的根因。根据 Issue 中的证据,可以排除/弱化的方向包括:

  • 不是 Flash Attention 配置表问题:原报告和修复后复测都在 FA on/off 两种模式下崩溃,与 PR #29803 改动的 fattn-mma-f16.cuh head-dim 320/256 config 及 fattn.cu 的 gqa_ratio 路由无关。
  • 不是量化 / 精度问题:Q8_0 与 Q6_K 在同一 prompt 的同一 token(7633)崩溃,说明更像是 shape 依赖的 kernel launch 配置问题,而非数据或精度问题。
  • 不是 ubatch 边界:batch=2048 时边界在 2048/4096/6144,崩溃总发生在 progress 日志打印 n_tokens=7633 之后的下一步。

作者提出的可能原因(尚未确认):Qwen3.8-Flash-Next 使用 QSA head_dim=256 加 sparse indexer(top_k 2048),崩溃点的固定 token 位置与内容相关性指向 indexer / sparse-attention 路径中按绝对 token 位置推导 launch 配置的逻辑,例如 indexer 的 K-block 或 PLE gather 在某个位置边界(约 7633)越界,导致 kernel launch 参数不合法。

环境排查

  • 确认 LM Studio / llama.cpp CUDA runtime 版本(b 号或 commit),例如 2.33.0=b10760、2.42.0=b11087、2.45.0=b11163、2.46.0=b11189;注意 #29803 对应 commit ec7630a 已包含在 LM Studio 2.51.0(llama-server 自报 commit 1fb7ef3e3)。
  • 确认 CUDA runtime 版本与 driver 版本(Issue 环境为 CUDA 12.4、driver 582.78)。
  • 确认 GPU 型号与数量、是否 sm_70(Issue 为 7x Volta:1x Quadro GV100 + 6x Tesla V100 32GB)。
  • 确认是否设置 GGML_CUDA_P2P(Issue 未启用 peer access)。
  • 确认启动参数:--split-mode layer、--main-gpu 0、--parallel 1、--ubatch-size、--ctx-size、KV cache 类型、--kv-unified 状态。
  • 确认模型与量化类型(Q8_0、Q6_K 均已复现),以及 GGUF 头部架构元数据:blocks、attention heads / kv heads、head_dim、sparse indexer top_k、experts/top-k。
  • 确认 Flash Attention 与 CUDA graphs 的开关状态(本 Issue 中两种状态均可复现)。
  • 确认是否设置了 CUDA_MODULE_LOADING=EAGER(本 Issue 中设置与否均可复现)。
  • 确认是否启用 CUDA_LAUNCH_BLOCKING=1(Issue 建议在 debug build 上开启以定位失败 kernel)。

解决步骤

  1. 先确认你的 runtime 是否已包含 PR #29803(commit ec7630a)。若尚未包含,可优先尝试升级到包含该 commit 的构建;但请注意该修复在本 Issue 的复现环境中被证明未能解决此特定签名。
  2. 如果你使用的是 --split-mode layer 的多 GPU 配置,可优先尝试以下对照实验来缩小范围(Issue 中尚未逐一验证这些是否绕过崩溃):
    • 切换到 --split-mode row,观察崩溃点是否移动或消失。
    • 改用单 GPU(--main-gpu 指定单一设备,不参与 layer split)跑同一 prompt,确认是否仍崩。
    • 调整 --ubatch-size(Issue 中 ubatch 256/384/512 均复现,可作为排除项)。
    • 使用与崩溃 prompt 不同的内容(Issue 中 18K 与 138K 的新鲜 prefill 均能正常越过 token 7633),确认是否为内容相关性触发。
  3. 在 debug build 上启用 CUDA_LAUNCH_BLOCKING=1,并让构建在 common.cuh:1707(或对应版本行号)处 dump 失败 kernel 的名称与 grid/block 维度,以定位是哪个 kernel 的 launch 参数不合法。
  4. 收集 Windows 事件日志中 WER Application Error 事件的 faulting module 路径(确认包含 cuda-avx2-<version>)与 exitCode(0xC0000409)。
  5. 在 原 Issue 中附上放大的最小复现(相同 prompt、相同 token 位置、相同 runtime commit、相同启动参数),以便维护者定位 indexer / PLE gather 路径的位置边界。

验证方法

  • 使用同一 prompt、同一 batch / ubatch / ctx / split 配置,重复运行 prefill,确认是否仍固定死在 n_tokens=7633(或 Session A 的 progress 0.33 位置)。
  • 在同一 runtime 上换一个内容不同的 prompt(例如 Issue 中 18K、138K 的新鲜 prefill),确认其能正常越过崩溃点并完成 prefill 与首轮 decode。
  • 对同一模型分别用 Q8_0 与 Q6_K 复测,确认崩溃点是否随量化改变;若仍在同一 token 位置,则支持 shape 依赖的 launch 配置假设。
  • 在多轮 agent 流量下测试高 prefix-cache reuse(f_keep 约 0.96~0.99)的 partial-reuse prefill,确认是否仍出现 invalid argument @ ggml_cuda_kernel_launch (common.cuh:1707) 并 fail-fast。
  • 若维护者发布了针对 indexer / sparse-attention launch 路径的修复 commit,需在包含该 commit 的 runtime 上用上述确定性 prompt 重新复测,确认崩溃点消失。

参考来源

ggml-org/llama.cpp #29562

ggml-org/llama.cpp PR #29803(曾被标记为修复,但复测未通过)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 27358

发表回复

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