
Misc. bug: Vulkan: DeviceLost on AMD APUs (gfx90c) due to GPU job timeout from command batch size
快速结论:该报错通常出现在 AMD APU(gfx90c 架构)运行 Vulkan 后端的大型计算图时,根本原因是默认的 nodes_per_submit = 100 导致单次 GPU 提交超时。优先排查并降低 nodes_per_submit 值为 1 或 10,或者增大内核超时参数。
问题场景
用户在 Linux 系统上,通过 stable-diffusion.cpp(共用 ggml Vulkan 后端)运行 Flux 2 Klein 4B 模型,分辨率为 1024×1024 且启用了 VAE tiling 时触发。
在 llama.cpp 中使用大型图像输入(mmproj)或超长上下文时也可能复现。
报错原文
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
内核日志同步输出:
amdgpu: ring comp_1.2.0 timeout, signaled seq=12481, emitted seq=12485
amdgpu: Starting comp_1.2.0 ring reset
amdgpu: Ring comp_1.2.0 reset succeeded
[drm] device wedged, but recovered through reset
原因分析
可能原因:ggml Vulkan 后端在 ggml_vulkan.cpp 中硬编码了 int nodes_per_submit = 100,导致单次 vkQueueSubmit 堆积过多计算节点。在 AMD APU(gfx90c)等慢速集成 GPU 上,累积的 GPU 工作时间超过了 Linux 默认的 amdgpu 锁定超时(amdgpu.lockup_timeout,默认 2000ms),内核因此认为 GPU 挂死,触发上下文丢失重置。
在低分辨率或短序列时(如 512×512)每个批次能按时完成;但在 1024×1024 扩散且序列长度约 4608 时,二次注意力的规模使得单批次数百毫秒的操作,累积突破 2 秒阈值。
环境排查
- Linux 内核 amdgpu 驱动版本(可通过
dmesg | grep amdgpu确认) - ggml Vulkan 后端版本(commit
58c38058或更新) - 显卡型号和 Vulkan 驱动:AMD Renoir APU (gfx90c) 使用 RADV
- llama.cpp 或 stable-diffusion.cpp 的构建选项(确保启用了 Vulkan 后端)
- 运行时的模型规模、提示长度、图像分辨率等影响计算负载的参数
解决步骤
- (可优先尝试)降低节点批处理大小:修改
ggml-vulkan.cpp中的nodes_per_submit = 100为1或10。Issue 提供者测试nodes_per_submit = 1后 1024×1024 分辨率从崩溃变为正常(261.60s),且 512×512 下性能无下降(反而提升约 3%)。
注意:此修改是本地临时方案,官方尚未合入;可以通过补丁或直接编辑源码实现。 - 增大内核超时时间作为临时绕开方案:此方法不需要改代码,但属于用户侧 workaround。
sudo sh -c 'echo 60000 > /sys/module/amdgpu/parameters/lockup_timeout'注意:此参数只能在启动时设置(GRUB 配置 + 重启)才能持久化,且增大超时可能导致实际 GPU 挂死时桌面长时间冻结(60 秒超时即 60 秒冻结)。建议与方案 1 结合使用,而非单独依赖。
- (建议)关注环境变量化改进:Issue 中提议将
nodes_per_submit改为可通过环境变量GGML_VK_NODES_PER_SUBMIT覆盖,或根据设备类型自动调整。目前尚未实现,请留意后续版本更新。 - 更新 ggml 版本:检查是否有相关 PR(如 #21713)合入后的 commit,优先使用最新代码。
验证方法
使用相同的命令重新运行之前崩溃的任务(例如 1024×1024 扩散或大型图像处理),确认不再出现 vk::Queue::submit: ErrorDeviceLost 异常;同时检查内核日志,不应再出现 ring ... timeout 和 ring reset 相关消息。

![[Bug]: github_copilot provider: 'no choices' error for claude-opus-4.8 despite #29392 fix](https://www.chat-gpts.plus/wp-content/uploads/2026/06/30927-f9610a47-768x403.jpg)
![[Bug]: Custom `input_cost_per_token_above_ _tokens` tiers are silently dropped unless N is 128k/200k/272k](https://www.chat-gpts.plus/wp-content/uploads/2026/06/30344-fbe5ac89-768x403.jpg)
