§
    N�’j/  ã                   ó8  — U d dl mZ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mZmZ d dlmZmZ  G d„ d	e¦  «        Zdaedz  ed
<   deddfd„Z	 ddej        dedz  deej        edz  f         fd„Z	 ddej        dededz  dej        fd„Z	 ddej        dedededej        dedz  dej        fd„Z	 ddej        dedededz  dej        f
d„Z	 ddej        dedz  deej        e e         f         fd„Z!	 ddededz  dedz  dej        fd„Z"dS )é    )ÚABCÚabstractmethod)ÚAnyN)ÚShardedTensor)ÚShard)Ú_all_gather_dtensorÚ_create_chunk_dtensorÚ_create_chunk_sharded_tensor)Ú
DeviceMeshÚDTensorc                   óº  — e Zd ZdZedej        deej        edz  f         fd„¦   «         Z	edej        dedej        fd„¦   «         Z
e	 ddej        ded	ed
edej        dej        dz  dej        fd„¦   «         Zedej        dededej        fd„¦   «         Zedej        deej        ee         f         fd„¦   «         Zedededz  dej        fd„¦   «         ZdS )ÚFSDPExtensionszä
    This enables some customizable hooks to enable composability with tensor
    parallelism. To activate these hooks, use :func:`_set_fsdp_extensions` to
    set a custom :class:`FSDPExtensions` that implements the hooks.
    ÚtensorÚreturnNc                 ó   — dS )z6E.g. converting ``DistributedTensor`` to local tensor.N© ©Úselfr   s     úUC:\Projects\DSCons\.venv\Lib\site-packages\torch\distributed\fsdp\_fsdp_extensions.pyÚpre_flatten_transformz$FSDPExtensions.pre_flatten_transform   s	   € ð 	ˆó    Úparam_extensionc                 ó   — dS )z6E.g. converting local tensor to ``DistributedTensor``.Nr   )r   r   r   s      r   Úpost_unflatten_transformz'FSDPExtensions.post_unflatten_transform   s	   € ð 	ˆr   ÚrankÚ
world_sizeÚnum_devices_per_nodeÚpgÚdevicec                 ó   — dS )z6Shards a tensor to chunks and returns the local chunk.Nr   )r   r   r   r   r   r   r   s          r   Úchunk_tensorzFSDPExtensions.chunk_tensor(   ó	   € ð 	ˆr   Údevice_meshc                 ó   — dS )zAShards a tensor/DTensor to DTensor and returns the local DTensor.Nr   )r   r   r   r#   s       r   Úchunk_dtensorzFSDPExtensions.chunk_dtensor5   s	   € ð 	ˆr   c                 ó   — dS )z£
        This is to be called before loading a *sharded* model state dict and
        should return the tensor and list of shards from which to load data.
        Nr   r   s     r   Úpre_load_state_dict_transformz,FSDPExtensions.pre_load_state_dict_transform?   s	   € ð 	ˆr   Úparent_meshc                 ó   — dS )z³
        This is to be called before loading a *sharded* DTensor state dict.
        This gathers tensor in FSDP dimension and returns local tensor of
        TP DTensor.
        Nr   )r   r   r(   s      r   Úall_gather_dtensorz!FSDPExtensions.all_gather_dtensorJ   r"   r   ©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚTensorÚtupler   r   r   ÚintÚdistÚProcessGroupr   r!   r   r%   Úlistr   r'   r   r*   r   r   r   r   r      sï  € € € € € ðð ð ðà”ðð 
ˆuŒ|˜S 4™ZÐ'Ô	(ðð ð ñ „^ðð ðà”ðð ðð 
Œð	ð ð ñ „^ðð ð '+ð
ð 
à”ð
ð ð
ð ð	
ð
 "ð
ð Ôð
ð ”˜tÑ#ð
ð 
Œð
ð 
ð 
ñ „^ð
ð ðà”ðð ðð  ð	ð
 
Œðð ð ñ „^ðð ðà”ðð 
ˆuŒ|˜T %œ[Ð(Ô	)ðð ð ñ „^ðð ð
àð
ð   $Ñ&ð
ð 
Œð	
ð 
ð 
ñ „^ð
ð 
ð 
r   r   Ú_extensionsÚ	flattenerr   c                 ó
   — | a d S r+   )r7   )r8   s    r   Ú_set_fsdp_extensionsr:   [   s   € à€K€K€Kr   r   Úfsdp_extensionc                 óJ   — |�|                      | ¦  «        \  }}|�||fS | d fS r+   )r   )r   r;   Ú
new_tensorr   s       r   Ú_ext_pre_flatten_transformr>   `   s=   € ð Ð!Ø&4×&JÒ&JÈ6Ñ&RÔ&RÑ#ˆ
�OØÐ&Ø˜Ð.Ð.Ø�4ˆ<Ðr   r   c                 ó:   — |�|�|                      | |¦  «        S | S r+   )r   )r   r   r;   s      r   Ú_ext_post_unflatten_transformr@   k   s*   € ð
 Ð! oÐ&AØ×6Ò6°v¸ÑOÔOÐOØ€Mr   r   r   r   r   c                 ó@   — |�|j         nt          } || ||||¦  «        S r+   )r!   r
   )r   r   r   r   r   r;   Úchunk_tensor_fns          r   Ú_ext_chunk_tensorrC   u   sB   € ð Ð%ð 	Ô#Ð#å)ð ð
 ˆ?ØØØØØ
ñô ð r   r#   c                 ó<   — |�|j         nt          } || ||¦  «        S r+   )r%   r	   )r   r   r#   r;   Úchunk_dtensor_fns        r   Ú_ext_chunk_dtensorrF   ‹   s=   € ð Ð%ð 	Ô$Ð$å"ð ð
 ÐØØØñô ð r   c                 óÊ   — |�|                      | ¦  «        S t          | ¦  «        t          urt          dt          | ¦  «        › �¦  «        ‚|                      ¦   «         }| |fS )NzExpected ShardedTensor, got )r'   Útyper   ÚAssertionErrorÚlocal_shards)r   r;   Úshardss      r   Ú"_ext_pre_load_state_dict_transformrL   �   sh   € ð Ð!Ø×;Ò;¸FÑCÔCÐCåˆF�|„|�=Ð(Ð(ÝÐJ½DÀ¹L¼LÐJÐJÑKÔKÐKØ× Ò Ñ"Ô"€FØ�FÐÐr   r(   c                 ó:   — |�|j         nt          } || |¦  «        S r+   )r*   r   )r   r(   r;   Úall_gather_dtensor_fns       r   Ú_ext_all_gather_dtensorrO   ª   s2   € ð Ð%ð 	Ô)Ð)å ð ð
 !Ð  ¨Ñ5Ô5Ð5r   r+   )#Úabcr   r   Útypingr   r0   Útorch.distributedÚdistributedr4   Ú+torch.distributed._shard.sharded_tensor.apir   Ú-torch.distributed._shard.sharded_tensor.shardr   Ú#torch.distributed.fsdp._shard_utilsr   r	   r
   Útorch.distributed.tensorr   r   r   r7   Ú__annotations__r:   r1   r2   r>   r@   r3   r5   rC   rF   r6   rL   rO   r   r   r   ú<module>rY      s+  ðØ #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø EÐ EÐ EÐ EÐ EÐ EØ ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ð
 9Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8Ð 8ðEð Eð Eð Eð E�Sñ Eô Eð EðP &*€ˆ^˜dÑ"Ð )Ð )Ñ )ð Nð °tð ð ð ð ð -1ðð ØŒLðà" TÑ)ðð ˆ5Œ<˜˜t™Ð#Ô$ðð ð ð ð -1ðð ØŒLðàðð # TÑ)ðð „\ð	ð ð ð ð  -1ðð ØŒLðà
ðð ðð ð	ð
 	Ôðð # TÑ)ðð „\ðð ð ð ð4 -1ð	ð ØŒLðà
ðð ðð # TÑ)ð	ð
 „\ðð ð ð ð( -1ð
ð 
ØŒLð
à" TÑ)ð
ð ˆ5Œ<˜˜eœÐ$Ô%ð
ð 
ð 
ð 
ð  -1ð
6ð 
6Øð
6à˜dÑ"ð
6ð # TÑ)ð
6ð „\ð	
6ð 
6ð 
6ð 
6ð 
6ð 
6r   