§
    ®˜ºhF?  ã                   óô  — d dl Z d dlZd dl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¦  «        ej        ¦  «        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ÚOptional©Ú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      úo/var/www/html/services/rag-service/venv/lib/python3.11/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                   óˆ   — 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__C   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__H   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   ú<lambda>z,TensorChunkSpec.from_tuple.<locals>.<lambda>Z   ó   € �¨Ñ,Ô,€ r   r   )r,   Úargs_chunk_specs     r   Ú
from_tuplezTensorChunkSpec.from_tupleK   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   r/   r0   s    r   r2   z+TensorChunkSpec.from_dict.<locals>.<lambda>l   r3   r   r   )r,   Úkwargs_chunk_specs     r   Ú	from_dictzTensorChunkSpec.from_dict^   s%   € õ *ØØ,Ð,ñ
ô 
Ðð !Ð r   N)r   r   r   r   r   ÚintÚ__annotations__r)   r+   ÚstaticmethodÚtupler5   ÚdictÚstrr9   r   r   r   r	   r	   9   s¸   € € € € € € ðð ð#ð #ð #ð €N€N�Nð
ð 
ð 
ð
4ð 4ð 4ð ðØ˜#˜s˜(”Oðð ð ñ „\ðð$ ð!Ø˜˜c˜”Nð!ð !ð !ñ „\ð!ð !ð !r   r	   c                   ó   — e Zd ZdS )Ú
_ReplicateNr   r   r   r   rA   rA   r   r   r   rA   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ÚziprA   Ú
isinstanceÚtorchÚTensorr	   Úsizer"   ÚloggerÚwarningÚRuntimeErrorÚtensor_splitÚ_debug_mask_minibatchesÚ
zeros_likeÚsliceÚndimÚ	TypeErrorÚranger   )"Ú	args_dictr4   Ú
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_specrF   s"                                    @r   Ú_shard_dict_of_argsr}   v   sí  ø€ ð( !ÐØ€Ià €OØ€Låˆy‰>Œ>�S Ñ1Ô1Ò1Ð1Ð1Øn�d 9§>¢>Ñ#3Ô#3Ñ4Ô4ÐnÐnÕPTÐUd×UiÒUiÑUkÔUkÑPlÔPlÐnÐnñ 2Ô1Ð1ð "ŸšÑ)Ô)ð 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ÐJà#$§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Úchunksr4   r8   Ú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   )rD   Úirv   s     €r   ú	<genexpr>z;split_args_kwargs_into_chunks.<locals>.<listcomp>.<genexpr>W  s'   øè è € Ð<Ð< ˆj˜ŒmÐ<Ð<Ð<Ð<Ð<Ð<r   )r=   r\   rH   )rD   rv   s    @r   rG   z1split_args_kwargs_into_chunks.<locals>.<listcomp>V  sT   ø€ ð ð ð àõ 	Ð<Ð<Ð<Ð<¥U­3¨z©?¬?Ñ%;Ô%;Ð<Ñ<Ô<Ñ<Ô<ðð ð r   )r	   ÚDEFAULT_CHUNK_DIMrH   r>   Úfromkeysr}   Ú	enumeraterU   )	r~   r   r€   r4   r8   Úargs_split_dictra   Úkwargs_splitry   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   )rD   rF   Úarg_idxÚchunks_flatteneds     €€r   rG   z merge_chunks.<locals>.<listcomp>¤  s3   ø€ ð ð ð àð ! Ô+¨GÔ4ðð ð r   é   ÚdeviceÚmeta)Úsectionsr1   r0   )r   r	   r‡   rH   rM   rL   r‰   rO   r\   rW   ÚshaperP   rV   Úemptyr"   rN   rR   rY   rZ   Úcatr   r   r   r   )r€   rg   Úspec_flattenedÚflatten_specÚchunk0_flatrz   Úchunk_flattenedri   Úargs_flattenedrd   Úpartial_valuesÚoverall_shapeÚvalÚmeta_chunksÚvalues_to_catÚchunk_start_idxÚpartial_valueÚ
meta_chunkÚchunk_end_idxrt   ÚslicedÚreduced_valrF   Ú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ÚoperatorÚtypingr   r   rP   Útorch.fx.noder   Útorch.utils._pytreer   r   Ú__all__Ú	getLoggerr   rS   rW   r   r   ÚtensorÚaddÚsum_reducerr‡   r	   rA   r}   r=   r>   r?   r:   rI   r
   r   r   r   r   ú<module>r²      sQ  ðð €€€Ø €€€Ø  Ð  Ð  Ð  Ð  Ð  Ð  Ð  à €€€Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <ðð ð €ð 
ˆÔ	˜8Ñ	$Ô	$€ðð
  Ð ð#ð #ð #ð #ð #ñ #ô #ð #ð$	ð 	ð 	ð 	ð 	�>ñ 	ô 	ð 	ð ˆl˜<˜5œ<¨Ñ,Ô,¨h¬lÑ;Ô;€ð Ð ð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   