Skip to content

[Bug] Brush 初始化阶段 CubeCL/WGPU 计算流丢失并触发双重 panic #23

Description

@ooolabdev

问题描述

用户在 Windows 上运行 OOOSplat 生成流程时,FFmpeg 和 COLMAP 均成功完成,但 Brush v0.3.0 在训练初始化阶段约 7 秒后崩溃。

界面最终仅显示 Brush 外部进程失败,退出码为:

Some(-1073740791)

该退出码对应 0xC0000409,是连续 Rust panic 后触发的 Windows fail-fast,不是根本原因。

运行参数

brush-cli 0.3.0
--total-steps 15000
--max-resolution 1600
--export-every 15000
--export-name final.ply.tmp

为保护用户隐私,项目路径和输入文件名已省略。

实际错误

首个有效错误:

thread 'main' panicked at
cubecl-wgpu/src/compute/stream.rs:404:18:
called `Option::unwrap()` on a `None` value

随后出现连锁错误:

thread 'main' panicked at
burn-fusion/src/stream/execution/ordering.rs:67:38:
index out of bounds: the len is 0 but the index is 0

进程信息:

exit_code: Some(-1073740791)
elapsed_ms: 7129

第二个 Burn panic 应为第一个 GPU 计算流异常后的连锁反应。

已排除的输入与 COLMAP 问题

已使用 COLMAP model_analyzer 检查实际生成的稀疏模型:

Frames: 219
Registered frames: 219
Images: 219
Registered images: 219
Points: 11999
Observations: 164321
Mean track length: 13.694558
Mean observations per image: 750.324201
Mean reprojection error: 0.820348px

其他检查结果:

  • FFprobe 和 FFmpeg 均以退出码 0 完成。
  • FFmpeg实际抽取 219 张 720×1280 JPG。
  • COLMAP 特征提取和匹配使用 CPU:use_gpu=0
  • COLMAP Mapper 输出 Keeping successful reconstruction,退出码 0。
  • cameras.binimages.binpoints3D.bin 转换为 TXT 后,没有发现 NaNInf
  • 相机参数正常:单个 SIMPLE_RADIAL 相机,焦距约 897 px。
  • COLMAP 中虽出现 Bundle Adjustment Cholesky 求解警告,但后续成功恢复并完成全部图像注册。

因此现有证据不支持“COLMAP 数据损坏或注册率不足导致 Brush 崩溃”。

初步判断

这是 Brush v0.3.0 所使用的 WGPU/CubeCL/Burn GPU 运行时问题。最可能的故障链:

  1. WGPU 设备丢失、GPU 命令提交失败或资源分配失败。
  2. CubeCL 未能取得有效计算流,却直接对 None 执行 unwrap()
  3. Burn Fusion 在空执行队列上继续排序,产生第二次 panic。
  4. Windows 以 0xC0000409 终止进程。

上游存在相同 CubeCL 提交和相同 stream.rs:404 panic 的记录;该记录在 panic 前明确出现 Not enough memory for command submissionParent device is lost

但本次日志没有捕获到最初的 WGPU device-lost reason,因此目前不能断言具体触发因素一定是 OOM。需要区分:

  • GPU 驱动重置或设备丢失;
  • 单次 Buffer/连续显存分配失败;
  • WGPU 显存预算或资源上限;
  • 双显卡选择错误;
  • AMD/Intel/NVIDIA 特定驱动兼容性;
  • Brush 初始化、KNN 或首批计算 Kernel 缺陷。

Brush 的另一个显式大型 Buffer 问题可供对照,但不是本次相同的直接错误:

当前日志缺口

现有项目日志没有记录:

  • Brush 实际选择的 GPU 名称和设备索引;
  • GPU 厂商、驱动版本;
  • WGPU backend(DX12/Vulkan 等);
  • WGPU device-lost reason;
  • 崩溃前显存预算和关键 Buffer 分配;
  • Windows Display/WHEA 事件。

COLMAP 使用 CPU 只能说明当时没有启用 NVIDIA COLMAP 加速;Brush 的 GPU 选择与 COLMAP 独立,不能据此确认 Brush 使用了哪块显卡。

建议处理

诊断

  • 在启动 Brush 前记录 OS、GPU 厂商/型号、驱动版本和可用适配器。
  • 为 Brush 设置适当的 WGPU/CubeCL日志环境变量,并完整捕获 device-lost/OOM 信息。
  • 记录 Brush 启动阶段:数据读取、图像解码、KNN 初始化、GPU Buffer 创建和首个训练 step。
  • 记录任务使用的 Brush 版本与二进制 SHA-256。
  • 若检测到双显卡,记录实际选择的设备。
  • 保留 Windows事件查看器中同一时间的 Display、WHEA、nvlddmkmamdwddmg 错误。

用户侧错误提示

识别以下已知 panic 特征:

cubecl-wgpu/src/compute/stream.rs
Option::unwrap() on a None value
burn-fusion/src/stream/execution/ordering.rs

不要只显示“外部进程执行失败”,应提示:

Brush GPU 计算设备在初始化阶段失效。请更新显卡驱动、关闭其他 GPU 应用或降低生成质量,并提交 GPU 型号、驱动版本和 Brush 日志。

稳定性

  • 评估是否可以降低分辨率后进行一次明确告知用户的重试。
  • 不应将该错误误报为 COLMAP 注册率或输入素材问题。
  • Brush崩溃后应保留已经生成的 COLMAP 数据和真实阶段状态,方便诊断与未来重试。

待补充环境信息

  • Windows具体版本
  • GPU厂商和型号
  • 显卡驱动版本
  • 是否存在双显卡
  • 崩溃时间附近的 Windows Display/WHEA事件
  • 降低 max-resolution 后是否仍在初始化阶段崩溃

验收建议

  • Brush设备丢失/OOM时,OOOSplat显示可理解、可操作的错误原因。
  • 完整日志能确认实际GPU适配器、驱动、WGPU backend和首个GPU错误。
  • Brush失败不会覆盖或丢失成功的COLMAP阶段状态。
  • 对相同数据重试时能判断是稳定复现、设备相关还是负载相关。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions