MPS_ERROR_UNSUPPORTED_DTYPE pytorch type_error ai_generated true

RuntimeError: MPS backend does not support float64. Falling back to float32. Please cast your tensors to float32 explicitly.

ID: pytorch/mps-float64-cast-fallback

Also available as: JSON · Markdown · 中文
90%Fix Rate
88%Confidence
1Evidence
2023-05-01First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
PyTorch 2.0.0 active
PyTorch 2.1.0 active
macOS 13 Ventura active
macOS 14 Sonoma active
Apple M1 active
Apple M2 active
Apple M3 active

Root Cause

The Metal Performance Shaders (MPS) backend on Apple Silicon does not support float64 (double precision) tensors; any operation involving float64 tensors triggers a fallback to CPU or an error, causing performance degradation or crashes.

generic

中文

Apple Silicon 上的 Metal Performance Shaders (MPS) 后端不支持 float64(双精度)张量;任何涉及 float64 张量的操作会触发回退到 CPU 或导致错误,引起性能下降或崩溃。

Official Documentation

https://pytorch.org/docs/stable/notes/mps.html#un-supported-features

Workarounds

  1. 95% success Cast all tensors to float32 explicitly before moving to MPS device: tensor = tensor.float().to('mps'). This ensures compatibility with MPS backend.
    Cast all tensors to float32 explicitly before moving to MPS device: tensor = tensor.float().to('mps'). This ensures compatibility with MPS backend.
  2. 90% success Set the default dtype to float32 at the start of the script: torch.set_default_dtype(torch.float32). This prevents accidental creation of float64 tensors from Python floats.
    Set the default dtype to float32 at the start of the script: torch.set_default_dtype(torch.float32). This prevents accidental creation of float64 tensors from Python floats.
  3. 85% success Use a custom wrapper function that checks dtype and casts if needed: def to_mps(tensor): return tensor.float().to('mps') if tensor.is_floating_point() else tensor.to('mps')
    Use a custom wrapper function that checks dtype and casts if needed: def to_mps(tensor): return tensor.float().to('mps') if tensor.is_floating_point() else tensor.to('mps')

中文步骤

  1. Cast all tensors to float32 explicitly before moving to MPS device: tensor = tensor.float().to('mps'). This ensures compatibility with MPS backend.
  2. Set the default dtype to float32 at the start of the script: torch.set_default_dtype(torch.float32). This prevents accidental creation of float64 tensors from Python floats.
  3. Use a custom wrapper function that checks dtype and casts if needed: def to_mps(tensor): return tensor.float().to('mps') if tensor.is_floating_point() else tensor.to('mps')

Dead Ends

Common approaches that don't work:

  1. Set environment variable PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 to disable MPS fallback 95% fail

    This flag controls memory watermark, not dtype support. The float64 issue remains and will cause errors.

  2. Use torch.set_default_dtype(torch.float64) to force double precision 90% fail

    This makes the problem worse by creating more float64 tensors, increasing fallback frequency and memory usage.

  3. Install PyTorch nightly build for better MPS support 85% fail

    Nightly builds may have improvements but still do not support float64 on MPS as of current versions.