# SPDX-License-Identifier: Apache-2.0 import torch from fastvideo.logger import init_logger from fastvideo.platforms import AttentionBackendEnum from fastvideo.platforms.interface import (DeviceCapability, Platform, PlatformEnum) logger = init_logger(__name__) class MpsPlatform(Platform): _enum = PlatformEnum.MPS device_name: str = "mps" device_type: str = "mps" dispatch_key: str = "MPS" device_control_env_var: str = "MPS_VISIBLE_DEVICES" @classmethod def get_device_capability(cls, device_id: int = 0) -> DeviceCapability | None: raise NotImplementedError @classmethod def get_device_name(cls, device_id: int = 0) -> str: raise NotImplementedError @classmethod def get_device_uuid(cls, device_id: int = 0) -> str: raise NotImplementedError @classmethod def get_device_total_memory(cls, device_id: int = 0) -> int: raise NotImplementedError @classmethod def is_async_output_supported(cls, enforce_eager: bool | None) -> bool: if enforce_eager: logger.warning("To see benefits of async output processing, enable MPS " "graph. Since, enforce-eager is enabled, async output " "processor cannot be used") return False return True @classmethod def get_current_memory_usage(cls, device: torch.types.Device | None = None) -> float: return 0.0 @classmethod def get_attn_backend_cls(cls, selected_backend: AttentionBackendEnum | None, head_size: int, dtype: torch.dtype) -> str: # MPS supports SDPA (Scaled Dot-Product Attention) which is the most compatible logger.info("Using Torch SDPA backend for MPS.") return "fastvideo.attention.backends.sdpa.SDPABackend" @classmethod def get_device_communicator_cls(cls) -> str: # Use base communicator for MPS return "fastvideo.distributed.device_communicators.base_device_communicator.DeviceCommunicatorBase" @classmethod def seed_everything(cls, seed: int | None = None) -> None: """Set the seed for MPS device.""" if seed is not None: import random import numpy as np random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) # MPS doesn't have manual_seed_all like CUDA # The manual_seed above should be sufficient