o
    zi]                     @   s   d dl Z d dlmZmZ d dlZd dl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 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mZ G dd deZdS )    N)OptionalUnion)override)_XLA_AVAILABLE)XLACheckpointIO)_StrategyRegistry)_optimizers_to_device)_DEVICE)_WrappingCheckpointIO)XLAPrecision)SingleDeviceStrategy)	TrainerFn)find_shared_parametersset_shared_parametersc                       s
  e Zd ZdZ				ddeded deeeef  dee	 d	e
f
 fd
dZeedeeef fddZejedeeeef  ddfddZeede	fddZejedee	 ddfddZedddZeededdfddZed fddZ  ZS ) SingleDeviceXLAStrategyz-Strategy for training on a single XLA device.NFdeviceacceleratorzpl.accelerators.Acceleratorcheckpoint_ioprecision_plugindebugc                    sX   t sttt t|tjr|j}dd lm  m	} t
 j|||||d || _d S )Nr   )r   r   r   r   )r   ModuleNotFoundErrorstr
isinstancetorchr   indextorch_xla.core.xla_modelcore	xla_modelsuper__init__
xla_devicer   )selfr   r   r   r   r   xm	__class__ [/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_lightning/strategies/single_xla.pyr   $   s   
z SingleDeviceXLAStrategy.__init__returnc                 C   s*   | j }|d urt|ttfsJ |S t S N)_checkpoint_ior   r   r
   r!   pluginr%   r%   r&   r   ;   s
   z%SingleDeviceXLAStrategy.checkpoint_ioioc                 C   s.   |d urt |ttfstd| || _d S )NzHThe XLA strategy can only work with the `XLACheckpointIO` plugin, found )r   r   r
   	TypeErrorr)   )r!   r,   r%   r%   r&   r   D   s   
c                 C   s&   | j }|d urt|tsJ |S t S r(   )_precision_pluginr   r   r*   r%   r%   r&   r   K   s
   z(SingleDeviceXLAStrategy.precision_pluginc                 C   s*   |d urt |tstd| || _d S )NzEThe XLA strategy can only work with the `XLAPrecision` plugin, found )r   r   r-   r.   )r!   r   r%   r%   r&   r   T   s   
trainer
pl.Trainerc                 C   s   | j r
tdtjd< | jd usJ | j| | jd usJ | j| j t	| j}| 
  t| j| | | j| _|jjtjkrG| | |   |jjtjkr[t| j| j d S d S )N   PT_XLA_DEBUG)r   r   osenvironr   setupmodelr   convert_moduler   model_to_devicer   _setup_modelstatefnr   FITTINGsetup_optimizerssetup_precision_pluginr   
optimizersroot_device)r!   r/   shared_paramsr%   r%   r&   r5   [   s    

zSingleDeviceXLAStrategy.setupstrategy_registryc                 C   s   |j d| | jd d S )N
single_xla)description)register__name__)clsrB   r%   r%   r&   register_strategiesr   s   z+SingleDeviceXLAStrategy.register_strategiesc                    s   t    tjdd  d S )Nr2   )r   teardownr3   r4   pop)r!   r#   r%   r&   rI   w   s   
z SingleDeviceXLAStrategy.teardown)NNNF)r/   r0   r'   N)r'   N)rF   
__module____qualname____doc__r	   r   r   r   r
   r   boolr   propertyr   r   setterr   r5   classmethodr   rH   rI   __classcell__r%   r%   r#   r&   r   !   sH    "r   )r3   typingr   r   r   typing_extensionsr   pytorch_lightningpl!lightning_fabric.accelerators.xlar   lightning_fabric.pluginsr   lightning_fabric.strategiesr   $lightning_fabric.utilities.optimizerr    lightning_fabric.utilities.typesr	   $pytorch_lightning.plugins.io.wrapperr
   'pytorch_lightning.plugins.precision.xlar   *pytorch_lightning.strategies.single_devicer    pytorch_lightning.trainer.statesr   pytorch_lightning.utilitiesr   r   r   r%   r%   r%   r&   <module>   s    