Apple Silicon (MPS): float64 timestep sinusoid fails — working 3-line fix

Abierto Apto para principiantes
#23 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 7 días

@arxigen ya está trabajando en esto.

Desde el 26/10/2026.

  • #25 de @arxigen — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
85/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python, pytorch

Línea de trabajo

La corrección está completamente escrita: reemplaza el cálculo de sinusoides en float64 en MOSSImageTransformer.forward dentro de pipeline_moss_image.py por la versión calculada en CPU que se muestra en el diff, y aplica el mismo cambio a las copias bajo transformer/ y scheduler/. Verifica primero en CPU que las salidas no cambien, y luego ejecuta la generación con el dispositivo MPS si está disponible. Listo cuando las tres copias estén parcheadas y la generación produzca imágenes correctas tanto en CPU como en MPS.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Problem

On Apple Silicon (PyTorch MPS), generation fails on the first step:

TypeError: Cannot convert a MPS Tensor to float64 dtype as the MPS framework doesn't
support float64.

The cause is the float64 timestep sinusoid in MOSSImageTransformer.forward
(pipeline_moss_image.py). MPS has no float64.

Fix (verified)

Compute the sinusoid on the CPU in float64 (numerically identical to training) and move
the float32 result back to the device:

-        freq = 10000 ** (-torch.arange(half, device=times.device, dtype=torch.float64) / half)
-        phase = times.double()[:, None] * freq
-        embedding = torch.cat((phase.cos(), phase.sin()), -1).float()
+        freq = 10000 ** (-torch.arange(half, device="cpu", dtype=torch.float64) / half)
+        phase = times.detach().cpu().double()[:, None] * freq
+        embedding = torch.cat((phase.cos(), phase.sin()), -1).float().to(times.device)

Important: use .cpu().double(), not .to("cpu", torch.float64). On MPS (torch 2.14.1),
torch.tensor([1000., 976., 24.], device="mps").to("cpu", torch.float64) silently returns
[0., 0., 0.]. Every timestep then becomes 0 and the output is pure noise, with no error.

Verification
  • MacBook Pro, M5 Pro, 64 GB; macOS 27.0.1; torch 2.14.1; diffusers 0.42.0.dev0;
    transformers 5.20.2; OpenMOSS-Team/MOSS-Image-SFT @ f972bd4
  • Same seed and prompt at 512×512, 10 steps, CFG 1: the MPS output matches the CPU
    reference image (MPS 4 s vs CPU 701 s).
  • 1024×1024, 25 steps, CFG 2.5: 89 s on MPS, correct output.
  • Every other component matched CPU on MPS in a layer-by-layer comparison: text
    encoder, attention, RoPE, embedders, all 42 blocks.
Notes for Mac users
  • Load with torch_dtype={"default": torch.bfloat16, "vae": torch.float32}, then
    pipe.to("mps").
  • causal_conv1d and flash-linear-attention are CUDA-only, so the text encoder uses
    transformers' reference kernels. That's slower but correct.
  • torchvision is required by the Qwen3-VL processor.

Please consider applying this in the repo (including the transformer/ and scheduler/
copies of the file) and listing Apple Silicon as supported.

Lenguaje dominante
Python
Estrellas
2.2k
Forks
114
Merge medio
9 d 1 h
PR fusionados (30 d)
1

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de OpenMOSS/MOSS-Image

Todos los issues de OpenMOSS/MOSS-Image

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.