
Vulkan: vk::DeviceLostError crash in ggml_vk_flash_attn on AMD gfx1102 (RADV PHOENIX)
快速结论:此报错是 AMD RDNA3 架构(如 Radeon 780M、gfx1102)在 Vulkan 后端启用 Flash Attention 时触发的 GPU 设备丢失崩溃。优先排查方案是关闭 -fa on 参数,或切换至 ROCm 后端(但 ROCm 后端在 decode 阶段同样存在闪退问题)。
问题场景
用户在 llama.cpp 的 llama-server 中使用 Vulkan 后端(--device Vulkan0)加载 GGUF 模型,并开启 Flash Attention 加速(-fa on)。在首次 decode 阶段(prompt processing 完成后,生成第一个 token 时)触发崩溃。完整复现命令见 Issue 正文。
报错原文
radv/amdgpu: The CS has been cancelled because the context is lost. This context is guilty of a hard recovery.
terminate called after throwing an instance of 'vk::DeviceLostError'
what(): vk::Queue::submit: ErrorDeviceLost
#6 ggml_vk_submit(std::shared_ptr<vk_context_struct>&, vk::Fence) [libggml-vulkan.so.0]
#7 ggml_vk_preallocate_buffers(ggml_backend_vk_context*, std::shared_ptr<vk_context_struct>) [libggml-vulkan.so.0]
#8 ggml_vk_flash_attn(...) [libggml-vulkan.so.0]
#9 ggml_vk_build_graph(...) [libggml-vulkan.so.0]
原因分析
可能原因:ggml_vk_flash_attn 在预分配缓冲区阶段(ggml_vk_preallocate_buffers)触发了 Vulkan 设备的硬恢复(hard recovery)。受害者上下文被销毁,导致后续 vk::Queue::submit 抛出 ErrorDeviceLost。这似乎是 AMD RADV 驱动在 RDNA3 架构(gfx1102)上与 Vulkan Flash Attention 实现的兼容性问题。关闭 -fa on 后两个后端均工作正常。
环境排查
- GPU 型号:AMD Radeon Graphics (RADV PHOENIX) / gfx1102 (RDNA3 iGPU,Radeon 780M / APU Phoenix)
- 驱动:RADV (Mesa),UMA 设备(
uma: 1) - 操作系统:Linux x86_64,Ubuntu(GNU 13.3.0)
- llama.cpp 构建版本:8458 (4cb7e0bd6) 及之后版本(用户报告从更新后开始出现)
- 模型架构:mistral3 (Ministral-3-14B-Instruct) 或 Qwen3.5 系列
- 后端及参数:–device Vulkan0, -fa on, -ctk q8_0, -ctv q8_0
解决步骤
- 优先尝试:移除
-fa on参数(或改为-fa off)。这是 Issue 中确认有效的全局方案。 - 如果必须使用 Flash Attention,可尝试切换至 ROCm 后端(
--device ROCm0)。但注意:ROCm 后端在第一次 decode token 时同样会崩溃,报hipStreamSynchronize错误(unspecified launch failure),这不是稳定替代方案。 - 检查是否使用了不兼容的模型架构(如 mistral3)。更换为其他架构的模型可能绕过问题,但 Issue 中未提供具体证据。
- 更新 Mesa/Vulkan RADV 驱动至最新版本。Issue 中未指定驱动版本,但已知 RDNA3 相关 bug 可能在新驱动中修复。
- 降低 batch size (
-b) 或 ubatch size (-ub) 可能缓解问题,但 Issue 中未验证此方案。
验证方法
使用原复现命令(保留 -fa on)应触发 vk::DeviceLostError。移除 -fa on 后重新运行,模型应正常加载并完成 inference 而不崩溃。



