Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

MiniMax-H3: float64 rotary position grid cannot be moved to MPS (`Cannot convert a MPS Tensor to float64`)

已关闭 适合新手
#14,639 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
88/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
macos, python, pytorch

调研方向

从 before_denoise.py 中的 MiniMaxH3PrepareLayoutStep(约第 444 行)和 MiniMaxH3Ref2VAPrepareLayoutStep(约第 768 行)开始,同时保持 fp64 网格构造不变。检查 MPS 的设备传输行为,并验证 t2va、fl2va 和 ref2va 工作流能够在不出现 float64 转换错误的情况下完成。

由索引模型根据 Issue 内容生成。

描述

bug
Describe the bug

Both MiniMax-H3 layout blocks build their rotary position grid in float64 on CPU (deliberately — the grid has to reproduce the released model's fp64 coordinates exactly) and then move it to the execution device with a plain .to(device):

  • MiniMaxH3PrepareLayoutStep, before_denoise.py line 444 (v0.40.0): block_state.position_ids = position_ids.to(device)
  • MiniMaxH3Ref2VAPrepareLayoutStep, line 768: same statement

Metal has no float64, so on MPS every workflow (t2va, fl2va, ref2va) dies at that line before the first denoising step. No MPS-specific handling exists anywhere on that path.

Reproduction
Reproduction

The failing operation in isolation (this is exactly what the layout step does):

import torch
position_ids = torch.zeros(8, 3, dtype=torch.float64)   # what MiniMaxH3PrepareLayoutStep builds
position_ids.to("mps")

With the real pipeline: MiniMaxH3ModularPipeline on device="mps", any workflow, fails inside prepare_layout with the same error.

Logs
TypeError: Cannot convert a MPS Tensor to float64 dtype as the MPS framework doesn't support float64. Please use float32 instead.
Proposed fix

Keep the fp64 computation untouched and drop the dtype only at the device transfer, only for MPS (two sites):

# before_denoise.py, MiniMaxH3PrepareLayoutStep and MiniMaxH3Ref2VAPrepareLayoutStep
if device is not None and torch.device(device).type == "mps":
    block_state.position_ids = position_ids.to(device, dtype=torch.float32)
else:
    block_state.position_ids = position_ids.to(device)

Precision impact, measured on the grids the code actually produces (_spatial_position_grid, _temporal_position_grid, audio rows) for a large layout — 64×64 latent frame with patch 2 (1024×1024 output), 102 latent frames (~15 s), 4000 audio latents:

grid max |coord| max abs error after fp32 cast
spatial h / w 31.0 0 (exact)
temporal 568.3 2.0e-5
audio time 4567.3 1.6e-4

Worst case is 1.6e-4 rad of rotary phase at the highest frequency (inv_freq = 1), about 24× below the bf16 precision (3.9e-3) the transformer itself runs in. With this patch applied locally, all three workflows run end to end on an M5 Max (t2va, fl2va with keyframes, ref2va with up to 12 references), outputs reproducible across runs. Happy to open a PR if this shape of fix is acceptable.

Logs

System Info
  • 🤗 Diffusers version: 0.40.0 (sites verified against the v0.40.0 tag; also present on main)
  • Platform: macOS-26.6.2-arm64-arm-64bit-Mach-O
  • Python version: 3.14.5
  • PyTorch version (GPU?): 2.14.0.dev20260808 (MPS)
  • Transformers version: 5.14.1
  • Accelerate version: 1.14.0
  • Accelerator: Apple M5 Max, 128 GB unified memory
  • Using GPU in script?: yes (MPS)
  • Using distributed or parallel set-up in script?: no
Who can help?

@apolinario (MiniMax-H3 integration, #14355)

主要语言
Python
星标
34.6k
派生
7.4k
平均合并
3 天 20 小时
30 天内合并 PR
55

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

huggingface/diffusers 的其他 Issue

查看 huggingface/diffusers 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。