o
    8wi                     @   s   d dl Z d dl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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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__ ^/home/ubuntu/sommelier/.venv/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      )      r0   )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)rB   
__module____qualname____doc__r   r   r   r$   r   r   r   staticmethodr   r)   r   listr"   r+   	functools	lru_cacher:   boolr>   classmethodr   rD   __classcell__r   r   r   r   r	      s0    0(

r	   ztorch_xla>=1.13	torch_xlaztorch_xla>=2.1ztorch_xla>=2.5r   c                  C   sH   t rddlm}  |  d uS trddlm}  |  S ddlm} | S )Nr   )runtime)pjrt)_XLA_GREATER_EQUAL_2_5rO   rP   device_typer3   
using_pjrtr6   rQ   )xrrQ   r   r   r   r   l   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:`~pytorch_lightning.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    }   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)   rI   tuplelenr;   )r   device_countr   r   r   rW      s   rW   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   )rY   r)   strip)r%   xr   r   r   r'      s   $ z*_parse_tpu_devices_str.<locals>.<listcomp>,z*Could not parse the selected TPU devices: )r[   r)   r;   splitr!   r   r   r   rV      s   
rV   )rJ   typingr   r   r$    lightning_utilities.core.importsr   typing_extensionsr   )lightning_fabric.accelerators.acceleratorr   &lightning_fabric.accelerators.registryr   (lightning_fabric.utilities.device_parserr   r	   r   r3   rR   rL   r   r)   r   rI   r    objectrW   rV   r   r   r   r   <module>   s    
M,"