Misc. bug: Vulkan: DeviceLost on AMD APUs (gfx90c) due to GPU job timeout from command batch size

用户在 Linux 系统上,通过 stable-diffusion.cpp(共用 ggml Vulkan 后端)运行 Flux 2 Klein 4B 模型,分辨率为 1024×1024 且启用了 VAE tiling 时触发。 在 llama.cpp 中使用大型图像输入(mmproj)或超长上下文时

Misc. bug: Vulkan: DeviceLost on AMD APUs (gfx90c) due to GPU job timeout from command batch size

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 后端)
  • 运行时的模型规模、提示长度、图像分辨率等影响计算负载的参数

解决步骤

  1. (可优先尝试)降低节点批处理大小:修改 ggml-vulkan.cpp 中的 nodes_per_submit = 100110。Issue 提供者测试 nodes_per_submit = 1 后 1024×1024 分辨率从崩溃变为正常(261.60s),且 512×512 下性能无下降(反而提升约 3%)。
    注意:此修改是本地临时方案,官方尚未合入;可以通过补丁或直接编辑源码实现。
  2. 增大内核超时时间作为临时绕开方案:此方法不需要改代码,但属于用户侧 workaround。
    sudo sh -c 'echo 60000 > /sys/module/amdgpu/parameters/lockup_timeout'

    注意:此参数只能在启动时设置(GRUB 配置 + 重启)才能持久化,且增大超时可能导致实际 GPU 挂死时桌面长时间冻结(60 秒超时即 60 秒冻结)。建议与方案 1 结合使用,而非单独依赖。

  3. (建议)关注环境变量化改进:Issue 中提议将 nodes_per_submit 改为可通过环境变量 GGML_VK_NODES_PER_SUBMIT 覆盖,或根据设备类型自动调整。目前尚未实现,请留意后续版本更新。
  4. 更新 ggml 版本:检查是否有相关 PR(如 #21713)合入后的 commit,优先使用最新代码。

验证方法

使用相同的命令重新运行之前崩溃的任务(例如 1024×1024 扩散或大型图像处理),确认不再出现 vk::Queue::submit: ErrorDeviceLost 异常;同时检查内核日志,不应再出现 ring ... timeoutring reset 相关消息。

参考来源

ggml-org/llama.cpp #21724

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 9733

发表回复

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