Ë
      çi¡  ã            
       óP  — d dl Z d dl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 d dlmZ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!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. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z> d dl9m?Z@ d dlAmBZBmCZC d dlDmEZE d dlFmGZGmHZHmIZImJZJ d dlKmLZLmZmMZM d dlNmOZO d dlPmQZQmRZR er<d dlSmTZT d dlUmVZVmWZWmXZX d d lYmZZZ d d!l[m\Z\ ee]e^e      eee_e`ge_f   eZf   ZaeeXed"   f   Zbd#Zc ejÈ                  d$eed%¬&«        G d'„ d(e0e7«      Zfd)eee^e   ege^e      f      d*ed+   d,ehfd-„Zid.ed+   d/ehd,ehfd0„Zjd1ed2ehd,dfd3„Zk G d4„ d5e6«      Zld6eee_d7f      d,d7fd8„Zmd9d:d/ehd,d;fd<„Znd=ed,e_fd>„Zod1ed,ed?   fd@„Zp	 dNd1edAe`dBe_d,ed?   fdC„ZqdDed,e_fdE„ZrdDed,e_fdF„Zsd1etd,e!e   fdG„Zud1ejì                  j:                  dHejî                  d,dfdI„ZxdJeheyef   dDed,dfdK„ZzdLeheyef   dDed,dfdM„Z{y)Oé    N)Ú	Generator)ÚAbstractContextManagerÚ	ExitStackÚnullcontext)Ú	timedelta)Úpartial)ÚPath)ÚTYPE_CHECKINGÚAnyÚCallableÚLiteralÚOptionalÚUnion)ÚRequirementCache)Úrank_zero_only)ÚTensor)ÚModule)Ú	Optimizer)Ú	TypeGuardÚoverride)ÚAccelerator)ÚCheckpointIOÚClusterEnvironmentÚ	Precision)Údefault_pg_timeout)ÚFSDPPrecision)Ú_SubprocessScriptLauncher)ÚParallelStrategy)Ú_StrategyRegistry)Ú
TBroadcastÚ_apply_filterÚ_BackwardSyncControlÚ_ShardedÚ!_validate_keys_for_strict_loading)ÚReduceOpÚ_distributed_is_initializedÚ-_get_default_process_group_backend_for_deviceÚ_init_dist_connectionÚ_sync_ddp_if_available©Úgroup)Ú_TORCH_GREATER_EQUAL_2_2Ú_TORCH_GREATER_EQUAL_2_3)Ú&_has_meta_device_parameters_or_buffers)Ú_METADATA_FILENAMEÚ
_lazy_loadÚ_materialize_tensorsÚ_move_state_into)Úrank_zero_deprecationr   Úrank_zero_warn)Ú
reset_seed)Ú_PATHÚ	_Stateful)Ú
DeviceMesh)Ú
CPUOffloadÚMixedPrecisionÚShardingStrategy©ÚModuleWrapPolicy)Ú_LRScheduler)Ú
FULL_SHARDÚSHARD_GRAD_OPÚNO_SHARDÚHYBRID_SHARD)ÚfsdpÚfsdp_cpu_offloadÚignorez.*FSDP.state_dict_type.*)ÚcategoryÚmessagec            !       óˆ  ‡ — e Zd ZdZdddddeddddddddfdee   deeej                        dee
   dee   d	ee   d
ee   deeddf   ded   ded   deeee   eee      f      ded   ddded   deeee   df      deddf ˆ fd„Zeedefd„«       «       Zej6                  ededdfd„«       «       Zeedej                  fd„«       «       Zedefd „«       Zej6                  d!eddfd"„«       Zedefd#„«       Zeedeeef   fd$„«       «       Z edee   fd%„«       Z!eded   fd&„«       Z"eede#fd'„«       «       Z$e$j6                  edee   ddfd(„«       «       Z$edQd)„«       Z%edQˆ fd*„«       Z&e	 dRd+ed,ee'   d-ed.   deeee'   ed.   f   fd/„«       Z(ed+edefd0„«       Z)ed1e'de'fˆ fd2„«       Z*ed+eddfd3„«       Z+edRd4ee   de,fd5„«       Z-ede,fd6„«       Z.e	 dSd7e/d8ee   d9eee0ef      de/fd:„«       Z1ed;ededdfd<„«       Z2edTd=e3d>ede3fd?„«       Z4e	 	 dUd+ed1e'd@ee5ef   dAee5ef   dBede/fdC„«       Z6e	 	 dVdDe7dEeeeee'ef   f   dFee   dGeeee8eegef   f      ddf
dH„«       Z9e	 	 	 dWdDe7dEeeee'eeeee'ef   f   f      dIedJee   deeef   f
dK„«       Z:e;edLe<ddfdM„«       «       Z=dQdN„Z>defdO„Z?dQdP„Z@ˆ xZAS )XÚFSDPStrategyae  Strategy for Fully Sharded Data Parallel provided by torch.distributed.

    Fully Sharded Training shards the entire model across all available GPUs, allowing you to scale model
    size, whilst using efficient communication to reduce overhead. In practice, this means we can remain
    at parity with PyTorch DDP, whilst scaling our model sizes dramatically. The technique is similar
    to ZeRO-Stage 3.

    For more information check out
    `this blogpost <https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api>`__.

    Defaults have been set and options have been exposed, but may require configuration
    based on your level of memory/speed efficiency. We suggest having a look at
    `this tutorial <https://pytorch.org/tutorials/intermediate/FSDP_tutorial.html>`__ for more information.

    Arguments:
        cpu_offload: See ``cpu_offload`` parameter in :class:`torch.distributed.fsdp.FullyShardedDataParallel`.
        mixed_precision: See ``mixed_precision`` parameter in :class:`torch.distributed.fsdp.FullyShardedDataParallel`.
        auto_wrap_policy: Same as ``auto_wrap_policy`` parameter in
            :class:`torch.distributed.fsdp.FullyShardedDataParallel`. For convenience, this also accepts a set of the
            layer classes to wrap.
        activation_checkpointing: Deprecated. Use ``activation_checkpointing_policy``.
        activation_checkpointing_policy: Same as ``auto_wrap_policy`` parameter in
            :class:`torch.distributed.fsdp.FullyShardedDataParallel` but used when selecting the modules for which you
            want to enable activation checkpointing. Enabling this can free up a significant amount of memory at the
            cost of speed since activations in these layers need to be recomputed during backpropagation. For
            convenience, this also accepts a set of the layer classes to wrap.
        sharding_strategy: Select whether to shard model parameters, gradients, optimizer states, or a combination of
            them. Available values are:

            - ``"FULL_SHARD"``: Shards model parameters, gradients, and optimizer states (default).
            - ``"SHARD_GRAD_OP"``: Shards gradients and optimizer states only. Model parameters get replicated.
            - ``"NO_SHARD"``: No sharding (identical to regular DDP).
            - ``"HYBRID_SHARD"``: Shards model parameters, gradients, and optimizer states within a single machine, but
              replicates across machines. See also the `device_mesh` parameter below.

            Also accepts a :class:`torch.distributed.fsdp.ShardingStrategy` enum value.

        device_mesh: A tuple `(replication size, sharding size)` that defines over how many devices to shard and
            replicate the model. The product of the two numbers must equal the world size. Only valid in combination
            with the `HYBRID_SHARD` sharding strategy.

        state_dict_type: The format in which the state of the model and optimizers gets saved into the checkpoint.

            - ``"full"``: The full weights and optimizer states get assembled on rank 0 and saved to a single file.
            - ``"sharded"``: Each rank saves its shard of weights and optimizer states to a file. The checkpoint is
              a folder with as many files as the world size.

        \**kwargs: See available parameters in :class:`torch.distributed.fsdp.FullyShardedDataParallel`.

    Nr?   ÚshardedÚacceleratorÚparallel_devicesÚcluster_environmentÚ	precisionÚprocess_group_backendÚtimeoutÚcpu_offloadr9   Úmixed_precisionr:   Úauto_wrap_policyÚ_POLICYÚactivation_checkpointingÚactivation_checkpointing_policyÚsharding_strategyÚ_SHARDING_STRATEGYÚstate_dict_type)ÚfullrJ   Údevice_meshr8   ÚkwargsÚreturnc                 ó¦  •— t         ‰| �  ||||¬«       d| _        || _        || _        t        «       | _        t        |	|«      | _        | j                  j                  dd«       |� t        st        d«      ‚|| j                  d<   t        |
|«      | _        || _        t        || j                  «      | _        t!        |«      | _        || _        y )N)rK   rL   rM   rN   é   Úuse_orig_paramsTz=The `device_mesh` argument is only supported in torch >= 2.2.r[   )ÚsuperÚ__init__Ú
_num_nodesÚ_process_group_backendÚ_timeoutÚ_FSDPBackwardSyncControlÚ_backward_sync_controlÚ_auto_wrap_policy_kwargsÚ_fsdp_kwargsÚ
setdefaultr,   Ú
ValueErrorÚ _activation_checkpointing_kwargsÚ_state_dict_typeÚ_init_sharding_strategyrW   Ú_init_cpu_offloadrQ   rR   )ÚselfrK   rL   rM   rN   rO   rP   rQ   rR   rS   rU   rV   rW   rY   r[   r\   Ú	__class__s                   €úu/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/lightning_fabric/strategies/fsdp.pyrb   zFSDPStrategy.__init__Š   sÜ   ø€ ô$ 	‰ÑØ#Ø-Ø 3Øð	 	ô 	
ð ˆŒØ5JˆÔ#Ø-4ˆŒÜ&>Ó&@ˆÔ#Ü4Ð5EÀvÓNˆÔð 	×Ñ×$Ñ$Ð%6¸Ô=àÐ"Ý+Ü Ð!`ÓaÐaØ/:ˆD×Ñ˜mÑ,ä0PØ$Ð&Eó1
ˆÔ-ð !0ˆÔÜ!8Ð9JÈD×L]ÑL]Ó!^ˆÔÜ,¨[Ó9ˆÔØ.ˆÕó    c                 óF   — t        dt        | «      j                  › d�«      ‚)NúThe `z3` does not use the `CheckpointIO` plugin interface.©ÚNotImplementedErrorÚtypeÚ__name__©rp   s    rr   Úcheckpoint_iozFSDPStrategy.checkpoint_io¸   ó$   € ô " E¬$¨t«*×*=Ñ*=Ð)>Ð>qÐ"rÓsÐsrs   Úioc                 óF   — t        dt        | «      j                  › d�«      ‚)Nru   z3` does not support setting a `CheckpointIO` plugin.rv   )rp   r}   s     rr   r{   zFSDPStrategy.checkpoint_io½   r|   rs   c                 óP   — | j                   €J ‚| j                   | j                     S ©N)rL   Ú
local_rankrz   s    rr   Úroot_devicezFSDPStrategy.root_deviceÂ   s+   € ð ×$Ñ$Ð0Ð0Ð0Ø×$Ñ$ T§_¡_Ñ5Ð5rs   c                 ó   — | j                   S r€   ©rc   rz   s    rr   Ú	num_nodeszFSDPStrategy.num_nodesÈ   s   € à�‰Ðrs   r…   c                 ó   — || _         y r€   r„   )rp   r…   s     rr   r…   zFSDPStrategy.num_nodesÌ   s	   € à#ˆ�rs   c                 óH   — | j                   �t        | j                   «      S dS )Nr   )rL   Úlenrz   s    rr   Únum_processeszFSDPStrategy.num_processesÐ   s$   € à-1×-BÑ-BÐ-NŒs�4×(Ñ(Ó)ÐUÐTUÐUrs   c                 óN   — | j                   | j                  z  | j                  dœS )N)Únum_replicasÚrank)r…   r‰   Úglobal_rankrz   s    rr   Údistributed_sampler_kwargsz'FSDPStrategy.distributed_sampler_kwargsÔ   s$   € ð "&§¡°$×2DÑ2DÑ!DÈt×O_ÑO_Ñ`Ð`rs   c                 ó   — | j                   S r€   )rd   rz   s    rr   rO   z"FSDPStrategy.process_group_backendÙ   s   € à×*Ñ*Ð*rs   c                 ó„   — | j                   r| j                   S | j                  }t        |t        «      r|j                  S y r€   )rR   rN   Ú
isinstancer   Úmixed_precision_config©rp   Úplugins     rr   r’   z#FSDPStrategy.mixed_precision_configÝ   s9   € à×ÒØ×'Ñ'Ð'Ø—‘ˆÜ�fœmÔ,Ø×0Ñ0Ð0Ørs   c                 ó\   — | j                   }|�t        |t        «      sJ ‚|S t        d«      S )Nz32-true)Ú
_precisionr‘   r   r“   s     rr   rN   zFSDPStrategy.precisionæ   s3   € ð —‘ˆØÐÜ˜f¤mÔ4Ð4Ð4ØˆMÜ˜YÓ'Ð'rs   c                 óR   — |�t        |t        «      st        d|› �«      ‚|| _        y )NzGThe FSDP strategy can only work with the `FSDPPrecision` plugin, found )r‘   r   Ú	TypeErrorr–   )rp   rN   s     rr   rN   zFSDPStrategy.precisionï   s/   € ð Ð ¬°I¼}Ô)MÜÐeÐfoÐepÐqÓrÐrØ#ˆ�rs   c                 ó®   — | j                   €J ‚| j                   j                  s1t        | j                   | j                  | j                  «      | _        y y r€   )rM   Úcreates_processes_externallyr   r‰   r…   Ú	_launcherrz   s    rr   Ú_configure_launcherz FSDPStrategy._configure_launcherö   sM   € à×'Ñ'Ð3Ð3Ð3Ø×'Ñ'×DÒDÜ6°t×7OÑ7OÐQU×QcÑQcÐei×esÑesÓtˆD�Nð Ers   c                 óè   •— t         ‰| �  «        | j                  «        t        | j                  j                  d«      t        «      r*ddlm}  |d| j                  d   «      | j                  d<   y y )Nr[   r   )Úinit_device_meshÚcuda)	ra   Úsetup_environmentÚ_setup_distributedr‘   ri   ÚgetÚtupleÚtorch.distributed.device_meshrž   )rp   rž   rq   s     €rr   r    zFSDPStrategy.setup_environmentü   sc   ø€ ä‰Ñ!Ô#Ø×ÑÔ!ô �d×'Ñ'×+Ñ+¨MÓ:¼EÔBÝFá/?ÀÈ×HYÑHYÐZgÑHhÓ/iˆD×Ñ˜mÒ,ð Crs   ÚmoduleÚ
optimizersÚ	schedulerr>   c                 ó°   — | j                   j                  d«      }|du r"t        dt        | «      j                  › d�«      ‚| j                  |«      }|||fS )zÞWraps the model into a :class:`~torch.distributed.fsdp.fully_sharded_data_parallel.FullyShardedDataParallel`
        module and sets `use_orig_params=True` to keep the reference to the original parameters in the optimizer.r`   Fz	You set `zõ(use_orig_params=False)` but this is not supported when setting the model and optimizer up jointly. Either set it to `True` or set the objects up in this order: Create the model, call `setup_module`, create the optimizer, call `setup_optimizer`.)ri   r¢   rk   rx   ry   Úsetup_module)rp   r¥   r¦   r§   r`   s        rr   Úsetup_module_and_optimizersz(FSDPStrategy.setup_module_and_optimizers  sk   € ð ×+Ñ+×/Ñ/Ð0AÓBˆØ˜eÑ#ÜØœD ›J×/Ñ/Ð0ð 1+ð +óð ð ×"Ñ" 6Ó*ˆØ�z 9Ð,Ð,rs   c           	      ó¾  ‡— ddl mŠ t        ˆfd„|j                  «       D «       «      r=t	        |«      rt        d«       d| j                  v rct        d«       | j                  d= nJ ‰d|| j                  | j                  | j                  | j                  j                  dœ| j                  ¤Ž}t        || j                  «       t        || j                  «       |S )	z|Wraps the model into a :class:`~torch.distributed.fsdp.fully_sharded_data_parallel.FullyShardedDataParallel`
        module.r   ©ÚFullyShardedDataParallelc              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr€   ©r‘   )Ú.0Úmodr­   s     €rr   Ú	<genexpr>z,FSDPStrategy.setup_module.<locals>.<genexpr>  s   øè ø€ ÐUÑDT¸SŒz˜#Ð7×8ÑDTùó   ƒzYThe model is already wrapped in `FSDP` but there are still parameters on the meta device.rS   z_A FSDP `auto_wrap_policy` is set, but the model is already wrapped. The policy will be ignored.)r¥   rQ   rR   rW   Ú	device_id© )Útorch.distributed.fsdpr­   ÚanyÚmodulesr.   r4   ri   rQ   r’   rW   r‚   ÚindexÚ_move_torchmetrics_to_deviceÚ_setup_activation_checkpointingrl   )rp   r¥   r­   s     @rr   r©   zFSDPStrategy.setup_module  sÒ   ø€ õ 	DäÓUÀFÇNÁNÔDTÓUÔUä5°fÔ=ÜØoôð " T×%6Ñ%6Ñ6ÜØuôð ×%Ñ%Ð&8Ñ9á-ð ØØ ×,Ñ,Ø $× ;Ñ ;Ø"&×"8Ñ"8Ø×*Ñ*×0Ñ0ñð ×#Ñ#ñˆFô 	% V¨T×-=Ñ-=Ô>ô 	(¨°×0UÑ0UÔVàˆrs   Ú	optimizerc                 óˆ   •— | j                   j                  d«      rt        ‰| �  |«      S t	        |«      st        d«      ‚|S )aI  Set up an optimizer for a model wrapped with FSDP.

        This setup method doesn't modify the optimizer or wrap the optimizer. The only thing it currently does is verify
        that the optimizer was created after the model was wrapped with :meth:`setup_module` with a reference to the
        flattened parameters.

        r`   z�The optimizer does not seem to reference any FSDP parameters. HINT: Make sure to create the optimizer after setting up the model.)ri   r¢   ra   Úsetup_optimizerÚ_optimizer_has_flat_paramsrk   )rp   r¼   rq   s     €rr   r¾   zFSDPStrategy.setup_optimizer:  sL   ø€ ð ×Ñ× Ñ Ð!2Ô3Ü‘7Ñ*¨9Ó5Ð5Ü)¨)Ô4äð/óð ð Ðrs   c                  ó   — y r€   rµ   )rp   r¥   s     rr   Úmodule_to_devicezFSDPStrategy.module_to_deviceM  s   € àrs   Ú
empty_initc                 óþ   — | j                   j                  «       }| j                  «       }t        «       }|r$|j	                  t        j                  d«      «       |j	                  |«       |j	                  |«       |S )NÚmeta)rN   Úmodule_init_contextÚmodule_sharded_contextr   Úenter_contextÚtorchÚdevice)rp   rÂ   Úprecision_init_ctxÚmodule_sharded_ctxÚstacks        rr   rÅ   z FSDPStrategy.module_init_contextQ  sj   € à!Ÿ^™^×?Ñ?ÓAÐØ!×8Ñ8Ó:ÐÜ“ˆÙð ×Ñ¤§¡¨VÓ 4Ô5Ø×ÑÐ.Ô/Ø×ÑÐ.Ô/Øˆrs   c           	      ó®   — ddl m} ddlm}  |d|| j                  | j
                  | j                  | j                  j                  dœ| j                  ¤ŽS )Nr   r¬   )Úenable_wrap)Úwrapper_clsrQ   rR   rW   r´   rµ   )
Ú2torch.distributed.fsdp.fully_sharded_data_parallelr­   Útorch.distributed.fsdp.wraprÎ   rQ   r’   rW   r‚   r¹   ri   )rp   r­   rÎ   s      rr   rÆ   z#FSDPStrategy.module_sharded_context_  sW   € å_Ý;áð 
Ø0Ø×(Ñ(Ø ×7Ñ7Ø"×4Ñ4Ø×&Ñ&×,Ñ,ñ
ð ×Ññ
ð 	
rs   Útensorr+   Ú	reduce_opc                 óB   — t        |t        «      rt        |||¬«      S |S )N)rÓ   )r‘   r   r)   )rp   rÒ   r+   rÓ   s       rr   Ú
all_reducezFSDPStrategy.all_reducem  s"   € ô �fœfÔ%Ü)¨&°%À9ÔMÐMØˆrs   Úargsc                 ó  — t        «       sy t        j                  j                  «       dk(  r6t        j                  j	                  | j
                  j                  g¬«       y t        j                  j	                  «        y )NÚnccl)Ú
device_ids)r&   rÈ   ÚdistributedÚget_backendÚbarrierr‚   r¹   )rp   rÖ   r\   s      rr   rÜ   zFSDPStrategy.barrieru  sZ   € ä*Ô,ØÜ×Ñ×(Ñ(Ó*¨fÒ4Ü×Ñ×%Ñ%°$×2BÑ2B×2HÑ2HÐ1IÐ%ÕJä×Ñ×%Ñ%Õ'rs   ÚobjÚsrcc                 óŠ   — t        «       s|S |g}t        j                  j                  ||t        j
                  ¬«       |d   S )Nr*   r   )r&   rÈ   rÚ   Úbroadcast_object_listÚ_groupÚWORLD)rp   rÝ   rÞ   s      rr   Ú	broadcastzFSDPStrategy.broadcast~  s<   € ä*Ô,ØˆJàˆeˆÜ×Ñ×/Ñ/°°SÄÇÁÐ/ÔMØ�1‰vˆrs   Úmax_normÚ	norm_typeÚerror_if_nonfinitec                 óô   — ddl m} t        ||«      s9t        dt	        | «      j
                  › d|j                  j
                  › d�«      ‚| j                  j                  |«       |j                  ||¬«      S )zClip gradients by norm.r   r¬   zFGradient clipping with FSDP is only possible if the module passed to `zE.clip_gradients_norm` is wrapped in `FullyShardedDataParallel`. Got: Ú.)rä   rå   )
rÐ   r­   r‘   r˜   rx   ry   rq   rN   Úunscale_gradientsÚclip_grad_norm_)rp   r¥   r¼   rä   rå   ræ   r­   s          rr   Úclip_gradients_normz FSDPStrategy.clip_gradients_norm‡  s}   € õ 	`ä˜&Ð":Ô;äðÜ˜$“Z×(Ñ(Ð)ð *Ø×)Ñ)×2Ñ2Ð3°1ð6óð ð
 	�‰×(Ñ(¨Ô3Ø×%Ñ%¨xÀ9Ð%ÓMÐMrs   ÚpathÚstateÚstorage_optionsÚfilterc                 ó¢  — |�t        d«      ‚|�| j                  dk(  rt        d«      ‚t        | j	                  |«      «      }|j                  «       r(| j                  dk(  rt        |«      st        d|› �«      ‚ddlm	} |j                  «       D �cg c]  }t        |«      sŒ|‘Œ }}t        |«      dk(  rt        d	«      ‚t        |«      d
kD  rt        d«      ‚|d   }| j                  dk(  �r|j                  «       r|j                  «        |j!                  dd¬«       t#        |«      }i }	i }
|5  |j%                  «       D ]ƒ  \  }}t'        |t(        «      r|j+                  «       }|	}nIt'        |t,        «      r|j/                  ||«      }|	}n$t'        |t0        «      r|j+                  «       n|}|
}t3        ||xs i ||«       Œ… 	 ddd«       t5        |	|«       | j6                  dk(  rt9        j:                  |
|t<        z  «       yy| j                  dk(  rüt        |«      rt?        j@                  |«       tC        || jD                  ¬«      }i }|5  |j%                  «       D ]}  \  }}t'        |t(        «      r|j+                  «       }nEt'        |t,        «      r|j/                  ||«      }n"t'        |t0        «      r|j+                  «       n|}t3        ||xs i ||«       Œ 	 ddd«       | j6                  dk(  rt9        j:                  ||«       yyt        d| j                  › �«      ‚c c}w # 1 sw Y   �ŒlxY w# 1 sw Y   ŒZxY w)a  Save model, optimizer, and other state to a checkpoint on disk.

        If the state-dict-type is ``'full'``, the checkpoint will be written to a single file containing the weights,
        optimizer state and other metadata. If the state-dict-type is ``'sharded'``, the checkpoint gets saved as a
        directory containing one file per process, with model- and optimizer shards stored per file. Additionally, it
        creates a metadata file `meta.pt` with the rest of the user's state (only saved from rank 0).

        Nz�`FSDPStrategy.save_checkpoint(..., storage_options=...)` is not supported because `FSDPStrategy` does not use the `CheckpointIO`.rJ   zVFSDP doesn't support loading sharded filtered checkpoints, so saving them is disabled.rZ   z/The checkpoint path exists and is a directory: r   r¬   a  Could not find a FSDP model in the provided checkpoint state. Please provide the model as part of the state like so: `save_checkpoint(..., state={'model': model, ...})`. Make sure you set up the model (and optimizers if any) through the strategy before saving the checkpoint.r_   záFound multiple FSDP models in the given state. Saving checkpoints with FSDP is currently limited to a single model per checkpoint. To save multiple models, call the save method for each model separately with a different path.T)ÚparentsÚexist_ok)Ú
world_sizezUnknown state_dict_type: )#r˜   rm   rw   r	   rã   Úis_dirÚ_is_sharded_checkpointÚIsADirectoryErrorr¶   r­   ÚvaluesÚ_has_fsdp_modulesrˆ   rk   Úis_fileÚunlinkÚmkdirÚ_get_sharded_state_dict_contextÚitemsr‘   r   Ú
state_dictr   Úoptim_state_dictr7   r!   Ú_distributed_checkpoint_saver�   rÈ   Úsaver/   ÚshutilÚrmtreeÚ_get_full_state_dict_contextró   )rp   rì   rí   rî   rï   ÚFSDPr¥   r¸   Ústate_dict_ctxÚconverted_stateÚmetadataÚkeyrÝ   Ú	convertedÚtarget_dictÚ
full_states                   rr   Úsave_checkpointzFSDPStrategy.save_checkpoint�  s  € ð  Ð&ÜðCóð ð Ð $×"7Ñ"7¸9Ò"Dä%Øhóð ô
 �D—N‘N 4Ó(Ó)ˆØ�;‰;Œ=˜T×2Ñ2°fÒ<ÔE[Ð\`ÔEaÜ#Ð&UÐVZÐU[Ð$\Ó]Ð]åKà(-¯©¬ÓT©˜fÔ:KÈFÕ:S’6¨ˆÐTÜˆw‹<˜1ÒÜðsóð ô
 ˆw‹<˜!ÒÜðPóð ð
 ˜‘ˆà× Ñ  IÓ-Ø�|‰|Œ~Ø—‘”Ø�J‰J˜t¨dˆJÔ3ä<¸VÓDˆNð /1ˆOØ')ˆHÚØ %§¡¦‘H�C˜ä! #¤vÔ.Ø$'§N¡NÓ$4˜	Ø&5™Ü# C¬Ô3Ø$(×$9Ñ$9¸&À#Ó$F˜	Ø&5™ä8BÀ3Ì	Ô8R C§N¡NÔ$4ÐX[˜	Ø&.˜Ü! # v¢|°°YÀÕLñ !.÷  ô )¨¸$Ô?à×Ñ 1Ò$Ü—
‘
˜8 TÔ,>Ñ%>Õ?ð %ð ×"Ñ" fÒ,Ü% dÔ+Ü—‘˜dÔ#ä9¸&ÈTÏ_É_Ô]ˆNØ)+ˆJÚØ %§¡¦‘H�C˜Ü! #¤vÔ.Ø$'§N¡NÓ$4™	Ü# C¬Ô3Ø$(×$9Ñ$9¸&À#Ó$F™	ä8BÀ3Ì	Ô8R C§N¡NÔ$4ÐX[˜	Ü! # v¢|°°YÀ
ÕKñ !.÷  ð ×Ñ 1Ò$Ü—
‘
˜: tÕ,ð %ô Ð8¸×9NÑ9NÐ8OÐPÓQÐQùòA U÷4  ‘ú÷2  �ús&   ÂL3Â%L3Ä6BL8ÉBMÌ8MÍMÚstrictÚweights_onlyc                 óÔ  — |st        d|›d�«      ‚t        | j                  |«      «      }t        |t        «      rddlm}  |||| j                  |¬«       i S t        |t        «      rt        d«      ‚ddl
m} ddlm} |j                  «       D ��	ci c]  \  }}	t        |	«      sŒ||	“Œ }
}}	t!        |
«      dk(  rt        d	«      ‚|j                  «       D ��ci c]  \  }}t        |t        «      sŒ||“Œ }}}t!        |
«      d
kD  rt        d«      ‚t#        |
j                  «       «      d   \  }}	t%        |«      �r7t'        |	«      }|5  ||	j)                  «       i}t+        ||«       |	j-                  ||   |¬«       |r]ddlm}  ||¬«      }|j                  «       D ];  \  }} |||   ||¬«      }|j3                  ||   |	|¬«      }|j-                  |«       Œ= ddd«       t5        j6                  |t8        z  |¬«      }|j;                  «       |
j;                  «       z
  |j;                  «       z
  }t=        ||j;                  «       |¬«       |D ]  }||vrŒ|j?                  |«      ||<   Œ |S tA        |«      �r)tC        |«      }ddlm"}m#}  ||j?                  |«      |	| j                  |¬«       t        |t        «      ri S tI        |«      }|j                  «       D ]c  \  }}tK        |	| j                  d¬«      5   ||j?                  |«      |	«      }|j3                  ||	|¬«      }|j-                  |«       ddd«       Œe |j;                  «       |
j;                  «       z
  |j;                  «       z
  }t=        ||j;                  «       |¬«       tM        |||¬«       |S t        dtO        |«      ›d�«      ‚c c}	}w c c}}w # 1 sw Y   �ŒñxY w# 1 sw Y   ŒþxY w)zOLoad the contents from a checkpoint and restore the state of the given objects.z,Got FSDPStrategy.load_checkpoint(..., state=z—) but a state with at least  a model instance to reload is required. Pass it in like so: FSDPStrategy.load_checkpoint(..., state={'model': model, ...})r   )Ú _load_raw_module_state_from_path)r¥   ró   r  z`Loading a single optimizer object from a checkpoint is not supported yet with the FSDP strategy.)Ú!load_sharded_optimizer_state_dictr¬   a  Could not find a FSDP model in the provided checkpoint state. Please provide the model as part of the state like so: `load_checkpoint(..., state={'model': model, ...})`. Make sure you set up the model (and optimizers if any) through the strategy before loading the checkpoint.r_   zâFound multiple FSDP models in the given state. Loading checkpoints with FSDP is currently limited to a single model per checkpoint. To load multiple models, call the load method for each model separately with a different path.)r  ©ÚFileSystemReader©rì   )Úmodel_state_dictÚoptimizer_keyÚstorage_reader)rÿ   ÚmodelÚoptimN)r  )Ú_load_raw_module_stateÚ _rekey_optimizer_state_if_neededF)ró   Ú
rank0_only)ÚsourceÚdestinationÚkeysz	The path zœ does not point to a valid checkpoint. Make sure the path points to either a directory with FSDP checkpoint shards, or a single file with a full checkpoint.)(rk   r	   rã   r‘   r   Ú*lightning_fabric.strategies.model_parallelr  ró   r   rw   Ú&torch.distributed.checkpoint.optimizerr  r¶   r­   rý   rø   rˆ   Úlistrõ   rü   rþ   Ú_distributed_checkpoint_loadÚload_state_dictÚtorch.distributed.checkpointr  Úoptim_state_dict_to_loadrÈ   Úloadr/   r   r$   ÚpopÚ_is_full_checkpointr0   r  r  r1   r  r2   Ústr)rp   rì   rí   r  r  r  r  r  r	  r¥   r¸   r  r¦   Ú
module_keyr  Úmodule_stater  ÚreaderÚ	optim_keyÚoptim_stateÚflattened_osdr  Úrequested_metadata_keysÚ
checkpointr  r  Útemp_state_dictrÿ   s                               rr   Úload_checkpointzFSDPStrategy.load_checkpoint  sà  € ñ ÜØ>¸u¸ið HRð Róð ô �D—N‘N 4Ó(Ó)ˆä�eœVÔ$Ýcá,¨T¸%ÈDÏOÉOÐdjÕkØˆIä�eœYÔ'Ü%Øróð õ 	]ÝKà27·+±+´-Ô]±-¡; 3¨ÔCTÐU[ÕC\�3˜‘;°-ˆÑ]Üˆw‹<˜1ÒÜðtóð ð
 49·;±;´=Ôa±=¡Z S¨%ÄJÈuÔV_ÕD`�c˜5‘j°=ˆ
ÑaÜˆw‹<˜!ÒÜðPóð ô
 " '§-¡-£/Ó2°1Ñ5Ñˆ
�Fä! $Õ'Ü<¸VÓDˆNâØ *¨F×,=Ñ,=Ó,?Ð@�Ü,¨\¸4Ô@Ø×&Ñ& |°JÑ'?ÈÐ&ÔOáÝMñ .°4Ô8�Fà,6×,<Ñ,<Ö,>Ñ(˜	 5Ù&GØ-9¸*Ñ-EØ*3Ø+1ô'˜ð
 )-×(EÑ(EØ-8¸Ñ-CØ"(Ø"'ð )Fó )˜ð
 ×-Ñ-¨mÕ<ð -?÷  ô4 —z‘z $Ô);Ñ";È,ÔWˆHØ&+§j¡j£l°W·\±\³^Ñ&CÀjÇoÁoÓFWÑ&WÐ#Ü-Ð.EÀxÇ}Á}ÃÐ_eÕfÛ.�Ø˜hÑ&ØØ%Ÿ\™\¨#Ó.��c’
ð /ð ˆOä˜tÕ$Ü# DÓ)ˆJ÷ñ
 # :§>¡>°*Ó#=ÀfÐY]×YhÑYhÐqwÕxä˜%¤Ô(Ø�	ô .¨jÓ9ˆJð %/×$4Ñ$4Ö$6Ñ �	˜5ä1°&ÀTÇ_Á_ÐafÖgÙ&FÀzÇ~Á~ÐV_ÓG`ÐbhÓ&i�OØ'+×'DÑ'DØ)8Ø$Ø#ð (Eó (Ð$ð
 ×)Ñ)Ð*:Ô;÷ hÐgð %7ð ',§j¡j£l°W·\±\³^Ñ&CÀjÇoÁoÓFWÑ&WÐ#Ü-Ð.EÀzÇÁÓGXÐagÕhô  J¸EÐH_Õ`ð ÐäØœ˜D›	�}ð %_ð _ó
ð 	
ùó} ^ùó b÷  ‘ú÷r hÐgús1   ÂOÂ(OÃOÃ5OÅBOÌ>OÏOÏO'	Ústrategy_registryc                 ó”   — t         j                  j                  «       sy |j                  d| d¬«       |j                  d| dd¬«       y )NrC   z+Fully Sharded Data Parallel (FSDP) training)ÚdescriptionrD   zQFully Sharded Data Parallel (FSDP) training with Full Sharding and CPU OffloadingT)r8  rQ   )rÈ   rÚ   Úis_availableÚregister)Úclsr6  s     rr   Úregister_strategiesz FSDPStrategy.register_strategies„  sV   € ô × Ñ ×-Ñ-Ô/Øà×"Ñ"ØØØEð 	#ô 	
ð
 	×"Ñ"ØØØkØð	 	#õ 	
rs   c                 ó<  — t        «        | j                  «        | j                  «       | _        | j                  €J ‚d| j
                  i}t        r*| j                  j                  dk7  r| j                  nd |d<   t        | j                  | j                  fi |¤Ž y )NrP   Úcpur´   )
r5   Ú_set_world_ranksÚ_get_process_group_backendrd   rM   re   r-   r‚   rx   r(   )rp   r\   s     rr   r¡   zFSDPStrategy._setup_distributed–  s‰   € ÜŒØ×ÑÔØ&*×&EÑ&EÓ&GˆÔ#Ø×'Ñ'Ð3Ð3Ð3Ø"+¨T¯]©]Ð!;ˆÝ#Ø6:×6FÑ6F×6KÑ6KÈuÒ6T $×"2Ò"2ÐZ^ˆF�;ÑÜ˜d×6Ñ6¸×8SÑ8SÑ^ÐW]Ó^rs   c                 óH   — | j                   xs t        | j                  «      S r€   )rd   r'   r‚   rz   s    rr   r@  z'FSDPStrategy._get_process_group_backend   s    € Ø×*Ñ*ÒmÔ.[Ð\`×\lÑ\lÓ.mÐmrs   c                 ó>  — | j                   �q| j                   j                  | j                  | j                  z  | j                  z   «       | j                   j                  | j                  | j                  z  «       | j                  xt        _	        t        _	        y r€   )rM   Úset_global_rankÚ	node_rankr‰   r�   Úset_world_sizer…   r�   r   rŒ   Úutils_rank_zero_onlyrz   s    rr   r?  zFSDPStrategy._set_world_ranks£  sy   € Ø×#Ñ#Ð/Ø×$Ñ$×4Ñ4°T·^±^Àd×FXÑFXÑ5XÐ[_×[jÑ[jÑ5jÔkØ×$Ñ$×3Ñ3°D·N±NÀT×EWÑEWÑ4WÔXð ;?×:JÑ:JÐJŒÔÔ2Õ7rs   )r]   Nr€   )NÚmean)r   )g       @T)NN)NTN)Bry   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#  rÈ   rÉ   r   r   r+  r   r   Úboolrx   r   r   r£   Úintr   rb   Úpropertyr   r   r{   Úsetterr‚   r…   r‰   ÚdictrŽ   rO   r’   r   rN   rœ   r    r   rª   r©   r¾   rÁ   r   rÅ   rÆ   r   r%   rÕ   rÜ   r    rã   Úfloatrë   r6   r   r  r5  Úclassmethodr   r<  r¡   r@  r?  Ú__classcell__)rq   s   @rr   rI   rI   V   s–  ø„ ñ1ðj .2Ø9=Ø<@Ø)-Ø/3Ø'9Ø7;Ø6:Ø04ØVZØ?CØ2>Ø6?ØAEñ,/à˜kÑ*ð,/ð # 4¨¯©Ñ#5Ñ6ð,/ð &Ð&8Ñ9ð	,/ð
 ˜IÑ&ð,/ð  (¨™}ð,/ð ˜)Ñ$ð,/ð ˜4 ¨tÐ3Ñ4ð,/ð "Ð"2Ñ3ð,/ð # 9Ñ-ð,/ð #+¨5°°f±¸tÀDÈÁLÑ?QÐ1QÑ+RÑ"Sð,/ð *2°)Ñ)<ð,/ð 0ð,/ð !Ð!2Ñ3ð,/ð ˜e E¨#¡J°Ð$<Ñ=Ñ>ð,/ð  ð!,/ð" 
õ#,/ð\ Øðt˜|ò tó ó ðtð ×ÑØðt ð t°ò tó ó ðtð Øð6˜UŸ\™\ò 6ó ó ð6ð ð˜3ò ó ðð ×Ñð$ 3ð $¨4ò $ó ð$ð ðV˜sò Vó ðVð Øða¨D°°c°©Nò aó ó ðað ð+ x°¡}ò +ó ð+ð ð¨Ð1AÑ(Bò ó ðð Øð(˜=ò (ó ó ð(ð ×ÑØð$ 8¨IÑ#6ð $¸4ò $ó ó ð$ð
 òuó ðuð
 ôjó ðjð àaeñ-Øð-Ø*.¨y©/ð-ØFNÈ~ÑF^ð-à	ˆv�t˜I‘¨°Ñ(@Ð@Ñ	Aò-ó ð-ð  ð 6ð ¨fò ó ððB ð¨ð °yô ó ðð$ ð vð °$ò ó ðð ñ¨h°t©nð ÐH^ò ó ðð ð
Ð(>ò 
ó ð
ð àgmñØðØ%-¨c¡]ðØFNÈuÐU]Ð_bÐUbÑOcÑFdðà	òó ðð ð(˜Sð (¨Cð (°Dò (ó ð(ð ñ˜Zð ¨cð ¸*ò ó ðð ð (+Ø#'ñNàðNð ðNð ˜˜s˜
Ñ#ð	Nð
 ˜ ˜Ñ$ðNð !ðNð 
òNó ðNð* ð
 *.ØBFñaRàðaRð �C˜˜v y°#Ð5Ñ6Ð6Ñ7ðaRð " #™ð	aRð
 ˜˜c 8¨S°#¨J¸Ð,<Ñ#=Ð=Ñ>Ñ?ðaRð 
òaRó ðaRðF ð _cØØ'+ñ@
àð@
ð ˜˜f i°°c¸5ÀÈÐTWÐAWÑ;XÐ6XÑ1YÐYÑZÑ[ð@
ð ð	@
ð
 ˜t‘nð@
ð 
ˆc�3ˆh‰ò@
ó ð@
ðD Øð
Ð4Eð 
È$ò 
ó ó ð
ó _ðn¨Có n÷Krs   rI   rU   rV   rT   r]   c                 óô   ‡— | €|€i S | �|�t        d«      ‚| �At        | t        «      rt        | «      Šn| fŠt	        d| › dt        ‰«      › d�«       dˆfd„iS t        |t
        «      rt        |i «      S d|iS )NzeYou cannot set both `activation_checkpointing` and `activation_checkpointing_policy`. Use the latter.z'`FSDPStrategy(activation_checkpointing=zD)` is deprecated, use `FSDPStrategy(activation_checkpointing_policy=z)` instead.Úcheck_fnc                 ó   •— t        | ‰«      S r€   r¯   )Ú	submoduleÚclassess    €rr   Ú<lambda>z2_activation_checkpointing_kwargs.<locals>.<lambda>¿  s   ø€ ¬j¸ÀGÔ.Lrs   rS   )rk   r‘   r#  r£   r3   Úsetrh   )rU   rV   rW  s     @rr   rl   rl   ¬  s³   ø€ ð  Ð'Ð,KÐ,SØˆ	ØÐ+Ð0OÐ0[ÜØsó
ð 	
ð  Ð+ÜÐ.´Ô5ÜÐ4Ó5‰Gà/Ð1ˆGÜØ5Ð6NÐ5Oð P=Ü=@À»\¸NÈ+ðWô	
ð ÓLÐMÐMÜÐ1´3Ô7Ü'Ð(GÈÓLÐLØÐ ?Ð@Ð@rs   Úpolicyr\   c                 óT   — | €|S t        | t        «      rddlm}  || «      } | |d<   |S )Nr   r<   rS   )r‘   rY  rÑ   r=   )rZ  r\   r=   s      rr   rh   rh   Å  s3   € Ø€~ØˆÜ�&œ#ÔÝ@á! &Ó)ˆà!'€FÐÑØ€Mrs   r¥   Úactivation_checkpointing_kwargsc                 óØ   ‡— |sy ddl mŠ t        ˆfd„| j                  «       D «       «      rt	        d«       y ddl m}m}m} t        st        ||j                  ¬«      } || fd|i|¤Ž y )Nr   )ÚCheckpointWrapperc              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr€   r¯   )r°   r±   r^  s     €rr   r²   z2_setup_activation_checkpointing.<locals>.<genexpr>×  s   øè ø€ Ð
JÑ9I°#Œ:�cÐ,×-Ñ9Iùr³   ztFSDP checkpointing is configured, but the model already contains checkpointed layers. Checkpointing will be ignored.)ÚCheckpointImplÚapply_activation_checkpointingÚcheckpoint_wrapper)Úcheckpoint_implÚcheckpoint_wrapper_fn)Ú;torch.distributed.algorithms._checkpoint.checkpoint_wrapperr^  r·   r¸   r4   r`  ra  rb  r,   r   ÚNO_REENTRANT)r¥   r\  r`  ra  rb  r^  s        @rr   r»   r»   Ñ  sj   ø€ Ù*Øå]ä
Ó
J¸¿¹Ô9IÓ
JÔJÜð.ô	
ð 	÷ñ õ $Ü$Ð%7È×IdÑIdÔeÐÙ" 6ÑwÐASÐwÐWvÓwrs   c                   ó*   — e Zd Zedededefd„«       Zy)rf   r¥   Úenabledr]   c                 óÐ   — |s
t        «       S ddlm} t        ||«      s9t	        dt        | «      j                  › d|j                  j                  › d�«      ‚|j                  «       S )zuBlocks gradient synchronization inside the :class:`~torch.distributed.fsdp.FullyShardedDataParallel`
        wrapper.r   r¬   zABlocking backward sync is only possible if the module passed to `zB.no_backward_sync` is wrapped in `FullyShardedDataParallel`. Got: rè   )	r   rÐ   r­   r‘   r˜   rx   ry   rq   Úno_sync)rp   r¥   rh  r­   s       rr   Úno_backward_syncz)_FSDPBackwardSyncControl.no_backward_syncê  sl   € ñ Ü“=Ð Ý_ä˜&Ð":Ô;äðÜ˜$“Z×(Ñ(Ð)ð *Ø×)Ñ)×2Ñ2Ð3°1ð6óð ð
 �~‰~ÓÐrs   N)ry   rH  rI  r   r   rK  r   rk  rµ   rs   rr   rf   rf   é  s*   „ Øð  vð  ¸ð  ÐAWò  ó ñ rs   rf   rQ   r9   c                 óN   — ddl m} t        | |«      r| S  |t        | «      ¬«      S )Nr   )r9   )Úoffload_params)r¶   r9   r‘   rK  )rQ   r9   s     rr   ro   ro   ü  s%   € Ý1ä$ [°*Ô=ˆ;ÐoÁ:Ô]aÐbmÓ]nÔCoÐors   rW   rX   r;   c                 óN  — ddl m} |j                  d«      �|j                  d«      �t        d«      ‚t	        | t
        «      r|| j                  «          n| }d|j                  v r>|j                  d«      €-|j                  d«      €|j                  d«      €t        d«      ‚|S )	Nr   )r;   Úprocess_groupr[   znThe arguments `FSDPStrategy(process_group=..., device_mesh=...)` are mutually exclusive.Pass only one of them.ÚHYBRIDrS   zŽThe hybrid sharding strategy requires you to pass at least one of the parameters: `auto_wrap_policy`, `process_group` tuple, or `device_mesh`.)	r¶   r;   r¢   rk   r‘   r+  ÚupperÚnameÚRuntimeError)rW   r\   r;   Ústrategys       rr   rn   rn     s­   € Ý7à‡z�z�/Ó"Ð.°6·:±:¸mÓ3LÐ3XÜð%ó
ð 	
ô
 ?IÐIZÔ\_Ô>`ÐÐ 1× 7Ñ 7Ó 9Ò:Ðfw€Hà�H—M‘MÑ!Ø�J‰JÐ)Ó*Ð2Ø�J‰J�Ó'Ð/Ø�J‰J�}Ó%Ð-äð8ó
ð 	
ð €Ors   r¼   c                 ó:   — t        d„ | j                  D «       «      S )Nc              3   óJ   K  — | ]  }|d    D ]  }t        |dd«      –— Œ Œ y­w)ÚparamsÚ_fsdp_flattenedFN)Úgetattr)r°   r+   Úparams      rr   r²   z-_optimizer_has_flat_params.<locals>.<genexpr>  s1   è ø€ ð Ù>T°UÐbgÐhpÔbqÐY^Œ�Ð(¨%×0ÐbqÐ0Ñ>Tùs   ‚!#)r·   Úparam_groups)r¼   s    rr   r¿   r¿     s"   € Üñ Ø>G×>TÒ>Tóó ð rs   )NNNc                 óˆ   — ddl m} ddlm}m}m}  |d¬«      } |d¬«      }|j                  | |j                  ||¬«      }|S )Nr   r¬   )ÚShardedOptimStateDictConfigÚShardedStateDictConfigÚStateDictTypeT)Úoffload_to_cpu©r¥   rY   Ústate_dict_configÚoptim_state_dict_config)r¶   r­   Útorch.distributed.fsdp.apir}  r~  r  rY   ÚSHARDED_STATE_DICT)r¥   r  r}  r~  r  r‚  rƒ  Ústate_dict_type_contexts           rr   rü   rü     sQ   € ÝGßmÑmá.¸dÔCÐÙ9ÈÔNÐØ"×2Ñ2ØØ%×8Ñ8Ø+Ø 7ð	 3ó Ðð #Ð"rs   ró   r  c                 ó”   — ddl m}m} ddl m} ddlm}  |d|¬«      } |d|¬«      }|j                  | |j                  ||¬«      }	|	S )Nr   )ÚFullStateDictConfigr  r¬   )ÚFullOptimStateDictConfigT)r€  r  r�  )r¶   rˆ  r  r­   r„  r‰  rY   ÚFULL_STATE_DICT)
r¥   ró   r  rˆ  r  r  r‰  r‚  rƒ  r†  s
             rr   r  r  .  sY   € ÷ JÝGÝCá+¸4ÈJÔWÐÙ6ÀdÐWaÔbÐØ"×2Ñ2ØØ%×5Ñ5Ø+Ø 7ð	 3ó Ðð #Ð"rs   rì   c                 óT   — | j                  «       xr | t        z  j                  «       S )z]A heuristic check to determine whether the path points to a directory with checkpoint shards.)rô   r/   rù   r  s    rr   rõ   rõ   A  s"   € à�;‰;‹=ÒB˜dÔ%7Ñ7×@Ñ@ÓBÐBrs   c                 ó"   — | j                  «       S r€   )rù   r  s    rr   r*  r*  F  s   € Ø�<‰<‹>Ðrs   c                 óx   ‡— ddl mŠ t        | t        «      xr" t	        ˆfd„| j                  «       D «       «      S )Nr   r¬   c              3   ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr€   r¯   )r°   Úmr­   s     €rr   r²   z$_has_fsdp_modules.<locals>.<genexpr>M  s   øè ø€ Ð-pÑ_oÐZ[¬j¸Ð<T×.UÑ_oùr³   )r¶   r­   r‘   r   r·   r¸   )r¥   r­   s    @rr   rø   rø   J  s-   ø€ Ý?ä�fœfÓ%Òp¬#Ó-pÐ_e×_mÑ_mÔ_oÓ-pÓ*pÐprs   rÉ   c                 óˆ   ‡— t        d«      sy ddlmŠ ˆfd„| j                  «       D «       D ]  }|j	                  |«       Œ y )NÚtorchmetricsr   )ÚMetricc              3   ó<   •K  — | ]  }t        |‰«      sŒ|–— Œ y ­wr€   r¯   )r°   r�  r’  s     €rr   r²   z/_move_torchmetrics_to_device.<locals>.<genexpr>X  s   øè ø€ ÐHÑ.˜´*¸QÀÕ2G”1Ñ.ùs   ƒ•)r   r‘  r’  r¸   Úto)r¥   rÉ   Úmetricr’  s      @rr   rº   rº   P  s6   ø€ ô ˜NÔ+Øå#ãH˜fŸn™nÔ.ÖHˆØ�	‰	�&Õñ Irs   r  c                 óŠ   — t         rddlm}  || |¬«       y ddlm} t        rddlm} nddlm}  ||d¬«      } || |«       y )Nr   )r  ©Úcheckpoint_id)ÚFileSystemWriter)Úsave_state_dictT)rì   Úsingle_file_per_rank)r-   r&  r  r™  r,   rš  )r  rì   r  r™  Úwriters        rr   r   r   \  s6   € ÝÝ5ñ 	ˆ_¨DÖ1åAå#Þ9åLá! tÀ$ÔGˆÙˆ_˜fÕ%rs   r-  c                 óˆ   — t         rddlm}  || |¬«       y ddlm} t        rddlm} nddlm}  ||¬«      } || |«       y )Nr   )r(  r—  r  )r%  r  )r-   r&  r(  r  r,   r%  )r-  rì   r(  r  r.  s        rr   r$  r$  o  s4   € ÝÝ5ñ 	ˆ\¨Ö.åAå#Þ9åLÙ! tÔ,ˆÙˆ\˜6Õ"rs   )T)|r  ÚwarningsÚcollections.abcr   Ú
contextlibr   r   r   Údatetimer   Ú	functoolsr   Úpathlibr	   Útypingr
   r   r   r   r   r   rÈ   Ú lightning_utilities.core.importsr   Ú"lightning_utilities.core.rank_zeror   rF  r   Útorch.nnr   Útorch.optimr   Útyping_extensionsr   r   Úlightning_fabric.acceleratorsr   Úlightning_fabric.pluginsr   r   r   Ú5lightning_fabric.plugins.collectives.torch_collectiver   Ú'lightning_fabric.plugins.precision.fsdpr   Ú7lightning_fabric.strategies.launchers.subprocess_scriptr   Ú$lightning_fabric.strategies.parallelr   Ú$lightning_fabric.strategies.registryr   Ú$lightning_fabric.strategies.strategyr    r!   r"   r#   r$   Ú&lightning_fabric.utilities.distributedr%   r&   r'   r(   r)   r+   rá   Ú"lightning_fabric.utilities.importsr,   r-   Úlightning_fabric.utilities.initr.   Úlightning_fabric.utilities.loadr/   r0   r1   r2   Ú$lightning_fabric.utilities.rank_zeror3   r4   Úlightning_fabric.utilities.seedr5   Ú lightning_fabric.utilities.typesr6   r7   r¤   r8   rÐ   r9   r:   r;   rÑ   r=   Útorch.optim.lr_schedulerr>   rY  rx   rK  rL  rT   rX   Ú_FSDP_ALIASESÚfilterwarningsÚFutureWarningrI   r#  rO  rl   rh   r»   rf   ro   rn   r¿   rü   r  rõ   r*  Úobjectrø   ÚnnrÉ   rº   r+  r   r$  rµ   rs   rr   Ú<module>r¿     só  ðó Û Ý %ß EÑ EÝ Ý Ý ÷÷ ó Ý =Ý UÝ Ý Ý !ß 1å 5ß PÑ PÝ TÝ AÝ ]Ý AÝ B÷õ ÷õ õ C÷õ Sß rÓ rß fÑ fÝ 6ß =áÝ8ßoÑoÝ<Ý5à�C˜˜V™Ñ% x°¸¸sÐ0CÀTÐ0IÑ'JÐL\Ð\Ñ]€GØÐ/°Ð9rÑ1sÐsÑtÐð -€ð €× Ñ ˜¨=ÐB\Õ ]ôS	KÐ# Xô S	KðlAØ& u¨T°&©\¸4ÀÀVÁÑ;MÐ-MÑ'NÑOðAà%-¨iÑ%8ðAð 
óAð2	 X¨iÑ%8ð 	À$ð 	È4ó 	ðx¨Fð xÐUYð xÐ^bó xô0 Ð3ô  ð&p 8¨E°$¸Ð2DÑ,EÑ#Fð pÈ<ó pðÐ/Cð ÈTð ÐVhó ð.¨)ð ¸ó ð#¨Fð #°yÐAQÑ7Ró #ð  9=ñ#Øð#Ø #ð#Ø15ð#àÐÑ ó#ð&C ð C¨$ó Cð
˜dð  tó ðq˜fð q¨°6Ñ):ó qð	¨¯©¯©ð 	À%Ç,Á,ð 	ÐSWó 	ð&°$°s¸C°x±.ð &Èð &ÐQUó &ð&#¨t°C¸°H©~ð #ÀTð #Èdô #rs   