Eval bug: SIGSEGV running DS4F on Intel B70 (Missing SYCL f16 Conversion)

此报错发生在 llama.cpp 使用 SYCL 后端(Intel Arc Pro B70)运行 DeepSeek-V4-Flash 模型时,首次推理即崩溃,根因是 set_rows 算子缺少 F16 半精度类型转换,导致 SYCL 设备指针被 CPU 后端当作主机地址解引用。优先排查你是否使用了包

快速结论:此报错发生在 llama.cpp 使用 SYCL 后端(Intel Arc Pro B70)运行 DeepSeek-V4-Flash 模型时,首次推理即崩溃,根因是 set_rows 算子缺少 F16 半精度类型转换,导致 SYCL 设备指针被 CPU 后端当作主机地址解引用。优先排查你是否使用了包含 F16 类型转换补丁的构建版本。

适用环境:Linux 系统(Fedora 43),Intel Arc Pro B70 显卡,SYCL 后端(Level Zero),Intel oneAPI DPC++/C++ Compiler 2026.1.0;llama.cpp 构建版本 201(a7a6d0d26)及官方 Docker 镜像(version: 10200)。

最快修复方案:暂无官方版本更新;可优先尝试合入 Issue 评论中提供的补丁(修改 ggml/src/ggml-sycl/ggml-sycl.cppggml/src/ggml-sycl/set_rows.cpp),该补丁已由报告者验证可解决崩溃。

注意事项:补丁仍处于社区讨论阶段,尚未合并到主线(截至 Issue 关闭时以 PR #26515 形式提交);官方维护者表示因缺少对应硬件,未进行本地验证。

问题场景

在 llama.cpp 的 SYCL 后端下运行 DeepSeek-V4-Flash-0731(DSv4F 架构)模型,使用 llama-completion 工具执行推理。触发条件是 -ngl(GPU 层数)大于 0,即需要将部分网络层卸载到 Intel Arc Pro B70 显卡。无论是量化版本(IQ3_XXS)还是更小规模的 IQ2 构建,均会稳定复现段错误(SIGSEGV)。CPU 后端本身工作正常,问题只在启用了 SYCL 后端时出现。

报错原文

Thread 1 "llama-completio" received signal SIGSEGV, Segmentation fault.
0x0000000000420de4 in __intel_avx_rep_memcpy ()
#0  0x0000000000420de4 in __intel_avx_rep_memcpy ()
#1  0x00007ffff7691354 in ggml_compute_forward_set_rows () from libggml-cpu.so.0
#2  0x00007ffff75bcd08 in ggml_graph_compute_thread () from libggml-cpu.so.0
#3  0x00007ffff75bb5c3 in ggml_graph_compute () from libggml-cpu.so.0
#4  0x00007ffff75bf83c in ggml_backend_cpu_graph_compute() from libggml-cpu.so.0
#5  0x00007fffe773105c in ggml_backend_sched_graph_compute_async () from libggml-base.so.0
#6  0x00007ffff784ae31 in llama_context::graph_compute() from libllama.so.0
#7  0x00007ffff784a7db in llama_context::process_ubatch() from libllama.so.0
#8  0x00007ffff784c665 in llama_context::decode() from libllama.so.0
#9  0x00007ffff7851a4b in llama_decode () from libllama.so.0
#10 0x00007ffff7c7809d in common_prompt_batch_decode() from libllama-common.so.0

原因分析

可能原因(基于 Issue 中的调试与补丁分析):
1. F16 源类型未处理ggml_compute_forward_set_rows 在 CPU 后端对 SYCL 设备指针执行了 memcpy,而实际数据是存放在设备内存中的,CPU 无法直接解引用。
2. SYCL 后端算子声明不支持 F16 输入do_ggml_backend_sycl_device_supports_op 中仅允许 GGML_TYPE_F32 作为 set_rows 的源类型。DS4F 模型在浮点转换后可能产生 F16 张量,导致调度器把 set_rows 错误地丢给 CPU 后端执行。
3. 缺失 half→bfloat16 转换路径:补丁注释明确指出 sycl::vec::convert 不提供 half 到 bfloat16 的转换,需要手动通过 float 中转实现。

环境排查

  • 确认构建工具链为 Intel LLVM 2026.1.0(icx/icpx),且启用了 GGML_SYCL=ONGGML_SYCL_F16=ON
  • 确认显卡驱动为 Level Zero 1.15.38308+4 或 NEO OpenCL 26.18.38308.4。
  • 确认模型类型为 DeepSeek-V4-Flash-0731(DSv4F 架构),并检查 -ngl 参数是否大于 0。
  • 若崩溃发生在官方 Docker 镜像(ghcr.io/ggml-org/llama.cpp:server-intel),需判断镜像内置的 llama.cpp 版本是否早于修复合入点。

解决步骤

  1. 将 Issue 评论中的补丁应用到本地源码,涉及两个文件:
    a. 修改 ggml/src/ggml-sycl/ggml-sycl.cpp,在 do_ggml_backend_sycl_device_supports_opset_rows 分支中,允许 GGML_TYPE_F16 源类型(仅当目标类型为 F16 或 F32)。
    b. 修改 ggml/src/ggml-sycl/set_rows.cpp,新增 sycl::halfbfloat16 的转换特化模板,并在 ggml_sycl_op_set_rows 中按源类型(F32/F16)与索引类型(I64/I32)分发调用。
  2. 重新编译,参考 Issue 中的命令:
    cmake -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL=ON -DGGML_SYCL_TARGET=INTEL -DGGML_SYCL_DEVICE_ARCH=bmg-g31 -DGGML_SYCL_F16=ON -DGGML_SYCL_DNN=ON -DGGML_SYCL_GRAPH=ON -DGGML_NATIVE=ON
    cmake --build build -j$(nproc) -- llama-completion
  3. 运行测试命令,确认不再崩溃:
    ONEAPI_DEVICE_SELECTOR=level_zero:0 ./build/bin/llama-completion -m DeepSeek-V4-Flash-0731-UD-IQ3_XXS-00001-of-00004.gguf -ngl 43 --n-cpu-moe 42 -c 4096 -ub 256 -fa on -ctk f16 -ctv f16 -p "Hello" -n 5
  4. 若不想手动打补丁,可关注 PR #26515 的合并状态,待合入后更新构建版本。

验证方法

执行上述测试命令,观察是否仍出现 SIGSEGV 段错误。若补丁生效,llama.cpp 应能正常完成 5 个 token 的生成并输出结果;同时可配合 gdbdmesg 确认无新的崩溃记录。对于无法获取该测试模型的用户,可用任意 DSv4F 架构量化模型并设置 -ngl 大于 0 进行冒烟测试。

参考来源

ggml-org/llama.cpp #26462

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21235

发表回复

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