Ë
      çiå  ã                   óÀ   — d dl mZmZ d dlmZ d dlm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Zd dlmZmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZ  G d„ dee«      Zy)é    )ÚABCÚabstractmethod)Ú	Generator)Úcontextmanager)ÚAnyÚOptionalN)ÚTensor)Úoverride)ÚCheckpointIOÚClusterEnvironment)ÚReduceOpÚ_all_gather_ddp_if_available)Ú	LayerSync)Ú	Precision)ÚStrategyc                   óL  ‡ — e Zd ZdZ	 	 	 	 	 dded   deeej                        dee   dee	   dee
   f
ˆ fd	„Zeeed
ej                  fd„«       «       «       Zed
efd„«       Zed
efd„«       Zed
efd„«       Zed
efd„«       Zeed
efd„«       «       Zed
eeej                        fd„«       Zej0                  deeej                        d
dfd„«       Zed
eeef   fd„«       Zeddedee   ded
efd„«       Zeddeded
efd„«       Ze d
e!fd„«       Z"ed ˆ fd„«       Z#ˆ xZ$S )!ÚParallelStrategyz:Strategy for training with multiple processes in parallel.NÚacceleratorzpl.accelerators.AcceleratorÚparallel_devicesÚcluster_environmentÚcheckpoint_ioÚprecision_pluginc                 óT   •— t         ‰| �  |||¬«       || _        || _        d | _        y )N)r   r   r   )ÚsuperÚ__init__r   r   Ú_layer_sync)Úselfr   r   r   r   r   Ú	__class__s         €úz/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/pytorch_lightning/strategies/parallel.pyr   zParallelStrategy.__init__"   s2   ø€ ô 	‰Ñ [ÀÐ`pÐÔqØ 0ˆÔØATˆÔ Ø04ˆÕó    Úreturnc                  ó   — y)zReturn the root device.N© ©r   s    r   Úroot_devicezParallelStrategy.root_device/   s   � r    c                 óR   — | j                   �| j                   j                  «       S dS ©Nr   )r   Úglobal_rankr$   s    r   r(   zParallelStrategy.global_rank5   s(   € à9=×9QÑ9QÐ9]ˆt×'Ñ'×3Ñ3Ó5ÐdÐcdÐdr    c                 óR   — | j                   �| j                   j                  «       S dS r'   )r   Ú
local_rankr$   s    r   r*   zParallelStrategy.local_rank9   ó(   € à8<×8PÑ8PÐ8\ˆt×'Ñ'×2Ñ2Ó4ÐcÐbcÐcr    c                 óR   — | j                   �| j                   j                  «       S dS r'   )r   Ú	node_rankr$   s    r   r-   zParallelStrategy.node_rank=   s(   € à7;×7OÑ7OÐ7[ˆt×'Ñ'×1Ñ1Ó3ÐbÐabÐbr    c                 óR   — | j                   �| j                   j                  «       S dS )Né   )r   Ú
world_sizer$   s    r   r0   zParallelStrategy.world_sizeA   r+   r    c                 ó    — | j                   dk(  S r'   )r(   r$   s    r   Úis_global_zerozParallelStrategy.is_global_zeroE   s   € ð ×Ñ 1Ñ$Ð$r    c                 ó   — | j                   S ©N©Ú_parallel_devicesr$   s    r   r   z!ParallelStrategy.parallel_devicesJ   s   € à×%Ñ%Ð%r    c                 ó   — || _         y r4   r5   )r   r   s     r   r   z!ParallelStrategy.parallel_devicesN   s
   € à!1ˆÕr    c                 ób   — | j                   �t        | j                   «      nd| j                  dœS )Nr   )Únum_replicasÚrank)r   Úlenr(   r$   s    r   Údistributed_sampler_kwargsz+ParallelStrategy.distributed_sampler_kwargsR   s3   € ð ;?×:OÑ:OÐ:[œC × 5Ñ 5Ô6ÐabØ×$Ñ$ñ
ð 	
r    ÚtensorÚgroupÚ
sync_gradsc                 ó   — t        |||¬«      S )z&Perform a all_gather on all processes.)r>   r?   )r   )r   r=   r>   r?   s       r   Ú
all_gatherzParallelStrategy.all_gatherY   s   € ô ,¨F¸%ÈJÔWÐWr    ÚdecisionÚallc                 óê   — t        j                  t        |«      | j                  ¬«      }| j	                  |t
        j                  ¬«      }|rt        || j                  k(  «      }|S t        |«      }|S )aè  Reduces a boolean decision over distributed processes. By default is analogous to ``all`` from the standard
        library, returning ``True`` only if all input decisions evaluate to ``True``. If ``all`` is set to ``False``,
        it behaves like ``any`` instead.

        Args:
            decision: A single input decision.
            all: Whether to logically emulate ``all`` or ``any``. Defaults to True.

        Returns:
            bool: The reduced boolean decision.

        )Údevice)Ú	reduce_op)	Útorchr=   Úintr%   Úreducer   ÚSUMÚboolr0   )r   rB   rC   s      r   Úreduce_boolean_decisionz(ParallelStrategy.reduce_boolean_decision^   si   € ô —<‘<¤ H£°d×6FÑ6FÔGˆØ—;‘;ØÜ—l‘lð ó 
ˆñ 9<”4˜ D§O¡OÑ3Ó4ˆØˆô BFÀhÃˆØˆr    c              #   óì   K  — t        | j                  t        j                  j                  j
                  «      r(| j                  j                  «       5  d–— ddd«       yd–— y# 1 sw Y   yxY w­w)zàBlocks ddp sync gradients behaviour on backwards pass.

        This is useful for skipping sync when accumulating gradients, reducing communication overhead
        Returns: context manager with sync behaviour off

        N)Ú
isinstanceÚmodelÚplÚ	utilitiesÚtypesÚDistributedDataParallelÚno_syncr$   s    r   Úblock_backward_syncz$ParallelStrategy.block_backward_synct   sR   è ø€ ô �d—j‘j¤"§,¡,×"4Ñ"4×"LÑ"LÔMØ—‘×#Ñ#Õ%Ø’
÷ &Ð%ð ‹J÷ &Ð%üs   ‚AA4ÁA(ÁA4Á(A1Á-A4c                 ór   •— | j                   €J ‚| j                   j                  «        t        ‰| �  «        y r4   )r   Úteardownr   )r   r   s    €r   rW   zParallelStrategy.teardown‚   s2   ø€ à×'Ñ'Ð3Ð3Ð3Ø× Ñ ×)Ñ)Ô+Ü‰ÑÕr    )NNNNN)NF)T)r!   N)%Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚlistrG   rE   r   r   r   r   Úpropertyr   r
   r%   rH   r(   r*   r-   r0   rK   r2   r   ÚsetterÚdictÚstrr   r<   r	   rA   rL   r   r   rU   rW   Ú__classcell__)r   s   @r   r   r      sS  ø„ ÙDð @DØ9=Ø<@Ø04Ø04ñ5àÐ;Ñ<ð5ð # 4¨¯©Ñ#5Ñ6ð5ð &Ð&8Ñ9ð	5ð
   Ñ-ð5ð # 9Ñ-õ5ð ØØð&˜UŸ\™\ò &ó ó ó ð&ð ðe˜Sò eó ðeð ðd˜Cò dó ðdð ðc˜3ò có ðcð ðd˜Cò dó ðdð Øð% ò %ó ó ð%ð ð& (¨4°·±Ñ+=Ñ">ò &ó ð&ð ×Ñð2°¸$¸u¿|¹|Ñ:LÑ1Mð 2ÐRVò 2ó ð2ð ð
¨D°°c°©Nò 
ó ð
ð ñX ð X°¸±ð XÐRVð XÐciò Xó ðXð ñ°ð ¸4ð È4ò ó ðð* ð Yò ó ðð ôó ôr    r   )Úabcr   r   Úcollections.abcr   Ú
contextlibr   Útypingr   r   rG   r	   Útyping_extensionsr
   Úpytorch_lightningrP   Úlightning_fabric.pluginsr   r   Ú&lightning_fabric.utilities.distributedr   r   Úpytorch_lightning.pluginsr   Ú#pytorch_lightning.plugins.precisionr   Ú%pytorch_lightning.strategies.strategyr   r   r#   r    r   Ú<module>rm      s>   ð÷ $Ý %Ý %ß  ã Ý Ý &ã ß Eß YÝ /Ý 9Ý :ôg�x õ gr    