+
    –°³j[  ã                   óz  € ^ RI t ^ RIt^ RIHt ^ RIHtHt ^ RIt^ RIH	t	 ^ RI
Ht ^ RIHt ^ RIHtHtHt . ROt] P&                  ! ]4      t R	t ! R
 R4      t ! R R]4      t]! ]P2                  ! R4      ]P4                  4      t^ t ! R R4      t ! R R4      tR R ltR R lt R t!RR R llt"R R lt#R# )é    N)ÚSequence)ÚAnyÚcast)ÚDTensor©Úmap_aggregate)Ú	BlockMask)Útree_flattenÚtree_mapÚtree_unflattenÚTensorChunkSpecFc                   ó*   a € ] tR t^t o RtR tRtV tR# )Ú_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                ó   € Wn         W n        R # ©N©Ú
init_valueÚ	reduce_fn)Úselfr   r   s   &&&Úh/home/luca/screen-checking/.venv/lib/python3.14/site-packages/torch/distributed/pipelining/microbatch.pyÚ__init__Ú_CustomReducer.__init__,   s   € Ø$ŒØ"Žó    r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classdictcell__©Ú__classdict__s   @r   r   r      s   ø‡ € ñ
÷#ð #r   r   c                   ó   € ] tR t^1tRtR# )Ú_LossReducer© N©r   r   r   r   r   r%   r   r   r$   r$   1   ó   † Ûr   r$   g        c                   óz   a € ] tR t^<t o RtR tR tR t]V 3R lR l4       t	]V 3R lR l4       t
V 3R	 ltR
tV tR# )r   z*
Class used to specify chunking of inputs
c                ó   € Wn         R # r   ©Ú	split_dim)r   r+   s   &&r   r   ÚTensorChunkSpec.__init__A   s   € Ø"Žr   c                ó|   € V P                   P                   R V P                   P                   RV P                   R2# )Ú.Ú(Ú))Ú	__class__r   r   r+   ©r   s   &r   Ú__repr__ÚTensorChunkSpec.__repr__F   s9   € à�~‰~×(Ñ(Ð)¨¨4¯>©>×+BÑ+BÐ*CÀ1ÀTÇ^Á^ÐDTÐTUÐVð	
r   c                ó"   € R V P                    R2# )zTensorChunkSpec(r0   r*   r2   s   &r   Ú__str__ÚTensorChunkSpec.__str__K   s   € Ø! $§.¡.Ð!1°Ð3Ð3r   c                ó4   <€ V ^8„  d   QhRS[ S[R3,          /# )é   Ú
chunk_dims.)ÚtupleÚint)Úformatr"   s   "€r   Ú__annotate__ÚTensorChunkSpec.__annotate__O   s   ø€ ÷ ñ Ù™#˜s˜(•Oñr   c                ó    € \        V R 4      pV# )aJ  
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                 ó   € \        V 4      # r   ©r   ©Údims   &r   Ú<lambda>Ú,TensorChunkSpec.from_tuple.<locals>.<lambda>]   ó	   € œ¨Ô,r   r   )r:   Úargs_chunk_specs   & r   Ú
from_tupleÚTensorChunkSpec.from_tupleN   s   € ô (ØÙ,ó
ˆð Ðr   c                ó6   <€ V ^8„  d   QhRS[ S[S[3,          /# )r9   r:   )ÚdictÚstrr<   )r=   r"   s   "€r   r>   r?   b   s   ø€ ÷ !ñ !Ù™™c˜•Nñ!r   c                ó    € \        V R 4      pV# )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                 ó   € \        V 4      # r   rB   rC   s   &r   rE   Ú+TensorChunkSpec.from_dict.<locals>.<lambda>o   rG   r   r   )r:   Úkwargs_chunk_specs   & r   Ú	from_dictÚTensorChunkSpec.from_dicta   s   € ô *ØÙ,ó
Ðð !Ð r   c                ó&   <€ V ^8„  d   Qh/ S[ ;R&   # )r9   r+   )r<   )r=   r"   s   "€r   r>   r?   <   s   ø‡ ‚ ñ �Nò r   r*   N)r   r   r   r   r   r   r3   r6   ÚstaticmethodrI   rR   Ú__annotate_func__r   r    r!   s   @r   r   r   <   sI   ø‡ € ñò#ò

ò
4ð ÷ó ðð$ ÷!ó ð!÷M ƒ r   c                   ó   € ] tR t^utRtR# )Ú
_Replicater%   Nr&   r%   r   r   rX   rX   u   r'   r   rX   c                óR   € V ^8„  d   QhR\         R\        R\        \         ,          /# )r9   Ú
block_maskÚ
num_chunksÚreturn)r	   r<   Úlist)r=   s   "r   r>   r>   y   s*   € ÷ >ñ >Üð>äð>ô 
Œ)…_ñ>r   c                óN  a € S P                   P                  ^ 4      ^8X  d   S .V,          # S P                   P                  ^ 4      V8¼  g   \        R4      h^ p\        P                  ! S P                   W4      p\        P                  ! S P
                  W4      pS P                  e"   \        P                  ! S P                  W4      M	R.V,          pS P                  e"   \        P                  ! S P                  W4      M	R.V,          p. p^ p\        V4       F…  p	V 3R lp
VP                  \        P                  ! W9,          WI,          WY,          Wi,          S P                  V
! V4      S P                  R7      4       WƒV	,          P                  ^ 4      ,          pK‡  	  V# )zñGiven a block mask, split the block mask along the batch dimension (dim0).

Args:
    block_mask: Block mask to split
    num_chunks: Number of chunks to split the block mask into

Returns:
    chunk_block_masks: List of chunked block masks
z;Block mask has fewer batch size than the number of chunks. Nc                 ó   <a € VV 3R  lpV# )c                 ód   <€ \         P                  ! V S4      pSP                  W,           WV4      # r   )ÚtorchÚ	full_likeÚmask_mod)ÚbÚhÚq_idxÚkv_idxÚb_offsetrZ   Úidxs   &&&& €€r   Úbatch_offset_mask_modÚI_split_block_mask.<locals>.create_mask_mod.<locals>.batch_offset_mask_mod¥   s*   ø€ Ü Ÿ?š?¨1¨cÓ2�Ø!×*Ñ*¨1­<¸À6ÓJÐJr   r%   )ri   rj   rZ   s   f €r   Úcreate_mask_modÚ*_split_block_mask.<locals>.create_mask_mod¤   s   ù€ öKð )Ð(r   )Úkv_num_blocksÚ
kv_indicesÚfull_kv_num_blocksÚfull_kv_indicesÚ
BLOCK_SIZErc   Úseq_lengths)rn   ÚsizeÚAssertionErrorra   Útensor_splitro   rp   rq   ÚrangeÚappendr	   Úfrom_kv_blocksrr   rs   )rZ   r[   Ú	batch_dimÚkv_num_blocks_chunksÚkv_indices_chunksÚfull_kv_num_blocks_chunksÚfull_kv_indices_chunksÚchunk_block_masksÚbatch_offsetÚ	chunk_idxrl   s   f&         r   Ú_split_block_maskr‚   y   s�  ø€ ð ×Ñ×$Ñ$ QÓ'¨1Ô,Øˆ|˜jÕ(Ð(à×#Ñ#×(Ñ(¨Ó+¨zÔ9ÜØIó
ð 	
ð €IÜ ×-Ò-Ø× Ñ  *óÐô ×*Ò*¨:×+@Ñ+@À*ÓXÐð ×(Ñ(Ò4ô 	×Ò˜:×8Ñ8¸*ÔPàˆV�jÕ ð ð ×%Ñ%Ò1ô 	×Ò˜:×5Ñ5°zÔMàˆV�jÕ ð ð ÐØ€LÜ˜:Ö&ˆ	õ	)ð 	× Ñ Ü×$Ò$Ø2Õ=Ø,Õ7Ø#<Õ#GØ 6Õ AØ%×0Ñ0Ù(¨Ó6Ø&×2Ñ2ôô
	
ð 	¨YÕ7×<Ñ<¸QÓ?Õ?Šñ) 'ð* Ðr   c          	      ó†   € V ^8„  d   QhR\         P                  R\        R\        R\        \         P                  ,          /# )r9   ÚtensorÚspecr[   r\   )ra   ÚTensorr   r<   r   )r=   s   "r   r>   r>   º   sC   € ÷ e<ñ e<Ü�L‰Lðe<ä
ðe<ô ðe<ô Œe�l‰lÕñ	e<r   c                ó
  a€ V P                  SP                  4      V8¼  g)   \        RV P                  SP                  4       R24      h\        V \        4      pV'       Ed   V P
                  pV P                  pV P                  4       p\        P                  ! WbSP                  4      pV P                  SP                  ,          p\        W‚4      w  ršV P                  4       p. p\        V4       Fw  w  rÞ\        V P                  4      pY�V
8  d   ^M^ ,           VSP                  &   VP                  \        P                   ! VVV\        P"                  ! V4      VRR7      4       Ky  	  TpM!\        P                  ! WSP                  4      pV P$                  '       d,   V P&                  '       d   V F  pVP)                  4        K  	  \*        '       g   V# R V3R llpV'       d€   V P
                  pV P                  pV P                  pV P                  4       pV! V P                  4       .R V 4       O5!  pV Uu. uF  p\        P                   ! VVVVVRR7      NK!  	  up# \        V! V .VO5!  4      # u upi )záGiven a tensor, and a chunking spec, split the tensor.
Args:

    tensor: Tensor to split
    spec: Chunking spec
    num_chunks: Number of chunks to split the tensor into

Returns:
    chunk_tensors: List of chunked tensors
zTensor size z is smaller than num_chunksF©ÚshapeÚstrideÚ	run_checkc                ó’   € V ^8„  d   QhR\         P                  R\         P                  R\        \         P                  R3,          /# )r9   ÚorigÚchunksr\   .)ra   r†   r;   )r=   s   "r   r>   Ú#_split_tensor.<locals>.__annotate__û   s:   € ÷ ñ Ü�l‰lðÜ%*§\¡\ðä	Œu�|‰|˜SÐ Õ	!ñr   c                 óx  <€ . p^ pV F¥  p\         P                  ! V 4      pW4P                  SP                  4      ,           p\	        R4      .VP
                  ,          p\	        W64      VSP                  &   WEV&   VP                  V4       W4P                  SP                  4      ,          pK§  	  \        V4      # )r   N)ra   Ú
zeros_likert   r+   ÚsliceÚndimrx   r;   )	r�   rŽ   Úexpandedri   ÚchunkÚnew_valÚupperÚslicesr…   s	   &*      €r   Ú_expand_chunksÚ%_split_tensor.<locals>._expand_chunksû   s™   ø€ ð ˆØˆÛˆEÜ×&Ò& tÓ,ˆGØŸ*™* T§^¡^Ó4Õ4ˆEÜ#(¨£; -°'·,±,Õ">ˆFÜ%*¨3Ó%6ˆF�4—>‘>Ñ"Ø#�F‰OØ�O‰O˜GÔ$Ø—:‘:˜dŸn™nÓ-Õ-ŠCñ ô �X‹Ðr   c              3   ó^   "  € T F#  p\        \        V4      P                  4       x € K%  	  R # 5ir   )r   r   Úto_local)Ú.0Úcs   & r   Ú	<genexpr>Ú _split_tensor.<locals>.<genexpr>  s#   é € ÐA±=¨aŒd”7˜AÓ×'Ñ'×)Ð)³=ùs   ‚+-)rt   r+   ru   Ú
isinstancer   Ú
placementsÚdevice_meshrœ   ra   rv   r‰   ÚdivmodrŠ   Ú	enumerater]   rx   Ú
from_localÚSizeÚrequires_gradÚis_leafÚretain_gradÚ_debug_mask_minibatches)r„   r…   r[   Ú_is_dtensorr¢   ÚmeshÚlocal_tensorÚlocal_chunksÚglobal_split_sizeÚquotientÚ	remainderÚglobal_strideÚchunk_tensors_listÚiÚlocal_chunkÚchunk_shapeÚchunk_tensorsr•   r™   Úglobal_shapeÚlocal_expandedÚts   &f&                   r   Ú_split_tensorr¼   º   sA  ø€ ð  �;‰;�t—~‘~Ó&¨*Ô4ÜØ˜6Ÿ;™; t§~¡~Ó6Ð7Ð7RÐSó
ð 	
ô ˜V¤WÓ-€Kç€{ð ×&Ñ&ˆ
Ø×!Ñ!ˆØ—‘Ó(ˆÜ×)Ò)¨,ÀDÇNÁNÓSˆà"ŸL™L¨¯©Õ8ÐÜ$Ð%6ÓCÑˆØŸ™›ˆØ13ÐÜ'¨Ö5‰NˆAÜ˜vŸ|™|Ó,ˆKØ*2¸y¼=±aÈaÕ*PˆK˜Ÿ™Ñ'Ø×%Ñ%Ü×"Ò"ØØØÜŸ*š* [Ó1Ø(Ø#ôö	ñ 6ð 1C‰ä×*Ò*¨6¸t¿~¹~ÓNˆð
 ××Ð §§ Û"ˆEØ×ÑÖñ #÷ #Ó"ØÐ÷ð ÷ Ø×&Ñ&ˆ
Ø×!Ñ!ˆØ—|‘|ˆØŸ™›ˆÙ'Ø�O‰OÓð
áA±=ÓAó
ˆñ $ó

ñ $�ô ×ÒØØØØ"Ø$Ø÷ñ $ñ

ð 
	
ô ‘N 6Ð:¨MÓ:Ó;Ð;ùò

s   É%J c           	     óº  € V '       g   \        V4       Uu. uF  p/ NK  	  up# \        V 4      \        V4      8X  g@   \        R\        V P	                  4       4       R\        VP	                  4       4       24      hVf   \        R4      h\        V R R7      w  rE\        VR R7      w  rc. p\        WFRR7       EF�  w  r‰V	\        J g   \        V	\        4      '       d   VP                  V4       K9  \        V\        P                  4      '       dZ   \        V	\        4      '       g   \        R	\        V	4       24      hVP                  VP                  V	P                  4      4       K²  \        V\         4      '       d«   \        V	\        4      '       g   \        R	\        V	4       24      hV	P                  ^ 8X  g   \        R
4      hVP"                  P                  ^ 4      ^8X  d   VP                  V4       EKE  VP                  VP"                  P                  ^ 4      4       EKr  \%        RV	 RV R24      h	  \'        . VOVN5!  p
\        V
4       Uu. uF  p. NK  	  pp\        WFRR7       Fº  w  r‰. pV	\        J g   \        V	\        4      '       d   V.V
,          pMa\        V\        P                  4      '       d   \)        W‰V
4      pM4\        V\         4      '       d   \+        WŠ4      pM\%        RV	 RV R24      h\        W¼RR7       F  w  rÞVP                  V4       K  	  K¼  	  V Uu. uF  p\-        WÕ4      NK  	  up# u upi u upi u upi )a3  
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
zargs_dict.keys() = z args_chunk_spec.keys() = z.args_chunk_spec should have been set by callerc                 ó"   € \        V \        4      # r   ©r¡   r	   ©Úxs   &r   rE   Ú%_shard_dict_of_args.<locals>.<lambda>@  s   € ¤Z°´9Ô%=r   ©r©   c                 ó"   € \        V \        4      # r   r¿   rÀ   s   &r   rE   rÂ   C  s   € ¬:°a¼Ô+Cr   T©ÚstrictzExpected TensorChunkSpec, got z#BlockMask only supports split_dim=0zUnsupported chunk spec: z and value: z combination.)rw   Úlenru   r]   Úkeysr
   ÚziprX   r¡   rx   ra   r†   r   Útypert   r+   r	   rn   Ú
ValueErrorÚminr¼   r‚   r   )Ú	args_dictrH   r[   Ú_ÚvaluesÚ	tree_specÚchunk_specsÚsplit_sizesÚvr…   Úresult_num_chunksÚflat_split_resultsÚv_splitsÚ_flat_split_resultÚ_v_splits   &&&            r   Ú_shard_dict_of_argsrÙ   "  s  € ÷$ Ü! *Ô-Ó.Ñ-�q“Ñ-Ñ.Ð.äˆy‹>œS Ó1Ô1ÜØ!¤$ y§~¡~Ó'7Ó"8Ð!9ð :(Ü(,¨_×-AÑ-AÓ-CÓ(DÐ'EðGó
ð 	
ð ÒÜÐMÓNÐNä$ØÑ=ôÑ€Fô "ØÑ!Cô�N€Kð
 €KÜ�v°4×8Ð8‰ˆð ”:Ó¤¨D´*×!=Ò!=Ø×Ñ˜zÖ*Ü˜œ5Ÿ<™<×(Ò(Ü˜d¤O×4Ò4Ü$Ð'EÄdÈ4ÃjÀ\Ð%RÓSÐSØ×Ñ˜qŸv™v d§n¡nÓ5Ö6Ü˜œ9×%Ò%Ü˜d¤O×4Ò4Ü$Ð'EÄdÈ4ÃjÀ\Ð%RÓSÐSØ—>‘> QÔ&Ü$Ð%JÓKÐKà�‰×#Ñ# AÓ&¨!Ô+Ø×"Ñ" :×.à×"Ñ" 1§?¡?×#7Ñ#7¸Ó#:×;äØ*¨4¨&°¸Q¸C¸}ÐMóð ñ) 9ô. Ð5˜[Ð5¨*Ó5Ðä16Ð7HÔ1IÓ$JÑ1I¨A£RÑ1IÐÐ$JÜ�v°4×8‰ˆØ"$ˆØ”:Ó¤¨D´*×!=Ò!=Ø�sÐ.Õ.‰HÜ˜œ5Ÿ<™<×(Ò(Ü$ QÐ.?Ó@‰HÜ˜œ9×%Ò%Ü(¨Ó>‰HäØ*¨4¨&°¸Q¸C¸}ÐMóð ô -0Ø°÷-
Ñ(Ðð ×%Ñ% hÖ/ó-
ñ 9ñ( #5óá"4Ðô 	Ð)Ö5Ù"4ñð ùò /ùòX %Kùò&s   –MÉMÌ7Mc                óP  € V ^8„  d   QhR\         \        R3,          R\        \        \        3,          R,          R\        R\         \
        R3,          R,          R\        \        \
        3,          R,          R\         \        \         ,          \        \        ,          3,          /# )	r9   Úargs.ÚkwargsNrŽ   rH   rQ   r\   )r;   r   rL   rM   r<   r   r]   )r=   s   "r   r>   r>   z  s‘   € ÷ p$ñ p$Ü
”�S��/ðp$ä””c��N˜TÕ!ðp$ô ðp$ô œ?¨CÐ/Õ0°4Õ7ð	p$ô
 œC¤Ð0Õ1°DÕ8ðp$ô Œ4”�;œœT�
Ð"Õ#ñp$r   c                óÜ  a	€ Vf   / pR pVf   \        WPR R7      pVf   \        WQR R7      p\        \        \        V 4      4      \        \        V4      4      V4      p\	        V4      p\        VVV4      p\	        V4      V8  d=   \	        V4      p\        \        \        V 4      4      \        \        V4      4      V4      p\	        V4      \	        V4      8w  d$   \        R\	        V4       R\	        V4       24      hV U	a	u. uFY  o	\        ;QJ d)    . V	3R l\        \	        S	4      4       4       F  NK  	  5M"! V	3R l\        \	        S	4      4       4       4      NK[  	  p
p	W¨3# u up	i )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
c                 óŠ   € \        V \        P                  \        ,          4      '       d   \	        \
        4      # \        4       # r   )r¡   ra   r†   r	   r   ÚDEFAULT_CHUNK_DIMrX   ©rÓ   s   &r   Údefault_specÚ3split_args_kwargs_into_chunks.<locals>.default_spec·  s,   € Ü�aœŸ™¬	Õ1×2Ò2Ü"Ô#4Ó5Ð5ä“<Ðr   c                 ó"   € \        V \        4      # r   r¿   rà   s   &r   rE   Ú/split_args_kwargs_into_chunks.<locals>.<lambda>¿  s   € ´*¸QÄ	Ô2Jr   rÃ   c                 ó"   € \        V \        4      # r   r¿   rà   s   &r   rE   rä   Ä  s   € ´J¸qÄ)Ô4Lr   z;args and kwargs are split into different number of chunks: z, c              3   ó6   <"  € T F  pSV,          x € K  	  R # 5ir   r%   )r�   rµ   Ú
chunk_argss   & €r   rŸ   Ú0split_args_kwargs_into_chunks.<locals>.<genexpr>æ  s   øé € Ð<Ñ%; ˆj˜�mŠmÓ%;ùs   ƒ)r   rÙ   rL   r¥   rÇ   ÚRuntimeErrorr;   rw   )rÛ   rÜ   rŽ   rH   rQ   rá   Úargs_split_dictÚreal_num_chunksÚkwargs_splitrç   Ú
args_splits   &&&&&    ` r   Úsplit_args_kwargs_into_chunksrî   z  sk  ø€ ðp ‚~Øˆò ð ÒÜ"ØÑ(Jô
ˆð Ò Ü$ØÑ*Lô
Ðô *ÜŒY�t‹_ÓÜŒY�Ó'Ó(Øó€Oô
 ˜/Ó*€Oä&ØØØó€Lô ˆ<Ó˜?Ô*ô ˜lÓ+ˆä-Ü”˜4“Ó!Ü”˜?Ó+Ó,Øó
ˆô ˆ?Óœs <Ó0Ô0ÜØIÜ�?Ó#Ð$ B¤s¨<Ó'8Ð&9ð;ó
ð 	
ñ *ôá)ˆJ÷ 	ŒÔ<¤U¬3¨z«?Ô%;Ó<�‰Ô<¤U¬3¨z«?Ô%;Ó<Ö<Ù)ð ð ð
 Ð#Ð#ùòs   ÄE)ÄAE)c                ó:   € V ^8„  d   QhR\         \        ,          /# )r9   rŽ   )r]   r   )r=   s   "r   r>   r>   í  s   € ÷ j8ñ j8Ü”�Iñj8r   c                óX
  a!€ Ve   \        V4      w  r#M4\        V ^ ,          4      w  rC\        \        4      .\        V4      ,          p. pV  FK  p\        V4      w  rx\        V4      \        V4      8w  d   \	        RV RV 24      hVP                  V4       KM  	  . p	\        V4       EFe  w  p
o!\        S!\        4      '       Edi   \        \        V4      4       Uu. uF  pW[,          V
,          NK  	  pp\        '       Ed^   V^ ,          P                  pVR,           F/  pVP                  V8X  d   K  \        RV RVP                   24      h	  \        P                  ! \        P                  ! VRR/ \        V4      S!P                  R	7      p. p^ p\        V4      \        V4      8X  g$   \        R
\        V4       R\        V4       24      h\!        WÏRR7       F|  w  ppVVP#                  S!P                  4      ,           p\%        RRR4      .VP&                  ,          p\%        VV4      VS!P                  &   VV,          pVP                  V4       TpK~  	  MTpV Uu. uF  p\        V\(        4      NK  	  pp\+        V4      '       Edh   \-        V4      '       g   \        R4      hV^ ,          P.                  p\        VR,          ^4       F5  w  ppVP.                  V8w  g   K  \        RV RV RVP.                   24      h	  V^ ,          P0                  p\        P2                  ! V Uu. uF  pVP5                  4       NK  	  upS!P                  R7      p\7        V^ ,          P                  4      p\9        V!3R lV 4       4      VS!P                  &   \        P:                  ! V4      pV^ ,          P=                  4       pV	P                  \(        P>                  ! VVVVVRR7      4       EKR  V	P                  \        P2                  ! VS!P                  R7      4       EK†  \        S!\@        4      '       d[   S!PB                  p\        \        V4      4       F"  pS!PE                  VW[,          V
,          4      pK$  	  V	P                  V4       EKö  V^ ,          V
,          p \        ^\        V4      4       F5  pW[,          V
,          V 8X  d   K  \        RV  RW[,          V
,           24      h	  V	P                  V 4       EKh  	  \G        W“4      # u upi u upi u upi )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
NzChunk z did not match chunk spec :é   NNzExpected shape z, got ÚdeviceÚmeta)ÚsectionsrD   z6Expected len(partial_values) == len(meta_chunks), got z != TrÅ   zRmerge_chunks: expected all values to be DTensors or none to be DTensors, got a mixz*merge_chunks: placement mismatch at chunk z: expected rC   c              3   ó\   <"  € T F!  qP                   SP                  ,          x € K#  	  R # 5ir   )r‰   r+   )r�   rÓ   Úargs   & €r   rŸ   Úmerge_chunks.<locals>.<genexpr>s  s"   øé € ð /Ù4A¨q—G‘G˜CŸM™M×*Ò*³Mùs   ƒ),Frˆ   z	Expected )$r
   r   rß   rÇ   rË   rx   r¥   r¡   rw   r«   r‰   ru   ra   rv   Úemptyr+   rÉ   rt   r’   r“   r   ÚanyÚallr¢   r£   Úcatrœ   r]   Úsumr§   rŠ   r¦   r   r   r   r   )"rŽ   Ú
chunk_specÚspec_flattenedÚflatten_specÚchunk0_flatÚchunks_flattenedr•   Úchunk_flattenedrÎ   Úargs_flattenedÚarg_idxr�   Úpartial_valuesÚoverall_shapeÚvalÚmeta_chunksÚvalues_to_catÚchunk_start_idxÚpartial_valueÚ
meta_chunkÚchunk_end_idxÚslice_indicesÚslicedrÓ   Údtensor_flagsr¢   rµ   r­   Ú	local_catÚ	cat_shapeÚ
cat_strideÚreduced_valÚvaluerö   s"   &&                               @r   Úmerge_chunksr  í  sÓ  ø€ ðZ ÒÜ'3°JÓ'?Ñ$ˆ˜ô %1°¸µÓ$;Ñ!ˆÜ)Ô*;Ó<Ð=ÄÀKÓ@PÕPˆð ÐãˆÜ)¨%Ó0ÑˆÜˆÓ¤3 ~Ó#6Ô6Ü˜v e WÐ,FÀzÀlÐSÓTÐTà×Ñ Ö0ñ ð !#€NÜ! .×1‰ˆ�Ü�cœ?×+Ó+ô "'¤sÐ+;Ó'<Ô!=óá!=�Ið !Õ+¨G×4Ð4Ù!=ð ð ÷
 'Ô&à .¨qÕ 1× 7Ñ 7�Ø)¨"×-Ð-�CØŸ9™9¨Ö5Ü,Ø-¨m¨_¸FÀ3Ç9Á9À+ÐNóð ñ .ô
 $×0Ò0Ü—K’K Ð>°vÑ>Ü  Ó0ØŸ™ô�ð !#�Ø"#�Ü˜>Ó*¬c°+Ó.>Ô>Ü(ØPÔQTÐUcÓQdÐPeÐeiÔjmÐnyÓjzÐi{Ð|óð ô 25Ø"¸÷2Ñ-�M :ð %4°j·o±oÀcÇmÁmÓ6TÕ$T�Mä%*¨4°°tÓ%<Ð$=À×@RÑ@RÕ$R�MÜ38¸È-Ó3X�M #§-¡-Ñ0Ø*¨=Õ9�FØ!×(Ñ(¨Ô0à&3’Oò2ð !/�ñ >KÓK¹]¸œZ¨¬7Ö3¹]ˆMÐKÜ�=×!Ó!Ü˜=×)Ò)Ü(ð9óð ð
 +¨1Õ-×8Ñ8�
Ü% m°BÕ&7¸Ö;‘D�A�qØ—|‘| zÖ1Ü,ØHÈÈð L(Ø(2 |°6¸!¿,¹,¸ðIóð ñ <ð % QÕ'×3Ñ3�Ü!ŸIšIÙ+8Ó9©= a�Q—Z‘Z–\©=Ñ9ØŸ™ô�	ô ! ¨qÕ!1×!7Ñ!7Ó8�	Ü+.ô /Ù4Aó/ó ,�	˜#Ÿ-™-Ñ(ô "ŸJšJ yÓ1�	Ø*¨1Õ-×4Ñ4Ó6�
Ø×%Ñ%Ü×&Ò&Ø!ØØ"Ø'Ø)Ø"'ô÷	ð ×%Ñ%¤e§i¢i°À3Ç=Á=Ô&Q×RÜ˜œ^×,Ò,ØŸ.™.ˆKä"¤3Ð'7Ó#8Ö9�	Ø!Ÿm™mØÐ!1Õ!<¸WÕ!Eó’ñ :ð
 ×!Ñ! +×.à$ QÕ'¨Õ0ˆEÜ" 1¤cÐ*:Ó&;Ö<�	Ø'Õ2°7Õ;¸uÖDÜ(Ø# E 7¨&Ð1AÕ1LÈWÕ1UÐ0VÐWóð ñ =ð
 ×!Ñ! %×(ñG 2ôL ˜.Ó7Ð7ùòIùòV Lùò" :s   ÃTÉ&T"Ì5T'
)r   rî   r  )NN)$ÚloggingÚoperatorÚcollections.abcr   Útypingr   r   ra   Útorch.distributed.tensorr   Útorch.fx.noder   Ú!torch.nn.attention.flex_attentionr	   Útorch.utils._pytreer
   r   r   Ú__all__Ú	getLoggerr   Úloggerr«   r   r$   r„   ÚaddÚsum_reducerrß   r   rX   r‚   r¼   rÙ   rî   r  r%   r   r   Ú<module>r$     sº   ðó Û Ý $ß ã Ý ,Ý 'Ý 7ß FÑ Fò€ð 
×	Ò	˜8Ó	$€ðð
  Ð ÷#ñ #ô$	�>ô 	ñ ˜5Ÿ<š<¨Ó,¨h¯l©lÓ;€ð Ð ÷5!ñ 5!÷r	ñ 	õ>õBe<òPU÷pp$÷fj8r   