快速结论:此报错发生在 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.cpp 与 ggml/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=ON与GGML_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 版本是否早于修复合入点。
解决步骤
- 将 Issue 评论中的补丁应用到本地源码,涉及两个文件:
a. 修改ggml/src/ggml-sycl/ggml-sycl.cpp,在do_ggml_backend_sycl_device_supports_op的set_rows分支中,允许GGML_TYPE_F16源类型(仅当目标类型为 F16 或 F32)。
b. 修改ggml/src/ggml-sycl/set_rows.cpp,新增sycl::half→bfloat16的转换特化模板,并在ggml_sycl_op_set_rows中按源类型(F32/F16)与索引类型(I64/I32)分发调用。 - 重新编译,参考 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 - 运行测试命令,确认不再崩溃:
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 - 若不想手动打补丁,可关注 PR #26515 的合并状态,待合入后更新构建版本。
验证方法
执行上述测试命令,观察是否仍出现 SIGSEGV 段错误。若补丁生效,llama.cpp 应能正常完成 5 个 token 的生成并输出结果;同时可配合 gdb 或 dmesg 确认无新的崩溃记录。对于无法获取该测试模型的用户,可用任意 DSv4F 架构量化模型并设置 -ngl 大于 0 进行冒烟测试。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[bug]: InvokeAI v6.14.0-RC1 Crashed while generating Krea-2 Image](https://www.chat-gpts.plus/wp-content/uploads/2026/09/9444-d6bdc60c-768x403.jpg)
![[Question]: Shared embedded chat URL fails to access documents after logout or when accessed by other users](https://www.chat-gpts.plus/wp-content/uploads/2026/09/15895-cf3f7033-768x403.jpg)
