o
    oi                     @   s   d dl 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 d dlmZ d dlmZ G dd	 d	eZed
dZedZdefddZdeeeee f deeee f fddZdeddfddZdedeeee f fddZdS )    N)AnyListUnion)RequirementCache)override)Accelerator)_AcceleratorRegistry)_check_data_typec                	       s  e Zd ZdZdededdf fd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e f fddZeedeeee f deej fddZeeejdddefddZeeejdddefddZeededdfddZ  ZS )XLAAcceleratorzAccelerator for XLA devices, normally TPUs.

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

    argskwargsreturnNc                    s4   t sttt t stdt j|i | d S )Nz-The XLA XRT runtime is not supported anymore.)_XLA_AVAILABLEModuleNotFoundErrorstr_using_pjrtRuntimeErrorsuper__init__)selfr   r   	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/lightning/fabric/accelerators/xla.pyr   !   s
   zXLAAccelerator.__init__devicec                 C      d S Nr   )r   r   r   r   r   setup_device(      zXLAAccelerator.setup_devicec                 C   r   r   r   )r   r   r   r   teardown,   r   zXLAAccelerator.teardowndevicesc                 C   s   t | S )z!Accelerator device parsing logic.)_parse_tpu_devicesr    r   r   r   parse_devices0   s   zXLAAccelerator.parse_devicesc                 C   s6   t | } t| trdd t| D S td| d gS )z*Gets parallel devices for the Accelerator.c                 S   s   g | ]}t d |qS )xla)torchr   ).0ir   r   r   
<listcomp><   s    z7XLAAccelerator.get_parallel_devices.<locals>.<listcomp>r$   r   )r!   
isinstanceintranger%   r   r"   r   r   r   get_parallel_devices6   s   
z#XLAAccelerator.get_parallel_devices   )maxsizec                  C   sH   t sdS trddlm}  |  S ddlm}  dddd}||  dS )z!Get the devices when set to auto.r   )tpu      )      r1   )r   _XLA_GREATER_EQUAL_2_1torch_xla._internalr/   num_available_devicestorch_xla.experimentalgetversion)r/   device_count_on_versionr   r   r   auto_device_countC   s   z XLAAccelerator.auto_device_countc                
   C   s*   zt  dkW S  tttfy   Y dS w )Nr   F)r
   r;   
ValueErrorAssertionErrorOSErrorr   r   r   r   is_availableU   s
   zXLAAccelerator.is_availableaccelerator_registryc                 C   s   |j d| | jd d S )Nr/   )description)register__name__)clsr@   r   r   r   register_accelerators`   s   z$XLAAccelerator.register_accelerators)r   N)rC   
__module____qualname____doc__r   r   r   r%   r   r   r   staticmethodr   r*   r   r   r#   r,   	functools	lru_cacher;   boolr?   classmethodr   rE   __classcell__r   r   r   r   r
      s0    0(

r
   ztorch_xla>=1.13	torch_xlaztorch_xla>=2.1r   c                  C   s,   t rddlm}  |  S ddlm} | S )Nr   )runtime)pjrt)r4   rO   rP   
using_pjrtr7   rQ   )xrrQ   r   r   r   r   k   s
   r   r    c                 C   s&   t |  t| trt| } t|  | S )a  Parses the TPU devices given in the format as accepted by the
    :class:`~lightning.pytorch.trainer.trainer.Trainer` and :class:`~lightning.fabric.Fabric`.

    Args:
        devices: An int of 1 or string '1' indicates that 1 core with multi-processing should be used
            An int 8 or string '8' indicates that all 8 cores with multi-processing should be used
            A single element list of int or string can be used to indicate the specific TPU core to use.

    Returns:
        A list of tpu cores to be used.

    )r	   r)   r   _parse_tpu_devices_str_check_tpu_devices_validr"   r   r   r   r!   v   s
   
r!   c                 C   s|   t  }t| tr| d|hv s-t| ttfr/t| dkr/d| d   kr+|d kr/d S  nd S td| d|d  d| )Nr-   r   z!`devices` can only be 'auto', 1, z or [<0-z>] for TPUs. Got )r
   r;   r)   r*   listtuplelenr<   )r    device_countr   r   r   rU      s   rU   c                 C   sZ   |   } zt| W S  ty,   zdd | dD W  Y S  ty+   td| w w )Nc                 S   s$   g | ]}t |d krt| qS )r   )rX   r*   strip)r&   xr   r   r   r(      s   $ z*_parse_tpu_devices_str.<locals>.<listcomp>,z*Could not parse the selected TPU devices: )rZ   r*   r<   splitr"   r   r   r   rT      s   
rT   )rJ   typingr   r   r   r%    lightning_utilities.core.importsr   typing_extensionsr   )lightning.fabric.accelerators.acceleratorr   &lightning.fabric.accelerators.registryr   (lightning.fabric.utilities.device_parserr	   r
   r   r4   rL   r   r*   r   r!   objectrU   rT   r   r   r   r   <module>   s   
M,"