Eval bug: SYCL garbage on the second prompt.

该报错在 llama.cpp 的 SYCL 后端下,发送第二个 prompt 时触发,表现为输出乱码。核心诱因是模型权重中包含大量 Q2_K 量化张量,它们在特定 batch 大小下触发了 SYCL 的 reorder 路径缺陷,可优先尝试通过设置环境变量 GGML_SYCL_ENABLE_OPT=

快速结论:该报错在 llama.cpp 的 SYCL 后端下,发送第二个 prompt 时触发,表现为输出乱码。核心诱因是模型权重中包含大量 Q2_K 量化张量,它们在特定 batch 大小下触发了 SYCL 的 reorder 路径缺陷,可优先尝试通过设置环境变量 GGML_SYCL_ENABLE_OPT=0 绕过。

适用环境:llama.cpp(版本 b10450 附近,SYCL 后端);操作系统:Linux;硬件:Intel Arc Pro B60/B70 显卡;工具链:IntelLLVM 2026.1.0;模型:KAT-Coder-V2.5-Dev-Cerebellum-GGUF(含 78.5% Q2_K 张量)及 muse-glimmer-30b(CUDA 后端亦有复现报告)。

最快修复方案:暂无确认的代码修复,但 Issue 中验证有效的临时方案为设置环境变量 GGML_SYCL_ENABLE_OPT=0 后重启服务。

注意事项:该方案会关闭 SYCL 优化路径,可能影响推理性能(例如 Issue 中纯 Q3_K 模型从 29 tok/s 降至 6.28 tok/s);此问题是已知缺陷,开发者已确认短期内不会修复。

问题场景

用户在 Linux 下使用 llama.cpp 的 SYCL 后端(Intel Arc Pro B60 显卡)启动 llama-server,加载混合量化模型 KAT-Coder-V2.5-Dev-Cerebellum-GGUF 后,第一次请求正常,第二次及后续请求全部返回噪声乱码。同样的模型通过 Vulkan 后端或纯 CPU 运行时表现正常。

报错原文

Eval bug: SYCL garbage on the second prompt.
req 0  chars=1264  frac_alpha=0.729  COHERENT
req 1  chars= 300  frac_alpha=0.000  NOISE   '//////...'
req 2..5                             NOISE

原因分析

社区开发者在 Issue 中定位到的根本原因:Q2_K 量化类型在 SYCL reorder 路径上的缺陷。核心证据如下:

  • 该模型的张量表按元素数统计,由 78.5% Q2_K、17.0% Q3_K、2.9% Q6_K 等构成,且 Q2_K 是 DMMV(单 token 路径)支持 reorder、但 MMVQ 不支持 reorder 的唯一类型。
  • 触发条件依赖 should_reorder_tensor() 的判断逻辑(dst->src[1]->ne[1] <= 8),即只有在 batch size 小于等于 8 时才会重排权重布局,且该重排是“就地”完成的——第一次请求发生时重排尚未生效,从第二次请求开始,Q2_K kernel 就会读取已被重排变形的数据,且无法自行恢复。
  • 纯 Q2_K 单类型模型的对照实验中,开启 reorder 时 3 次推理全部输出噪声,关闭 reorder 时 3 次全部正常;纯 Q3_K 模型则在开关 reorder 下均正常工作,证明问题与 Q2_K 强相关。

环境排查

  • 确认 llama.cpp 构建版本(Issue 复现于 b10450,官方容器 ghcr.io/ggml-org/llama.cpp:server-intel-b10450);
  • 确认 oneAPI 环境变量:ONEAPI_DEVICE_SELECTOR=level_zero:0ZES_ENABLE_SYSMAN=1
  • 确认工具链版本为 IntelLLVM 2026.1.0(Linux x86_64);
  • 检查模型的量化构成(优先排查是否含大量 Q2_K 张量);
  • 注意:该问题在 CUDA 后端(muse-glimmer-30b 模型)也有报告,需一并排查;
  • 确认纯 CPU 或 Vulkan 后端是否正常(用于排除模型本身损坏的可能性)。

解决步骤

  1. 在启动脚本或 shell 会话中设置环境变量:export GGML_SYCL_ENABLE_OPT=0
  2. 重启 llama-server,重新加载模型;
  3. 如果关闭优化后性能损失不可接受,可考虑将模型中的 Q2_K 张量重新量化为 Q3_K:使用 llama-quantize --allow-requantize --pure 生成纯 Q3_K 模型(但需注意 requantization 的精度损失);
  4. 或者换用 Vulkan 后端运行同一模型(Issue 验证 Vulkan 无 SYCL reorder 路径,输出正常);
  5. 跟踪上游 Issue(参考来源链接),等待官方修复;Issue 评论中开发者已明确“won’t be fixed in short time”。

验证方法

设置 GGML_SYCL_ENABLE_OPT=0 后,连续发送至少 3 个独立的 prompt 请求,检查第二个及后续响应是否恢复为可读文本(不再是 ////// 之类的噪声字符)。也可使用 Issue 中提供的量化开关对照实验思路,用单类型模型(纯 Q2_K vs 纯 Q3_K)对比 reorder 开启和关闭时的输出一致性。

参考来源

ggml-org/llama.cpp #26845

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 22328

发表回复

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