Ë
      çi³,  ã                   ó  — d dl Z d dlmZmZ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 d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z'm(Z( erd dl)m*Z*  G d„ de«      Z+y)é    N)ÚTYPE_CHECKINGÚAnyÚCallableÚOptionalÚUnion)ÚTensor)ÚModule)Ú	Optimizer)Ú
DataLoader)Úoverride)ÚAccelerator)Ú_XLA_GREATER_EQUAL_2_1)ÚCheckpointIOÚ	PrecisionÚXLAPrecision)ÚXLAEnvironment)ÚXLACheckpointIO)ÚParallelStrategyÚ_StrategyRegistry)Ú_XLALauncher)Ú
TBroadcast)Úrank_zero_only)Ú_PATHÚReduceOp©ÚMpDeviceLoaderc                   óÎ  ‡ — e Zd ZdZ	 	 	 	 	 d2dee   deeej                        dee	   dee
   deddfˆ fd	„Zeedej                  fd
„«       «       Zedefd„«       Zeede	fd„«       «       Zej&                  edee   ddfd„«       «       Zeede
fd„«       «       Zej&                  edee   ddfd„«       «       Zeedefˆ fd„«       «       Zeedefˆ fd„«       «       Zeedefˆ fd„«       «       Zeedefˆ fd„«       «       Zed3d„«       Zed3ˆ fd„«       Zededefd„«       Zededdfd„«       Zede ddfd„«       Z!ed4de"dee#   dede"fd „«       Z$e	 d5d!e%e"e#f   dee#   d"ee%e&e'f      de"fd#„«       Z(ed6d$ee'   d%e#d&e#ddfd'„«       Z)ed7d(e*d)ede*fd*„«       Z+e	 	 d5d+e,d,e-e'e%ee.e#f   f   d-ee#   d.ee-e'e/e'e#gef   f      ddf
ˆ fd/„«       Z0e1ed0e2ddfd1„«       «       Z3ˆ xZ4S )8ÚXLAStrategyzxStrategy for training multiple TPU devices using the :func:`torch_xla.distributed.xla_multiprocessing.spawn`
    method.NÚacceleratorÚparallel_devicesÚcheckpoint_ioÚ	precisionÚsync_module_statesÚreturnc                 óh   •— t         ‰| �  ||t        «       ||¬«       d | _        d| _        || _        y )N)r   r    Úcluster_environmentr!   r"   F)ÚsuperÚ__init__r   Ú_backward_sync_controlÚ	_launchedÚ_sync_module_states)Úselfr   r    r!   r"   r#   Ú	__class__s         €út/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/lightning_fabric/strategies/xla.pyr(   zXLAStrategy.__init__+   sB   ø€ ô 	‰ÑØ#Ø-Ü .Ó 0Ø'Øð 	ô 	
ð '+ˆÔ#ØˆŒØ#5ˆÕ ó    c                 ób   — | j                   st        d«      ‚dd lmc m} |j                  «       S )NzFAccessing the XLA device before processes have spawned is not allowed.r   )r*   ÚRuntimeErrorÚtorch_xla.core.xla_modelÚcoreÚ	xla_modelÚ
xla_device)r,   Úxms     r.   Úroot_devicezXLAStrategy.root_device>   s)   € ð �~Š~ÜÐgÓhÐhß-Ð-à�}‰}‹Ðr/   c                 óH   — | j                   �t        | j                   «      S dS ©Nr   )r    Úlen©r,   s    r.   Únum_processeszXLAStrategy.num_processesG   s$   € à-1×-BÑ-BÐ-NŒs�4×(Ñ(Ó)ÐUÐTUÐUr/   c                 óZ   — | j                   }|�t        |t        «      sJ ‚|S t        «       S ©N)Ú_checkpoint_ioÚ
isinstancer   ©r,   Úplugins     r.   r!   zXLAStrategy.checkpoint_ioK   s3   € ð ×$Ñ$ˆØÐÜ˜f¤oÔ6Ð6Ð6ØˆMÜÓ Ð r/   Úioc                 óR   — |�t        |t        «      st        d|› �«      ‚|| _        y )NzHThe XLA strategy can only work with the `XLACheckpointIO` plugin, found )r@   r   Ú	TypeErrorr?   )r,   rC   s     r.   r!   zXLAStrategy.checkpoint_ioT   s/   € ð ˆ>¤*¨R´Ô"AÜÐfÐgiÐfjÐkÓlÐlØ ˆÕr/   c                 ó\   — | j                   }|�t        |t        «      sJ ‚|S t        d«      S )Nz32-true)Ú
_precisionr@   r   rA   s     r.   r"   zXLAStrategy.precision[   s3   € ð —‘ˆØÐÜ˜f¤lÔ3Ð3Ð3ØˆMÜ˜IÓ&Ð&r/   c                 óR   — |�t        |t        «      st        d|› �«      ‚|| _        y )NzEThe XLA strategy can only work with the `XLAPrecision` plugin, found )r@   r   rE   rG   )r,   r"   s     r.   r"   zXLAStrategy.precisiond   s/   € ð Ð ¬°I¼|Ô)LÜÐcÐdmÐcnÐoÓpÐpØ#ˆ�r/   c                 ó4   •— | j                   r
t        ‰| �  S dS r9   )r*   r'   Úglobal_rank©r,   r-   s    €r.   rJ   zXLAStrategy.global_rankk   s   ø€ ð '+§n¢nŒu‰wÑ"Ð;¸!Ð;r/   c                 ó4   •— | j                   r
t        ‰| �  S dS r9   )r*   r'   Ú
local_rankrK   s    €r.   rM   zXLAStrategy.local_rankp   ó   ø€ ð &*§^¢^Œu‰wÑ!Ð:¸Ð:r/   c                 ó4   •— | j                   r
t        ‰| �  S dS r9   )r*   r'   Ú	node_rankrK   s    €r.   rP   zXLAStrategy.node_ranku   s   ø€ ð %)§N¢NŒu‰wÑ Ð9¸Ð9r/   c                 ó4   •— | j                   r
t        ‰| �  S dS )Né   )r*   r'   Ú
world_sizerK   s    €r.   rS   zXLAStrategy.world_sizez   rN   r/   c                 ó$   — t        | «      | _        y r>   )r   Ú	_launcherr;   s    r.   Ú_configure_launcherzXLAStrategy._configure_launcher   s   € ä% dÓ+ˆ�r/   c                 óê   •— | j                   €J ‚t        | j                   «      dk(  r"t        dt        | «      j                  › d�«      ‚d| _        | j                  t        _        t        ‰| �)  «        y )NrR   zThe zƒ does not support running on a single device with the PjRT runtime. Try using all devices or the `SingleDeviceXLAStrategy` strategyT)r    r:   ÚNotImplementedErrorÚtypeÚ__name__r*   rJ   r   Úrankr'   Úsetup_environmentrK   s    €r.   r\   zXLAStrategy.setup_environmentƒ   sw   ø€ à×$Ñ$Ð0Ð0Ð0Üˆt×$Ñ$Ó%¨Ò*ô &Ø”t˜D“z×*Ñ*Ð+ð ,Sð Sóð ð
 ˆŒØ"×.Ñ.ŒÔÜ‰Ñ!Õ#r/   Úmodulec                 óT   — | j                   rt        rddlm} nddlm}  ||«       |S )Nr   )Úbroadcast_master_param)r+   r   r2   r_   Útorch_xla.experimental.pjrt)r,   r]   r_   s      r.   Úsetup_modulezXLAStrategy.setup_module’   s!   € à×#Ò#Ý%ÞKåNá" 6Ô*àˆr/   c                 ó:   — |j                  | j                  «       y r>   )Útor7   )r,   r]   s     r.   Úmodule_to_devicezXLAStrategy.module_to_devicež   s   € à�	‰	�$×"Ñ"Õ#r/   Ú
dataloaderr   c                 óÂ   — ddl m} t        ||«      r|S  ||| j                  «      }|j                  j
                  |_        t        |j                  dd «      |_        |S )Nr   r   Úbatch_sampler)Ú%torch_xla.distributed.parallel_loaderr   r@   r7   Ú_loaderÚdatasetÚgetattrrg   )r,   re   r   s      r.   Úprocess_dataloaderzXLAStrategy.process_dataloader¢   sY   € åHä�j .Ô1àÐá# J°×0@Ñ0@ÓAˆ
à'×/Ñ/×7Ñ7ˆ
ÔÜ#*¨:×+=Ñ+=¸ÐPTÓ#Uˆ
Ô ØÐr/   ÚtensorÚgroupÚ
sync_gradsc                 ó®  — | j                   s|S t        |t        «      s$t        dt	        | «      j
                  › d|› �«      ‚|j                  «       dk(  r|j                  d«      }|j                  }|j                  | j                  «      }ddlmc m} ddlmc m} |r|j!                  |«      n|j!                  |«      }|j                  |«      }|S )aC  Function to gather a tensor from several distributed processes.

        Args:
            tensor: tensor to all-gather.
            group: unused.
            sync_grads: flag that allows users to synchronize gradients for the all-gather operation.
        Return:
            A tensor of shape (world_size, ...)

        Ú`z4.all_gather` is only implemented for tensors. Given r   N)r*   r@   r   rX   rY   rZ   ÚdimÚ	unsqueezeÚdevicerc   r7   Útorch_xla.core.functionsr3   Ú	functionsr2   r4   Ú
all_gather)r,   rm   rn   ro   Úoriginal_deviceÚxfr6   s          r.   rw   zXLAStrategy.all_gather°   s¼   € ð �~Š~ØˆMÜ˜&¤&Ô)Ü%Ø”D˜“J×'Ñ'Ð(Ð(\Ð]cÐ\dÐeóð ð �:‰:‹<˜1ÒØ×%Ñ% aÓ(ˆFØ Ÿ-™-ˆØ—‘˜4×+Ñ+Ó,ˆç-Ð-ß-Ð-á*4�—‘˜vÔ&¸"¿-¹-ÈÓ:OˆØ—‘˜?Ó+ˆØˆr/   ÚoutputÚ	reduce_opc                 óÀ  — t        |t        «      s!t        j                  || j                  ¬«      }t        |t
        «      xr |t
        j                  k7  }t        |t        «      xr |j                  «       dv}|s|rt        d|› �«      ‚dd l
mc m} |j                  d|t        «      }t        |t        «      r!|j                  «       dv r|| j                  z  }|S )N)rt   )ÚsumÚmeanÚavgz]Currently, the XLAStrategy only supports `sum`, `mean`, `avg` for the reduce operation, got: r   Úreduce)r   r~   )r@   r   Útorchrm   r7   r   ÚSUMÚstrÚlowerÚ
ValueErrorr2   r3   r4   Úmesh_reducer}   rS   )r,   rz   rn   r{   Úinvalid_reduce_opÚinvalid_reduce_op_strr6   s          r.   Ú
all_reducezXLAStrategy.all_reduceÎ   sÅ   € ô ˜&¤&Ô)Ü—\‘\ &°×1AÑ1AÔBˆFä& y´(Ó;ÒYÀ	ÌXÏ\É\Ñ@YÐÜ *¨9´cÓ :Ò n¸y¿¹Ó?PÐXnÐ?nÐÙÑ 5ÜðØ�;ð óð ÷ 	.Ð-à—‘ ¨&´#Ó6ˆä�i¤Ô%¨)¯/©/Ó*;¸Ñ*NØ˜dŸo™oÑ-ˆFàˆr/   ÚnameÚargsÚkwargsc                 óZ   — | j                   sy dd lmc m} |€d}|j	                  |«       y )Nr   Ú )r*   r2   r3   r4   Ú
rendezvous)r,   rŠ   r‹   rŒ   r6   s        r.   ÚbarrierzXLAStrategy.barrierå   s(   € à�~Š~Øß-Ð-àˆ<àˆDØ
�‰�dÕr/   ÚobjÚsrcc                 óÚ  — | j                   s|S dd lmc m} t	        |t
        «      }|rL|j                  «       dk(  r|j                  d«      }|j                  }|j                  | j                  «      }nqt        j                  «       }t        j                  ||«       t        j                  t!        |j#                  «       «      | j                  t        j$                  ¬«      }|g}|j'                  ||¬«       |d   }|sVt        j                  |j)                  «       j+                  «       j-                  «       «      }t        j.                  |«      }|S |j                  «      }|S )Nr   )rt   Údtype)Úroot_ordinal)r*   r2   r3   r4   r@   r   rr   rs   rt   rc   r7   rC   ÚBytesIOr�   Úsaverm   Ú	bytearrayÚ	getbufferÚfloatÚcollective_broadcastÚcpuÚbyteÚnumpyÚload)r,   r‘   r’   r6   Ú	is_tensorrx   Úbuffers          r.   Ú	broadcastzXLAStrategy.broadcastð   s  € à�~Š~ØˆJç-Ð-ä˜s¤FÓ+ˆ	ÙØ�w‰w‹y˜AŠ~Ø—m‘m AÓ&�Ø!Ÿj™jˆOà—&‘&˜×)Ñ)Ó*‰Cô —Z‘Z“\ˆFÜ�J‰J�s˜FÔ#Ü—,‘,Ü˜&×*Ñ*Ó,Ó-°d×6FÑ6FÌeÏkÉkôˆCð ˆeˆØ
×Ñ °#ÐÔ6Ø�!‰fˆáä—Z‘Z §¡£	§¡Ó 0× 6Ñ 6Ó 8Ó9ˆFÜ—*‘*˜VÓ$ˆCð ˆ
ð —&‘&˜Ó)ˆCàˆ
r/   ÚpathÚstateÚstorage_optionsÚfilterc                 ó^   •— ddl mc m} |j                  «        t        ‰| �  ||||¬«       y)a„  Save model, optimizer, and other state as a checkpoint file.

        Args:
            path: A path to where the file(s) should be saved
            state: A dictionary with contents to be saved. If the dict contains modules or optimizers, their
                state-dict will be retrieved and converted automatically.
            storage_options: Additional options for the ``CheckpointIO`` plugin
            filter: An optional dictionary of the same format as ``state`` mapping keys to callables that return a
                boolean indicating whether the given parameter should be saved (``True``) or filtered out (``False``).

        r   N)r¥   r¦   )r2   r3   r4   Ú	mark_stepr'   Úsave_checkpoint)r,   r£   r¤   r¥   r¦   r6   r-   s         €r.   r©   zXLAStrategy.save_checkpoint  s-   ø€ ÷& 	.Ð-ð 	�‰Œä‰Ñ  e¸_ÐU[ÐÕ\r/   Ústrategy_registryc                 ó@   — |j                  d| | j                  ¬«       y )NÚxla)Údescription)ÚregisterrZ   )Úclsrª   s     r.   Úregister_strategieszXLAStrategy.register_strategies-  s   € ð 	×"Ñ" 5¨#¸3¿<¹<Ð"ÕHr/   )NNNNT)r$   N)NF)NNr>   )r   )5rZ   Ú
__module__Ú__qualname__Ú__doc__r   r   Úlistr�   rt   r   r   Úboolr(   Úpropertyr   r7   Úintr<   r!   Úsetterr   r"   r   rJ   rM   rP   rS   rV   r\   r	   ra   rd   r   rl   r   r   rw   r   r   rƒ   r‰   r�   r   r¢   r   Údictr
   r   r©   Úclassmethodr   r°   Ú__classcell__)r-   s   @r.   r   r   '   s)  ø„ ñð
 .2Ø9=Ø37Ø,0Ø#'ñ6à˜kÑ*ð6ð # 4¨¯©Ñ#5Ñ6ð6ð   Ñ0ð	6ð
 ˜LÑ)ð6ð !ð6ð 
õ6ð& Øð˜UŸ\™\ò ó ó ðð ðV˜sò Vó ðVð Øð!˜ò !ó ó ð!ð ×ÑØð! ¨Ñ 6ð !¸4ò !ó ó ð!ð
 Øð'˜<ò 'ó ó ð'ð ×ÑØð$ 8¨IÑ#6ð $¸4ò $ó ó ð$ð
 Øð<˜Sô <ó ó ð<ð Øð;˜Cô ;ó ó ð;ð Øð:˜3ô :ó ó ð:ð Øð;˜Cô ;ó ó ð;ð ò,ó ð,ð ô$ó ð$ð ð	 6ð 	¨fò 	ó ð	ð ð$ vð $°$ò $ó ð$ð ð¨Zð Ð<Lò ó ðð ñ ð °¸±ð ÐRVð Ðciò ó ðð: àswñØ˜F C˜KÑ(ðØ19¸#±ðØRZÐ[`ÐaiÐknÐanÑ[oÑRpðà	òó ðð, ñ˜H S™Mð ¸ð Èð ÐPTò ó ðð ñ ˜Zð  ¨cð  ¸*ò  ó ð ðD ð
 *.ØBFñ]àð]ð �C˜˜v y°#Ð5Ñ6Ð6Ñ7ð]ð " #™ð	]ð
 ˜˜c 8¨S°#¨J¸Ð,<Ñ#=Ð=Ñ>Ñ?ð]ð 
ô]ó ð]ð2 ØðIÐ4Eð IÈ$ò Ió ó ôIr/   r   ),rC   Útypingr   r   r   r   r   r�   r   Útorch.nnr	   Útorch.optimr
   Útorch.utils.datar   Útyping_extensionsr   Úlightning_fabric.acceleratorsr   Ú!lightning_fabric.accelerators.xlar   Úlightning_fabric.pluginsr   r   r   Ú%lightning_fabric.plugins.environmentsr   Úlightning_fabric.plugins.io.xlar   Úlightning_fabric.strategiesr   r   Ú)lightning_fabric.strategies.launchers.xlar   Ú$lightning_fabric.strategies.strategyr   Ú$lightning_fabric.utilities.rank_zeror   Ú lightning_fabric.utilities.typesr   r   rh   r   r   © r/   r.   Ú<module>rÌ      sZ   ðó 
ß @Õ @ã Ý Ý Ý !Ý 'Ý &å 5Ý Dß JÑ JÝ @Ý ;ß KÝ BÝ ;Ý ?ß <áÝDôIIÐ"õ IIr/   