Eval bug: Qwen3-Embedding model crashes on startup with GGML_ASSERT(block_num_y % num_subgroups == 0) failed.

用户使用 llama-server 加载 Qwen3-Embedding GGUF 模型(0.6B-Q8_0 或 4B-Q4_K_M),启动进程中触发断言失败。涉及 Intel Arc 系列显卡(B70 / B570),编译工具链为 IntelLLVM 2026.0.0,GGML backend 为

Eval bug: Qwen3-Embedding model crashes on startup with GGML_ASSERT(block_num_y % num_subgroups == 0) failed.

Eval bug: Qwen3-Embedding model crashes on startup with GGML_ASSERT(block_num_y % num_subgroups == 0) failed.

快速结论:该报错在启动 Qwen3-Embedding GGUF 模型(尤其是 Q8_0 或 Q4_K_M 量化格式)时出现,优先排查 GGML_SYCL 后端下的多列矩阵-向量乘法函数(reorder_mul_mat_vec_*_sycl)的线程块对齐问题。关闭 SYCL 优化(GGML_SYCL_DISABLE_OPT=1)可临时绕过。

问题场景

用户使用 llama-server 加载 Qwen3-Embedding GGUF 模型(0.6B-Q8_0 或 4B-Q4_K_M),启动进程中触发断言失败。涉及 Intel Arc 系列显卡(B70 / B570),编译工具链为 IntelLLVM 2026.0.0,GGML backend 为 SYCL。该问题同时影响 reorder_mul_mat_vec_q4_0_q8_1_syclreorder_mul_mat_vec_q8_0_q8_1_syclreorder_mul_mat_vec_q3_k_q8_1_syclreorder_mul_mat_vec_q4_k_q8_1_syclreorder_mul_mat_vec_q5_k_q8_1_syclreorder_mul_mat_vec_q6_k_q8_1_sycl 这六个函数。

报错原文

GGML_ASSERT(block_num_y % num_subgroups == 0) failed
/home/rich/builds/llama.cpp/ggml/src/ggml-sycl/mmvq.cpp:1106: GGML_ASSERT(block_num_y % num_subgroups == 0) failed

原因分析

问题根因在于 SYCL 后端中多列矩阵-向量乘法函数的线程块数量(block_num_y)不是子组数量(num_subgroups)的整数倍,导致 GPU 工作组分配时断言失败。PR #22035 曾尝试修复该问题,但未能覆盖所有六个多列函数,且修复方式可能与运行时子组大小(WARP_SIZE)不一致。Issue 中 AI 分析建议将 block_num_y 的计算方式改为向上取整并与 num_subgroups 相乘,但该方案未经社区正式合并。

此外,用户测试显示设置环境变量 GGML_SYCL_DISABLE_OPT=1 可以绕过该断言,表明优化路径中可能存在额外的未对齐分支。

环境排查

  • llama.cpp 版本:确认当前版本是否为 commit 8f83d6c27(version 9562)或 d6d0ce821(version 9581),及构建时间是否晚于 2026-06-22。
  • Intel 编译器版本:IntelLLVM 2026.0.0
  • GPU 型号:Intel Arc Pro B70 / B570
  • GGML backend 配置:CMake 编译时是否启用 GGML_SYCL=ONGGML_SYCL_F16=ON
  • 量化格式:Q8_0 或 Q4_K_M(已验证触发)

解决步骤

  1. 可优先尝试:在启动命令前设置环境变量 export GGML_SYCL_DISABLE_OPT=1 以禁用 SYCL 优化路径,临时绕过断言。
  2. 若问题依然存在,建议升级至最新 master 分支(至少 >= commit d6d0ce821),并尝试重新构建:
    cmake .. -DGGML_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
  3. 若要彻底修复,需修改 ggml/src/ggml-sycl/mmvq.cpp 中六个 reorder_mul_mat_vec_*_sycl 函数,将 block_num_y 循环上界改为:
    constexpr size_t num_subgroups = WARP_SIZE;
    const int block_num_y = ceil_div(nrows, GGML_SYCL_MMV_Y * (int)num_subgroups) * (int)num_subgroups;

    然后重新编译。

验证方法

启动 llama-server 并加载相同的 Qwen3-Embedding 模型,观察日志中不再出现 GGML_ASSERT(block_num_y % num_subgroups == 0) failed 且模型成功加载到 GPU 端(日志中应显示已使用 -ngl 99)。使用 --embedding 模式并发送测试 embedding 请求确认推理正常。

参考来源

ggml-org/llama.cpp #24304

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9616

发表回复

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