ValueError: Trellis2 coords can’t be empty

这个报错通常出现在 Apple Silicon(MPS)上运行 ComfyUI 原生 Trellis.2 / Pixal3D 图生 3D 模板时,`VaeDecodeStructureTrellis2` 解码出的占据体素全为 0,导致稀疏结构为空。优先检查 MPS 上 `nn.Conv3d` 的数值

快速结论:这个报错通常出现在 Apple Silicon(MPS)上运行 ComfyUI 原生 Trellis.2 / Pixal3D 图生 3D 模板时,`VaeDecodeStructureTrellis2` 解码出的占据体素全为 0,导致稀疏结构为空。优先检查 MPS 上 `nn.Conv3d` 的数值输出是否异常,并考虑把结构解码放到 CPU 上执行。

适用环境:Issue 已确认:ComfyUI 原生 Trellis.2 / Pixal3D 模板;Apple Silicon(MPS);测试硬件为 M2 Max / 32 GB。Issue 提到 int8 与 bf16 checkpoint、任意 VAE dtype 均可复现,未提供具体 ComfyUI 版本、Python 版本、PyTorch 版本或 macOS 版本号。

最快修复方案:暂无确认的一步修复方案。Issue 中报告者验证有效的处理是:在 `VaeDecodeStructureTrellis2` 中把 `struct_dec` 放到 CPU 上运行,即对该结构解码步骤使用 CPU 回退;这是一个 16^3 → 64^3 的解码,耗时约一秒,之后完整几何流程可在 MPS 上跑完。

注意事项:该 CPU 回退是 Issue 作者自述的 workaround,不是官方合并的修复,不同版本环境需自行验证。Issue 评论摘要还提到,把 macOS 从 26.2 (25C56) 升级到 26.7 (25G229) 后问题解决,但这只是评论中的单点反馈,不代表对所有 MPS 环境都成立。另外 `channels_last_3d` 不足以绕过该问题,因为最后一层是 `(32, 1, k=3)`,`out_channels == 1` 在两种内存格式下都出错。

问题场景

在 Apple Silicon(MPS)设备上,运行 ComfyUI 原生的 Trellis.2 / Pixal3D 图生 3D 模板。即使使用官方示例输入(`viking_wolf_rune_axe.png`),流程也会在 Trellis2ShapeStage 阶段失败。报告者确认,int8 与 bf16 checkpoint、任意 VAE dtype 都会触发,因此不是特定输入或特定量化导致的问题。

报错原文

ValueError: Trellis2 coords can't be empty

原因分析

Issue 作者定位到的原因是:VaeDecodeStructureTrellis2 通过 shape_vae.decode_structure(...) > 0 计算占据情况;struct_dec 由 20 层堆叠的 nn.Conv3d(k=3) 组成,而 nn.Conv3d 在 MPS 上返回了错误结果(作者称是上游 PyTorch bug,并已单独提交)。

作者给出的同一 latent 与权重在不同设备/精度下的对比:

  • cpu / fp32:decode_structure 输出范围 -218.19 .. +176.15,occupied voxels 为 13170 / 262144(5.02%)
  • mps / fp32:输出为常数 -0.0752,occupied voxels 为 0
  • mps / fp16:输出为常数 -0.0752,occupied voxels 为 0

由于所有体素都低于 > 0 判断,稀疏结构为空,shape stage 因此抛错。这也意味着问题不在输入图像或 checkpoint 量化,而在 MPS 后端对 nn.Conv3d 的计算结果;不过具体触发条件仍以 PyTorch 上游问题为准,可视为可能原因。

环境排查

  • 确认是否运行在 Apple Silicon 的 MPS 后端,且触发的是原生 Trellis.2 / Pixal3D 图生 3D 模板。
  • 确认是否使用官方示例输入(`viking_wolf_rune_axe.png`)仍可复现,以排除输入问题。
  • 分别用 int8 与 bf16 checkpoint 测试,确认是否与量化无关。
  • 检查 VaeDecodeStructureTrellis2struct_dec 在 MPS 上的输出是否为常数,并对比 CPU fp32 的输出范围。
  • Issue 未明确给出 ComfyUI、PyTorch、Python、macOS 的具体版本号;如要排查,可记录本机 MPS 相关版本,并与评论中提到的 macOS 26.2 → 26.7 升级线索对照。

解决步骤

  1. 先确认复现路径:在 Apple Silicon MPS 上运行 Trellis.2 / Pixal3D 图生 3D 模板,使用官方示例输入,观察是否在 Trellis2ShapeStage 抛出 ValueError: Trellis2 coords can't be empty
  2. 按 Issue 作者的验证方式,对 VaeDecodeStructureTrellis2 里的 struct_dec 输出做设备对比:在 CPU / fp32 下应得到类似 -218.19 .. +176.15 的分布,并有约 5% 体素被判定为 occupied;若 MPS 下输出为常数 -0.0752 且 occupied 为 0,即命中该问题。
  3. 可优先尝试作者验证有效的 workaround:在 VaeDecodeStructureTrellis2 中让 struct_dec 在 CPU 上运行(CPU 回退),其余流程仍走 MPS。该步骤为 16^3 → 64^3 解码,约耗时一秒。
  4. 可优先尝试评论中提到的系统更新线索:把 macOS 从 26.2 (25C56) 升级到 26.7 (25G229),有反馈称升级后问题解决;升级前建议备份并确认所依赖的 ComfyUI / PyTorch 环境兼容。
  5. 不要依赖 channels_last_3d 作为绕过手段;Issue 指出最后一层为 (32, 1, k=3)out_channels == 1 在两种内存格式下都不正确。

验证方法

重新运行 Trellis.2 / Pixal3D 图生 3D 模板,确认不再出现 ValueError: Trellis2 coords can't be empty,并能在 MPS 上完成完整几何流程。Issue 作者在 M2 Max / 32 GB 上设置 target_resolution=1024 时,应用 CPU 回退后完整流程约 12 分钟完成。也可单独检查 decode_structure 输出:不再为常数,occupied voxels 大于 0(参考 CPU fp32 约为 5.02%)。

参考来源

Comfy-Org/ComfyUI #16340

Issue 中关联的 PyTorch 上游问题:pytorch/pytorch #197114

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23760

发表回复

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