
Vulkan: DeviceLost crash on AMD GCN 1.0 GPUs (Tahiti/HD 7900/R9 280X) with kernel 6.19
快速结论:该报错通常发生在 AMD GCN 1.0 架构显卡(Tahiti/HD 7900/R9 280X/FirePro D700)全量 GPU 卸载(-ngl 99)运行较长上下文时,优先尝试添加 RADV_DEBUG=novm,syncshaders,zerovram 环境变量作为工作区。
问题场景
用户在 llama.cpp 的 llama-server 中,使用两块 AMD FirePro D700(Tahiti XT,与 HD 7970/R9 280X 同型)显卡,在 Arch Linux 系统中启用全量 GPU 卸载(-ngl 99)处理 500+ token 上下文时触发崩溃。系统使用内核 6.19.1、Mesa 25.1.0、RADV 驱动(amdgpu 内核驱动)。
报错原文
radv/amdgpu: The CS has been cancelled because the context is lost. This context is innocent.
terminate called after throwing an instance of 'vk::DeviceLostError'
what(): vk::Queue::submit: ErrorDeviceLost
原因分析
可能原因是 AMD GCN 1.0 架构(Tahiti)在 Mesa/RADV 驱动中的计算着色器调度存在竞态条件(race condition),当上下文长度超过约 500 token 时,全量 GPU 卸载场景下的 ggml_backend_tensor_copy 操作导致设备丢失。Mesa/RADV 驱动层面的错误(而非 llama.cpp 本身)被认为是根本原因。开启 syncshaders 标志可强制在每次绘制/调度后同步着色器,从而避免该竞态条件。
环境排查
- 确认 GPU 架构是否为 AMD GCN 1.0(Tahiti),如 Radeon HD 7900 系列、R9 280X、FirePro D700
- 确认内核版本(例如 6.19.1)
- 确认 Mesa 版本(例如 25.1.0 或更高)
- 确认使用 RADV 驱动(amdgpu 内核驱动 +
amdgpu.si_support=1内核参数) - 确认 llama.cpp 编译时启用了 Vulkan 后端
解决步骤
- 优先尝试:在启动命令中加入 RADV 调试标志:
RADV_DEBUG=novm,syncshaders,zerovram ./llama-server -m model.gguf -ngl 99 --host 0.0.0.0 --port 8080 - 如果上述方案无效或为了追求稳定性,可降低 GPU 层数作为备选工作区:
RADV_DEBUG=novm ./llama-server -m model.gguf -ngl 20 -c 8192 --host 0.0.0.0 --port 8080
验证方法
使用 1000+ token 的上下文发送请求,观察是否稳定运行且无 vk::DeviceLostError 报错。使用 RADV_DEBUG=novm,syncshaders,zerovram 配置时,全量卸载的速度约为 ~11 t/s(对比无标志全量卸载的 ~12 t/s,损失微小)。



