U
    Jºcã  ã                   @   sô   U d dl mZmZ d dlmZmZmZmZ d dlZd dl	m
Z d dlmZ G dd„ deƒZdaee ed< eddœd	d
„Zejeejee f dœdd„Zejeejdœdd„Zejeeeejejdœdd„Zejeejeej f dœdd„ZdS )é    )ÚABCÚabstractmethod)ÚAnyÚListÚOptionalÚTupleN)Ú_create_chunk_sharded_tensorc                   @   s–   e Zd ZdZeejeejee	 f dœdd„ƒZ
eeje	ejdœdd„ƒZeejeeeejejdœd	d
„ƒZeejeejeej f dœd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Úreturnc                 C   s   dS )z6E.g. converting ``DistributedTensor`` to local tensor.N© ©Úselfr   r   r   úK/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributed/fsdp/_fsdp_extensions.pyÚpre_flatten_transform   s    z$FSDPExtensions.pre_flatten_transform©r   Úparam_extensionr   c                 C   s   dS )z6E.g. converting local tensor to ``DistributedTensor``.Nr   )r   r   r   r   r   r   Úpost_unflatten_transform   s    z'FSDPExtensions.post_unflatten_transform©r   ÚrankÚ
world_sizeÚnum_devices_per_nodeÚpgr   c                 C   s   dS )z6Shards a tensor to chunks and returns the local chunk.Nr   )r   r   r   r   r   r   r   r   r   Úchunk_tensor"   s    
zFSDPExtensions.chunk_tensorc                 C   s   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   r   r   r   Úpre_load_state_dict_transform.   s    	z,FSDPExtensions.pre_load_state_dict_transformN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚTensorr   r   r   r   r   ÚintÚdistÚProcessGroupr   r   r   r   r   r   r   r	   
   s,   ýüùýr	   Ú_extensions)Ú	flattenerr   c                 C   s   | a d S ©N)r%   )r&   r   r   r   Ú_set_fsdp_extensions=   s    r(   r
   c                 C   s.   t d k	r&t  | ¡\}}|d k	r&||fS | d fS r'   )r%   r   )r   Z
new_tensorÚ	extensionr   r   r   Ú_ext_pre_flatten_transformB   s
    r*   r   c                 C   s    t d k	r|d k	rt  | |¡S | S r'   )r%   r   )r   r   r   r   r   Ú_ext_post_unflatten_transformL   s    r+   r   c                 C   s"   t d k	rt jnt}|| ||||ƒS r'   )r%   r   r   )r   r   r   r   r   Zchunk_tensor_fnr   r   r   Ú_ext_chunk_tensorU   s    	ÿýûr,   c                 C   s"   t d k	rt  | ¡S |  ¡ }| |fS r'   )r%   r   Zlocal_shards)r   Zshardsr   r   r   Ú"_ext_pre_load_state_dict_transformj   s    
r-   )Úabcr   r   Útypingr   r   r   r   r    Ztorch.distributedZdistributedr#   Z#torch.distributed.fsdp._shard_utilsr   r	   r%   Ú__annotations__r(   r!   r*   r+   r"   r$   r,   r-   r   r   r   r   Ú<module>   s2    0þý
úþ