U
    Jc                     @   sT  d dl Z d dl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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m Z  dd	l!m"Z" G d
d deZ#G dd deZ$ee%ef eedddZ&ee ee dddZ'ee%ef e(edddZ)ee eee ef dddZ*eedddZ+dS )    N)ListTupleDictAnyUnioncast)narrow_tensor_by_index)ShardedTensor   )SavePlannerLoadPlannerSavePlanLoadPlanReadItem	WriteItemWriteItemType)BytesStorageMetadataTensorStorageMetadataMetadataIndexMetadataSTATE_DICT_TYPESTORAGE_TYPES)_create_read_items_create_write_items"_create_default_metadata_only_plan)find_state_dict_objectc                   @   s   e Zd Zeeef eddddZedddZ	e
e ee
e ef dd	d
ZeedddZeeejejf dddZeedddZeedddZdS )DefaultSavePlannerN
state_dictis_coordinatorreturnc                 C   s   || _ || _d S N)r   r   )selfr   r    r#   W/tmp/pip-unpacked-wheel-gikjz4vx/torch/distributed/_shard/checkpoint/default_planner.pyinit)   s    zDefaultSavePlanner.initr    c                 C   s   t | j| j| _| jS r!   )create_default_local_save_planr   r   planr"   r#   r#   r$   create_local_plan-   s    z$DefaultSavePlanner.create_local_plan	all_plansr    c                 C   s   t |\| _| _| j| jfS r!   )create_default_global_save_planglobal_planmetadata)r"   r,   r#   r#   r$   create_global_plan1   s    z%DefaultSavePlanner.create_global_plannew_planr    c                 C   s
   || _ |S r!   )r(   r"   r2   r#   r#   r$   finish_plan5   s    zDefaultSavePlanner.finish_plan)
write_itemr    c                 C   s   |  |j}| ||S r!   )lookup_objectindextransform_object)r"   r5   objectr#   r#   r$   resolve_data9   s    zDefaultSavePlanner.resolve_datar7   r    c                 C   s   t | j|S zo
        This is an extension from the planner interface to make it easy to extend the default planner
        r   r   r"   r7   r#   r#   r$   r6   =   s    z DefaultSavePlanner.lookup_object)r5   r9   c                 C   s(   |j tjkr$t }t|| |}|S r<   )typer   BYTE_IOioBytesIOtorchsave)r"   r5   r9   bytesr#   r#   r$   r8   C   s
    z#DefaultSavePlanner.transform_object)__name__
__module____qualname__r   strr   boolr%   r   r*   r   r   r   r0   r4   r   r   rC   TensorrA   rB   r:   r   r6   r8   r#   r#   r#   r$   r   (   s    r   c                   @   s   e Zd ZeeeddddZedddZe	e e	e dd	d
Z
eedddZeejddddZedddZeejddddZeejdddZeejdddZdS )DefaultLoadPlannerN)r   r/   r   r    c                 C   s   || _ || _|| _d S r!   )r   r/   r   )r"   r   r/   r   r#   r#   r$   r%   O   s    zDefaultLoadPlanner.initr&   c                 C   s   t | j| jS r!   )create_default_local_load_planr   r/   r)   r#   r#   r$   r*   T   s    z$DefaultLoadPlanner.create_local_plan)r.   r    c                 C   s   t |S r!   )create_default_global_load_plan)r"   r.   r#   r#   r$   r0   W   s    z%DefaultLoadPlanner.create_global_planr1   c                 C   s   |S r!   r#   r3   r#   r#   r$   r4   Z   s    zDefaultLoadPlanner.finish_plan)	read_itemvaluer    c                 C   s   t || j|jj< d S r!   )rC   loadr   
dest_indexfqn)r"   rO   rP   r#   r#   r$   
load_bytes]   s    zDefaultLoadPlanner.load_bytes)rO   c                 C   s   |  |j}| ||S r!   )lookup_tensorrR   transform_tensorr"   rO   tensorr#   r#   r$   resolve_tensor`   s    z!DefaultLoadPlanner.resolve_tensor)rO   rX   r    c                 C   s   d S r!   r#   rW   r#   r#   r$   commit_tensord   s    z DefaultLoadPlanner.commit_tensorr;   c                 C   s   t | j|S r<   r=   r>   r#   r#   r$   rU   g   s    z DefaultLoadPlanner.lookup_tensor)rO   rX   c                 C   s   t ||j|jS r<   )r   Zdest_offsetslengthsrW   r#   r#   r$   rV   m   s    z#DefaultLoadPlanner.transform_tensor)rF   rG   rH   r   r   rJ   r%   r   r*   r   r0   r4   r   rA   rB   rT   rY   rC   rK   rZ   r   rU   rV   r#   r#   r#   r$   rL   N   s   rL   )r   r/   r    c                 C   s8   g }|   D ]"\}}|j| }|t|||7 }qt|S r!   )itemsZstate_dict_metadatar   r   )r   r/   requestsrS   objmdr#   r#   r$   rM   t   s
    

rM   r+   c                 C   s   | S )z
    Create global load plan used by DefaultLoadPlanner.

    The default load behavior involved no global coordination and this function
    currently doesn't change the local plans.
    r#   )r,   r#   r#   r$   rN      s    rN   r   c                 C   s:   g }|   D ]$\}}t|ts"|r|t||7 }qt|S )a  
    Create the ``SavePlan`` used by DefaultSavePlanner.

    On non-coordinator ranks, this function ignores tensors and non-tensor objects,
    only producing writes for ShardedTensor objects.

    On the coordinator rank, produce writes for all values.
    )r\   
isinstancer	   r   r   )r   r   r]   rS   r^   r#   r#   r$   r'      s
    	r'   c           	      C   s  i }g }| D ]}g }|j D ]}|jtjks:|jj|ks:t|jtjkr`t ||jj< |	| q|j
dk	snttt||jjt|j
j|j
jg d}tj|jt|jd}tj||d}|	| |j
jdk	std|jj |j	|j
j q|	tj||d q|t|fS )a  
    Create the global plan and metadata used by DefaultSavePlanner.

    Metadata is produced by concatenating the metadata of all ``WriteItem`` from the supplied plans.

    The only global planning change is to update index hints in all ``MetadataIndex`` objects.
    N)
propertiessizechunks)r7   z1Cannot create MD for tensor without bounds. FQN: )r\   )r\   r?   r   ZSHARDr7   rS   AssertionErrorr@   r   appendZtensor_datar   r   
setdefaultra   rb   dataclassesreplacelenrc   chunkr   )	r,   r_   Z	new_plansr(   Z	new_itemsitemZ	tensor_mdZ	new_indexZnew_itemr#   r#   r$   r-      s4    

r-   )r   r    c                 C   s   t | }t|g\}}|S )z^
    Return the ``Metadata`` if DefaultSavePlanner was used to checkpoint ``state_dict``.
    )r   r-   )r   r(   _r_   r#   r#   r$   _create_default_local_metadata   s    rm   ),rg   rA   typingr   r   r   r   r   r   rC   Ztorch.distributed._shard._utilsr   Z'torch.distributed._shard.sharded_tensorr	   Zplannerr   r   r   r   r   r   r   r/   r   r   r   r   r   r   Zplanner_helpersr   r   r   utilsr   r   rL   rI   rM   rN   rJ   r'   r-   rm   r#   r#   r#   r$   <module>   s&    $
 	&'
	 &