§
    Ÿ²Åj!A  ã                   óð  — d dl Z d dlmZmZmZmZmZ d dlZd dlm	Z	 d dl
mZmZ g d¢Z e j        e¦  «        Z	 dZ G d„ d¦  «        Z G d	„ d
e¦  «        Z e ej        d¦  «        d„ ¦  «        Zd Z G d„ d¦  «        Z G d„ d¦  «        Zd„ Z	 	 ddeedf         deeeef                  dedeeedf                  deeeef                  deee         ee         f         fd„Zdee         fd„ZdS )é    N)ÚAnyÚDictÚListÚOptionalÚTuple©Úmap_aggregate)Útree_flattenÚtree_unflatten)ÚTensorChunkSpecÚsplit_args_kwargs_into_chunksÚmerge_chunksFc                   ó   — e Zd ZdZd„ ZdS )Ú_CustomReducera$  
    Custom reducer class that can be used to specify a custom operation that
    reduces losses of multiple microbatches into one value.

    Example:
    >>> # xdoctest: +SKIP
    >>> sum_reducer = _CustomReducer(
    >>>     torch.tensor(0.0),
    >>>     lambda a, b: a + b
    >>> )
    c                 ó"   — || _         || _        d S ©N)Ú
init_valueÚ	reduce_fn)Úselfr   r   s      úXC:\Projects\Historical\venv\Lib\site-packages\torch/distributed/pipelining/microbatch.pyÚ__init__z_CustomReducer.__init__(   s   € Ø$ˆŒØ"ˆŒˆˆó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   © r   r   r   r      s-   € € € € € ð
ð 
ð#ð #ð #ð #ð #r   r   c                   ó   — e Zd ZdS )Ú_LossReducerN©r   r   r   r   r   r   r   r   -   ó   € € € € € Ø€Dr   r   g        c                 ó   — | |z   S r   r   )ÚaÚbs     r   ú<lambda>r%   1   s
   € ¸1¸q¹5€ r   c                   óˆ   — e Zd ZU dZd„ Zeed<   d„ Zd„ Ze	de
edf         fd„¦   «         Ze	deeef         fd	„¦   «         Zd
S )r   z2
    Class used to specify chunking of inputs
    c                 ó   — || _         d S r   ©Ú	split_dim)r   r)   s     r   r   zTensorChunkSpec.__init__=   s   € Ø"ˆŒˆˆr   r)   c                 óJ   — | j         j        › d| j         j        › d| j        › d�S )Nú.ú(ú))Ú	__class__r   r   r)   ©r   s    r   Ú__repr__zTensorChunkSpec.__repr__B   s/   € àŒ~Ô(ÐVÐV¨4¬>Ô+BÐVÐVÀTÄ^ÐVÐVÐVð	
r   c                 ó   — d| j         › d�S )NzTensorChunkSpec(r-   r(   r/   s    r   Ú__str__zTensorChunkSpec.__str__G   s   € Ø3 $¤.Ð3Ð3Ð3Ð3r   Ú
chunk_dims.c                 ó(   — t          | d„ ¦  «        }|S )aŠ  
        A helper for creating a tuple of `TensorChunkSpec` from a tuple of chunk
        dimensions (int's).
        Example:
            >>> # xdoctest: +SKIP
            >>> # There are three positional arguments to the model, and
            >>> # we are chunking them along dimension 0, 0 and 1, respectively
            >>> args_chunk_spec = TensorChunkSpec.from_tuple((0, 0, 1))
        c                 ó    — t          | ¦  «        S r   ©r   ©Údims    r   r%   z,TensorChunkSpec.from_tuple.<locals>.<lambda>Y   ó   € �¨Ñ,Ô,€ r   r   )r3   Úargs_chunk_specs     r   Ú
from_tuplezTensorChunkSpec.from_tupleJ   s$   € õ (ØØ,Ð,ñ
ô 
ˆð Ðr   c                 ó(   — t          | d„ ¦  «        }|S )a\  
        A helper for creating a dictionary of `TensorChunkSpec` from a
        dictionary of chunk dimensions (int's).
        Example:
            >>> # xdoctest: +SKIP
            >>> # Chunk dimension 0 for the "id" argument, 1 for the "mask" argument
            >>> kwargs_chunk_spec = TensorChunkSpec.from_dict({"id": 0, "mask": 1})
        c                 ó    — t          | ¦  «        S r   r6   r7   s    r   r%   z+TensorChunkSpec.from_dict.<locals>.<lambda>k   r9   r   r   )r3   Úkwargs_chunk_specs     r   Ú	from_dictzTensorChunkSpec.from_dict]   s%   € õ *ØØ,Ð,ñ
ô 
Ðð !Ð r   N)r   r   r   r   r   ÚintÚ__annotations__r0   r2   Ústaticmethodr   r;   r   Ústrr?   r   r   r   r   r   8   s¸   € € € € € € ðð ð#ð #ð #ð €N€N�Nð
ð 
ð 
ð
4ð 4ð 4ð ðØ˜#˜s˜(”Oðð ð ñ „\ðð$ ð!Ø˜˜c˜”Nð!ð !ð !ñ „\ð!ð !ð !r   r   c                   ó   — e Zd ZdS )Ú
_ReplicateNr    r   r   r   rE   rE   q   r!   r   rE   c                 óÊ  ‡!— i }g }|}d}t          | ¦  «        t          |¦  «        k    sNJ dt          |                      ¦   «         ¦  «        › dt          |                     ¦   «         ¦  «        › �¦   «         ‚|                      ¦   «         D �]\  }}t	          |¦  «        \  }	}
|                     |
¦  «         ||         }|€J ‚t	          |¦  «        \  }}t          |	¦  «        t          |¦  «        k    rt          d|› d|› �¦  «        ‚g }t          |	|¦  «        D �]æ\  }}|t          u st          |t          j        ¦  «        s|                     |g|z  ¦  «         ŒCt          |t          ¦  «        �r}t          |t          j        ¦  «        sJ |› d�¦   «         ‚|                     |j        ¦  «        }||k     rB|r't                               d|› d	|› d
|› d�¦  «         |}nt#          d|› d|› d|› d�¦  «        ‚t          j        |||j        ¦  «        }t&          r¹g }d}|D ]œ}t          j        |¦  «        }||                     |j        ¦  «        z   }t+          ddd¦  «        g|j        z  }t+          ||¦  «        ||j        <   |||<   |                     |¦  «         ||                     |j        ¦  «        z  }Œ�|                     |¦  «         n|                     |¦  «         d}�ŒÖt/          d|› �¦  «        ‚|||<   �Œ�g }t1          |¦  «        D ]FŠ!i }|                     ¦   «         D ]\  }}ˆ!fd„|D ¦   «         }|||<   Œ|                     |¦  «         ŒGg }|D ]y}i }t          |¦  «        t          |¦  «        k    sJ ‚t          |                     ¦   «         |¦  «        D ]\  \  }}} t3          || ¦  «        ||<   Œ|                     |¦  «         Œz|S )aW  
    Given a dictionary of args, and a dictionary of chunking specs, shard the
    args according to the chunking specs.

    Args:
        args_dict: Dictionary of args
        args_chunk_spec: Dictionary of chunking specs
        num_chunks: Number of chunks to shard the args into

    Returns:
        args_split: List of sharded args
    Tzargs_dict.keys() = z args_chunk_spec.keys() = NzArgument value z9 did not have the same number of values as as chunk spec z is not a tensorz%Tensor size on chunking dimension is z', downsizing the number of chunks from z to r+   zArg z% on chunking dimension has a size of z$, smaller than the number of chunks zŒ. PiPPy cannot reduce the number of chunks because other arguments have bigger chunk-dimension sizes. Please adjust your num_chunks setting.r   FzUnrecognized chunk spec: c                 ó    •— g | ]
}|‰         ‘ŒS r   r   )Ú.0Úv_flatÚ	chunk_idxs     €r   ú
<listcomp>z'_shard_dict_of_args.<locals>.<listcomp>ã   s   ø€ ÐDÐDÐD°f  yÔ 1ÐDÐDÐDr   )ÚlenÚlistÚkeysÚitemsr
   ÚappendÚ
ValueErrorÚziprE   Ú
isinstanceÚtorchÚTensorr   Úsizer)   ÚloggerÚwarningÚRuntimeErrorÚtensor_splitÚ_debug_mask_minibatchesÚ
zeros_likeÚsliceÚndimÚ	TypeErrorÚranger   )"Ú	args_dictr:   Ú
num_chunksÚargs_sharded_replicatedÚ	arg_specsÚreal_num_chunksÚfirst_tensorÚarg_keyÚargÚflatÚspecÚ
chunk_specÚchunk_spec_flatÚ_Úsharded_arg_flatÚvÚchunk_vÚv_split_dim_sizeÚchunk_tensorsÚexpanded_chunksÚsplit_dim_idxÚchunk_tensorÚnew_valÚ	upper_idxÚslice_indicesÚchunks_flatÚ
chunk_argsÚkeyÚarg_single_chunkÚ
args_splitÚchunkÚper_chunk_argsÚarg_specrJ   s"                                    @r   Ú_shard_dict_of_argsr�   u   sû  ø€ ð( !ÐØ€Ià €OØ€Låˆy‰>Œ>�SØñô ò ð ð àm�T )§.¢.Ñ"2Ô"2Ñ3Ô3ÐmÐmÍtÐTc×ThÒThÑTjÔTjÑOkÔOkÐmÐmñô ð ð "ŸšÑ)Ô)ð I<ñ I<‰ˆ�Ý! #Ñ&Ô&‰
ˆˆdØ×Ò˜ÑÔÐà$ WÔ-ˆ
ØÐ%Ð%Ð%Ý)¨*Ñ5Ô5Ñˆ˜Ýˆt‰9Œ9�˜OÑ,Ô,Ò,Ð,Ýð8 #ð 8ð 8Ø+5ð8ð 8ñô ð ð
 Ðå˜d OÑ4Ô4ð 8	Gñ 8	G‰JˆAˆwØ�*Ð$Ð$­J°q½%¼,Ñ,GÔ,GÐ$Ø ×'Ò'¨¨¨oÑ(=Ñ>Ô>Ð>Ð>Ý˜G¥_Ñ5Ô5ñ 5Gõ " !¥U¤\Ñ2Ô2ÐJÐJ°qÐ4JÐ4JÐ4JÑJÔJÐ2à#$§6¢6¨'Ô*;Ñ#<Ô#<Ð Ø# oÒ5Ð5Ø#ð õ ŸšðhÐDTð hð hØDNðhð hØTdðhð hð hñô ð ð +;˜˜å*ðE 7ð Eð EÐQað Eð EØAKðEð Eð Eñô ð õ !&Ô 2Ø�¨Ô(9ñ!ô !�õ +ð ;Ø&(�Oà$%�MØ(5ð Nð N˜Ý"'Ô"2°1Ñ"5Ô"5˜Ø$1°L×4EÒ4EÀgÔFWÑ4XÔ4XÑ$X˜	å).¨t°T¸4Ñ)@Ô)@Ð(AÀGÄLÑ(P˜Ý;@Ø)¨9ñ<ô <˜ gÔ&7Ñ8ð 2>˜ Ñ.à'×.Ò.¨wÑ7Ô7Ð7à%¨×):Ò):¸7Ô;LÑ)MÔ)MÑM˜˜à$×+Ò+¨OÑ<Ô<Ð<Ð<à$×+Ò+¨MÑ:Ô:Ð:à$�‘åÐ E¸GÐ EÐ EÑFÔFÐFà+;Ð Ñ(Ñ(ð €KÝ˜?Ñ+Ô+ð 'ð 'ˆ	Øˆ
Ø/×5Ò5Ñ7Ô7ð 	/ð 	/‰HˆC�ØDÐDÐDÐDÀÐDÑDÔDÐØ.ˆJ�s‰OˆOØ×Ò˜:Ñ&Ô&Ð&Ð&ð €Jàð *ð *ˆØˆÝ�9‰~Œ~¥ U¡¤Ò+Ð+Ð+Ð+Ý$'¨¯ª©¬°yÑ$AÔ$Að 	@ð 	@Ñ ‰JˆS�#˜Ý"0°°hÑ"?Ô"?ˆN˜3ÑÐØ×Ò˜.Ñ)Ô)Ð)Ð)àÐr   Úargs.ÚkwargsÚchunksr:   r>   Úreturnc                 ó  — |€i }|€%t          t          ¦  «        ft          | ¦  «        z  }|€-t                               |t          t          ¦  «        ¦  «        }t          t          t          | ¦  «        ¦  «        t          t          |¦  «        ¦  «        |¦  «        }t          |¦  «        }t          |||¦  «        }t          |¦  «        |k     rTt          |¦  «        }t          t          t          | ¦  «        ¦  «        t          t          |¦  «        ¦  «        |¦  «        }t          |¦  «        t          |¦  «        k    r/t          dt          |¦  «        › dt          |¦  «        › �¦  «        ‚d„ |D ¦   «         }||fS )a  
    Given a sequence of args and kwargs, split them into a number of chunks
    according to  their respective chunking specs.

    Args:
        args: Tuple of args
        kwargs: Dict of kwargs
        chunks: Number of chunks to split the args and kwargs into
        args_chunk_spec: chunking specs for args, in same shape as args
        kwargs_chunk_spec: chunking specs for kwargs, in same shape as kwargs

    Returns:
        args_split: List of sharded args
        kwargs_split: List of sharded kwargs
    Nz;args and kwargs are split into different number of chunks: z, c           
      óz   ‡— g | ]7Št          ˆfd „t          t          ‰¦  «        ¦  «        D ¦   «         ¦  «        ‘Œ8S )c              3   ó(   •K  — | ]}‰|         V — Œd S r   r   )rH   Úirz   s     €r   ú	<genexpr>z;split_args_kwargs_into_chunks.<locals>.<listcomp>.<genexpr>V  s'   øè è € Ð<Ð< ˆj˜ŒmÐ<Ð<Ð<Ð<Ð<Ð<r   )Útupler`   rL   )rH   rz   s    @r   rK   z1split_args_kwargs_into_chunks.<locals>.<listcomp>U  sT   ø€ ð ð ð àõ 	Ð<Ð<Ð<Ð<¥U­3¨z©?¬?Ñ%;Ô%;Ð<Ñ<Ô<Ñ<Ô<ðð ð r   )r   ÚDEFAULT_CHUNK_DIMrL   ÚdictÚfromkeysr�   Ú	enumeraterY   )	r‚   rƒ   r„   r:   r>   Úargs_split_dictre   Úkwargs_splitr}   s	            r   r   r   ô   s–  € ðp €~Øˆð ÐÝ*Õ+<Ñ=Ô=Ð?Å#ÀdÁ)Ä)ÑKˆàÐ Ý ŸMšM¨&µ/ÕBSÑ2TÔ2TÑUÔUÐå)Ý�Y�t‰_Œ_ÑÔÝ�Y�Ñ'Ô'Ñ(Ô(Øñô €Oõ
 ˜/Ñ*Ô*€Oå&ØØØñô €Lõ ˆ<ÑÔ˜?Ò*Ð*õ ˜lÑ+Ô+ˆå-Ý•˜4‘”Ñ!Ô!Ý•˜?Ñ+Ô+Ñ,Ô,Øñ
ô 
ˆõ ˆ?ÑÔ�s <Ñ0Ô0Ò0Ð0Ýð;Ý�?Ñ#Ô#ð;ð ;Ý'*¨<Ñ'8Ô'8ð;ð ;ñ
ô 
ð 	
ð
ð à)ðñ ô €Jð
 �|Ð#Ð#r   c                 ó^  ‡‡— |�t          |¦  «        \  }}n=t          | d         ¦  «        \  }}t          t          ¦  «        gt          |¦  «        z  }g Š| D ]^}t          |¦  «        \  }}t          |¦  «        t          |¦  «        k    rt	          d|› d|› �¦  «        ‚‰                     |¦  «         Œ_g }t          |¦  «        D �]T\  Š}	t          |	t          ¦  «        �rmˆˆfd„t          t          ‰¦  «        ¦  «        D ¦   «         }
t          �r
|
d         j
        }|
dd…         D ]}|j
        |k    sJ ‚Œt          j        t          j        |ddiŽt          |
¦  «        |	j        ¬	¦  «        }g }d}t          |
¦  «        t          |¦  «        k    sJ ‚t          |
|¦  «        D ]s\  }}||                     |	j        ¦  «        z   }t#          ddd¦  «        g|j        z  }t#          ||¦  «        ||	j        <   ||         }|                     |¦  «         |}Œtn|
}|                     t          j        ||	j        ¬
¦  «        ¦  «         �Œ‰t          |	t(          ¦  «        r_|	j        }t          t          ‰¦  «        ¦  «        D ]$}|	                     |‰|         ‰         ¦  «        }Œ%|                     |¦  «         �Œý‰d         ‰         }t          dt          ‰¦  «        ¦  «        D ]}‰|         ‰         |k    sJ ‚Œ|                     |¦  «         �ŒVt/          ||¦  «        S )zæ
    Given a list of chunks, merge them into a single value according to
    the chunk spec.

    Args:
        chunks: list of chunks
        chunk_spec: Chunking spec for the chunks

    Returns:
        value: Merged value
    Nr   zChunk z did not match chunk spec c                 ó,   •— g | ]}‰|         ‰         ‘ŒS r   r   )rH   rJ   Úarg_idxÚchunks_flatteneds     €€r   rK   z merge_chunks.<locals>.<listcomp>£  s3   ø€ ð ð ð àð ! Ô+¨GÔ4ðð ð r   é   ÚdeviceÚmeta)Úsectionsr8   r7   )r
   r   rŒ   rL   rQ   rP   r�   rS   r`   r[   ÚshaperT   rZ   Úemptyr)   rR   rV   r]   r^   Úcatr   r   r   r   )r„   rk   Úspec_flattenedÚflatten_specÚchunk0_flatr~   Úchunk_flattenedrm   Úargs_flattenedrh   Úpartial_valuesÚoverall_shapeÚvalÚmeta_chunksÚvalues_to_catÚchunk_start_idxÚpartial_valueÚ
meta_chunkÚchunk_end_idxrx   ÚslicedÚreduced_valrJ   Úvaluer”   r•   s                           @@r   r   r   ]  s   øø€ ðZ ÐÝ'3°JÑ'?Ô'?Ñ$ˆ˜˜õ %1°¸´Ñ$;Ô$;Ñ!ˆ�\Ý)Õ*;Ñ<Ô<Ð=ÅÀKÑ@PÔ@PÑPˆð Ðàð 1ð 1ˆÝ)¨%Ñ0Ô0Ñˆ˜ÝˆÑÔ¥3 ~Ñ#6Ô#6Ò6Ð6ÝÐS eÐSÐSÀzÐSÐSÑTÔTÐTà×Ò Ñ0Ô0Ð0Ð0ð
 €NÝ! .Ñ1Ô1ð 0)ñ 0)‰ˆ�Ý�c�?Ñ+Ô+ñ /	)ðð ð ð ð å!&¥sÐ+;Ñ'<Ô'<Ñ!=Ô!=ðñ ô ˆNõ
 'ñ /à .¨qÔ 1Ô 7�Ø)¨!¨"¨"Ô-ð 6ð 6�CØœ9¨Ò5Ð5Ð5Ð5Ð5Ý#Ô0Ý”K Ð>°vÐ>Ð>Ý  Ñ0Ô0Øœðñ ô �ð !#�Ø"#�Ý˜>Ñ*Ô*­c°+Ñ.>Ô.>Ò>Ð>Ð>Ð>Ý14°^À[Ñ1QÔ1Qð 4ð 4Ñ-�M :Ø$3°j·o²oÀcÄmÑ6TÔ6TÑ$T�Må%*¨4°°tÑ%<Ô%<Ð$=ÀÔ@RÑ$R�MÝ38¸È-Ñ3XÔ3X�M #¤-Ñ0Ø*¨=Ô9�FØ!×(Ò(¨Ñ0Ô0Ð0à&3�O�Oð4ð !/�à×!Ò!¥%¤)¨M¸s¼}Ð"MÑ"MÔ"MÑNÔNÐNÑNÝ˜�^Ñ,Ô,ð 	)Øœ.ˆKå"¥3Ð'7Ñ#8Ô#8Ñ9Ô9ð ð �	Ø!ŸmšmØÐ!1°)Ô!<¸WÔ!Eñô ��ð ×!Ò! +Ñ.Ô.Ð.Ñ.à$ QÔ'¨Ô0ˆEÝ" 1¥cÐ*:Ñ&;Ô&;Ñ<Ô<ð Eð E�	Ø'¨	Ô2°7Ô;¸uÒDÐDÐDÐDÐDØ×!Ò! %Ñ(Ô(Ð(Ñ(õ ˜.¨,Ñ7Ô7Ð7r   )NN)ÚloggingÚtypingr   r   r   r   r   rT   Útorch.fx.noder	   Útorch.utils._pytreer
   r   Ú__all__Ú	getLoggerr   rW   r[   r   r   ÚtensorÚsum_reducerrŒ   r   rE   r�   rC   r@   r   r   r   r   r   ú<module>r¶      s\  ðð €€€Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3à €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð €ð 
ˆÔ	˜8Ñ	$Ô	$€ðð
  Ð ð#ð #ð #ð #ð #ñ #ô #ð #ð$	ð 	ð 	ð 	ð 	�>ñ 	ô 	ð 	ð ˆl˜<˜5œ<¨Ñ,Ô,Ð.@Ð.@ÑAÔA€ð Ð ð5!ð 5!ð 5!ð 5!ð 5!ñ 5!ô 5!ð 5!ðr	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð|ð |ð |ðF >BØ>Bðf$ð f$Ø
��S�Œ/ðf$à�T˜#˜s˜(”^Ô$ðf$ð ðf$ð ˜e O°SÐ$8Ô9Ô:ð	f$ð
    S¨/Ð%9Ô :Ô;ðf$ð ˆ4�Œ;˜˜Tœ
Ð"Ô#ðf$ð f$ð f$ð f$ðRw8Ø�ŒIðw8ð w8ð w8ð w8ð w8ð w8r   