o
    zi                     @   s   d dl Z d dlZd dlmZ d dlmZmZmZ d dlZd dl	m
Z
 d dlmZ d dlmZ G dd deZd	ee fd
dZdS )    N)	lru_cache)ListOptionalUnion)override)Accelerator)_AcceleratorRegistryc                   @   s   e Zd ZdZedejddfddZedddZe	ed	e
eeee f deee  fd
dZe	ed	e
eeee f deej fddZe	edefddZe	eeddefddZeededdfddZdS )MPSAcceleratorzAccelerator for Metal Apple Silicon GPU devices.

    .. warning::  Use of this accelerator beyond import and instantiation is experimental.

    devicereturnNc                 C   s   |j dkrtd| ddS )zd
        Raises:
            ValueError:
                If the selected device is not MPS.
        mpszDevice should be MPS, got z	 instead.N)type
ValueError)selfr
    r   U/home/ubuntu/.local/lib/python3.10/site-packages/lightning_fabric/accelerators/mps.pysetup_device!   s   
zMPSAccelerator.setup_devicec                 C   s   d S )Nr   )r   r   r   r   teardown+   s   zMPSAccelerator.teardowndevicesc                 C   s   ddl m} || ddS )z!Accelerator device parsing logic.r   )_parse_gpu_idsT)include_mps)(lightning_fabric.utilities.device_parserr   )r   r   r   r   r   parse_devices/   s   zMPSAccelerator.parse_devicesc                 C   s,   t | }|dusJ dd tt|D S )z*Gets parallel devices for the Accelerator.Nc                 S   s   g | ]}t d |qS )r   )torchr
   ).0ir   r   r   
<listcomp>=   s    z7MPSAccelerator.get_parallel_devices.<locals>.<listcomp>)r	   r   rangelen)r   parsed_devicesr   r   r   get_parallel_devices7   s   
z#MPSAccelerator.get_parallel_devicesc                   C   s   dS )z!Get the devices when set to auto.   r   r   r   r   r   auto_device_count?   s   z MPSAccelerator.auto_device_countr!   c                  C   s.   t dddk} |  otjj ot dv S )zOMPS is only available on a machine with the ARM-based Apple Silicon processors.DISABLE_MPS01)armarm64)osgetenvr   backendsr   is_availableplatform	processor)mps_disabledr   r   r   r+   E   s   zMPSAccelerator.is_availableaccelerator_registryc                 C   s   |j d| | jd d S )Nr   )description)register__name__)clsr/   r   r   r   register_acceleratorsM   s
   
z$MPSAccelerator.register_accelerators)r   N)r2   
__module____qualname____doc__r   r   r
   r   r   staticmethodr   intstrr   r   r   r    r"   r   boolr+   classmethodr   r4   r   r   r   r   r	      s,    	,*r	   r   c                   C   s   t  rdgS g S )z;
    Returns:
        A list of all available MPS GPUs
    r   )r	   r+   r   r   r   r   _get_all_available_mps_gpusW   s   r=   )r(   r,   	functoolsr   typingr   r   r   r   typing_extensionsr   )lightning_fabric.accelerators.acceleratorr   &lightning_fabric.accelerators.registryr   r	   r9   r=   r   r   r   r   <module>   s   =