o
    zi                     @  s   d dl mZ d dlmZ d dlZd dlm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mZ G dd deZdS )    )annotations)AnyN)Tensor)override)CheckpointIO)_StrategyRegistry)_DEVICE)	Precision)Strategy
TBroadcastc                      s   e Zd ZdZdZ				d4d5 fddZed6ddZed7d8ddZe	ed9d d!Z
ed:d#d$Ze	ed;d%d&Zed<d'd(Zed=d>d.d/Zeed?d2d3Z  ZS )@SingleDeviceStrategyz7Strategy that handles communication on a single device.single_devicecpuNdevicer   accelerator.pl.accelerators.accelerator.Accelerator | Nonecheckpoint_ioCheckpointIO | Noneprecision_pluginPrecision | Nonec                   sD   t  j|||d t|tjst|}|| _d| _d| _d| _d S )N)r   r   r   r      )	super__init__
isinstancetorchr   _root_deviceglobal_rank
local_rank
world_size)selfr   r   r   r   	__class__ ^/home/ubuntu/.local/lib/python3.10/site-packages/pytorch_lightning/strategies/single_device.pyr   #   s   

zSingleDeviceStrategy.__init__tensorAny | Tensorargsr   kwargsreturnc                 O     |S )a  Reduces a tensor from several distributed processes to one aggregated tensor. Since this strategy only
        operates with a single device, the reduction is simply the identity.

        Args:
            tensor: the tensor to sync and reduce
            *args: ignored
            **kwargs: ignored

        Return:
            the unmodified input as reduction is not needed for single process operation

        r"   )r   r$   r&   r'   r"   r"   r#   reduce2   s   zSingleDeviceStrategy.reduceFr   group
Any | None
sync_gradsboolc                 C  r)   )z&Perform a all_gather on all processes.r"   )r   r$   r+   r-   r"   r"   r#   
all_gatherB      zSingleDeviceStrategy.all_gathertorch.devicec                 C  s   | j S N)r   r   r"   r"   r#   root_deviceG   s   z SingleDeviceStrategy.root_deviceNonec                 C  s$   | j d us	J d| j | j d S )Nz-self.model must be set before self.model.to())modeltor4   r3   r"   r"   r#   model_to_deviceL   s   z$SingleDeviceStrategy.model_to_devicec                 C  s   dS )NTr"   r3   r"   r"   r#   is_global_zeroQ   r0   z#SingleDeviceStrategy.is_global_zeroc                 O  s   d S r2   r"   )r   r&   r'   r"   r"   r#   barrierV      zSingleDeviceStrategy.barrierr   objr   srcintc                 C  r)   r2   r"   )r   r<   r=   r"   r"   r#   	broadcastZ   r;   zSingleDeviceStrategy.broadcaststrategy_registryr   c                 C  s   |j | j| | jd d S )N)description)registerstrategy_name__name__)clsr@   r"   r"   r#   register_strategies^   s
   
z(SingleDeviceStrategy.register_strategies)r   NNN)r   r   r   r   r   r   r   r   )r$   r%   r&   r   r'   r   r(   r%   )NF)r$   r   r+   r,   r-   r.   r(   r   )r(   r1   )r(   r5   )r(   r.   )r&   r   r'   r   r(   r5   )r   )r<   r   r=   r>   r(   r   )r@   r   r(   r5   )rD   
__module____qualname____doc__rC   r   r   r*   r/   propertyr4   r8   r9   r:   r?   classmethodrF   __classcell__r"   r"   r    r#   r      s6    r   )
__future__r   typingr   r   r   typing_extensionsr   pytorch_lightningpllightning_fabric.pluginsr   lightning_fabric.strategiesr    lightning_fabric.utilities.typesr   #pytorch_lightning.plugins.precisionr	   %pytorch_lightning.strategies.strategyr
   r   r   r"   r"   r"   r#   <module>   s   