U
    ©Ê¹j<#  ã                   @   s¸  U d dl 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mZ dd	lmZmZmZmZmZmZ dd
lmZmZmZmZmZmZ ddlmZmZ dgZ ee! e"d< ej#edœdd„Z$eedœdd„Z%eeedœdd„Z&e!eedœdd„Z'e!eeedœdd„Z(e!ej#edœdd„Z)e!edœd d!„Z*d"d#„ Z+d$d%„ Z,e!eee ee d&œd'd„Z-eed(œd)d*„Z.e!eee d+œd,d-„Z/eedœd.d/„Z0e!eeee d0œd1d2„Z1dS )3é    )ÚAnyÚListN)ÚShardMetadata)ÚShardedTensor)ÚTensorProperties)ÚDTensor)Úcompute_local_shapeÚcompute_local_offseté   )ÚLoadItemTypeÚSavePlanÚReadItemÚ	WriteItemÚWriteItemTypeÚTensorWriteData)ÚBytesStorageMetadataÚChunkStorageMetadataÚTensorStorageMetadataÚMetadataIndexÚSTATE_DICT_TYPEÚSTORAGE_TYPES)Ú+_shards_get_overlap_region_wrt_saved_tensorÚ"_check_shard_metadata_pair_overlapÚ create_read_items_for_chunk_listÚ__all__)ÚtensorÚreturnc                 C   s$   t t dgt|  ¡ ƒ ¡|  ¡ d�S )Nr   ©ÚoffsetsÚsizes)r   ÚtorchÚSizeÚlenÚsize)r   © r$   úk/var/www/html/bwave/python/venv/lib/python3.8/site-packages/torch/distributed/checkpoint/planner_helpers.pyÚ_create_chunk_from_tensor%   s    þr&   )Úshard_mdr   c                 C   s   t t | j¡t | j¡d�S )Nr   )r   r    r!   Úshard_offsetsZshard_sizes)r'   r$   r$   r%   Ú_chunk_for_shard,   s    

þr)   )Úsharded_tensorr'   r   c                 C   s   t t|ƒ|  ¡ j|  ¡ jd�S )N©ÚchunkÚ
propertiesr#   )r   r)   ÚmetadataZtensor_propertiesr#   )r*   r'   r$   r$   r%   Ú_sharded_tensor_metadata3   s
    ýr/   )Úfqnr   r   c              	   C   sz   |j }|jdkstdƒ‚t t|j||jƒ¡}t t|j||jƒ¡}t	t
| |ƒtjtt||d�t | ¡ ¡| ¡ d�d�S )Nr
   ú.Only 1D DeviceMeshes can currently be handled.r   r+   ©ÚindexÚtypeZtensor_data)Údevice_meshÚndimÚAssertionErrorr    r!   r   ÚshapeÚ
placementsr	   r   r   r   ÚSHARDr   r   r   Úcreate_from_tensorZto_localr#   )r0   r   r5   r   r   r$   r$   r%   Ú_create_write_items_for_dtensor=   s&    ÿþþùýr<   )r0   r*   r'   r   c                 C   s(   t  |j¡}tt| |ƒtjt||ƒd�S )Nr2   )r    r!   r(   r   r   r   r:   r/   )r0   r*   r'   r   r$   r$   r%   Ú_create_write_item_for_shardU   s    ýr=   c                 C   sN   t  dgt| ¡ ƒ ¡}tt| |ƒtjtt	|| ¡ d�t
 |¡| ¡ d�d�S )Nr   r   r+   r2   )r    r!   r"   r#   r   r   r   ÚTENSORr   r   r   r;   )r0   r   r   r$   r$   r%   Ú_create_write_item_for_tensor`   s    ýýr?   ©r0   Úbytesc                 C   s   t t| ƒtjd�S )N)r3   r4   )r   r   r   ÚBYTE_IOr@   r$   r$   r%   Ú_create_write_item_for_bytesiom   s    þrC   c              	   C   s.   t tj| t |f¡|t |f¡t |f¡d�S ©N)r4   Ú
dest_indexÚdest_offsetsÚstorage_indexÚstorage_offsetsÚlengths)r   r   rB   r    r!   ©rE   Zdest_offsetrG   Zstorage_offsetÚlengthr$   r$   r%   Ú_create_read_item_for_byteiot   s    


úrL   c              	   C   s(   t tj| t |¡|t |¡t |¡d�S rD   )r   r   r>   r    r!   ©rE   rF   rG   rH   rI   r$   r$   r%   Ú_create_read_item_for_tensor�   s    úrN   )r0   Úcheckpoint_mdÚlocal_chunksr   c                 C   sª   g }t |ƒD ]˜\}}t |jƒD ]„\}}t||ƒs2qg }g }	g }
t||d�D ]*\}}}}| |¡ |	 |¡ |
 |¡ qJ| tt| |j|ƒ|	t| |j|ƒ||
d�¡ qq|S )aX  
    Creates a list of ``ReadItem`` based on the checkpoint and local chunks.

    This applies the resharding algorithm and computes the reads needed
    to satisfy ``local_chunks`` with a checkpoint described by ``checkpoint_md``.

    Args:
        fqn (str) : The state_dict FQN to pass to ``ReadItem``.
        checkpoint_md (TensorStorageMetadata): metadata for a given tensor
            from a checkpoint.
        local_chunks (List[ChunkStorageMetadata]): Local chunks that needs to be
            loaded.

    Returns:
        A list of ``ReadItem`` that will satisfy all input chunks.
    )Zsaved_shardZcurrent_shardrM   )Ú	enumerateÚchunksr   r   ÚappendrN   r   r   )r0   rO   rP   Z
read_itemsÚidxÚshardZstorage_idxZ
storage_mdrH   rF   rI   ÚdimZoffset_for_saved_tensorZoffset_for_current_tensorrK   r$   r$   r%   r   �   sR     ÿ ÿû

  ÿ  ÿ÷ÿ)Ú
state_dictr   c                 C   s–   g }|   ¡ D ]€\}}t|tƒr0| t||ƒ¡ qt|tƒr^| ¡ jD ]}| t|||ƒ¡ qDqt|t	j
ƒr|| t||ƒ¡ q| t||ƒ¡ qt|ƒS )N)ÚitemsÚ
isinstancer   rS   r<   r   r.   Zshards_metadatar=   r    ÚTensorr?   rC   r   )rW   Úrequestsr0   Úobjr'   r$   r$   r%   Ú"_create_default_metadata_only_planÊ   s    


ÿr]   )r0   Úobjectr   c                    s`   t ˆtƒrtˆ ˆƒgS t ˆtƒr8‡ ‡fdd„ˆ ¡ D ƒS t ˆtjƒrPtˆ ˆƒgS tˆ ˆƒgS d S )Nc                    s   g | ]}t ˆ ˆ|jƒ‘qS r$   )r=   r.   ©Ú.0rU   ©r0   r^   r$   r%   Ú
<listcomp>ß   s   ÿz'_create_write_items.<locals>.<listcomp>)	rY   r   r<   r   Úlocal_shardsr    rZ   r?   rC   ra   r$   ra   r%   Ú_create_write_itemsÛ   s    

þrd   c                 C   sP   | j }|jdkstdƒ‚t t| j|| jƒ¡}t t| j|| jƒ¡}t	||d�S )Nr
   r1   r   )
r5   r6   r7   r    r!   r   r8   r9   r	   r   )r   r5   r   r   r$   r$   r%   Ú_create_chunk_from_dtensoré   s    ÿþþre   )r0   Úmdr\   r   c                 C   s    t |tƒs€t |tƒr t|ƒg}nTt |tƒr>dd„ | ¡ D ƒ}n6t |tjƒrVt|ƒg}nt	d| › d�dt
|ƒ› � ƒ‚t| ||ƒS tt| ƒdt| ƒddd�gS d S )Nc                 S   s   g | ]}t |jƒ‘qS r$   )r)   r.   r_   r$   r$   r%   rb   ü   s     z&_create_read_items.<locals>.<listcomp>z Invalid checkpoint metadata for z, z(expected BytesStorageMetadata but found r   rJ   )rY   r   r   re   r   rc   r    rZ   r&   Ú
ValueErrorr4   r   rL   r   )r0   rf   r\   rP   r$   r$   r%   Ú_create_read_items÷   s*    



ÿÿûÿrh   )2Útypingr   r   r    Z!torch.distributed._shard.metadatar   Z'torch.distributed._shard.sharded_tensorr   Z0torch.distributed._shard.sharded_tensor.metadatar   Ztorch.distributed._tensorr   Z torch.distributed._tensor._utilsr   r	   Zplannerr   r   r   r   r   r   r.   r   r   r   r   r   r   Z
reshardingr   r   r   ÚstrÚ__annotations__rZ   r&   r)   r/   r<   r=   r?   rC   rL   rN   r   r]   rd   re   rh   r$   r$   r$   r%   Ú<module>   sH     	 	 þ
  þü=