Ë
    L²j°G ã                  óî  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZ
d dlZd dlZd dlmZmZ d dlmZ d dlmZmZ d dlmZmZ d dlZd dlZd dlZd dlmZ d dlmc m Z! d dl"m#Z#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/m0Z0 d dl1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z> d dl?m@Z@mAZA d dlBmCZCmDZDmEZEmFZFmGZGmHZH d dlImJZJ d dlKmLZL d dlMmNZN dd
lOm*Z* ddlPmQZQ ddlRmSZSmTZTmUZUmVZV ddlWmXZX ddlYmZZZm[Z[m\Z\ ddl]m^Z^ ddl_m`Z` ddlambZb dd lcmdZdmeZemfZfmgZgmhZh dd!limjZjmkZkmlZl erd dlmZnd dloZoe*jà                  Zqd"erd#<    ejæ                  et«      Zud$erd%<   ejì                  jî                  Zwejì                  jð                  Zxe G d&„ d'«      «       Zye G d(„ d)«      «       Zze G d*„ d+«      «       Z{dqd,„Z|drd-„Z}drd.„Z~dsd/„Z G d0„ d1«      Z€dqd2„Z� e€«       Z‚dtd3„Zƒdud4„Z„	 	 	 	 	 	 dvd5„Z…	 	 dw	 	 	 	 	 	 	 	 	 	 	 	 	 dxd7„Z†dqd8„Z‡dqd9„Zˆdqd:„Z‰dqd;„ZŠdqd<„Z‹dqd=„ZŒdqd>„Z�dqd?„ZŽ	 	 	 	 	 	 dyd@„Z�dzdA„Z�	 	 	 	 d{dB„Z‘	 	 	 d|	 	 	 	 	 	 	 	 	 	 	 d}dC„Z’	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d~dD„Z“ddE„Z”d€dF„Z•d�dG„Z–d‚dH„Z—dƒdI„Z˜d„d…dJ„Z™d†dK„Zš	 d„	 	 	 	 	 	 	 	 	 d‡dL„Z›	 	 dˆ	 	 	 	 	 	 	 	 	 	 	 d‰dM„Zœ	 dŠdd6d6dNœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d‹dO„Z�dddPœ	 	 	 	 	 	 	 	 	 	 	 dŒdQ„Zž eŸdR«      Z d�dS„Z¡dsdT„Z¢dŽdU„Z£e�jH                  d�dV„«       Z¥	 	 	 	 	 	 d�dW„Z¦d‘dX„Z§	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d’dY„Z¨	 	 	 	 	 	 	 	 	 	 d“dZ„Z©d”d[„Zªd”d\„Z«d”d]„Z¬dqd^„Z­	 	 	 	 	 	 d•d_„Z®	 dŠ	 	 	 	 	 	 	 	 	 d–d`„Z¯	 	 	 	 d—da„Z°d˜db„Z±	 	 	 	 d™dc„Z²dšdd„Z³d›de„Z´	 	 	 	 	 	 	 	 	 	 	 	 	 	 dœdf„Zµd dgl¶m·Z· d�dh„Z¸dždi„Z¹	 dŸ	 	 	 	 	 	 	 d dj„Zº	 	 	 	 	 	 d¡dk„Z»	 	 	 	 	 	 d¢dl„Z¼	 	 	 	 	 	 	 	 d£dm„Z½	 d¤ddnœ	 	 	 	 	 	 	 	 	 	 	 d¥do„Z¾	 	 	 	 	 d¦	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d§dp„Z¿y)¨é    )ÚannotationsN)ÚdefaultdictÚdeque)ÚCallable)Ú	dataclassÚreplace)ÚAnyÚTYPE_CHECKING)ÚcountersÚis_node_meta_valid)Ú(create_structured_trace_for_min_cut_info)Úis_with_effects)Úconfig)ÚCustomKnapsackSolverÚCustomRuntimeEstimator)ÚFakeScriptObject)Ú
is_builtin)Ú
LazyStringÚtrace_structured)Ú	trace_log)Úextract_tensor_metadata)ÚBackwardState)Úis_sym_nodeÚpy_sym_types)Úmagic_methodsÚmethod_to_operator)Úfind_symbol_binding_fx_nodesÚfree_symbolsÚis_symbol_binding_fx_nodeÚoptimization_hintÚstatically_known_falseÚstatically_known_true)Úgraph_drawer)Ú
OrderedSet)ÚCheckpointPolicyé   )ÚGraphInfoProvider)Údp_knapsackÚdp_knapsack_sliding_hirschbergÚgreedy_knapsackÚilp_knapsack)ÚKnapsackEvaluator)Ú	AOTOutputÚSavedForBackwardsAOTOutputÚ#SavedForBackwardsNoVcCheckAOTOutput)Ú_is_functional_graph)Úis_opaque_node)Úget_aot_graph_name)Ú_is_bwd_seed_offsetÚ_is_fwd_seed_offsetÚ
_is_primalÚ_is_tangentÚget_cuda_generator_meta_val)Úfx_graph_cseÚget_aten_targetÚraise_getitemsÚboolÚAOT_PARTITIONER_DEBUGzlogging.LoggerÚlogc                  ól   — e Zd ZU dZded<   ded<   ded<   ded<   ded<   dd„Zdd	„Zdd
„Zdd„Zdd„Z	y)ÚOpTypesz8Class for keeping track of different operator categorieszOrderedSet[Callable[..., Any]]Úfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsc                ó0   — t        |«      | j                  v S ©N)r9   r@   ©ÚselfÚnodes     ú\/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusibleh   s   € Ü˜tÓ$¨×(8Ñ(8Ð8Ð8ó    c                ó0   — t        |«      | j                  v S rF   )r9   rA   rG   s     rJ   Úis_compute_intensivezOpTypes.is_compute_intensivek   s   € Ü˜tÓ$¨×(BÑ(BÐBÐBrL   c                ó0   — t        |«      | j                  v S rF   )r9   rB   rG   s     rJ   Ú	is_randomzOpTypes.is_randomn   s   € Ü˜tÓ$¨¯©Ð7Ð7rL   c                ó0   — t        |«      | j                  v S rF   )r9   rC   rG   s     rJ   Úis_viewzOpTypes.is_viewq   s   € Ü˜tÓ$¨¯©Ð5Ð5rL   c                ó0   — t        |«      | j                  v S rF   )r9   rD   rG   s     rJ   Úis_recomputablezOpTypes.is_recomputablet   s   € Ü˜tÓ$¨×(=Ñ(=Ð=Ð=rL   N©rI   úfx.NodeÚreturnr;   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rK   rN   rP   rR   rT   © rL   rJ   r?   r?   ^   s=   … áBà/Ó/Ø9Ó9Ø.Ó.Ø,Ó,Ø4Ó4ó9óCó8ó6ô>rL   r?   c                  óš   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ej
                  dd„«       Zdd„Zdd„Zdd„Z	dd„Z
y)ÚNodeInfoúlist[fx.Node]ÚinputsúOrderedSet[fx.Node]Ú_required_fw_nodesÚrequired_bw_nodesÚtangents_closureÚunclaimed_nodesúdict[fx.Node, int]Úfw_orderÚstatic_lifetime_input_nodesc                óF   ‡ — t        d„ ‰ j                  D «       ˆ fd„¬«      S )Nc              3  ó    K  — | ]  }|–— Œ y ­wrF   r]   ©Ú.0Úns     rJ   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>ˆ   s   è ø€ Ò0�1ŒQÑ0ùs   ‚c                ó"   •— ‰j                   |    S rF   )rh   )rn   rH   s    €rJ   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>ˆ   s   ø€ ÀÇÁÈaÑ@P€ rL   ©Úkey)Úsortedrc   ©rH   s   `rJ   Úrequired_fw_nodeszNodeInfo.required_fw_nodes…   s!   ø€ äÙ0˜×/Ñ/Ô0Ó6Pô
ð 	
rL   c                ó   — || j                   v S rF   )rc   ©rH   rn   s     rJ   Úis_required_fwzNodeInfo.is_required_fw‹   s   € Ø�D×+Ñ+Ð+Ð+rL   c                ó   — || j                   v S rF   )rd   rx   s     rJ   Úis_required_bwzNodeInfo.is_required_bwŽ   s   € Ø�D×*Ñ*Ð*Ð*rL   c                ó   — || j                   v S rF   )rf   rx   s     rJ   Úis_unclaimedzNodeInfo.is_unclaimed‘   s   € Ø�D×(Ñ(Ð(Ð(rL   c                óZ   — || j                   vrt        d|› d�«      ‚| j                  |   S )NúNode z not in fw nodes!)rc   ÚAssertionErrorrh   rx   s     rJ   Úget_fw_orderzNodeInfo.get_fw_order”   s4   € Ø�D×+Ñ+Ñ+Ü  5¨¨Ð+<Ð!=Ó>Ð>Ø�}‰}˜QÑÐrL   N)rW   r`   ©rn   rV   rW   r;   )rn   rV   rW   Úint)rX   rY   rZ   r\   Ú	functoolsÚcached_propertyrv   ry   r{   r}   r�   r]   rL   rJ   r_   r_   x   sZ   … ð ÓØ+Ó+Ø*Ó*Ø)Ó)Ø(Ó(Ø Ó à!4Ó4à×Ñò
ó ð
ó
,ó+ó)ô rL   r_   c                  ó@   — e Zd ZU ded<   ded<   ded<   ded<   ded<   y)ÚMinCutOptionsr;   Úban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionN)rX   rY   rZ   r\   r]   rL   rJ   r‡   r‡   š   s    … àÓØ $Ó$Ø"&Ó&Ø!Ó!ØÔrL   r‡   c                óz   — | j                   j                  dd «      t        j                  t        j                  fv S )NÚ	recompute)ÚmetaÚgetr%   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©rI   s    rJ   Úmust_recomputer”   £   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ð ð rL   c                óT   — | j                   j                  D ]  }t        |«      sŒ y y)NTF)ÚgraphÚnodesr”   ©Úfx_grI   s     rJ   Úhas_recomputable_opsrš   ª   s+   € Ø—
‘
× Ñ ò ˆÜ˜$ÕÙðð rL   c                óä   — | j                   j                  D ]W  }t        |«      sŒt        |j                  d«      sŒ&t
        j                  j                  |j                  j                  v sŒW y y)NÚtagsTF)	r–   r—   r”   ÚhasattrÚtargetÚtorchÚTagÚnondeterministic_seededrœ   r˜   s     rJ   Úhas_recomputable_rng_opsr¢   ±   sU   € Ø—
‘
× Ñ ò ˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEáðð rL   c                ó
  — t        | j                  d   t        j                  t        j                  f«      ryt        | j                  d   t        j
                  «      s$t        dt        | j                  d   «      › �«      ‚y)NÚvalr&   z.expected node.meta['val'] to be SymFloat, got é   )Ú
isinstancer�   rŸ   ÚSymIntÚSymBoolÚSymFloatr€   Útyper“   s    rJ   Úsym_node_sizer«   ¼   sg   € Ü�$—)‘)˜EÑ"¤U§\¡\´5·=±=Ð$AÔBØÜ�d—i‘i Ñ&¬¯©Ô7ÜØ<¼TÀ$Ç)Á)ÈEÑBRÓ=SÐ<TÐUó
ð 	
ð rL   c                  ó   — e Zd Zdd„Zy)ÚInvalidNodeBasec                 ó   — y)NzInvalid Noder]   ru   s    rJ   Ú__repr__zInvalidNodeBase.__repr__Ç   s   € ØrL   N)rW   Ústr)rX   rY   rZ   r¯   r]   rL   rJ   r­   r­   Æ   s   „ ôrL   r­   c                ó6   — t        | j                  dd «      dk7  S )NÚ	namespaceÚ_c10d_functional)Úgetattrrž   r“   s    rJ   Úis_not_collectiverµ   Ì   s   € Ü�4—;‘; ¨TÓ2Ð6HÑHÐHrL   c                óX  — | j                   t        j                  k7  ry| j                  d   }| j                  d   }t	        |t
        j                  «      r|j                  dk7  ryd|j                  vry|j                  d   }||vry||   }t	        |t
        j                  «      r|S y)zÄGiven a getitem node, check if it extracts from a higher-order op
    that has kwargs mapping the key back to an original input.

    Returns the original input node if found, None otherwise.
    Nr   r&   Úcall_functionÚkwargs)	rž   ÚoperatorÚgetitemÚargsr¦   ÚfxÚNodeÚopr¸   )Úgetitem_nodeÚ	ho_resultrs   r¸   Úoriginal_inputs        rJ   Ú_get_ho_op_original_inputrÂ   Ó   s£   € ð ×Ñœh×.Ñ.Ò.ØØ×!Ñ! !Ñ$€IØ
×
Ñ
˜AÑ
€CÜ�i¤§¡Ô)¨Y¯\©\¸_Ò-LØØ�y×'Ñ'Ñ'ØØ×Ñ˜hÑ'€Fà
�&ÑØà˜C‘[€NÜ�.¤"§'¡'Ô*ØÐØrL   c                ó>  — | j                   t        j                  j                  j                  j
                  t        j                  j                  j                  j
                  fvry| j                  d   }t        |t        j                  «      syt        |«      S )zÊCheck if node is a view/reshape of a higher-order op output that aliases an input.

    Returns the original input node from the higher-order op's kwargs if the pattern
    matches, None otherwise.
    Nr   )rž   rŸ   ÚopsÚatenÚviewÚdefaultÚreshaper»   r¦   r¼   r½   rÂ   )rI   Úsources     rJ   Ú_is_copy_node_bw_onlyrÊ   ì   si   € ð ‡{�{œ5Ÿ9™9Ÿ>™>×.Ñ.×6Ñ6¼¿	¹	¿¹×8NÑ8N×8VÑ8VÐWÑWØØ�Y‰Y�q‰\€FÜ�fœbŸg™gÔ&ØÜ$ VÓ,Ð,rL   c                ó¨   — t        | «      }|�||v rt        ||   t        «      s||   S t        | «      }|�||v rt        ||   t        «      s||   S y)aµ  Try to find a valid input replacement for an invalid forward output.

    This handles cases where a forward output depends on backward nodes but
    semantically aliases an input. For example, a view of a getitem from a
    triton kernel that mutates a buffer in backward, or a direct getitem from
    such a higher-order op. The original input may be a primal or a valid
    intermediate node already present in the forward graph.
    N)rÊ   r¦   r­   rÂ   )rI   ÚenvrÁ   s      rJ   Ú_find_input_for_invalid_outputrÍ   ú   sk   € ô +¨4Ó0€NàÐ"Ø˜cÑ!Ü˜3˜~Ñ.´Ô@à�>Ñ"Ð"ä.¨tÓ4€NàÐ"Ø˜cÑ!Ü˜3˜~Ñ.´Ô@à�>Ñ"Ð"ØrL   Fc                óx  ‡— t        j                  «       }i Š|D ]3  }|j                  |j                  «      }|j                  |_        |‰|<   Œ5 | j
                  D �]:  }|s<t        |«      r|dk7  r||vr
t        ‰|<   Œ$t        |«      r|dk7  r||vr
t        ‰|<   ŒB|‰v rŒG|j                  dk(  r
t        ‰|<   Œ`|j                  dk(  r’t        j                  |j                  i |j                  ¤Ž}	|	D �
cg c]/  }
t        |
t         j                  «      rt        ‰|
   t         «      ‘Œ1 }	}
t#        |	«      r
t        ‰|<   Œç|j%                  |ˆfd„«      ‰|<   �Œ|j                  dk(  r|j%                  |ˆfd„«      ‰|<   �Œ*|j                  dk(  s�Œ;�Œ= g }t'        ||«      D �]i  \  }
}t        |
t         j                  «      �r7|
‰vrt)        d	|
› d
�«      ‚t        ‰|
   t         «      rûd}|
j*                  t,        j.                  j0                  j2                  j4                  u r�t        |
«      r‚t7        |
j                  «      dk\  rjt        |
j                  d   t         j                  «      rC|
j                  d   ‰v r2t        ‰|
j                  d      t         «      s‰|
j                  d      }|€t9        |
‰«      }|�|j;                  |«       �Œ4t=        d	|
› d�«      ‚|j;                  ‰|
   «       �ŒY|j;                  |
«       �Œl |j?                  tA        |«      «      }||j                  d<   |D �cg c]9  }t        |t         j                  «      r|j                  jC                  d«      nd‘Œ; c}|j                  d<   |jE                  «        |jG                  «        |S c c}
w c c}w )a‘  
    Given a graph, extracts out a subgraph that takes the specified nodes as
    inputs and returns the specified outputs.

    This includes specifying non-placeholder nodes as inputs.

    The general strategy is to initialize all inputs with proxies as we
    encounter them, and trace through the graph, only keeping values which take
    in valid proxies. Then, all dead code is eliminated.
    ÚbackwardÚforwardÚplaceholderr·   c                ó   •— ‰|    S rF   r]   ©ÚxrÌ   s    €rJ   rq   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>Z  ó   ø€ ¸CÀ¹F€ rL   Úget_attrc                ó   •— ‰|    S rF   r]   rÓ   s    €rJ   rq   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>]  rÕ   rL   Úoutputr   z couldn't be found in envNr&   r   z was invalid, but is outputÚdescÚstack_traceÚoutput_stack_traces)$r¼   ÚGraphrÑ   Únamer�   r—   Ú_must_be_in_backwardÚInvalidNodeÚ_must_be_in_forwardr¾   ÚpytreeÚarg_tree_leavesr»   r¸   r¦   r½   r­   ÚanyÚ	node_copyÚzipÚRuntimeErrorrž   rŸ   rÄ   rÅ   Úcopy_rÇ   ÚlenrÍ   Úappendr€   rØ   Útupler�   Úeliminate_dead_codeÚlint)Újoint_graphra   ÚoutputsÚoutputs_descsÚsubgraphÚignore_must_be_in_fw_bwÚ	new_graphrI   Únew_nodeÚall_argsrÔ   Úoutput_valuesÚx_descÚreplacementÚoutÚvrÌ   s                   @rJ   Ú"_extract_graph_with_inputs_outputsrú     sm  ø€ ô$ —‘“
€IØ"$€Cð ò ˆØ×(Ñ(¨¯©Ó3ˆàŸ	™	ˆŒàˆˆDŠ	ðð ×!Ñ!ó )ˆÙ&ä$ TÔ*Ø 
Ò*Ø Ñ&ä'��D‘	Øô $ DÔ)Ø 	Ò)Ø Ñ&ä'��D‘	Øà�3‰;ð Ø�W‰W˜Ò%Ü#ˆC�ŠIØ�W‰W˜Ò'Ü×-Ñ-¨t¯y©yÐH¸D¿K¹KÑHˆHð "öàÜ˜a¤§¡Ô)ô ˜3˜q™6¤?Õ3ðˆHð ô
 �8Œ}Ü'��D‘	Øà!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜
Ò"à!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜Ô ÙðS)ðT €MÜ˜ -Ó0ó $‰	ˆˆ6Ü�aœŸ™Õ!Ø˜‰|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ˜#˜a™&¤/Ô2ð #�ð —H‘H¤§	¡	§¡× 4Ñ 4× <Ñ <Ñ<Ü,¨QÔ/Ü˜AŸF™F› qÒ(Ü" 1§6¡6¨!¡9¬b¯g©gÔ6ØŸ™˜q™	 SÑ(Ü& s¨1¯6©6°!©9¡~´ÔGà"% a§f¡f¨Q¡i¡.�Kð Ð&Ü"@ÀÀCÓ"H�KØÐ*Ø!×(Ñ(¨Ô5ÙÜ$ u¨Q¨CÐ/JÐ%KÓLÐLØ× Ñ   Q¡Ö(à× Ñ  Ö#ð=$ð> ×
Ñ
œ5 Ó/Ó
0€CØ$€C‡H�HˆVÑð
 ö'àô &0°´2·7±7Ô%;ˆ�‰�
‰
�=Ô!ÀÑEò'€C‡H�HÐ"Ñ#ð
 ×!Ñ!Ô#Ø‡N�NÔØÐùòuùòf's   Ã84N2Í>N7c                ó  — t         j                  xry t        | j                  t        j
                  j                  «      xr t        | j                  «       xs1 | j                  t        j                  j                  j                  k(  S rF   )r   Úis_non_builtin_to_includer¦   rž   rŸ   Ú_opsÚ
OpOverloadr   rÄ   Úhigher_orderÚ triton_kernel_wrapper_functionalr“   s    rJ   rü   rü   Ž  s`   € Ü×+Ñ+ò Ü	�D—K‘K¤§¡×!6Ñ!6Ó	7Ò	WÄ
È4Ï;É;Ó@WÐ<Wò 	RØ�;‰;œ%Ÿ)™)×0Ñ0×QÑQÑQðrL   c                óv   — | j                   dk(  xr) t        | j                  j                  d«      t        «      S )NrÑ   r¤   )r¾   r¦   r�   r�   r   r“   s    rJ   Ú_is_backward_stater  •  s*   € Ø�7‰7�mÑ#ÒW¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWrL   c                ó@   — | j                   j                  dd «      dk(  S )NÚpartitioner_tagÚis_backward©r�   r�   r“   s    rJ   Ú_has_tag_is_backwardr  ™  s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBrL   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Ú
is_forwardr  r“   s    rJ   Ú_has_tag_is_forwardr
  �  s   € Ø�9‰9�=‰=Ð*¨DÓ1°\ÑAÐArL   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Úmust_be_in_forwardr  r“   s    rJ   Ú_has_tag_must_be_in_forwardr  ¡  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5IÑIÐIrL   c                ó@   — | j                   j                  dd «      dk(  S )Nr  Úmust_be_in_backwardr  r“   s    rJ   Ú_has_tag_must_be_in_backwardr  ¥  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJrL   c                óö   — t        | «      ryt        | j                  t        j                  j
                  «      xr  | j                  j                  j                  }t        | «       xr t        | «       xr |S ©NT)
r  r¦   rž   rŸ   rý   rþ   Ú_schemaÚ
is_mutabler  r  ©rI   r  s     rJ   rà   rà   ©  sn   € Ü" 4Ô(Øô 	�4—;‘;¤§
¡
× 5Ñ 5Ó6ò 	+Ø�K‰K×Ñ×*Ñ*ð ô
 ! Ó&Ð&ò 	Ü,¨TÓ2Ð2ò	àðrL   c                óØ   — t        | «      ryt        | j                  t        j                  j
                  «      xr  | j                  j                  j                  }t        | «      xr |S r  )	r  r¦   rž   rŸ   rý   rþ   r  r  r  r  s     rJ   rÞ   rÞ   ¸  sT   € Ü# DÔ)Øä�4—;‘;¤§
¡
× 5Ñ 5Ó6ò 	+Ø�K‰K×Ñ×*Ñ*ð ô   Ó%Ò4¨*Ð4rL   c          	     ól  — t        j                  d„ | j                  j                  d¬«      D «       Ž }t        j                  t	        t        | j                  j                  d¬«      «      «      j                  j                  dd gt        |«      z  «      «      }|d | }||d  }|d | }||d  }||||fS )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrF   ©r»   ©rm   rI   s     rJ   ro   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>Æ  s   è ø€ Ò	K˜ˆ$�)�)Ñ	Kùó   ‚rØ   ©r¾   rÙ   )	rá   râ   r–   Ú
find_nodesÚnextÚiterr�   r�   rè   )Újoint_moduleÚnum_fwd_outputsrî   rï   Úfwd_outputsÚbwd_outputsÚfwd_outputs_descsÚbwd_outputs_descss           rJ   Ú_extract_fwd_bwd_outputsr&  Â  sÍ   € ô ×$Ñ$Ù	K × 2Ñ 2× =Ñ =ÀÐ =Ó JÔ	Kð€Gô ×*Ñ*ÜŒT�,×$Ñ$×/Ñ/°8Ð/Ó<Ó=Ó>×CÑC×GÑGØ�T�FœS ›\Ñ)ó	
ó€Mð
 Ð*˜?Ð+€KØ˜/Ð*Ð+€KØ%Ð&6 Ð7ÐØ% oÐ&6Ð7ÐØ˜Ð%6Ð8IÐIÐIrL   c                óV   — | D ]$  }|j                   |k(  sŒ| j                  |«        y  y rF   )rÝ   Úremove)Úsaved_valuesrÝ   Úsaved_values      rJ   Ú_remove_by_namer+  Ô  s0   € Ø#ò ˆØ×Ñ˜tÓ#Ø×Ñ Ô,ÙñrL   c                ó„   — t        | «      }t        t        | «      dz
  dd«      D ]  }t        | |   «      rŒ|dz   } |S  |S )Nr&   éÿÿÿÿ)rè   Úranger   )Úfwd_module_outputsÚidxÚis      rJ   Úfind_first_sym_noder2  Û  sX   € ô Ð Ó
!€CÜ”3Ð)Ó*¨QÑ.°°BÓ7ò ˆÜÐ-¨aÑ0Õ1Ø�a‘%ˆCØØ€Jð	ð €JrL   c           	     ó’  — | j                  |«      5  | j                  t        j                  j                  j
                  j                  |f¬«      }t        j                  j                  j
                  j                  |j                  d   «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |dgdf¬«      }t        j                  j                  j                  j                  |j                  d   dgd«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |t        j                  f¬«      }t        j                  j                  j                  j                  |j                  d   t        j                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }t        j                  j                  j                  j                  |j                  d   |«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  |f¬«      }	t        j                  j                  j                  j                  |j                  d   «      |	j                  d<   t        |	j                  d   «      |	j                  d<   d d d «       | j                  	«      5  | j                  t        j                  j                  j                  j                   |	|f¬«      }
t        j                  j                  j                  j!                  |	j                  d   |«      |
j                  d<   t        |
j                  d   «      |
j                  d<   d d d «       | j                  
«      5  | j                  t        j                  j                  j                  j                  |
t        j"                  fd|› d|j$                  › �¬«      }t        j                  j                  j                  j                  |
j                  d   t        j"                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       |S # 1 sw Y   �Œ+xY w# 1 sw Y   �ŒfxY w# 1 sw Y   �Œ‰xY w# 1 sw Y   �ŒÈxY w# 1 sw Y   �Œ	xY w# 1 sw Y   �ŒHxY w# 1 sw Y   S xY w)	Nr  r¤   Útensor_metar-  TÚfp8_scale_pos_Ú_©r»   rÝ   )Úinserting_afterr·   rŸ   rÄ   rÅ   ÚabsrÇ   r�   r   ÚamaxÚprimsÚconvert_element_typeÚfloat64Ú	clamp_minÚ
reciprocalÚmulÚTensorÚfloat32rÝ   )r–   rI   ÚmaxÚminÚpositionÚabs_nodeÚ	amax_nodeÚamax_64_nodeÚclamp_min_nodeÚreciprocal_nodeÚmul_nodeÚ
scale_nodes               rJ   Úcalculate_quantization_scalingrM  æ  s$  € ð 
×	Ñ	˜tÓ	$ñ UØ×&Ñ&Ü�I‰I�N‰N×Ñ×&Ñ&Ø�ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×9Ñ9¸$¿)¹)ÀEÑ:JÓKˆ�‰�eÑÜ'>¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷Uð 
×	Ñ	˜xÓ	(ñ WØ×'Ñ'Ü�I‰I�N‰N×Ñ×'Ñ'Ø˜R˜D $Ð'ð (ó 
ˆ	ô !&§	¡	§¡× 3Ñ 3× ;Ñ ;Ø�M‰M˜%Ñ  2 $¨ó!
ˆ	�‰�uÑô )@À	ÇÁÈuÑ@UÓ(Vˆ	�‰�}Ñ%÷Wð 
×	Ñ	˜yÓ	)ñ 

Ø×*Ñ*Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœUŸ]™]Ð+ð +ó 
ˆô $)§9¡9§?¡?×#GÑ#G×#OÑ#OØ�N‰N˜5Ñ!¤5§=¡=ó$
ˆ×Ñ˜%Ñ ô ,CØ×Ñ˜eÑ$ó,
ˆ×Ñ˜-Ñ(÷

ð 
×	Ñ	˜|Ó	,ñ 

Ø×,Ñ,Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø Ð$ð -ó 
ˆô &+§Y¡Y§^¡^×%=Ñ%=×%EÑ%EØ×Ñ˜eÑ$ có&
ˆ×Ñ˜EÑ"ô .EØ×Ñ Ñ&ó.
ˆ×Ñ˜MÑ*÷

ð 
×	Ñ	˜~Ó	.ñ 

Ø×-Ñ-Ü�I‰I�N‰N×%Ñ%×-Ñ-Ø Ð"ð .ó 
ˆô ',§i¡i§n¡n×&?Ñ&?×&GÑ&GØ×Ñ Ñ&ó'
ˆ×Ñ˜UÑ#ô /FØ× Ñ  Ñ'ó/
ˆ×Ñ˜]Ñ+÷

ð 
×	Ñ	˜Ó	/ñ UØ×&Ñ&Ü�I‰I�N‰N×Ñ×%Ñ%Ø! 3Ð'ð 'ó 
ˆô  %Ÿy™yŸ~™~×1Ñ1×8Ñ8Ø× Ñ  Ñ'¨ó 
ˆ�‰�eÑô (?¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷Uð 
×	Ñ	˜xÓ	(ñ 	YØ×(Ñ(Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœEŸM™MÐ*Ø! ( ¨1¨T¯Y©Y¨KÐ8ð )ó 
ˆ
ô
 "'§¡§¡×!EÑ!E×!MÑ!MØ�M‰M˜%Ñ ¤%§-¡-ó"
ˆ
�‰˜Ñô *AÀÇÁÐQVÑAWÓ)Xˆ
�‰˜Ñ&÷	Yð Ð÷IUñ Uú÷Wñ Wú÷

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷Uñ Uú÷	Yð ÐúsZ   ’B3W.ÃB9W;Æ0CXÊB5XÍ(B3X"Ð4B5X/ÔC"X<×.W8×;XØXØXØ"X,Ø/X9Ø<Yc           	     ó	  — | j                  |«      5  | j                  t        j                  j                  j
                  j                  |t        j                  f¬«      }t        j                  j                  j
                  j                  |j                  d   t        j                  «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }t        j                  j                  j                  j                  |j                  d   |j                  d   «      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t        j                  j                  j                  j                  ||f¬«      }	t        j                  j                  j                  j                  |j                  d   |«      |	j                  d<   t        |	j                  d   «      |	j                  d<   d d d «       | j                  	«      5  | j                  t        j                  j                  j                  j                  |	|f¬«      }
t        j                  j                  j                  j                  |	j                  d   |«      |
j                  d<   t        |
j                  d   «      |
j                  d<   d d d «       | j                  
«      5  | j                  t        j                  j                  j
                  j                  |
|fd|› d|j                  › �¬«      }t        j                  j                  j
                  j                  |
j                  d   |«      |j                  d<   t        |j                  d   «      |j                  d<   d d d «       |S # 1 sw Y   �ŒbxY w# 1 sw Y   �Œ”xY w# 1 sw Y   �ŒÓxY w# 1 sw Y   �ŒxY w# 1 sw Y   S xY w)Nr  r¤   r4  Úfp8_quant_pos_r6  r7  )r8  r·   rŸ   rÄ   r;  r<  rÇ   rB  r�   r   rÅ   r@  rA  r>  Ú	clamp_maxrÝ   )r–   rI   rL  Ú
quant_typer>  rP  rE  Útarget_node_32Úscaled_target_nodeÚclamp_min_scaled_nodeÚclamp_max_scaled_nodeÚquant_activation_nodes               rJ   Úperform_quantizationrW  4  sä  € ð 
×	Ñ	˜zÓ	*ñ 

Ø×,Ñ,Ü�I‰I�O‰O×0Ñ0×8Ñ8ØœŸ™Ð&ð -ó 
ˆô &+§Y¡Y§_¡_×%IÑ%I×%QÑ%QØ�I‰I�eÑœeŸm™mó&
ˆ×Ñ˜EÑ"ô .EØ×Ñ Ñ&ó.
ˆ×Ñ˜MÑ*÷

ð 
×	Ñ	˜~Ó	.ñ 

Ø"×0Ñ0Ü�I‰I�N‰N×Ñ×%Ñ%Ø  *Ð-ð 1ó 
Ðô */¯©¯©×);Ñ);×)BÑ)BØ×Ñ Ñ&¨
¯©¸Ñ(>ó*
Ð×Ñ Ñ&ô 2IØ×#Ñ# EÑ*ó2
Ð×Ñ Ñ.÷

ð 
×	Ñ	Ð1Ó	2ñ 

Ø %× 3Ñ 3Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø$ iÐ0ð !4ó !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ×#Ñ# EÑ*¨Ió-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷

ð 
×	Ñ	Ð4Ó	5ñ 

Ø %× 3Ñ 3Ü�I‰I�N‰N×$Ñ$×,Ñ,Ø'¨Ð3ð !4ó !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ!×&Ñ& uÑ-¨yó-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷

ð 
×	Ñ	Ð4Ó	5ñ 
Ø %× 3Ñ 3Ü�I‰I�O‰O×0Ñ0×8Ñ8Ø'¨Ð4Ø! ( ¨1¨T¯Y©Y¨KÐ8ð !4ó !
Ðô �I‰I�O‰O×0Ñ0×8Ñ8Ø%×*Ñ*¨5Ñ1°:óð 	×"Ñ" 5Ñ)ô
 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷
ð !Ð ÷u

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷

ñ 

ú÷
ð !Ð ús@   ’CQÃ<CQÇB5QÊ%B5Q*Í3CQ7ÑQÑQÑQ'Ñ*Q4Ñ7Rc                óR   — | j                  «       }| j                  «       }||z  dz  S )z©
    Calculate the size of a PyTorch tensor in megabytes (MB).

    Args:
        tensor (torch.Tensor): Input tensor

    Returns:
        float: Memory size in MB
    i   )ÚnumelÚelement_size)ÚtensorÚnum_elementsrZ  s      rJ   Úcalculate_tensor_sizer]  z  s-   € ð —<‘<“>€LØ×&Ñ&Ó(€Là˜<Ñ'¨KÑ8Ð8rL   c            	     óú   — t         j                  j                  j                  d   j	                  dd«      } | j                  d«      D �cg c]$  }t        t         |j                  d«      d   «      ‘Œ& } }| S c c}w )NÚ!activation_quantization_aten_passÚallowed_dtypesztorch.bfloat16ú;ú.r-  )rŸ   Ú	_inductorr   Úpost_grad_fusion_optionsr�   Úsplitr´   )r`  Údtypes     rJ   Úget_allowed_dtypesrg  ‹  sz   € Ü—_‘_×+Ñ+×DÑDØ+ñç	�cÐ
Ð,Ó-ð ð ;I×:NÑ:NÈsÓ:SöØ16Œ”�u—{‘{ 3Ó'¨Ñ+Õ,ð€Nð ð Ðùòs   Á)A8c                óB  — t        «       }t        | «      r| j                  d   j                  |vryt        j
                  j                  j                  d   j                  dd«      }t        | j                  d   «      }t        j
                  j                  j                  d   j                  dd«      s||k\  S t        j
                  j                  j                  d   j                  dd«      rt        ||k\  «      xs t        ||k\  «       S t        ||k\  «      S )Nr¤   Fr_  Ú
size_in_mbéd   Úskip_dynamo_guardsÚquantize_dynamic_shape)rg  r   r�   rf  rŸ   rc  r   rd  r�   r]  r"   r!   )rI   r`  Úsize_thresholdri  s       rJ   Úshould_quantizern  •  s  € Ü'Ó)€NÜ˜dÔ# t§y¡y°Ñ'7×'=Ñ'=À^Ñ'SØÜ—_‘_×+Ñ+×DÑDØ+ñç	�cˆ,˜Óð ô ' t§y¡y°Ñ'7Ó8€JÜ�?‰?×!Ñ!×:Ñ:Ø+ñç	�cÐ
 Ó&ð'ð ˜^Ñ+Ð+ô �?‰?×!Ñ!×:Ñ:Ø/ñ
ç
‰#Ð&¨Ó
.ð/ô )Ø˜nÑ,óò Jä+¨J¸.Ñ,HÓIÐIðJô
 )¨°~Ñ)EÓFÐFrL   c                 ó´   — t         j                  j                  j                  d   j	                  dd«      } t        t         | j                  d«      d   «      S )Nr_  rQ  ztorch.float8_e5m2rb  r-  )rŸ   rc  r   rd  r�   r´   re  )rQ  s    rJ   Úget_quant_typerp  ¯  sN   € Ü—‘×'Ñ'×@Ñ@Ø+ñç	�cˆ,Ð+Ó,ð ô ”5˜*×*Ñ*¨3Ó/°Ñ3Ó4Ð4rL   c                ó\   — t        j                  | «      }|j                  |j                  fS )zÇ
    Calculate the range of values for a given torch.dtype.
    Args:
        dtype (torch.dtype): The input dtype.
    Returns:
        tuple: A tuple containing the minimum and maximum values.
    )rŸ   ÚfinforD  rC  )rf  Úinfos     rJ   Úcalculate_rangert  ·  s%   € ô �;‰;�uÓ€DØ�8‰8�T—X‘XÐÐrL   c           
     óø  — | j                  d¬«      d   }|j                  d   }t        «       }t        |«      \  }}t	        «       }g }g }	t        |«      D �]“  \  }
}|
|k  rŒ|j                  j                  dd«      sŒ*t        j                  j                  j                  d   j                  dd«      rOt        | ||d	|
«      }t        | ||||||
«      }t        |«      s|j                  |«       nñ|	j                  |«       nß| j!                  |«      5  | j#                  t        j$                  j&                  j(                  j*                  ||fd
|
› d|j,                  › �¬«      }t        j$                  j&                  j(                  j+                  |j                  d   |«      |j                  d<   t/        |j                  d   «      |j                  d<   d d d «       ||
<   �Œ– t        |«      D ��cg c]  \  }}|j                  ||«      ‘Œ }}}t1        |«      }||	z   }|r|d | |z   ||d  z   }|j3                  dt5        |«      «       t6        d   dxx   dz  cc<   y # 1 sw Y   ŒŽxY wc c}}w )NrØ   r  r   Úsaved_for_quantizationFr_  Úuse_scalingTçê-�™—q=rO  r6  r7  r¤   r4  ÚinductorÚ%activation_quantization_fwd_aten_passr&   )r  r»   rp  rt  ÚdictÚ	enumerater�   r�   rŸ   rc  r   rd  rM  rW  r   ré   r8  r·   rÄ   r;  r<  rÇ   rÝ   r   r2  Ú
update_argrê   r   )r–   r!  rØ   r"  rQ  r>  rP  Úposition_to_quantÚtensor_scale_nodesÚsym_scale_nodesrE  rI   rL  Ú
quant_noder1  Úoutput_updated_argsr0  Úscale_nodess                     rJ   Úquantize_activation_fwr„  Ã  sˆ  € Ø×Ñ ÐÓ*¨1Ñ-€FØ—+‘+˜a‘.€KÜÓ!€JÜ*¨:Ó6Ñ€IˆyÜ›ÐØ(*ÐØ%'€OÜ# KÓ0ó -5‰ˆ�$ð �oÒ%Øà�9‰9�=‰=Ð1°5Õ9ä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó&ð'ô <Ø˜4 ¨E°8ó�
ô
 2Ø˜4 ¨Z¸ÀIÈxó�
ô # :Ô.Ø&×-Ñ-¨jÕ9à#×*Ñ*¨:Õ6ð ×*Ñ*¨4Ó0ñ Ø!&×!4Ñ!4ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" JÐ/Ø-¨h¨Z°q¸¿¹¸ÐDð "5ó "�Jô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨jóð —O‘O EÑ*ô
 6MØ"Ÿ™¨Ñ.ó6�J—O‘O MÑ2÷ð +5Ð˜hÓ'ð[-5ôd 7@ÀÓ6L÷Ù+2¨1¨dÐ×Ñ˜a Õ&ðÐñ ô
 Ð1Ó
2€CØ$ Ñ6€KÙà  Ð%¨Ñ3Ð6IÈ#È$Ð6OÑOð 	ð ×Ñ�aœÐ2Ó3Ô4ÜˆZÑÐ@ÓAÀQÑFÔA÷Að üó&s   ÄCI*Ç;I6É*I3	c           
     ó
  ‡	— | j                   D �cg c]  }|j                  dk(  sŒ|‘Œ }}d }|D �]~  }|j                  j                  dd«      sŒ!|j                  j	                  d«       |j                  j	                  d«      }t
        j                  j                  j                  d   j                  dd«      �rÅ| j                  |«      5  d|j                  j                  dd	«      z   Š	t        ˆ	fd
„|D «       «      }d d d «       | j                  «      5  | j                  t
        j                  j                  j                   j"                  ||f¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       | j                  |«      5  | j                  t
        j                  j&                  j(                  j*                  ||f¬«      }t
        j                  j&                  j(                  j+                  |j                  d   |j                  d   «      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       | j                  «      5  | j                  t
        j                  j                  j                   j"                  ||f¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       nå| j                  |«      5  | j                  t
        j                  j                  j                   j"                  ||fdt-        |j                  «      z   ¬«      }t
        j                  j                  j                   j#                  |j                  d   |«      |j                  d<   t%        |j                  d   «      |j                  d<   d d d «       t/        |j0                  j3                  «       «      D ]   }|k7  sŒ	||k7  sŒ|j5                  ||«       Œ" �Œ� t6        d   dxx   dz  cc<   y c c}w # 1 sw Y   �ŒÊxY w# 1 sw Y   �Œ	xY w# 1 sw Y   �Œ;xY w# 1 sw Y   Œ“xY w# 1 sw Y   ŒŸxY w)NrÑ   rv  FÚdequant_typer_  rw  Ú
fp8_scale_Ú
fp8_quant_Ú c              3  ó@   •K  — | ]  }|j                   ‰k(  r|–— Œ y ­wrF   ©rÝ   )rm   Ú	bwd_inputÚ
scale_names     €rJ   ro   z)quantize_activation_bw.<locals>.<genexpr>  s%   øè ø€ ò &à%Ø$Ÿ>™>¨ZÒ7ô "ñ&ùs   ƒr  r¤   r4  Údequant_r7  ry  Ú%activation_quantization_bwd_aten_passr&   )r—   r¾   r�   r�   ÚpoprŸ   rc  r   rd  r8  rÝ   r   r  r·   rÄ   r;  r<  rÇ   r   rÅ   ÚdivrA  r°   ÚlistÚusersÚkeysÚreplace_input_withr   )
r–   rI   Ú	bw_inputsÚactivation_noder†  rL  Údivided_target_node_32Údequant_nodeÚuserr�  s
            @rJ   Úquantize_activation_bwr›    si  ø€ Ø"'§+¡+ÖJ˜$°·±¸MÓ1I’ÐJ€IÐJØ€OØó H@ˆØ�9‰9�=‰=Ð1°5Õ9Ø�I‰I�M‰MÐ2Ô3ØŸ9™9Ÿ=™=¨Ó8ˆLä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó'ñ(ð ×*Ñ*¨4Ó0ñ à!-°·	±	×0AÑ0AÀ,ÐPRÓ0SÑ!S�JÜ!%ó &à)2ô&ó "�J÷ð ×*Ñ*¨:Ó6ñ Ø&+×&9Ñ&9ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" LÐ1ð ':ó '�Oô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð $×(Ñ(¨Ñ/ô
 ;RØ'×,Ñ,¨UÑ3ó;�O×(Ñ(¨Ñ7÷ð ×*Ñ*¨?Ó;ñ 
Ø-2×-@Ñ-@ÜŸ	™	Ÿ™×*Ñ*×1Ñ1Ø-¨zÐ:ð .Aó .Ð*ô :?¿¹¿¹×9KÑ9K×9RÑ9RØ'×,Ñ,¨UÑ3°Z·_±_ÀUÑ5Kó:Ð*×/Ñ/°Ñ6ô 0Ð0F×0KÑ0KÈEÑ0RÓSð +×/Ñ/°Ñ>÷
ð ×*Ñ*Ð+AÓBñ Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ4°lÐCð $7ó $�Lô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ2×7Ñ7¸Ñ>Àóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ð ð ×*Ñ*¨4Ó0ñ Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ" LÐ1Ø'¬#¨d¯i©i«.Ñ8ð $7ó $�Lô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ô ˜TŸZ™ZŸ_™_Ó.Ó/ò @�Ø˜<Ó'¨D°OÓ,CØ×+Ñ+¨D°,Õ?ò@ðMH@ôT ˆZÑÐ@ÓAÀQÑFÔAùòY K÷ñ ú÷ñ ú÷
ñ 
ú÷ð ú÷ð úsJ   �S¥SÃ4SÄB5SÇ*CS%ËB5S2ÎCS>ÓS	ÓS"	Ó%S/	Ó2S;	Ó>T	c                óâ  ‡ ‡— t        dd„ ˆ fd„¬«       t        ‰ j                  |«       t        dd„ ˆ fd„¬«       t        dd„ ˆfd„¬«       ‰ j                  j                  d	¬
«      d   j                  d   }|D ]ý  }d|j
                  v sŒ|t        j                  dd|j
                  «         }‰j                  j                  |«      5  ‰j                  j                  |j
                  ¬«      }d d d «       |j                  d   }j                  j                  |j                  «       d|j                  d<   ||j                  d<   |j                  |«       ‰j                  j                  |«       Œÿ t        j                  j                   j"                  d   j%                  dd«      rüt'        ‰j                  j                  d¬
«      «      }	|	d   }
t)        |	«      D ]  }t+        |«      rŒ|}
 n ‰ j                  j                  d	¬
«      d   j                  d   }|D ]‚  }d|j
                  v sŒ‰j                  j                  |
«      5  ‰j                  j                  |j
                  ¬«      }d d d «       j                  j                  |j                  «       |}
Œ„ t-        ‰j                  «       t        dd„ ˆfd„¬«       y # 1 sw Y   �ŒåxY w# 1 sw Y   ŒgxY w)NÚartifactc                 ó   — dddœS )NÚ,before_activation_quantization_fwd_aten_passÚstring©rÝ   Úencodingr]   r]   rL   rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>d  ó   € ØBØ ñ
€ rL   c                 ó,   •— ‰ j                  ddd¬«      S ©NFT©Úprint_outputÚinclude_strideÚinclude_device©Úprint_readable©Ú
fwd_modules   €rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>h  ó   ø€ ˜:×4Ñ4Ø¨tÀDð 5ó 
€ rL   ©Úmetadata_fnÚ
payload_fnc                 ó   — dddœS )NÚ+after_activation_quantization_fwd_aten_passr   r¡  r]   r]   rL   rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>q  ó   € ØAØ ñ
€ rL   c                 ó,   •— ‰ j                  ddd¬«      S r¥  rª  r¬  s   €rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>u  r®  rL   c                 ó   — dddœS )NÚ,before_activation_quantization_bwd_aten_passr   r¡  r]   r]   rL   rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>|  r£  rL   c                 ó,   •— ‰ j                  ddd¬«      S r¥  rª  ©Ú
bwd_modules   €rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>€  r®  rL   rØ   r  r   rˆ  z^fp8_quant_pos_\d+_r‰  r‹  r†  Trv  r_  rw  rÑ   r-  r‡  c                 ó   — dddœS )NÚ+after_activation_quantization_bwd_aten_passr   r¡  r]   r]   rL   rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>­  r´  rL   c                 ó,   •— ‰ j                  ddd¬«      S r¥  rª  r¹  s   €rJ   rq   z5perform_fp8_activation_quantization.<locals>.<lambda>±  r®  rL   )r   r„  r–   r  r»   rÝ   ÚreÚsubr8  rÑ   r�   ÚupdateÚreplace_all_uses_withÚ
erase_noderŸ   rc  r   rd  r�   r’  Úreversedr6   r›  )r­  rº  Úbwd_module_inputsr!  Úquant_fwd_module_outputsÚfwd_noderŒ  Úquant_bwd_inputr†  Úquant_bwd_module_inputsÚbwd_input_locÚbw_inputÚscaled_fwd_module_outputsÚscale_bwd_inputs   ``            rJ   Ú#perform_fp8_activation_quantizationrÍ  \  sÆ  ù€ ô Øñ
ó
õ	ô ˜:×+Ñ+¨_Ô=äØñ
ó
õ	ô Øñ
ó
õ	ð  *×/Ñ/×:Ñ:¸hÐ:ÓGÈÑJ×OÑOÐPQÑRÐà,ò 3ˆØ˜8Ÿ=™=Ò(Ø)Ü—‘Ð-¨r°8·=±=ÓAñˆIð ×!Ñ!×1Ñ1°)Ó<ñ SØ",×"2Ñ"2×">Ñ">ÀHÇMÁMÐ">Ó"R�÷Sà$Ÿ>™>¨.Ñ9ˆLØ× Ñ ×'Ñ'¨¯©Ô6Ø=AˆO× Ñ Ð!9Ñ:Ø3?ˆO× Ñ  Ñ0Ø×+Ñ+¨OÔ<Ø×Ñ×'Ñ'¨	Õ2ð3ô ‡�×Ñ×6Ñ6Ø+ñç	�cˆ-˜Óðô #' z×'7Ñ'7×'BÑ'BÀmÐ'BÓ'TÓ"UÐà/°Ñ3ˆÜ Ð!8Ó9ò 	ˆHÜ˜xÕ(Ø (�Ùð	ð
 %/×$4Ñ$4×$?Ñ$?À8Ð$?Ó$LÈQÑ$O×$TÑ$TÐUVÑ$WÐ!Ø1ò 	0ˆHØ˜xŸ}™}Ò,à×%Ñ%×5Ñ5°mÓDñ WØ&0×&6Ñ&6×&BÑ&BÈÏÉÐ&BÓ&V�O÷Wà×$Ñ$×+Ñ+¨H¯M©MÔ:Ø /‘ð	0ô ˜:×+Ñ+Ô,äØñ
ó
ö	÷?Sñ Sú÷0Wð Wús   Ã'KÉ'K%ËK"	Ë%K.	c                óð  — |r|D �cg c]  }|j                   ‘Œ c}ng }| D �ci c]  }|j                   |“Œ }}t        j                  j                  j                  d   j                  dd«      r)| D �ci c]  }d|j                   vsŒ|j                   |“Œ  }}|j                  j                  d¬«      d   j                  d   }|j                  j                  d¬«      D �ci c]  }|j                   |“Œ }	}d}
|D ]Ò  }|j                   |v sŒt        |«      sŒ|j                   |v r!t        j                  d	|j                   «       ŒMd
|j                  d<   |j                  d   j                  |j                  d<   d
|	|j                      j                  d<   |j                  d   j                  |	|j                      j                  d<   d
}
ŒÔ |
rt        |||	|«       y y c c}w c c}w c c}w c c}w )Nr_  Úexclude_primalsFÚprimalsrØ   r  r   rÑ   z*Skipping quantization of static input %s: Trv  r¤   r†  )rÝ   rŸ   rc  r   rd  r�   r–   r  r»   rn  r=   Údebugr�   rf  rÍ  )r)  r­  rº  ri   r!  rI   Ústatic_input_namesÚsaved_values_namesr/  rÄ  Úshould_perform_fp8_quants              rJ   Úenable_activation_quantizationrÕ  ·  s÷  € ñ 'ð  ;Ö;�tˆ�‹Ó;àð ð
 7CÖC¨d˜$Ÿ)™) T™/ÐCÐÐCÜ‡�×Ñ×6Ñ6Ø+ñç	�cÐ
˜UÓ#ð$ð )5ö
Ø $¸	ÈÏÉÒ8RˆD�I‰I�t‰Oð
Ðð 
ð $×)Ñ)×4Ñ4¸Ð4ÓAÀ!ÑD×IÑIÈ!ÑLÐà$.×$4Ñ$4×$?Ñ$?À=Ð$?Ó$QöØ ˆ�	‰	�4‰ðÐð ð  %ÐØ"ò 
,ˆØ�9‰9Ð*Ò*¬¸tÕ/DØ�y‰yÐ.Ñ.Ü—	‘	ÐFÈÏ	É	ÔRØØ26ˆD�I‰IÐ.Ñ/Ø(,¯	©	°%Ñ(8×(>Ñ(>ˆD�I‰I�nÑ%àJNÐ˜dŸi™iÑ(×-Ñ-Ð.FÑGØ@DÇ	Á	È%Ñ@P×@VÑ@VÐ˜dŸi™iÑ(×-Ñ-¨nÑ=Ø'+Ñ$ð
,ñ  Ü+Ø˜
Ð$5°õ	
ð  ùò9 	<ùò Dùò
ùòs   ‡G$£G)Á4G.ÂG.Ã#G3)ri   rñ   Úomit_aot_autograd_runtimec               óB  — t        | |¬«      \  }}	}
}| j                  j                  d¬«      }g t        t        |«      ¢}|rg ng t        t
        |«      ¢}g t        t        |«      ¢}g t        t        |«      ¢}g t        t        |«      ¢}|€g }t        | j                  ||z   |z   |z   |z   |	|d|¬«      }t        j                  j                  «       }|j                  d¬«      D ]á  }|j                  sCt        ||j                  «       t        ||j                  «       t        ||j                  «       ŒR|r_t!        d„ |j                  D «       «      rCt        ||j                  «       t        ||j                  «       t        ||j                  «       Œ³t        |«      sŒ¿t        ||j                  «       |rŒØt#        d«      ‚ t%        «       }g }g }|D ]C  }t'        |«      }|r#|j)                  |«       |j+                  |«       Œ3|j+                  |«       ŒE t-        | j                  «      }t/        j0                  |||«      D ]]  }d	|j2                  vrŒt5        |j2                  d	   «      |z
  }t7        |d
„ ¬«      D ]  }||vrŒ|j+                  ||   «       Œ ||z  }Œ_ |j9                  «        |j;                  ||z   «       |�sÎg }g }g }|D ]|  }t=        |j2                  j?                  d	«      t@        «      r|j+                  |«       Œ>|j2                  j?                  dd«      r|j+                  |«       Œl|j+                  |«       Œ~ |j9                  «        |j;                  ||z   «       tC        |«      }tE        |«      D ]D  \  } }| |k\  sŒ|j2                  j?                  dd«      rŒ)t#        d| › d|› dtC        |«      › �«      ‚ t        | j                  ||z   ||z   |z   |z   |z   |
tG        tC        |«      tC        |«      z   tC        |«      z   tC        |«      z   «      D � cg c]+  } | |k\  r| tC        |«      k  rtI        | «      n
tK        | «      ‘Œ- c} z   d|¬«      }!t        | j                  ||z   |z   |z   |z   |z   |z   |	|d|¬«      }n€t        | j                  ||z   ||z   |z   |
tG        tC        |«      tC        |«      z   «      D � cg c]  } tK        | «      ‘Œ c} z   d|¬«      }!t        | j                  ||z   |z   |z   |	|d|¬«      }tL        jN                  jQ                  | |!«      }"tL        jN                  jQ                  | |«      }#tR        jT                  j?                  dd«      	 �tW        ||"|#||«       |"|#fS c c} w c c} w )aj  Extract forward and backward graph modules from a joint graph.

    Args:
        ignore_must_be_in_fw_bw: When True, disables forward/backward placement
            enforcement in _extract_graph_with_inputs_outputs. Needed when the
            joint_module is not an original fwd+bwd joint graph (e.g. a backward
            graph being re-partitioned for dI/dW splitting).
        omit_aot_autograd_runtime: When True, skips postprocessing that is
            only needed when the resulting modules will be wrapped in a custom
            autograd.Function (the AOTAutograd path). This includes: tangent input
            handling, version-counter check sorting of saved tensors, opaque object
            (FakeScriptObject) separation, and fp8 activation quantization. Set this
            to True when the fwd/bwd modules will be executed directly without autograd.
    ©r!  rÑ   r  NrÏ   )rñ   c              3  óÄ   K  — | ]X  }|j                   t        j                  j                  j                  j
                  u xr t        |j                  «      d k(  –— ŒZ y­w©r   N)rž   rŸ   rÄ   r³   Úwait_tensorrÇ   rè   r“  rl   s     rJ   ro   z+_extract_fwd_bwd_modules.<locals>.<genexpr>"  sS   è ø€ ò )
ð ð �H‰HœŸ	™	×2Ñ2×>Ñ>×FÑFÐFò "Ü�A—G‘G“ Ñ!ó"ñ)
ùs   ‚AA z'backward_state_inputs must not be emptyr¤   c                ó   — | j                   S rF   r‹  )Úss    rJ   rq   z*_extract_fwd_bwd_modules.<locals>.<lambda>J  s
   € °1·6±6€ rL   rr   Úsaved_tensor_with_no_vc_checkFzi=z, no_vc_check_start_idx=z, len(saved_values)=rÐ   r_  ),r&  r–   r  Úfilterr5   r6   r4   r3   r  rú   rŸ   ÚdistributedÚis_availabler“  r+  rÝ   Úallr€   r$   r   Úaddré   r   Ú	itertoolsÚchainr�   r   rt   ÚclearÚextendr¦   r�   r   rè   r|  r.  r/   r.   r¼   Ú_lazy_graph_moduleÚ_make_graph_moduleÚinductor_configrd  rÕ  )$r   r)  Úsaved_sym_nodesÚsaved_opaque_nodesr!  ri   rñ   rÖ  r"  r#  r$  r%  ÚplaceholdersÚprimal_inputsÚtangent_inputsÚfwd_seed_offset_inputsÚbwd_seed_offset_inputsÚbackward_state_inputsÚ	bwd_graphÚdistributed_enabledrI   Úsaved_symbolsÚsaved_sym_nodes_bindingÚsaved_sym_nodes_derivedÚsymbolÚsymbol_bindingsÚnew_symbolsrÝ  Úsaved_values_with_vc_checkÚsaved_values_no_vc_checkÚsaved_opaque_objectsÚno_vc_check_start_idxr1  Ú	fwd_graphr­  rº  s$                                       rJ   Ú_extract_fwd_bwd_modulesr   á  sW  € ô4 	! ¸ÔOñ C€K�Ð/Ð1Bð  ×%Ñ%×0Ñ0°MÐ0ÓB€LØ7”fœZ¨Ó6Ð7€Má'‰Ð-Q¬v´kÀ<Ó/PÐ-Qð ð JœvÔ&9¸<ÓHÐIÐØIœvÔ&9¸<ÓHÐIÐØGœfÔ%7¸ÓFÐGÐàÐ!ØÐä2Ø×ÑØØ
ñ	à
ñ	ð ñ	ð !ñ		!ð
 	ØØØ 7ô€Iô  ×+Ñ+×8Ñ8Ó:Ðà×$Ñ$¨Ð$Ó6ò Pˆà�zŠzÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Õ:ñ
 !¤Sñ )
ð —Z‘Zô)
ô &
ô
 ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÔ7ÜÐ.°·	±	Õ:Ü Õ%ä˜L¨$¯)©)Ô4Ú(Ü$Ð%NÓOÐOð-Pô8 /9«l€MØ ÐØ Ðð  ò 1ˆÜ*¨4Ó0ˆÙØ×Ñ˜fÔ%Ø#×*Ñ*¨4Õ0à#×*Ñ*¨4Õ0ð1ô 3°<×3EÑ3EÓF€OÜ—‘Ð 7¸À~ÓVò %ˆØ˜Ÿ	™	Ñ!ØÜ" 4§9¡9¨UÑ#3Ó4°}ÑDˆä˜Ñ)9Ô:ò 	?ˆAð ˜Ñ'ØØ#×*Ñ*¨?¸1Ñ+=Õ>ð	?ð 	˜Ñ$‰ð%ð" ×ÑÔØ×ÑÐ2Ð5LÑLÔMâ$ð &(Ð"Ø#%Ð Ø!ÐØ ò 	8ˆDä˜$Ÿ)™)Ÿ-™-¨Ó.Ô0@ÔAØ$×+Ñ+¨DÕ1Ø—‘—‘Ð>ÀÔFØ(×/Ñ/°Õ5à*×1Ñ1°$Õ7ð	8ð 	×ÑÔØ×ÑÐ6Ð9QÑQÔRÜ #Ð$>Ó ?Ðô ! Ó.ò 	‰GˆAˆtØÐ)Ó)Ø—y‘y—}‘}Ð%DÀeÕLÜ(Ø˜Q˜CÐ7Ð8MÐ7NÐNbÔcfÐgsÓctÐbuÐvóð ð	ô 7Ø×ÑØÐ2Ñ2ØØñà"ñ#ð !ñ!ð ñ	ð
 ô
 Ü˜Ó%ÜÐ.Ó/ñ0äÐ,Ó-ñ.ô ˜/Ó*ñ+óö	
ð ð Ð-Ò-°!´c¸,Ó6GÒ2Gô 4°AÔ6ä/°Ó2ñ3ò
ñð Ø$;ô+
ˆ	ô. 7Ø×ÑØØñà"ñ#ð !ñ!ð ñ	ð
 %ñ%ð $ñ$ð ØØØ$;ô
‰	ô  7Ø×ÑØÐ2Ñ2Ø˜,Ñ&¨Ñ8Øô œs <Ó0´3°Ó3GÑGÓHöàô +¨1Õ-òñð
 Ø$;ô
ˆ	ô 7Ø×ÑØØñà$ñ%ð $ñ$ð ØØØ$;ô

ˆ	ô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,È	ÓR€Jä×0Ñ0×4Ñ4Ø/°ó	
ð ð	ô
 	'ØØØØ'Øô	
ð �zÐ!Ð!ùòK
ùòFs   Ð90VÓ!V)Ústatic_lifetime_input_indicesri   c               óê  ‡— g }d}| j                   j                  D ]&  }t        |«      st        |«      st	        |«      sŒ%|}Œ( |€t        d«      ‚| j                   j                  D ]$  }t        |«      s|j                  |«       ||u sŒ$ n t        d„ |D «       «      }t        | «      }	t        | «      }
|	rIt        | j                   «      d   �$t        j                  d«       t        | |||¬«      S t        | d¬«      } t         j"                  st%        | «       t'        | «       t)        | «       |€g }t+        | ||«      }g }g }g }t,        j.                  j1                  «       Šdd	„}dd
„}dˆfd„}| j                   j                  D �]¾  }|j2                  |vrŒ|j4                  dk(  r$|j2                  d„ | j7                  «       D «       v rŒF|j8                  t,        j:                  j<                  j>                  j@                  t,        j:                  jB                  jD                  j@                  t,        j:                  jB                  jF                  j@                  t,        j:                  jB                  jH                  j@                  t,        j:                  jB                  jH                  jJ                  fv r�Œ7tM        |«      r|j                  |«       �ŒU ||«      r�Œ_|jN                  jQ                  d«      tR        jT                  k(  r0tW        |«      r|j                  |«       n|j                  |«       �Œ» ||«      rM|	rt        d|› d|j8                  › �«      ‚tW        |«      r|j                  |«       n|j                  |«       �ŒtW        |«      r|j                  |«       �Œ. ||«      s|j4                  dk(  rt        d|› d�«      ‚|jX                  D �cg c]  }|j2                  |vsŒ|‘Œ }}t[        d„ |D «       «      r|j]                  |«       �Œ¡t_        |«      r�Œ®|j                  |«       �ŒÁ ta        tb        je                  |«      jg                  «       «      }ta        tb        je                  |«      jg                  «       «      }ta        tb        je                  |«      jg                  «       «      }t         jh                  rti        | j                   |«      }|€|jj                  }tm        | |||||¬«      \  }}|j                   jo                  tp        ¬«       |j                   jo                  tp        ¬«       |	r'|
rts        | ||tu        |«      «      \  }}tw        |«      }t         jx                  rddl=m<}  |||||«       t}        |«      }t}        |«      }t        |d¬«      }tu        |j€                  «      dkD  rt        |d¬«      }||fS c c}w )aÔ  
    Partitions the :attr:`joint_module` in a manner that closely resembles the
    behavior observed in the original ``.forward()`` and ``.backward()`` of the
    callable, i.e., the resulting forward graph contains those operators that
    are executed in the original ``.forward()`` callable passed to
    :func:`aot_function`.

    The default partitioner collects the operators that are between the forward
    inputs and the forward outputs. This helps in finding the tensors which have
    to be stashed for the backward pass. These stashed tensors become the output
    of the generated forward graph. The remaining operators are then placed in
    the backward graph.

    .. warning::
        This API is experimental and likely to change.

    Args:
        joint_module(fx.GraphModule): The joint forward and backward graph. This
            is the result of AOT Autograd tracing.

    Returns:
        Returns the generated forward and backward Fx graph modules.
    Nzlast_node must not be Nonec              3  óT   K  — | ]   }|j                   d k7  sŒ|j                  –— Œ" y­w©rØ   N©r¾   rÝ   r  s     rJ   ro   z$default_partition.<locals>.<genexpr>û  s$   è ø€ ò $Ø¨t¯w©w¸(Ó/Bˆ�	�	ñ$ùó   ‚(—(r   zxTrying to unsafely apply AC to a non-functional graph with the default partitioner. Falling back to min-cut partitioner.)r!  r  T©Úis_default_partitionc                óœ   — d| j                   v xs= t        | j                   j                  d«      t        j                  j
                  «      S )Nr4  r¤   )r�   r¦   r�   rŸ   Ú_subclassesÚ
FakeTensorr“   s    rJ   Ú	is_tensorz$default_partition.<locals>.is_tensor#  s=   € Ø §	¡	Ð)ò 
¬ZØ�I‰I�M‰M˜%Ó ¤%×"3Ñ"3×">Ñ">ó.
ð 	
rL   c                ón   — t        d„ | j                  D «       «      xr t        | j                  «      dkD  S )Nc              3  óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wrF   )rž   r¹   rº   ©rm   rš  s     rJ   ro   z=default_partition.<locals>.is_multi_output.<locals>.<genexpr>*  s   è ø€ ÒG°D�—‘œx×/Ñ/Õ/ÑGùs   ‚')r   )râ  r“  rè   r“   s    rJ   Úis_multi_outputz*default_partition.<locals>.is_multi_output(  s.   € äÑG¸D¿J¹JÔGÓGò $Ü�D—J‘J“ !Ñ#ð	
rL   c                óÊ   •— | j                  d¬«      xrO | j                  dvxr? ‰ xs: | j                  t        j                  j
                  j                  j                  uS )NF)Úimpure_random)rÑ   rØ   )Ú	is_impurer¾   rž   rŸ   rÄ   r³   rÛ  rÇ   )rI   rô  s    €rJ   r  z$default_partition.<locals>.is_impure.  sc   ø€ ð �N‰N¨ˆNÓ/ò 	Ø—‘ððò	ð (Ð'ò UØ—;‘;¤e§i¡i×&@Ñ&@×&LÑ&L×&TÑ&TÐTð	
rL   rÖ   c              3  ó&   K  — | ]	  \  }}|–— Œ y ­wrF   r]   )rm   Úkrù   s      rJ   ro   z$default_partition.<locals>.<genexpr>C  s   è ø€ ò 3
Ù�!�QŒAñ3
ùs   ‚rŽ   z.Trying to apply AC on a graph with impure op: z, r·   z	Expected z to be a tensorc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   ©r   rl   s     rJ   ro   z$default_partition.<locals>.<genexpr>p  s   è ø€ Ò7 !Œ{˜1�~Ñ7ùó   ‚©rë  rì  r!  ri   )Úis_impure_noder&   ©Úenable_activation_offloadingF©r  rU   )Ar–   r—   r
  r5   r4   r€   r6   ré   r$   rš   r¢   r0   ÚwarningsÚwarnÚ#min_cut_rematerialization_partitionÚcleanup_recompute_tagsr   Ú(unsafe_allow_optimization_of_collectivesÚforce_save_collectivesÚforce_save_effectful_opsÚforce_save_bw_mutation_srcÚclassify_nodesrŸ   rà  rá  rÝ   r¾   Únamed_modulesrž   rÄ   rÅ   Ú_assert_scalarrÇ   ÚprofilerÚ_record_function_enter_newÚ_record_function_enterÚ_record_function_exitÚ_RecordFunctionr   r�   r�   r%   Ú	MUST_SAVEr1   r“  râ  rç  r”   r’  r{  Úfromkeysr”  Ú_sync_decision_cross_ranksri   r   rë   rµ   Úfunctionalize_rng_opsrè   Ú#reordering_to_mimic_autograd_enginer  Ú,_activation_offloading.activation_offloadingr:   Úthread_graphsafe_rng_from_hopsrd   )r   Ú_joint_inputsr!  r  ri   Úforward_nodesÚ	last_noderI   Úforward_node_namesÚgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsÚ	node_infor)  rë  rì  r  r  r  rn   Úbackward_usagesÚ	fw_moduleÚ	bw_moduler  rô  s                          @rJ   Údefault_partitionr?  Ï  s\  ø€ ð@ €MØ€IØ×"Ñ"×(Ñ(ò ˆÜ˜tÔ$¬
°4Ô(8Ô<OÐPTÕ<UØ‰Iðð ÐÜÐ9Ó:Ð:Ø×"Ñ"×(Ñ(ò ˆÜ˜4Ô Ø× Ñ  Ô&Ø�9ÒÙð	ô
 $ñ $Ø+ô$ó Ðô "6°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü × 2Ñ 2Ó3°AÑ6ÐBô �M‰MðLôô 7ØØØ /Ø.Kô	ð ô .¨lÐQUÔVˆä×:Ò:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ð,Ø(*Ð%ÜØÐ3°_ó€Ið €LØ€OØÐä×+Ñ+×8Ñ8Ó:Ðó
ó

õ
ð$ ×"Ñ"×(Ñ(ó <&ˆØ�9‰9Ð.Ñ.ØØ�7‰7�jÒ  T§Y¡Yñ 3
Ø&×4Ñ4Ó6ô3
ñ &
ð Ø�;‰;Ü�I‰I�N‰N×)Ñ)×1Ñ1ô �I‰I×Ñ×9Ñ9×AÑAÜ�I‰I×Ñ×5Ñ5×=Ñ=Ü�I‰I×Ñ×4Ñ4×<Ñ<Ü�I‰I×Ñ×4Ñ4×DÑDð	
ñ 	
ñ Ü�tÔð ×"Ñ" 4Ô(ÙÙ˜4Ô áØ�9‰9�=‰=˜Ó%Ô)9×)CÑ)CÒCÜ˜dÔ#Ø"×)Ñ)¨$Õ/à×#Ñ# DÔ)ÙÙ�TŒ?Ù)Ü$ØDÀTÀFÈ"ÈTÏ[É[ÈMÐZóð ô ˜dÔ#Ø"×)Ñ)¨$Õ/à×#Ñ# DÔ)ÙÜ˜$ÔØ×%Ñ% dÔ+ÙÙ˜Œ 4§7¡7¨oÒ#=Ü  9¨T¨F°/Ð!BÓCÐCØ&*§j¡jÖU °A·F±FÐBTÒ4Tš1ÐUˆÐUÜÑ7 Ô7Ô7ð ×"Ñ" ?Ô3ÙÜ˜dÖ#Ø×Ñ Ö%ðy<&ô| œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€OÜœdŸm™mÐ,>Ó?×DÑDÓFÓGÐä×(Ò(Ü1°,×2DÑ2DÀlÓSˆà"Ð*Ø&/×&KÑ&KÐ#Ü3ØØØ'Ø-Ø'Ø$?ôÑ€Iˆyð ‡O�O×'Ñ'Ô7HÐ'ÔIØ‡O�O×'Ñ'Ô7HÐ'ÔIá!Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 8¸	ÓBˆ	ô ×*Ò*õ	
ñ 	%ØØØØ'ô		
ô ˜yÓ)€IÜ˜yÓ)€Iä.¨yÀeÔL€IÜ
ˆ9×&Ñ&Ó'¨!Ò+Ü2°9È$ÔOˆ	à�iÐÐùòE Vs   Ï.W0ÐW0g    €„.Ac                ó    — | |j                   z  S rF   )Úitemsize)rY  rf  s     rJ   Ú_tensor_nbytesrB  ·  s   € Ø�5—>‘>Ñ!Ð!rL   c                óJ  ‡— dd„Šd| j                   v r¸| j                   d   }t        |t        «      ryt        |t        t        f«      rt        ˆfd„|D «       «      S t        |t        «      r"t        ˆfd„|j                  «       D «       «      S t        |t        j                  «      r ‰|«      S t        dt        |«      › d| › �«      ‚| j                  dk(  s:| j                  t        j                  j                  j                   j"                  u ry	t        d
| › d�«      ‚)Nc                ó–   — t        | t        j                  «      syt        t	        | j                  «       d¬«      | j                  «      S )Nr   é   ©Úfallback)r¦   rŸ   rA  rB  r    rY  rf  ©rÔ   s    rJ   Úobject_nbytesz_size_of.<locals>.object_nbytes¼  s2   € Ü˜!œUŸ\™\Ô*ØÜÔ/°·±³	ÀDÔIÈ1Ï7É7ÓSÐSrL   r¤   r&   c              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrF   r]   )rm   rn   rI  s     €rJ   ro   z_size_of.<locals>.<genexpr>É  s   øè ø€ Ò5¨A‘} Q×'Ñ5ùó   ƒc              3  ó4   •K  — | ]  \  }} ‰|«      –— Œ y ­wrF   r]   )rm   r6  rn   rI  s      €rJ   ro   z_size_of.<locals>.<genexpr>Ë  s   øè ø€ Ò@©D¨A¨q‘} Q×'Ñ@ùó   ƒzUnknown metadata type z	 on node rÖ   r   r   zO didn't have `val` metadata; we should always have `val` metadata on the nodes.)rÔ   ÚobjectrW   rƒ   )r�   r¦   r   r’  rê   Úsumr{  ÚitemsrŸ   rA  ræ   rª   r¾   rž   rÄ   rÅ   r(  rÇ   )rI   r¤   rI  s     @rJ   Ú_size_ofrQ  »  sò   ø€ óTð
 �—	‘	ÑØ�i‰i˜ÑˆÜ�cœ<Ô(Øô ˜œd¤E˜]Ô+ÜÓ5°Ô5Ó5Ð5Ü˜œTÔ"ÜÓ@°C·I±I³KÔ@Ó@Ð@Ü˜œUŸ\™\Ô*Ù  Ó%Ð%äÐ3´D¸³I°;¸iÈÀvÐNÓOÐOØ‡w�w�*Ò §¡¬u¯y©y¯~©~×/LÑ/L×/TÑ/TÑ TØÜ
Ø
�ˆvÐdÐeóð rL   c           	     ó2  — ddl m}  |t        «      }| j                  D ]3  }|j                  dk(  sŒ||j
                  j                  xx   dz  cc<   Œ5 t        j                  dt        |j                  «       t        j                  d«      d¬«      «       y )Nr   )r   r·   r&   ú%sT©rs   Úreverse)Úcollectionsr   rƒ   r—   r¾   rž   rX   r=   rs  rt   rP  r¹   Ú
itemgetter)r–   r   ÚcntrI   s       rJ   Ú
_count_opsrY  Ø  sr   € Ý'á%¤cÓ*€CØ—‘ò +ˆØ�7‰7�oÓ%Ø�—‘×$Ñ$Ó%¨Ñ*Ô%ð+ô ‡H�HˆT”6˜#Ÿ)™)›+¬8×+>Ñ+>¸qÓ+AÈ4ÔPÕQrL   c                 ó   — g } t        t        j                  j                  «      D ]¥  }t	        t        j                  j                  |«      }t        |t        j                  j                  «      sŒL|j                  «       D ]G  }t	        ||«      }t        j                  j                  |j                  v sŒ6| j                  |«        Œ¥ Œ§ | S rF   )ÚdirrŸ   rÄ   rÅ   r´   r¦   rý   ÚOpOverloadPacketÚ	overloadsr    Ú	pointwiserœ   ré   )rÄ   Ú	attr_nameÚopoverloadpacketÚoverloadÚop_overloads        rJ   Úpointwise_opsrc  â  s¤   € à-/€CÜœŸ™Ÿ™Ó(ò 
ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,GÔHØà(×2Ñ2Ó4ò 	ˆHÜ!Ð"2°HÓ=ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Ò6à—
‘
Ð+Ô,Ùñ	ð
ð €JrL   c                óî   — | D �ci c]7  }t        |t        j                  j                  j                  «      sŒ2|||   “Œ9 }}t        |j                  «       t        j                  d«      d¬«      S c c}w )Nr&   TrT  )	r¦   rŸ   r¼   rI   r½   rt   rP  r¹   rW  )r»   Ú	depth_mapÚargÚ
arg_depthss       rJ   Úsort_depthsrh  ô  sh   € ð (,öØ #¬z¸#¼u¿x¹x¿}¹}×?QÑ?QÕ/RˆˆY�s‰^Ñð€Jð ô �*×"Ñ"Ó$¬(×*=Ñ*=¸aÓ*@È$ÔOÐOùòs
   …3A2¹A2c                ó   ‡
‡‡— t        j                  «       Ši Š
| j                  j                  d¬«      D ]  }‰j	                  |ˆ
fd„«      ‰
|<   Œ t        | j                  j                  «      D ��ci c]  \  }}||“Œ
 c}}Šdˆ
ˆˆfd„}t        t        t        | j                  j                  «      «      }d}t        j                  }|D ]#  }|j                  D ]  }‰|   |k  sŒ‰|   }|}Œ Œ% |€| S t        | j                  j                  «      d‰|    D ]U  }|j                  dk(  sŒ|j                  t        j                   j"                  j$                  j&                  u sŒN ||«       ŒW t        | j                  j                  «      ‰|   d D ]
  } ||«       Œ t        j                   j)                  | ‰«      }	|	S c c}}w )aÄ  
    This pass finds the first bwd node in the graph (by looking at users of
    tangents) and then reorders the graph by walking from this node to all the
    way to the end of the graph. At each op in this traversal, we insert this op
    in a new graph and try to bring only the relevant subgraph from the other
    non-bwd edges relevant for this op. This closely mimics the behavior of
    autograd engine.

    Why is this pass required in the first place?

    This is an artifact of how partitioners work today. The starting point of
    partitioner is a joint graph, which is fwd and then bwd graph. In the case
    of checkpointing, we keep portions of fwd graph in their original place in
    the joint graph, while obtaining a bwd graph. As a result, the resulting bwd
    graph has copies of recomputed fwd subgraphs followed by the original bwd
    graph. If we run this naively, this leads to bad memory footprint, because
    the fwd subgraphs are live for way longer duration than necessary. This pass
    reorders the operations such that we prioritize the ops for the original bwd
    graph while only realizing those ops from the fwd graph that are necessary
    at any given point in the graph.
    rÑ   r  c                ó   •— ‰|    S rF   r]   rÓ   s    €rJ   rq   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>  s   ø€ ¸¸A¹€ rL   c                ó*  •— | g}t        «       }t        |«      dkD  rH|j                  «       } | |v s| ‰v rŒ'|j                  | «       || j                  z  }t        |«      dkD  rŒHt        |ˆfd„¬«      }|D ]  } ‰j                  | ˆfd„«      ‰| <   Œ y )Nr   c                ó   •— ‰|    S rF   r]   )rn   Úorders    €rJ   rq   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>+  s   ø€ À%ÈÁ(€ rL   rr   c                ó   •— ‰|    S rF   r]   rÓ   s    €rJ   rq   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>-  rÕ   rL   )r$   rè   r�  rã  Úall_input_nodesrt   rä   )rI   Ú	cur_nodesÚinsertable_nodesrÌ   rò   rm  s      €€€rJ   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph  s¢   ø€ Ø�Fˆ	Ü0:³ÐÜ�)‹n˜qÒ Ø—=‘=“?ˆDØÐ'Ñ'¨4°3©;ØØ× Ñ  Ô&ð ˜×-Ñ-Ñ-ˆIô �)‹n˜qÓ ô "Ð"2Ó8JÔKÐØ$ò 	DˆDØ!×+Ñ+¨DÓ2BÓCˆC�ŠIñ	DrL   Nr·   ©rI   rV   rW   ÚNone)r¼   rÜ   r–   r  rä   r|  r—   r’  rß  r6   ÚmathÚinfr“  r¾   rž   rŸ   rÄ   rÅ   rç   rÇ   ÚGraphModule)ÚgmrI   r0  rr  rï  Úfirst_node_in_bwdÚminimum_orderÚtangentrš  Únew_gmrÌ   rò   rm  s             @@@rJ   r2  r2  ý  s©  ú€ ô. —‘“
€IØ"$€Cð —‘×#Ñ# }Ð#Ó5ò @ˆØ×'Ñ'¨Ó.>Ó?ˆˆDŠ	ð@ô )2°"·(±(·.±.Ó(A×B™9˜3 ˆT�3‰YÓB€E÷Dô& œ&¤¨b¯h©h¯n©nÓ=Ó>€NØÐÜ—H‘H€MØ!ò )ˆØ—M‘Mò 	)ˆDØ�T‰{˜]Ó*Ø % d¡�Ø$(Ñ!ñ	)ð)ð Ð Øˆ	ô �R—X‘X—^‘^Ó$Ð%? uÐ->Ñ'?Ð@ò 'ˆØ�7‰7�oÓ%¨$¯+©+¼¿¹¿¹×9MÑ9M×9UÑ9UÒ*UÙ  Õ&ð'ô �R—X‘X—^‘^Ó$ UÐ+<Ñ%=Ð%?Ð@ò #ˆÙ˜TÕ"ð#ô �X‰X×!Ñ! " iÓ0€FØ€Mùó[ Cs   Á5G
c                ó®  — |j                   }|€t        d«      ‚| j                  }	|j                  }
t        j                  j
                  j                  }| j                  j                  |«      5  | j                  j                  d|› �«      }t        |«      |j                  d<   |}ddd«       |j                  j                  |«      5  |j                  j                  d|› �«      }t        |«      |j                  d<   |}ddd«       t        |j                  «      }|d<   | j                  j                  |«      5  |	j                  d||j                  g|j                  ¢­|¬«      }ddd«       |j!                  «       |	j#                  |«       t        |j                  «      }|d<   |
j%                  |«      5  |
j                  d||j                  g|j                  ¢­|¬«      }|j!                  |«       |
j#                  |«       ddd«       ||fS # 1 sw Y   �ŒzxY w# 1 sw Y   �Œ+xY w# 1 sw Y   ŒÌxY w# 1 sw Y   ||fS xY w)	a%  
    Note [CUDA Graph Safe RNG Functionalization]

    CUDA Graph capture doesn't work with get_rng_state and set_rng_state because these functions operate on CPU values,
    while CUDA Graph RNG capture uses on-device CUDA tensors. To solve this, we use graphsafe_set_state with a
    CUDA Generator registered to the CUDA Graph before capture begins. graphsafe_set_state updates the generator's pointer
    to reference a different GeneratorImpl, ensuring subsequent calls are correctly forwarded to the desired generator
    (and its cuda-tensor RNG state during graph capture).

    For each RNG operation's forward/backward pair:

    - We create two generators initialized with identical values
    - Each forward and backward call advances its respective generator equally
    - This keeps generators synchronized so forward and backward operations use matching RNG values

    When forward is called multiple times before backward (causing desynchronization):

    - We save the forward RNG state
    - We update the backward Generator's state before executing backward

    Before each CUDA Graph replay, replay_prologue updates captured RNG pointers with current states, ensuring backward Generator
    changes are reflected during replay.

    This function modifies both forward and backward computation graphs by:

    Creating RNG state placeholders for both passes
    Updating the forward node to use graph-safe RNG state
    Updating the backward node to use graph-safe RNG state

    For more details: https://github.com/pytorch/pytorch/issues/113541
    Nzdevice_idx must not be NoneÚfwd_rng_state_r¤   Úbwd_rng_state_Ú	rng_stater·   ©r»   r¸   )Úindexr€   r–   rŸ   Ú_primsÚ	rng_primsÚgraphsafe_run_with_rng_stater8  rÑ   r7   r�   r{  r¸   Úcreate_noderž   r»   rÁ  rÂ  Úinserting_before)r=  r>  Úfw_nodeÚbw_nodeÚdeviceÚ	rng_countÚlast_fwd_inputÚlast_bwd_inputÚ
device_idxÚfw_graphÚbw_graphr…  Úfwd_rng_stateÚbwd_rng_stateÚ	fw_kwargsÚfunctional_fw_nodeÚ
bwd_kwargsÚ
rng_outputs                     rJ   Ú%apply_graphsafe_rng_functionalizationr—  K  s8  € ðR —‘€JØÐÜÐ:Ó;Ð;Ø�‰€HØ�‰€HÜ#(§<¡<×#9Ñ#9×#VÑ#VÐ ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆÜ$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷'ð 
�‰×	(Ñ	(¨Ó	8ñ 'Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆä$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷	'ô �W—^‘^Ó$€IØ*€IˆkÑØ	�‰×	(Ñ	(¨Ó	1ñ 
Ø%×1Ñ1ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 2ó 
Ð÷
ð ×!Ñ!Ð"4Ô5Ø×Ñ˜Ô ô �g—n‘nÓ%€JØ+€Jˆ{ÑØ	×	"Ñ	" 7Ó	+ñ %Ø×)Ñ)ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 *ó 
ˆ
ð 	×%Ñ% jÔ1Ø×Ñ˜GÔ$÷%ð ˜>Ð)Ð)÷M'ñ 'ú÷'ñ 'ú÷
ð 
ú÷%ð ˜>Ð)Ð)ús1   Á19H"Ã9H/Å.H<ÇAIÈ"H,È/H9È<IÉIc                óf  ‡'— t        j                  «       }dd„}dd„Š'dd„} || «      } ||«      } ||«      }	i }
| j                  j                  D ]¨  }t	        |«      sŒt        |j                  d«      sŒ&t        j                  j                  |j                  j                  v sŒW|j                  |vs|j                  |	vrŒt||j                     }||j                     }|	|j                     }||dœ|
|<   Œª t        j                  j                  j                  }t        j                  j                  j                  }d }|j                  j!                  d¬«      D ]  }d|j                  v sŒ|} n |€t#        d	«      ‚g }t%        t'        |j                  j!                  d¬«      «      «      }t%        t'        |j                  j!                  d¬«      «      «      }t)        ˆ'fd
„|
j+                  «       D «       «      }|j-                  t        j.                  d«      «       t1        |«      dkD  }t        j2                  j4                  }t4        j6                  xr* | xr% |j8                   xs |j:                  j<                  }t?        |
j+                  «       «      D �]"  \  }}|d   }|d   } ‰'|«      }|j                  }|j                  }|r'|�%|j@                  dk(  rtC        ||||||||«      \  }}ŒZ|jE                  |«      5  |jG                  d||j                  g|jH                  ¢­|jJ                  ¬«      }|jG                  dtL        jN                  |dfi ¬«      } ||«      |jP                  d<   |jG                  dtL        jN                  |dfi ¬«      } tS        jR                  |jP                  «      | _(        |jU                  | «       |jW                  |«       |jY                  |«       d d d «       |jE                  |«      5  dt%        |«      › �}!|j[                  |!«      }" ||«      |"jP                  d<   d d d «       |jE                  |«      5  |jG                  d|"|j                  g|jH                  ¢­|jJ                  ¬«      } |jU                  | «       |jW                  |«       d d d «       �Œ% |r˜t%        t]        |j                  j!                  d¬«      «      «      }#|#jH                  d   }$t1        |$«      |z
  }%|$d |% t_        |«      z   |$|%d  z   }&|j                  ja                  |&«       |j                  jW                  |#«       |jc                  «        |jc                  «        ||fS # 1 sw Y   �Œ�xY w# 1 sw Y   �ŒLxY w# 1 sw Y   �ŒxY w)Nc                ó  — i }| j                   j                  D ]i  }|j                  dk(  sŒt        |j                  d«      sŒ*t
        j                  j                  |j                  j                  v sŒ[|||j                  <   Œk |S )Nr·   rœ   )
r–   r—   r¾   r�   rž   rŸ   r    r¡   rœ   rÝ   )ÚgmodÚrandom_nodesrI   s      rJ   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_opsÄ  sl   € Ø+-ˆØ—J‘J×$Ñ$ò 	/ˆDà—‘˜?Ó*Ü˜DŸK™K¨Õ0Ü—I‘I×5Ñ5¸¿¹×9IÑ9IÒIà*.�˜TŸY™YÒ'ð	/ð ÐrL   c                ó   — d| j                   vry| j                   d   }t        |t        «      s|f}|D ]D  }t        |t        j                  «      sŒ|j
                  j                  dk(  sŒ8|j
                  c S  t        j
                  d«      S )zV
        Check the example value of the node outputs to find the device type.
        r¤   NÚcudaÚcpu)r�   r¦   rê   rŸ   rA  rŠ  rª   )rI   Ú
candidatesÚ	candidates      rJ   Ú
get_devicez)functionalize_rng_ops.<locals>.get_deviceÏ  s€   € ð ˜Ÿ	™	Ñ!Øà—Y‘Y˜uÑ%ˆ
Ü˜*¤eÔ,Ø$˜ˆJà#ò 	,ˆIÜ˜)¤U§\¡\Õ2Ø×#Ñ#×(Ñ(¨FÓ2Ø$×+Ñ+Ò+ð	,ô
 �|‰|˜EÓ"Ð"rL   c                ó:  — ddl m}  |«       }|€t        d«      ‚|5  | �E| j                  dk(  r6|j	                  t
        j                  j                  «       «      cd d d «       S |j	                  t        j                  «       «      cd d d «       S # 1 sw Y   y xY w)Nr   )Údetect_fake_modezfake_mode must not be Nonerž  )Útorch._guardsr¤  r€   rª   Úfrom_tensorrŸ   rž  Úget_rng_state)rŠ  r¤  Ú	fake_modes      rJ   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_stateá  sŒ   € Ý2á$Ó&ˆ	ØÐÜ Ð!=Ó>Ð>Øñ 	@ØÐ! f§k¡k°VÒ&;Ø ×,Ñ,¬U¯Z©Z×-EÑ-EÓ-GÓH÷	@ñ 	@ð ×(Ñ(¬×)<Ñ)<Ó)>Ó?÷	@÷ 	@ò 	@ús   �>BÁ%"BÂBrœ   )ÚfwdÚbwdrÑ   r  r{  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisc              3  ó4   •K  — | ]  } ‰|d    «      –— Œ y­w)rª  Nr]   )rm   Ú	node_pairr¢  s     €rJ   ro   z(functionalize_rng_ops.<locals>.<genexpr>  s    øè ø€ ò Ø)2‰
�9˜UÑ#×$ñùrM  rŸ  r&   rª  r«  rž  r·   r�  r   r¤   Úrng_state_output_rØ   )rš  úfx.GraphModulerW   údict[str, fx.Node])rI   rV   rW   útorch.device | None)rŠ  r±  rW   útorch.Tensor)2rä  Úcountr–   r—   r”   r�   rž   rŸ   r    r¡   rœ   rÝ   rƒ  r„  Úrun_and_save_rng_stateÚrun_with_rng_stater  ræ   r  rÃ  r$   ÚvaluesÚdiscardrŠ  rè   rc  r   Úgraphsafe_rng_functionalizationÚfallback_randomÚtest_configsÚ*graphsafe_rng_func_ignores_fallback_randomr|  rª   r—  r‡  r†  r»   r¸   r¹   rº   r�   ÚcopyrÁ  rÂ  ré   rÑ   r  rê   rØ   Ú	recompile)(r   r=  r>  Únum_sym_nodesÚuidrœ  r©  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_maprI   Ú	base_noderˆ  r‰  Úrun_and_save_rngrµ  Úbw_tangent_start_nodeÚfw_rng_state_outputsrŒ  r�  ÚdevicesÚmulti_cuda_devicesÚ
ind_configÚ'use_rng_graphsafe_rng_functionalizationr‹  r­  rŠ  r�  r�  r”  Ústater–  Ú
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxrî   r¢  s(                                          @rJ   r1  r1  ©  s´  ø€ ô2 �/‰/Ó
€Có	ó#ó$	@ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ñ(ò Sˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEð
 �y‰yÐ 0Ñ0°D·I±IÐEUÑ4UØØ+¨D¯I©IÑ6ˆIØ& t§y¡yÑ1ˆGØ& t§y¡yÑ1ˆGØ:AÈ'Ñ2RÐ$ YÒ/ðSô  —|‘|×-Ñ-×DÑDÐÜŸ™×/Ñ/×BÑBÐà ÐØ—‘×*Ñ*¨mÐ*Ó<ò ˆØ˜Ÿ	™	Ò!Ø$(Ð!Ùðð Ð$ÜØoó
ð 	
ð +-Ðäœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€NÜœ( 9§?¡?×#=Ñ#=ÀÐ#=Ó#OÓPÓQ€Näó Ø6N×6UÑ6UÓ6Wôó €Gð ‡O�O”E—L‘L Ó'Ô(ô ˜W›¨Ñ)Ðô —‘×'Ñ'€Jä×.Ñ.ò 	
Ø"Ð"ò	
ð ×*Ñ*Ð*ò RØ×&Ñ&×QÑQð ,ô !*Ð*B×*IÑ*IÓ*KÓ Ló P-Ñˆ	�9à˜EÑ"ˆØ˜EÑ"ˆÙ˜GÓ$ˆà—?‘?ˆØ—?‘?ˆñ 4ØÐ"Ø—‘˜vÒ%ä-RØØØØØØØØó	.Ñ*ˆN™Nð ×*Ñ*¨7Ó3ñ !3Ø%-×%9Ñ%9Ø#Ø$ð  Ÿ™ðà Ÿ™ñð #Ÿ>™>ð &:ó 	&Ð"ð !×,Ñ,Ø#Ü×$Ñ$Ø,¨aÐ0Øð	 -ó �ñ %9¸Ó$@�—
‘
˜5Ñ!à%×1Ñ1Ø#Ü×$Ñ$à*Øðð ð 2ó �
ô #'§)¡)¨G¯L©LÓ"9�
”à×-Ñ-¨jÔ9Ø×#Ñ# GÔ,Ø$×+Ñ+¨EÔ2÷C!3ðH ×*Ñ*Ð+@ÓAñ MØ0´°c³°Ð<�
Ø$,×$8Ñ$8¸Ó$DÐ!Ù0DÀVÓ0LÐ!×&Ñ& uÑ-÷Mð
 ×*Ñ*¨7Ó3ñ -Ø%×1Ñ1Ø#Ø&ð *ØŸ™ðð !Ÿ™ñð
 #Ÿ>™>ð 2ó 
�
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,÷-ñ -ðEP-ñj Üœd 9§?¡?×#=Ñ#=ÀÐ#=Ó#JÓKÓLˆØ#×(Ñ(¨Ñ+ˆ
Ü  ›_¨}Ñ<ÐàÐ*Ð*Ð+ÜÐ(Ó)ñ*àÐ+Ð,Ð-ñ.ð 	ð
 	�‰×Ñ˜wÔ'Ø�‰×"Ñ" >Ô2Ø×ÑÔØ×ÑÔØ�iÐÐ÷S!3ñ !3ú÷HMñ Mú÷
-ñ -ús&   ÌC.VÐ5VÑ(AV&ÖV	ÖV#	Ö&V0	c                ó  — | j                   j                  D ]t  }t        |j                  t        j
                  j                  «      sŒ2|j                  j                  dk(  sŒLt        |«      rŒXt        j                  |j                  d<   Œv y)z½
    By default, the partitioner is not allowed to recompute collectives
    unless they come from a user-annotated AC region.
    See Note [Recomputing collectives in the partitioner]
    r³   rŽ   N)r–   r—   r¦   rž   rŸ   rý   rþ   r²   r”   r%   r.  r�   )r   rI   s     rJ   r#  r#  �  sh   € ð ×"Ñ"×(Ñ(ò @ˆä�t—{‘{¤E§J¡J×$9Ñ$9Õ:Ø—‘×%Ñ%Ð);Ó;Ü" 4Õ(ä%5×%?Ñ%?ˆD�I‰I�kÒ"ñ@rL   c                ó    ‡— dˆfd„Š| j                   j                  D ].  }t        |«      sŒt        |«      rŒt	        |«      rŒ' ‰|«       Œ0 y)a\  
    Force save outputs from with_effects nodes wrapping effectful ops.

    Effectful ops (registered via _register_effectful_op) should not be recomputed
    because they may have arbitrary global side effects (I/O, RNG state, collectives,
    etc.). We mark the tensor outputs of with_effects as MUST_SAVE to prevent
    recomputation of the effectful op.

    The with_effects node returns a tuple (token, result). We recursively find all
    leaf outputs extracted via getitem and mark them as MUST_SAVE. Since these are
    saved, the with_effects op doesn't need to be recomputed in backward.
    c                ó  •— | j                   D ]t  }|j                  t        j                  u sŒ  ‰|«       t	        |j
                  j                  d«      t        t        f«      rŒXt        j                  |j
                  d<   Œv y )Nr¤   rŽ   )r“  rž   r¹   rº   r¦   r�   r�   rê   r’  r%   r.  )rI   rš  Úmark_getitem_outputss     €rJ   rÕ  z6force_save_effectful_ops.<locals>.mark_getitem_outputsª  sa   ø€ Ø—J‘Jò 	HˆDØ�{‰{œh×.Ñ.Ò.Ù$ TÔ*Ü! $§)¡)§-¡-°Ó"6¼Ä¸ÕFÜ-=×-GÑ-G�D—I‘I˜kÒ*ñ		HrL   Nrs  )r–   r—   r   r”   r  )r   rI   rÕ  s     @rJ   r$  r$  œ  sF   ø€ õHð ×"Ñ"×(Ñ(ò 'ˆä˜DÕ!Ü" 4Õ(Ü(¨Õ.á  Õ&ñ'rL   c                óÞ  — t        «       }t        | j                  j                  «      D ]Á  }|j                  dk(  rŒ|j
                  t        j                  j                  j                  j                  u }|rrt        |«      r|j                  |j                  d   «       t        |«      sŒ„|j                  d   |v sŒ–t        j                   |j                  d   j"                  d<   ŒÁ y  y )NrØ   r   r&   rŽ   )r$   rÃ  r–   r—   r¾   rž   rŸ   rÄ   rÅ   rç   rÇ   r  rã  r»   r  r%   r.  r�   )r   Úhas_mutation_in_bwrI   Úis_copy_s       rJ   r%  r%  º  s¹   € ô 5?³LÐÜ˜×+Ñ+×1Ñ1Ó2ò ˆØ�7‰7�hÒØà—;‘;¤%§)¡)§.¡.×"6Ñ"6×">Ñ">Ð>ˆÙÜ+¨DÔ1Ø"×&Ñ& t§y¡y°¡|Ô4ä*¨4Õ0°T·Y±Y¸q±\ÐEWÒ5WÜ1A×1KÑ1K�—	‘	˜!‘×!Ñ! +Ò.ñ ñ!rL   c                óþ   — | j                   t        j                  k7  ry| j                  d   }t	        |«      t
        j                  urt        dt	        |«      › �«      ‚d|j                  vxr | j                  dk(  S )NFr   z#expected parent to be fx.Node, got r4  r·   )
rž   r¹   rº   r»   rª   r¼   r½   r€   r�   r¾   )rI   Úparents     rJ   Úis_getitem_of_multi_outputrÛ  Ñ  sh   € Ø‡{�{”h×&Ñ&Ò&ØØ�Y‰Y�q‰\€FÜˆFƒ|œ2Ÿ7™7Ñ"ÜÐBÄ4ÈÃ<À.ÐQÓRÐRØ §¡Ð+ÒJ°·±¸?Ñ0JÐJrL   c               óâ  — | j                   j                  D �]T  }t        |«      rÐ|j                  D ]i  }t        |«      sŒd|j                  v sŒd|j                  v sŒ-|j                  d   |j                  d   kD  sŒMt
        j                  |j                  d<   Œk |j                  j                  dd«      sŒ¤t        d„ |j                  D «       «      rŒÁt
        j                  |j                  d<   Œßd|j                  vsŒît        d„ |j                  D «       «      s�Œt        |«      rd|j                  d   j                  v r�Œ4|s�Œ8t
        j                  |j                  d<   �ŒW | S )a  
    If there are two consecutive checkpointed blocks with no operator in
    between, we would still want to stash the tensor at the boundary of
    checkpointed blocks. The following pass makes the last output node
    non-recomputable to allow for that.
    Úac_graph_idrŽ   Úhas_backward_hookFc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   ©r”   r  s     rJ   ro   z)cleanup_recompute_tags.<locals>.<genexpr>í  s   è ø€ ò EØ)-”˜t×$ñEùr  c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   rà  r  s     rJ   ro   z)cleanup_recompute_tags.<locals>.<genexpr>  s   è ø€ Ò@¨T”N 4×(Ñ@ùr  r   )r–   r—   r”   r“  r�   r%   r.  r�   rã   rÛ  r»   )r   r  rI   rš  s       rJ   r!  r!  Ú  s3  € ð ×"Ñ"×(Ñ(ó +@ˆÜ˜$ÔØŸ
™
ò H�ä" 4Õ(Ø%¨¯©Ò2Ø%¨¯©Ò2ØŸ	™	 -Ñ0°4·9±9¸]Ñ3KÓKä-=×-GÑ-G�D—I‘I˜kÒ*ðHð �y‰y�}‰}Ð0°%Õ8Äñ EØ15·±ôEõ Bô& *:×)CÑ)C�—	‘	˜+Ò&à §¡Ò*ÜÑ@°T·Z±ZÔ@Ö@ô +¨4Ô0°]ÀdÇiÁiÐPQÁl×FWÑFWÓ5Wã$ô &6×%?Ñ%?ˆD�I‰I�kÓ"ðW+@ðX ÐrL   c                óÌ  ‡‡‡‡=‡>‡?‡@‡A‡B‡C‡D‡E‡F‡G‡H‡I‡J‡K‡L— ‰€
t        «       Št        «       ŠJt        rQt        d„ | j                  D «       «      }|t        d„ ‰Jj                  D «       «      z
  }t
        j                  d|«       dNd„Š>dNd„Š?dNˆ>ˆ?ˆJfd„ŠB	 dd lŠHdOˆBˆˆJfd	„ŠDdPˆDˆˆJfd
„}dOˆBfd„ŠC	 	 	 	 	 	 dQˆCˆJfd„} ‰Hj                  «       ŠIt        «       Š=dRdSˆ=ˆˆIˆJfd„}	| j                  D �]Ë  }
|
j                  dk(  rŒ|
‰j                  v rp|
‰j                  vr1‰Ij                  |
j                  dz   dt         j"                  d¬«       n1‰Ij                  |
j                  dz   dt         j"                  d¬«       Œ’t%        |
«      r1‰Ij                  |
j                  dz   dt         j"                  d¬«       ŒÎt'        |
«      r
 |	|
d«       nt)        |
«      r	 |	|
d«        ||
«      }‰j+                  |
«      r|r	 |	|
|«       d|
j,                  vxr d|
j,                  vxs8 d|
j,                  v xr( t/        |
j,                  d   t0        j2                  «       }t5        |
«      rt7        t9        |
«      «      }d }nj|rRt/        |
j,                  j;                  d«      t<        t>        f«      stA        |
«      rd}d }n)t         j"                  }d}n ||
‰jB                  «      \  }}|rO|t         j"                  k(  s	|tD        k(  r3‰Ij                  |
j                  dz   |
j                  dz   |d|› �¬«       n.‰Ij                  |
j                  dz   |
j                  dz   |¬«       |
jF                  D ]?  }‰Ij                  |
j                  dz   |j                  dz   t         j"                  d¬«       ŒA �ŒÎ dTˆBˆfd „}‰jH                  �r(‰jJ                  D �]  }|jF                  D �cg c]$  }‰j+                  |«      r‰jM                  |«      ‘Œ& }}|jF                  D �cg c]  }‰j+                  |«      sŒ|‘Œ }}tO        |«      dkD  sŒw ||tQ        |«      «      }tS        |jF                  «      D ]x  }‰j+                  |«      sŒ‰jM                  |«      |kD  sŒ* ‰B||«      sŒ4|‰=v rŒ9t
        j                  d!|‰jM                  |«      ||‰jM                  |«      «        |	|«       Œz �Œ ‰jT                  �r^t        «       }| j                  D �]D  }‰j+                  |«      sŒ‰jM                  |«      |fg}‰jM                  |«      }tO        |«      dkD  sŒJtW        jX                  |«      \  }}||v rŒ,|j[                  |«       ‰jM                  |«      |d"z   kD  rNtO        |«      dk(  r@t
        j                  d#||‰jM                  |«      ‰jM                  |«      «        |	|«       ŒÝ|jF                  D ]J  }‰j+                  |«      sŒ ‰B||«      sŒ|‰=vsŒ$tW        j\                  |‰jM                  |«      |f«       ŒL tO        |«      dkD  rŒû�ŒG 	  ‰Hj^                  ‰Id$d«      \  }}|\  }5ŠGt        «       }6ˆIfdE„|5D «       D ]   \  ŠL}7|6j�                  ˆGˆLfdF„|7D «       «       Œ" t        «       }8|6D ]=  \  }9}:|9d dG |:d dH k7  rt�        dI|9d dG › dJ|:d dH › �«      ‚|9d dG }-|8j[                  |-«       Œ? t‘        | «      ŠEt“        | j                  «      D �;�
ci c]  \  };}
|
|;“Œ
 c}
};ŠFt•        ˆEfdK„|8D «       ˆFfdL„¬M«      }<|<‰=fS # t        $ r}t        d«      |‚d }~ww xY wc c}w c c}w # ‰Hj`                  $ �r}tc        td        jf                  «      }d }d ŠA| jh                  } 	 | r| jk                  d%d&d&¬'«      n
tm        | «      ŠAto        d(d)„ ˆAfd*„¬+«       tq        d,d-«      }ts        |d.«      5 }!|!ju                  ‰A«       d d d «       n# 1 sw Y   nxY wn# tv        $ r}d/|› d0�}Y d }~nd }~ww xY wd1jy                  ‰Hjz                  j|                  j                  ‰I«      «      Š@to        d(d2„ ˆ@fd3„¬+«       t�        ‰I«      }"|"�r²i }#d$g}$dUd4„}%|"D ]ä  \  }&}'}(|$jƒ                  |'«       |&d$k(  r* |%|'«      })|#j…                  |)g «      jƒ                  |(«       ŒG|'dk(  r* |%|&«      })|#j…                  |)g «      jƒ                  |(«       Œv |%|&«       |%|'«      k(  r* |%|&«      })|#j…                  |)g «      jƒ                  |(«       Œ± |%|&«      }* |%|'«      }+|#j…                  |+g «      jƒ                  d5|*› �«       Œæ g },|#j‡                  «       D ]5  \  }-}.|,jƒ                  d6|-› d7�«       |.D ]  }/|,jƒ                  d8|/› �«       Œ Œ7 d1jy                  |,«      }0d9jy                  |$«      }1t‰        ‰I«      \  }2ŠK‰Krto        d(d:„ ˆKfd;„¬+«       |rd<|› d1�nd}3|2r	|3d=|2› d1�z  }3d}4|rd>}4t        d?|0› d@|1› d1|3› |4› �«      |‚t
        j                  dA«       t
        j                  dBt‹        ˆHˆIfdC„«      «       t‰        ‰I«       ‚ d }~wtv        $ rE t
        j                  dA«       t
        j                  dBt‹        ˆHˆIfdD„«      «       t‰        ‰I«       ‚ w xY wc c}
};w )VNc              3  ó¤   K  — | ]H  }|j                   d k(  r7t        |j                  d«      r!t        |j                  j                  «      –— ŒJ y­w)r·   Ú_overloadpacketN)r¾   r�   rž   r°   rä  r  s     rJ   ro   z solve_min_cut.<locals>.<genexpr>  sA   è ø€ ò &
àØ�w‰w˜/Ò)¬g°d·k±kÐCTÔ.Uô �—‘×+Ñ+×,ñ&
ùs   ‚AAc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   )r°   ©rm   r1  s     rJ   ro   z solve_min_cut.<locals>.<genexpr>"  s   è ø€ ò 4
ØŒC��Fñ4
ùr  z&Ops banned from re-materialization: %sc                óD  — |j                   t        j                  j                  j                  k7  ry|j
                  d   }t        j                  j                  j                  |«      \  }}|D ].  }|j                  |   }| |u r yt        |t        «      sŒ)| |v sŒ. y y©NFr   T)rž   rŸ   rÄ   rÿ   Úauto_functionalizedr»   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsr¸   r¦   r’  )ÚaÚbÚ
mutable_opÚmutable_arg_namesr6  rÝ   rf  s          rJ   Ú!can_fuse_into_auto_functionalizedz8solve_min_cut.<locals>.can_fuse_into_auto_functionalized'  s™   € Ø�8‰8”u—y‘y×-Ñ-×AÑAÒAØØ—V‘V˜A‘Yˆ
ô ×#Ñ#×6Ñ6×GÑGàó
ñ	
ØØð
 &ò 	 ˆDØ—(‘(˜4‘.ˆCØ�C‰xÙÜ˜#œtÕ$Ø˜’8Ùð	 ð rL   c                óâ   — |j                   t        j                  j                  j                  k7  ry|j
                  d   }|D ])  }|j
                  d   }|€t        d«      ‚||   }| |u sŒ) y y)NFÚtensors_to_cloner¸   zkwargs must not be NoneT)rž   rŸ   rÄ   rÿ   r   r¸   r€   )rí  rî  rð  rÝ   r¸   rf  s         rJ   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functional;  sw   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÒNØØŸH™HÐ%7Ñ8ÐØ%ò 	ˆDØŸ(™( 8Ñ,ˆFØˆ~Ü$Ð%>Ó?Ð?Ø˜‘,ˆCØ�CŠxÙð	ð rL   c                ób  •— t        |«      t        j                  k(  ry ‰| |«      ry ‰| |«      ry| j                  t        j
                  u r>| j                  d   j                  t        j                  j                  j                  u ry‰j                  | «      xr ‰j                  |«      S )NTr   F)r9   rÅ   Úcatrž   r¹   rº   r»   rŸ   rÄ   rÿ   r   rK   )rí  rî  rñ  rô  Úop_typess     €€€rJ   rK   z!solve_min_cut.<locals>.is_fusibleH  s•   ø€ ô ˜1Ó¤§¡Ò)ØÙ,¨Q°Ô2ØÙ9¸!¸QÔ?Øà�H‰Hœ×(Ñ(Ñ(Ø—‘�q‘	× Ñ Ü�y‰y×%Ñ%×FÑFñGð
 Ø×"Ñ" 1Ó%Ò@¨(×*=Ñ*=¸aÓ*@Ð@rL   r   zANeed networkx installed to perform smart recomputation heuristicsc                ó<  •— ‰j                  | «      ryt        | g«      }t        |«      dkD  ro|j                  «       }|j                  D ]A  }‰j                  |«      s ‰||«      s y‰j                  |«      sŒ1|j                  |«       ŒC t        |«      dkD  rŒoyrè  )rR   r$   rè   r�  r“  ry   rã  )rI   rp  Úcurrš  rK   r;  r÷  s       €€€rJ   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwardsb  s‘   ø€ Ø×Ñ˜DÔ!ØÜ ˜vÓ&ˆ	Ü�)‹n˜qÒ Ø—-‘-“/ˆCØŸ	™	ò (�Ø ×/Ñ/°Ô5¹jÈÈdÔ>SÙØ×#Ñ# DÕ)Ø—M‘M $Õ'ð	(ô �)‹n˜qÓ ð rL   c                ón  •— | j                   dk7  ry| j                  t        j                  u ry| j                  j                  dd«      t        j                  k(  ryt        j                  r‰j                  | «      ry| j                  t        j                  j                  t        j                  j                  fv ry‰j                  r‰j!                  | «      s1y‰j#                  | «      ry‰j%                  | «      ryt'        | «      ry‰j(                  r3 ‰| «      r+t*        j-                  d	| t/        | j0                  «      «       y
| j2                  dk  r| j2                  t        j4                  kD  ry‰j6                  r0t9        d„ | j:                  D «       «      }t=        | «      }|dz  |k  ryy)zRReturns reason string if node should be banned from recomputation, None otherwise.r·   NrŽ   zmarked MUST_SAVEznot in recomputable allowlistz	random opzcompute intensive opznon-builtin opzmaterialized backwards: %s %szmaterialized in backwardiè  ztoo far from backwardc              3  óh   K  — | ]*  }t        |t        j                  «      sŒt        |«      –— Œ, y ­wrF   )r¦   r¼   r½   rQ  ræ  s     rJ   ro   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>£  s&   è ø€ ò %Ø !´*¸QÄÇÁÕ2H”˜—ñ%ùs   ‚2¢2r¥   zreduction op)r¾   rž   r¹   rº   r�   r�   r%   r.  r   Úrecompute_viewsrR   rÅ   Úlift_fresh_copyrÇ   Ú
lift_freshr‹   rT   rP   rN   rü   rŠ   r=   rÑ  rê   r“  Údist_from_bwÚmax_dist_from_bwrŒ   rO  r»   rQ  )rI   Úinput_tensors_sizeÚoutput_sizerú  Úmin_cut_optionsr÷  s      €€€rJ   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputationp  sr  ø€ à�7‰7�oÒ%ØØ�;‰;œ(×*Ñ*Ñ*ØØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÒIØ%Ü×!Ò! h×&6Ñ&6°tÔ&<ØØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÑQØà×2Ò2Ø×+Ñ+¨DÔ1Ø6à×!Ñ! $Ô'Ø"Ø×,Ñ,¨TÔ2Ø-Ü(¨Ô.Ø'ð ×7Ò7Ñ<UØô=
ô �I‰IÐ5°t¼UÀ4Ç:Á:Ó=NÔOØ-ð ×Ñ Ò$¨×):Ñ):¼V×=TÑ=TÒ)Tà*ð ×+Ò+Ü!$ñ %Ø%)§Y¡Yô%ó "Ðô # 4›.ˆKØ˜Q‰Ð!3Ò3Ø%ØrL   c                óf   •‡ — ‰ j                   dk(  ryt        ˆˆ fd„‰ j                  D «       «       S )NrÑ   Tc              3  ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wrF   r]   )rm   rš  rK   rI   s     €€rJ   ro   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>¯  s   øè ø€ ÒE°$‘z $¨×-ÑEùs   ƒ)r¾   râ  r“  )rI   rK   s   `€rJ   Úis_materializedz&solve_min_cut.<locals>.is_materialized«  s*   ù€ Ø�7‰7�mÒ#ØäÔE¸$¿*¹*ÔEÓEÐEÐErL   c           
     óÆ  •— t         j                  r| |v ryt        | «      }t         j                  r#‰j	                  | «      rt
        j                  dfS t        | j                  d   t        «      r/t        | j                  d   t        j                  «      st        dfS t        |dt        t        | j                   d«      d«      z  z  «      } ‰| «      r|dfS |d	z  dfS )
z¸Returns (weight, cannot_save_reason).

        cannot_save_reason is None for finite weights, or a string explaining
        why the node cannot be saved for infinite weights.
        rÚ  zview op (recompute_views=True)r¤   z$SymFloat (non-SymInt symbolic value)gš™™™™™ñ?rj  r&   Né   )r   Ú treat_parameters_as_free_to_saverQ  rý  rR   ru  rv  r¦   r�   r   rŸ   r§   ÚINT_INFrƒ   rC  rD  r   )rI   ri   Úmem_szr  r÷  s      €€rJ   Úget_node_weightz&solve_min_cut.<locals>.get_node_weight±  sÑ   ø€ ô ×3Ò3ØÐ3Ñ3àÜ˜$“ˆÜ×!Ò! h×&6Ñ&6°tÔ&<ô —8‘8Ð=Ð=Ð=ä�d—i‘i Ñ&¬Ô5ä˜dŸi™i¨Ñ.´·±Ô=ÜÐ FÐFÐFô à�cœS¤ T×%6Ñ%6¸Ó!<¸aÓ@Ñ@ÑAó
ˆñ ˜4Ô Ø˜4�<Ðà˜A‘:˜tÐ#Ð#rL   r‰  c                ó
  •— ‰j                  | «      ry| ‰v r\t        | j                  t        j                  j
                  «      xr | j                  j                  dk(  }t        j                  s|syt        | «      ryd| j                  v r(t        | j                  d   t        j                  «      ry‰j                  | «       ‰j                  d| j                  dz   t        j                   |rd|› �¬«       y	d¬«       y	)
NFr³   r¤   rÉ   Ú_inzcannot recompute: zcannot recompute©ÚcapacityÚreasonT)rR   r¦   rž   rŸ   rý   rþ   r²   r   r"  r”   r�   r©   rã  Úadd_edgerÝ   ru  rv  )rI   r  Úis_collectiveÚbanned_nodesÚdont_banÚnx_graphr÷  s      €€€€rJ   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowedÜ  s÷   ø€ Ø×Ñ˜DÔ!ØØ�8Ñô ˜4Ÿ;™;¬¯
©
×(=Ñ(=Ó>ò @Ø—K‘K×)Ñ)Ð-?Ñ?ð ô ×>Ò>ÁmØô ˜$ÔØà�D—I‘IÑ¤*¨T¯Y©Y°uÑ-=¼u¿~¹~Ô"NØØ×Ñ˜Ôð
 	×ÑØØ�I‰I˜ÑÜ—X‘XÙ4:Ð'¨ xÐ0ð	 	ô 	
ð ð ASð	 	ô 	
ð rL   rØ   Ú_outÚsinkz;must be available for backward: input required for gradientr  r  z3must be computed in backward: required for gradientz+must recompute: marked by checkpoint policyzprimal inputzforward RNG seedr¤   r4  ç        znon-tensor outputzcannot save: )r  zdata dependencyc                óØ  •— g }| D ]*  }t        j                  |‰
j                  |«      |df«       Œ, t        |«      dkD  r©t        j                  |«      \  }}}|s‰
j                  |«      S |j
                  D ]_  }‰
j                  |«      sŒ‰
j                  |«      |kD  rŒ*‰
j                  |«      | ‰	||«      f}||vsŒJt        j                  ||«       Œa t        |«      dkD  rŒ©|S )z„
        Finds the first unfusible node in the chain of nodes starting from
        `start_nodes` and returns its position.
        Tr   )ÚheapqÚheappushr�   rè   Úheappopr“  ry   )Ústart_nodesÚ	max_rangeÚsorted_nodesrn   r6  rI   Únode_is_fusiblerš  r¤   rK   r;  s            €€rJ   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusibleh	  sû   ø€ ð
 9;ˆØò 	OˆAÜ�N‰N˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÕNð	Oô �,Ó !Ò#Ü',§}¡}°\Ó'BÑ$ˆAˆt�_Ù"Ø ×-Ñ-¨dÓ3Ð3ØŸ
™
ò 
:�Ø×+Ñ+¨DÕ1Ø ×-Ñ-¨dÓ3°iÒ?Ø à!×.Ñ.¨tÓ4ØÙ" 4¨Ó.ð6�Cð
  ,Ò.ÜŸ™ |°SÕ9ð
:ô	 �,Ó !Ó#ð ÐrL   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rj  ztoo long %s %s %s %srÉ   FTr¦  r�  c                 ó   — dddœS )NÚmin_cut_failed_fx_graphr   r¡  r]   r]   rL   rJ   rq   zsolve_min_cut.<locals>.<lambda>å	  s   € Ø5Ø (ñ%€ rL   c                 ó   •— ‰ S rF   r]   )Úfx_graph_strs   €rJ   rq   zsolve_min_cut.<locals>.<lambda>é	  s   ø€  <€ rL   r¯  Úmin_cut_failed_graphz.txtÚwz(failed to write: ú)ú
c                 ó   — dddœS )NÚmin_cut_failed_edge_listr   r¡  r]   r]   rL   rJ   rq   zsolve_min_cut.<locals>.<lambda>ö	  s   € Ø2Ø$ñ!€ rL   c                 ó   •— ‰ S rF   r]   )Úedge_list_strs   €rJ   rq   zsolve_min_cut.<locals>.<lambda>ú	  s   ø€ ˜}€ rL   c                óX   — dD ]$  }| j                  |«      sŒ| d t        |«        c S  | S )N)r  r  )Úendswithrè   )Ú	node_nameÚsuffixs     rJ   Úget_base_namez$solve_min_cut.<locals>.get_base_name
  s:   € Ø-ò 9�FØ ×)Ñ)¨&Õ1Ø(¨¬C°«K¨<Ð8Ò8ð9ð !Ð rL   zdepends on z  ú:z    - z -> c                 ó   — dddœS )NÚmin_cut_failed_svgr   r¡  r]   r]   rL   rJ   rq   zsolve_min_cut.<locals>.<lambda>9
  s   € Ø 4Ø$,ñ)€ rL   c                 ó   •— ‰ S rF   r]   )Úsvg_contents   €rJ   rq   zsolve_min_cut.<locals>.<lambda>=
  s   ø€  {€ rL   zFX graph dump: zMin-cut graph visualization: z‡[Production debugging: Use tlparse to extract debug artifacts (min_cut_failed_fx_graph, min_cut_failed_edge_list, min_cut_failed_svg)]
a™  AOT Autograd failed to partition the joint forward-backward graph.

The partitioner determines which intermediate values to save from the forward pass vs recompute in the backward pass. This error means a value is required for backward, but cannot be saved AND cannot be recomputed.

This is a bug in PyTorch. Please file an issue at https://github.com/pytorch/pytorch/issues

Nodes involved in the conflict:
zª

[For PyTorch developers: one of the above constraints is wrong. Either the node should be recomputable, saveable, or not required for backward.]

[Debug: min-cut path] z-Failed to compute min-cut on following graph:rS  c                 ól   •— dj                  ‰ j                  j                  j                  ‰«      «      S ©Nr-  ©ÚjoinÚ	readwriteÚedgelistÚgenerate_edgelist©Únxr  s   €€rJ   rq   zsolve_min_cut.<locals>.<lambda>d
  ó%   ø€ ˜Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÓT€ rL   c                 ól   •— dj                  ‰ j                  j                  j                  ‰«      «      S r=  r>  rC  s   €€rJ   rq   zsolve_min_cut.<locals>.<lambda>n
  rE  rL   c              3  ó,   •K  — | ]  }|‰|   f–— Œ y ­wrF   r]   )rm   rn   r  s     €rJ   ro   z solve_min_cut.<locals>.<genexpr>v
  s   øè ø€ Ò8¨�Q˜ ™Ô$Ñ8ùs   ƒc              3  ó0   •K  — | ]  }|‰v sŒ‰|f–— Œ y ­wrF   r]   )rm   rù   Únon_reachableÚus     €€rJ   ro   z solve_min_cut.<locals>.<genexpr>w
  s   øè ø€ ÒA ¨a°=Ò.@�q˜!”fÑAùs   ƒ	�	éýÿÿÿéüÿÿÿznode_in[:-3]=z != node_out[:-4]=c              3  ó(   •K  — | ]	  }‰|   –— Œ y ­wrF   r]   ©rm   rI   Úname_to_nodes     €rJ   ro   z solve_min_cut.<locals>.<genexpr>†
  s   øè ø€ Ò2 ˆ�dÕ	Ñ2ùs   ƒc                ó   •— ‰|    S rF   r]   )rÔ   Únode_idxs    €rJ   rq   zsolve_min_cut.<locals>.<lambda>†
  s   ø€ À(È1Á+€ rL   rr   )rí  rV   rî  rV   rW   r;   rU   )rI   rV   rW   ú
str | None)rI   rV   ri   rb   rW   ztuple[float, str | None])r‰  )rI   rV   r  r°   rW   r;   )r!  r`   r"  rƒ   rW   rƒ   )r4  r°   rW   r°   )Kr$   Úget_default_op_listr<   r—   rD   r=   rs  ÚnetworkxÚImportErrorræ   ÚDiGraphr¾   rd   re   r  rÝ   ru  rv  r”   r5   r4   ry   r�   r¦   rŸ   rA  r   Úfloatr«   r�   r   r   r1   ri   r  r“  rˆ   rv   r�   rè   rC  rê   r‰   r  r   rã  r  Úminimum_cutÚNetworkXUnboundedr;   r   ÚhandlersÚowning_moduler«  r°   r   Ú_get_unique_pathÚopenÚwriteÚ	Exceptionr?  r@  rA  rB  Ú_find_infinite_capacity_pathré   Ú
setdefaultrP  Úvisualize_min_cut_graphr   rÀ  r€   Úget_name_to_noder|  rt   )Mrí   r;  r  r  Újoint_module_opsÚops_ignoredÚer  r  r  rI   Ú
ban_reasonÚis_non_tensor_nodeÚweightÚcannot_save_reasonrš  r%  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderr6  rù  Ú	cut_valueÚ	partitionÚunbounded_excÚstructured_tracing_enabledÚfx_graph_filer   ÚfÚinf_pathÚnode_constraintsÚraw_path_nodesr6  Ú	from_nodeÚto_noder  ÚbaseÚ	from_baseÚto_baseÚconstraint_linesr4  ÚconstraintsÚcÚconstraints_strÚraw_path_strÚsvg_pathÚlocal_files_msgÚtlparse_msgÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outr0  r)  r  rñ  rô  r1  r)  rK   r  rú  rO  rQ  rI  rD  r  r÷  r;  rJ  sM    ```                                                         @@@@@@@@@@@@@@@@rJ   Úsolve_min_cutr�    sb  ÿÿú€ ð ÐÜ“<ˆÜ"Ó$€HåÜ%ñ &
à#×)Ñ)ô&
ó 
Ðð
 '¬ñ 4
Ø$×5Ñ5ô4
ó *
ñ 
ˆô 	�‰Ð9¸;ÔGóó(÷Að&Û÷÷9õvFð&$Øð&$Ø4Gð&$à	!ö&$ðP ˆr�z‰z‹|€HÜ(2«€L÷ñ ð@ ×!Ñ!ó YˆØ�7‰7�hÒØà�9×.Ñ.Ñ.à˜9×5Ñ5Ñ5Ø×!Ñ!Ø—I‘I Ñ&ØÜ!ŸX™XØXð	 "õ ð ×!Ñ!Ø—I‘I Ñ%ØÜ!ŸX™XØPð	 "ô ð ä˜$Ôð
 ×ÑØ—	‘	˜EÑ!ØÜŸ™ØDð	 ô ð ä�dÔÙ(¨¨~Õ>Ü  Ô&Ù(¨Ð/AÔBñ
 .¨dÓ3ˆ
Ø×#Ñ# DÔ)©jÙ(¨¨zÔ:ð ˜Ÿ™Ð"ÒE }¸D¿I¹IÐ'EòUà�t—y‘yÐ ÒS¬°D·I±I¸eÑ4DÄeÇlÁlÓ)SÐ%Sð 	ô �tÔÜœ=¨Ó.Ó/ˆFØ!%ÑÙô Ø—	‘	—‘˜eÓ$¤}Ô6FÐ&Gôä Ô%Ø�Ø%)Ñ"äŸ™�Ø%8Ñ"á)8Ø�i×;Ñ;ó*Ñ&ˆFÐ&ñ
  6¬T¯X©XÒ#5¸Ä7Ò9JØ×ÑØ—	‘	˜EÑ!Ø—	‘	˜FÑ"ØØ&Ð'9Ð&:Ð;ð	 õ ð ×Ñ˜dŸi™i¨%Ñ/°·±¸VÑ1CÈfÐÔUà—J‘Jò 	ˆDØ×ÑØ—	‘	˜FÑ"Ø—	‘	˜EÑ!ÜŸ™Ø(ð	 õ ò	ðgYöXð4 ×,Ó,Ø"×4Ñ4ó 	;ˆIð &ŸO™OöàØ×+Ñ+¨DÔ1ð ×&Ñ& tÕ,ðˆFð ð "+§¡öØ°I×4LÑ4LÈTÕ4R’ðˆHð ô �6‹{˜Q‹Ù&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ó2ò ;�Dà!×0Ñ0°Õ6Ø%×2Ñ2°4Ó8Ð;NÓNÙ& y°$Õ7à <Ñ/Ø$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÕ:ò!;ð	;ðP ×1Ó1Ü'1£|ˆØ%×+Ñ+ó !	VˆJØ×+Ñ+¨JÔ7Øà×'Ñ'¨
Ó3°ZÐ@ð2ˆGð $×0Ñ0°Ó<ˆKÜ�g“, Ó"ÜŸ™ wÓ/‘��3Ø˜'‘>ØØ—‘˜CÔ ð ×*Ñ*¨3Ó/°+ÀÑ2CÒCÜ˜G›¨Ò)ä—H‘HØ.ØØ"Ø!×.Ñ.¨sÓ3Ø!×.Ñ.¨zÓ:ôñ 1°Ô5ØàŸI™Iò V�Dà!×0Ñ0°Õ6Ù& s¨DÕ1Ø ¨Ò4äŸ™ w°×1GÑ1GÈÓ1MÈtÐ0TÕUðVô) �g“, Õ"ð!	VðFbØ-˜rŸ~™~¨h¸À&ÓIÑˆ	�9ðF  )Ñ€Iˆ}Ü*4«,€FÛ8¨iÔ8ò B‰ˆˆ4Ø�‰ÔA dÔAÕAðBô ",£€IØ#ò !Ñˆ�Ø�3�Bˆ<˜8 C R˜=Ò(Ü Ø ¨¨ ˜~Ð-?ÀÈÈ"À¸ÐOóð ð ˜C˜R�Lˆ	Ø�‰�iÕ ð!ô $ KÓ0€Lä+4°[×5FÑ5FÓ+G×H™i˜c 4��c‘	ÓH€HÜÛ2¨	Ô2Ó8Mô€Lð ˜Ð%Ð%øôW ò ÜØOó
àð	ûðüòN	ùò
øðR ×Ñó Vä%)¬)×*<Ñ*<Ó%=Ð"ð %)ˆØ#'ˆØ"×0Ñ0ˆð	6ñ
  ð ×+Ñ+Ø!&°tÈDð ,ô ô ˜Ó%ð ô Øñó 0õô -Ð-CÀVÓLˆMÜ�m SÓ)ð &¨QØ—‘˜Ô%÷&÷ &ñ &üäò 	6Ø0°°°1Ð5�Mûð	6úð Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÓTˆÜØñó -õ	
ô 0°Ó9ˆÚð 68ÐØ&˜ZˆNó!ð /7ò Ñ*�	˜7 FØ×%Ñ% gÔ.ð  Ò(Ù(¨Ó1�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHØ Ò&Ù(¨Ó3�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHÙ" 9Ó-±¸wÓ1GÒGá(¨Ó3�DØ$×/Ñ/°°bÓ9×@Ñ@ÀÕHñ !.¨iÓ 8�IÙ+¨GÓ4�GØ$×/Ñ/°¸Ó<×CÑCØ% i [Ð1õð%ð. +-ÐØ*:×*@Ñ*@Ó*Bò :Ñ&�	˜;Ø ×'Ñ'¨"¨Y¨K°qÐ(9Ô:Ø$ò :�AØ$×+Ñ+¨f°Q°C¨LÕ9ñ:ð:ð
 #Ÿi™iÐ(8Ó9ˆOØ!Ÿ;™; ~Ó6ˆLô %<¸HÓ$EÑ!ˆH�kÙÜ Øñ!ó  3õñ 8E�/ - °Ñ3È"ð ñ ØÐ%BÀ8À*ÈBÐ#OÑO�ð ˆKÙ)ðað ô
 ð4ð #Ð#ð $)ð *6¨°bØ"Ð#Ø�-ð!óð !ð!ô" 	�‰Ð@ÔAÜ�‰ØÜÜTóô	
ô 	  Ô)ØûÜò 	Ü�‰Ð@ÔAÜ�‰ØÜÜTóô	
ô 	  Ô)Øð	üó6 Is�   Â] Ï+)]/Ð$]4Ð;]4Ù!]9 Ü$k Ý	],Ý]'Ý'],Ý9kÞ	)jÞ3A`&ß>`à	`&à`"	à`&à%jà&	`?à/`:à5jà:`?à?IjêAkc                ó   — t        dg«      }t        dg fg«      }|r²|j                  «       \  }}| j                  |«      D ]ˆ  }||v rŒ| |   |   }|j	                  dd«      }|t
        j                  k(  s
|t        k(  sŒ?|j	                  dd«      }|||f}	||	gz   }
|dk(  r|
c S |j                  |«       |j                  ||
f«       ŒŠ |rŒ²y)zºBFS from source to sink following only infinite-capacity edges.

    Returns a list of (from_node, to_node, reason) tuples representing the path,
    or None if no such path exists.
    rÉ   r  r   r  Úunknownr  N)
r$   r   ÚpopleftÚ
successorsr�   ru  rv  r  rã  ré   )r  ro  ÚqueuerI   Ú	edge_pathÚneighborÚ	edge_datar  r  Únew_edgeÚnew_paths              rJ   r`  r`  ‹
  sè   € ô ˜(˜Ó$€Gô <AÀ8ÈRÀ.ÐAQÓ;R€Eá
ØŸ-™-›/‰ˆˆiØ ×+Ñ+¨DÓ1ò 	3ˆHØ˜7Ñ"ØØ  ™ xÑ0ˆIØ —}‘} Z°Ó3ˆHàœ4Ÿ8™8Ò# x´7Ó':Ø"Ÿ™ x°Ó;�Ø  (¨FÐ3�Ø$¨ zÑ1�Ø˜vÒ%Ø#’OØ—‘˜HÔ%Ø—‘˜h¨Ð1Õ2ð	3ò ð  rL   c                ó
  — | › |› �}t         j                  j                  |«      s|S d}t         j                  j                  | › d|› |› �«      r,|dz  }t         j                  j                  | › d|› |› �«      rŒ,| › d|› |› �S )zžGet a unique file path, appending a counter if the file already exists.

    For example, if "min_cut_failed.svg" exists, returns "min_cut_failed_1.svg".
    r&   r6  )ÚosÚpathÚexists)Ú	base_nameÚ	extensionrœ  Úcounters       rJ   r\  r\  ¬
  sŠ   € ð
 ˆ[˜˜Ð$€DÜ�7‰7�>‰>˜$ÔØˆà€GÜ
�'‰'�.‰.˜I˜; a¨ y°°Ð<Ô
=Ø�1‰ˆô �'‰'�.‰.˜I˜; a¨ y°°Ð<Õ
=àˆ[˜˜'˜ 9 +Ð.Ð.rL   c                óŽ  — ddl }	 ddl}|j
                  j                  | «      j                  «       }|j                  |«      d   }|j                  «       D ]c  }| |j                  «          |j                  «          d   }|j                  t        |«      «       |t        d«      k(  sŒS|j                  d	«       Œe |j!                  «       j#                  d
«      }t%        dd«      }t'        |d«      5 }	|	j)                  |«       ddd«       ||fS # t        $ r t        j	                  dd¬«       Y yw xY w# 1 sw Y   ||fS xY w)z†Visualize the min-cut graph to an SVG file.

    Returns (path_to_svg, svg_content) tuple. Both are None if pydot is unavailable.
    r   NzMInstall pydot to visualize the min-cut graph for debugging: pip install pydotT)Úexc_info)NNr  rv  Úredúutf-8Úmin_cut_failedú.svgr+  )rT  ÚpydotrU  r=   rs  Únx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelr°   rW  Ú	set_colorÚ
create_svgÚdecoder\  r]  r^  )
r  rD  r§  Ú
dot_formatÚ	dot_graphÚedgeri  r;  r†  rx  s
             rJ   rb  rb  »
  s@  € ó ðÛð —‘×%Ñ% hÓ/×9Ñ9Ó;€JØ×)Ñ)¨*Ó5°aÑ8€IØ×#Ñ#Ó%ò "ˆØ˜$Ÿ/™/Ó+Ñ,¨T×-AÑ-AÓ-CÑDÀZÑPˆà�‰”s˜6“{Ô#à”U˜5“\Ó!Ø�N‰N˜5Õ!ð"ð ×&Ñ&Ó(×/Ñ/°Ó8€Kô  Ð 0°&Ó9€HÜ	ˆh˜Ó	ð  Ø	�‰�Ô÷ð �[Ð Ð øô3 ò Ü�‰Ø[Øð 	ô 	
ñ ðú÷,ð �[Ð Ð ús   †D Ã4D8Ä D5Ä4D5Ä8Ec                 óx  — g t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j
                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                   ‘t         j"                  ‘t         j$                  ‘t         j&                  ‘t         j(                  ‘t         j*                  ‘t         j,                  ‘t         j.                  ‘t         j0                  ‘t         j2                  ‘t         j4                  ‘t         j6                  ‘t         j8                  ‘t         j:                  ‘t         j<                  ‘t         j>                  ‘t         j@                  ‘t         jB                  ‘t         jD                  ‘t         jF                  ‘t         jH                  ‘t         jJ                  ‘t         jL                  ‘t         jN                  ‘t         jP                  ‘t         jR                  ‘t         jT                  ‘t         jV                  ‘t         jX                  ‘t         jZ                  ‘t         j\                  ‘t         j^                  ‘t         j`                  ‘t         jb                  ‘t         jd                  ‘t         jf                  ‘t         jh                  ‘t         jj                  ‘t         jl                  ‘t         jn                  ‘t         jp                  ‘t         jr                  ‘t         jt                  ‘t         jv                  ‘t         jx                  ‘t         jz                  ‘t         j|                  ‘t         j~                  ‘t         j€                  ‘t         j‚                  ‘t         j„                  ‘t         j†                  ‘t         jˆ                  ‘t         jŠ                  ‘t         jŒ                  ‘tŽ        j�                  ‘t         j’                  ‘t         j”                  ‘t         j–                  ‘t         j˜                  ‘} t         j’                  t         j”                  t         jš                  g}|t         jœ                  t         jž                  t         j                   t¢        j¤                  t         j¦                  t         j¨                  t         jª                  t         j¬                  t         j®                  g	z  }|}| g t¢        j                  ‘t¢        j°                  ‘t         j²                  ‘t         j˜                  ‘t         j´                  ‘t¢        j¶                  ‘t¢        j€                  ‘t         j¶                  ‘t         j¸                  ‘t¢        j¤                  ‘t         j¬                  ‘t         jº                  ‘t         jœ                  ‘t         j¦                  ‘t         jž                  ‘t         j¼                  ‘t         j¾                  ‘t         jÀ                  ‘t         jÂ                  ‘t         jÄ                  ‘t         jÆ                  ‘t         jÈ                  ‘t         jÊ                  ‘t         jÌ                  ‘t         jÎ                  ‘t         jÐ                  ‘t         jÒ                  ‘t         j¨                  ‘t         jÔ                  ‘t         jÖ                  ‘t         jØ                  ‘t         jÚ                  ‘t         jÜ                  ‘t¢        jÞ                  ‘t¢        jà                  ‘z  } | t         jâ                  t         jä                  gz  } | |z  } | tç        «       z  } | t         jè                  gz  } | tê        D �cg c]  }tí        |«      ‘Œ c}z  } tï        | «      }tï        tð        dtò        f      t         jô                  t         jö                  t         jø                  g«      }t         jú                  t         jü                  t         jþ                  t         �j                   t         �j                  t         �j                  t         �j                  t         �j                  t         �j
                  t         �j                  t         �j                  g}||z  }�t        |tï        |«      |tï        |«      |«      S c c}w )N.)‰rÅ   rã  r¿  r‘  Úatan2r@  rC  rD  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltr9  Úbitwise_notÚceilÚfloorÚfracÚnegÚreluÚroundÚsiluÚtruncr=   Úlog10Úlog1pÚlog2ÚlgammaÚexpÚexpm1ÚerfÚerfcÚcosÚacosÚcoshÚsinÚasinÚsinhÚtanÚatanÚtanhÚatanhÚsqrtÚrsqrtr?  ÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardrO  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizer:  ÚtoÚtype_asr¹   rº   ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasrÆ   ÚsliceÚtr;  Úbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectre  r<  ÚcloneÚ	full_likeÚvarÚstdÚ_unsafe_viewrÈ   Úbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosrþ  ÚarangeÚtriuÚvar_meanÚisinfrã   ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ'_low_memory_max_pool_offsets_to_indicesr‚  Úgatherrc  Ú
zeros_liker   r   r$   r   r	   Únative_dropoutÚ	rand_likeÚ
randn_likeÚmmÚconvolutionÚconvolution_backwardÚbmmÚaddmmÚ#_scaled_dot_product_flash_attentionÚ'_scaled_dot_product_efficient_attentionÚ_flash_attention_forwardÚ_efficient_attention_forwardÚupsample_bilinear2dÚ
_scaled_mmr?   )Údefault_recomputable_opsÚrecomputable_view_opsrC   ÚmrD   rB   rA   r@   s           rJ   rS  rS  â
  s’  € ðL:Ü�‰ðL:ä�‰ðL:ô 	�‰ðL:ô 	�
‰
ð	L:ô
 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�	‰	ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô 	�‰ðL:ô  	�‰ð!L:ô" 	�‰ð#L:ô$ 	�‰ð%L:ô& 	�‰ð'L:ô( 	�‰ð)L:ô* 	�‰ð+L:ô, 	�‰ð-L:ô. 	×Ñð/L:ô0 	�	‰	ð1L:ô2 	�
‰
ð3L:ô4 	�	‰	ð5L:ô6 	�‰ð7L:ô8 	�	‰	ð9L:ô: 	�
‰
ð;L:ô< 	�	‰	ð=L:ô> 	�
‰
ð?L:ô@ 	�‰ðAL:ôB 	�
‰
ðCL:ôD 	�
‰
ðEL:ôF 	�	‰	ðGL:ôH 	�‰ðIL:ôJ 	�‰ðKL:ôL 	�
‰
ðML:ôN 	�‰ðOL:ôP 	�	‰	ðQL:ôR 	�‰ðSL:ôT 	�	‰	ðUL:ôV 	�	‰	ðWL:ôX 	�‰ðYL:ôZ 	�	‰	ð[L:ô\ 	�	‰	ð]L:ô^ 	�‰ð_L:ô` 	�	‰	ðaL:ôb 	�	‰	ðcL:ôd 	�
‰
ðeL:ôf 	�	‰	ðgL:ôh 	�
‰
ðiL:ôj 	�‰ðkL:ôl 	�‰ðmL:ôn 	�‰ðoL:ôp 	�‰ðqL:ôr 	×ÑðsL:ôt 	�
‰
ðuL:ôv 	�
‰
ðwL:ôx 	�	‰	ðyL:ôz 	�‰ð{L:ô| 	�	‰	ð}L:ô~ 	×ÑðL:ô@ 	�‰ðAL:ôB 	�	‰	ðCL:ôD 	×ÑðEL:ôF 	×ÑðGL:ôH 	�	‰	ðIL:ôJ 	�‰ðKL:ôL 	�‰ðML:ôN 	×ÑðOL:ôP 	�‰ðQL:ôR 	�‰ðSL:ôT 	�	‰	ðUL:ôV 	�‰ðWL:ÐôZ "Ÿ\™\¬4¯>©>¼4¿:¹:ÐFÐØÜ�	‰	Ü�
‰
Ü�‰Ü×ÑÜ�‰Ü�‰Ü�‰Ü�‰Ü�
‰
ð
ñ 
Ðð %€HØð $!Ü�	‰	ð$!ä×"Ñ"ð$!ô 	�
‰
ð$!ô 	�‰ð	$!ô
 	�‰ð$!ô 	�	‰	ð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�
‰
ð$!ô  	�‰ð!$!ô" 	×Ñð#$!ô$ 	×Ñð%$!ô& 	�	‰	ð'$!ô( 	�‰ð)$!ô* 	×Ñð+$!ô, 	�‰ð-$!ô. 	�	‰	ð/$!ô0 	�‰ð1$!ô2 	�
‰
ð3$!ô4 	�‰ð5$!ô6 	�	‰	ð7$!ô8 	�‰ð9$!ô: 	�
‰
ð;$!ô< 	�
‰
ð=$!ô> 	�‰ð?$!ô@ 	�‰ðA$!ôB 	�‰ðC$!ôD 	�
‰
ðE$!ôF 	×5Ñ5ðG$!ñ $ÐðL ¤§¡¬T¯[©[Ð 9Ñ9ÐØ Ñ(Ðà¤£Ñ/ÐàÜ�‰ð!ñ Ðð ÄÖ N¸1Ô!3°AÕ!6Ò NÑNÐÜ!Ð":Ó;ÐäœH S¬# XÑ.Ñ/Ü	×	Ñ	œdŸn™n¬d¯o©oÐ>ó€Jô 	�‰Ü×ÑÜ×!Ñ!Ü�ŠÜ�
Š
Ü×0Ò0Ü×4Ò4Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð # ZÑ/€KÝØÜÐ(Ó)ØÜ�8ÓØóð ùò+ !Os   ß7d7c                óJ   — i }| j                   D ]  }|||j                  <   Œ |S rF   )r—   rÝ   )r–   rO  rI   s      rJ   rc  rc  Š  s.   € Ø')€LØ—‘ò 'ˆØ"&ˆ�T—Y‘YÒð'àÐrL   c                óÔ  — t         j                  }|dk(  rt        |||«      S |dk(  rt        |||«      S |dk(  rt	        |||«      S |dk(  rt        |||«      S |dk(  rZt        j                  d«       t        j                  | |||¬«      }t	        ||t        |¬«      j                  t        |¬	«      «      S t        |t        «      r ||| |||«      \  }}	d
||	fS t        d|› �«      ‚)NÚgreedyÚilpÚdpr)   Údynamic_memory_budget_dpz”dynamic_memory_budget_dp is an experimental solver. It does not guarantee performance improvements. Additionally, it is not guaranteed to be stable.)rí   Úall_recomputable_banned_nodesÚ recorded_knapsack_input_memoriesÚ recorded_knapsack_input_runtimes)Úgraph_info_provider)Úknapsack_algoÚmax_mem_budgetr  z,Not aware of memory budget knapsack solver: )r   Úactivation_memory_budget_solverr*   r+   r(   r)   r=   Úwarningr'   Úinialize_from_graphr,   Úget_knee_point_memory_budgetr¦   r   ræ   )
rí   ÚmemoryÚruntimesÚ
max_memoryr;  r,  ÚSOLVERr/  Úsaved_node_idxÚrecomp_node_idxs
             rJ   Ú#_optimize_runtime_with_given_memoryr<  ‘  s#  € ô ×3Ñ3€FØ�ÒÜ˜v x°Ó<Ð<Ø	�5ŠÜ˜F H¨jÓ9Ð9Ø	�4ŠÜ˜6 8¨ZÓ8Ð8Ø	Ð3Ò	3Ü-¨f°hÀ
ÓKÐKØ	Ð-Ò	-Ü�‰ð?ô	
ô
 0×CÑCØ#Ø*GØ-3Ø-5ô	
Ðô ØØÜØ$7ôç*Ñ*Ü)Ø)ð +ó ó	
ð 		
ô 
�FÔ0Ô	1Ù*0Ø�K ¨YÐ8Uó+
Ñ'ˆ˜ð �^ _Ð5Ð5äÐIÈ&ÈÐRÓSÐSrL   ©Úno_dispatchc                óä   ‡— t        | j                  «      }dˆfd„}|D �cg c]
  } ||«      ‘Œ }}| j                  «       D �cg c]
  } ||«      ‘Œ }}| j                  ||¬«      S c c}w c c}w )Nc                ó   •— t        | ‰¬«      S )NrF  )r    )ÚdrG  s    €rJ   Úrealize_symbolz8_remove_symbols_without_guarding.<locals>.realize_symbolÈ  s   ø€ Ü  ¨XÔ6Ð6rL   )Ústride)rA  ztorch.SymInt | intrW   rƒ   )r’  ÚshaperC  Únew_empty_strided)rÔ   rG  rD  rB  rÝ  rC  s    `    rJ   Ú _remove_symbols_without_guardingrF  Å  sk   ø€ Ü�—‘‹M€Eõ7ð ).Ö. 1‰^˜AÕÐ.€EÐ.Ø)*¯©«Ö4 A‰n˜QÕÐ4€FÐ4Ø×Ñ˜u¨VÐÓ4Ð4ùò /ùÚ4s   ¡A(ÁA-c                óx  ‡ ‡‡	— t         j                  }dd„}|dk(  ry|dk(  rat        «       5  ddlm} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	|j                  ˆˆ	ˆ fd„«      }|cd d d «       S |dk(  rudd	l
m} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	 |d
¬«      5 } ‰ j                  ‰i ‰	¤Ž d d d «       j                  «       }t        |d«      S t        |t         «      r |‰ «      S t#        d|› �«      ‚# 1 sw Y   y xY w# 1 sw Y   ŒWxY w)Nc                óz  — t        | t        j                  «      rAt        | j                  d   t        j
                  «      rt        | j                  d   d¬«      S t        | t        j                  «      rAt        | j                  d   t        j                  «      rt        | j                  d   d¬«      S t        | t        j                  «      r(t        | j                  d   t        j                  «      ryt        | t        j                  «      r(t        | j                  d   t        j                  «      ry| S )Nr¤   rE  rF  ç      ð?T)r¦   r¼   r½   r�   rŸ   rA  rF  r§   r    r©   r¨   rH  s    rJ   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argÓ  sÃ   € Ü�aœŸ™Ô!¤j°·±¸±ÄÇÁÔ&MÜ3°A·F±F¸5±MÈDÔQÐQÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç,Á,Ô(OÜ$ Q§V¡V¨E¡]¸TÔBÐBÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç.Á.Ô(QØÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç-Á-Ô(PØàˆHrL   Útestingr&   Úprofiler   )Úbenchmarkerc                 ó(   •—  ‰j                   ‰ i ‰¤ŽS rF   )rž   )r»   r¸   rI   s   €€€rJ   rq   z"estimate_runtime.<locals>.<lambda>è  s   ø€ °;°4·;±;ÀÐ3OÈÑ3O€ rL   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )rÔ   r	   rW   r	   )r   Ú*activation_memory_budget_runtime_estimatorr>  Ú$torch._inductor.runtime.benchmarkingrM  rá   Útree_mapr»   r¸   Úbenchmark_gpuÚtorch.utils.flop_counterrP  rž   Úget_total_flopsrC  r¦   r   ræ   )
rI   ÚRUNTIME_MODErJ  rM  ÚmsrP  ÚmodeÚcounted_flopsr»   r¸   s
   `       @@rJ   Úestimate_runtimer\  Ð  s'  ú€ Ü×DÑD€Ló
ð �yÒ Øà	˜Ò	"Ü‹]ñ 	ÝHä!Ÿ?™?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&à×*Ñ*Õ+OÓPˆBØ÷	ñ 	ð 
˜Ò	 å<ä—‘ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ UÔ+ð 	)¨tàˆD�K‰K˜Ð( Ò(÷	)ð ×,Ñ,Ó.ˆÜ�= !Ó$Ð$ä	�LÔ"8Ô	9Ù˜DÓ!Ð!ô Ð=¸l¸^ÐLÓMÐM÷/	ð 	ú÷	)ð 	)ús   ­AD$ÃD0Ä$D-Ä0D9c                óª
  ‡ ‡‡‡ ‡!‡"‡#‡$‡%‡&‡'‡(‡)‡*— |dkD  s|dk  rt        d|› �«      ‚t        t        j                  t        j                  t        j
                  t        j                  t        j                  ¬«      }t        j                  rt        |dddd¬«      }|dk(  r‰j                  S t        ‰ ‰|«      \  }}|dk(  r|S d-d„Š! ‰!‰j                  «      Š( ‰!|«      Š&‰&‰(k  r|S d.ˆ&ˆ(fd„}d/ˆ!ˆ&ˆ(fd	„Š"t        |ddd¬
«      }t        ‰ ‰|«      \  }} ‰"|«      |k  r|S t        |d¬«      Št        ‰ ‰‰«      \  }	}
 ‰"|	«      |k  r|	S ddlmŠ# t        ˆ#fd„‰j                  D «       «      Š%	 	 	 	 d0ˆ#ˆ%fd„} ||
«      }|D �cg c]1  }|j                  j!                  dd«      t"        j$                  k(  r|‘Œ3 }}|D �cg c]	  }||vsŒ|‘Œ }}t'        |t(        d¬«      Š t+        ‰ «      dk(  r‰j                  |z   S ‰ D �cg c]  } |t)        |«      «      ‘Œ c}Š'‰ D �cg c]  }t-        |«      ‘Œ c}Š*ddlmŠ) 	 	 	 	 	 	 	 	 d1ˆˆ ˆ'ˆ)ˆ*fd„Š$t        j2                  �rÃd2ˆ"ˆ$ˆ ˆˆ*fd„} |d«       |d«      g}|d   dd  |d   dd  k7  r¤|d   |d   fg}|r—|j5                  «       \  }}|d   |d   z
  dk  r#|j7                  |«       |j7                  |«       ŒF ||d   |d   z   dz  «      }|dd  |dd  k7  r|j7                  ||f«       |dd  |dd  k7  r|j7                  ||f«       |rŒ—|j9                  «        dd lm} |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}|j?                  d¬«       |jA                  ||d¬«       tC        |«      D ]"  \  }}|jE                  |d›|||   fddd ¬!«       Œ$ |jG                  d"«       |jI                  d#«       |jK                  d$«       |jM                  d«       |jO                  «       }|jQ                  «        tS        jT                  «       }t        jV                  �'t        jV                  }tS        jX                  |d¬%«       d&}tZ        j\                  j_                  «       r?tZ        j\                  ja                  «       r!d'tZ        j\                  jc                  «       › �}tR        jd                  jg                  |d(|› d)ti        «       › d*�«      }|jk                  |«       tl        jo                  d+|«        ‰$|‰‰ ¬,«      d   S c c}w c c}w c c}w c c}w c c}w c c}w )3Nr&   r   zJThe valid ranges for memory budget are 0 <= m <= 1. The provided value is )rˆ   r‰   rŠ   r‹   rŒ   F)rˆ   r‰   rŠ   r‹   c                ó:   — t        t        t        | «      «      dz  S ©Nç    eÍÍA)rO  ÚmaprQ  )r)  s    rJ   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_size"  s   € Ü”3”x Ó.Ó/°#Ñ5Ð5rL   c                ó   •— | dz  ‰‰z
  z  S r_  r]   )ÚszÚmax_act_sizeÚmin_act_sizes    €€rJ   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_size+  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9rL   c                ó&   •—  ‰| «      ‰z
  ‰‰z
  z  S rF   r]   )Úactivationsrb  re  rf  s    €€€rJ   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratio.  s"   ø€ Ù)¨+Ó6¸ÑEØ˜<Ñ'ñ
ð 	
rL   )rˆ   r‰   rŠ   )r‹   )Úget_node_storagec              3  ó.   •K  — | ]  } ‰|«      –— Œ y ­wrF   r]   )rm   rI   rk  s     €rJ   ro   z*choose_saved_values_set.<locals>.<genexpr>L  s   øè ø€ ÒT¸4Ñ 0°× 6ÑTùrK  c                óˆ   •— | D �cg c]1  }|j                   t        d«      k  r ‰|«      ‰vst        |«      r|‘Œ3 c}S c c}w r_  )r   rƒ   rü   )r  r1  rk  Úinput_storagess     €€rJ   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodesN  sL   ø€ ð
 "ö
àð —‘¤ S£Ò)á$ QÓ'¨~Ñ=Ü0°Ô3ò ò
ð 	
ùò 
s   †6?rŽ   TrT  r=  c                ó°  •—  ‰«       5  t        |‰‰t        | d«      |‰«      \  }}}d d d «       t        «       }D ]  }	 |j                  ‰|   «       Œ |j                  ‰«      st        d«      ‚t        ||‰|«      \  }}	t        r+t        |‰|‰D �
cg c]  }
t        |
«      ‘Œ c}
‰‰|¬«	       |fS # 1 sw Y   Œ‘xY w# t        $ r Y Œ“w xY wc c}
w )Nr   z:dont_ban must be a subset of all_recomputable_banned_nodes)	rí   r,  Úsaved_node_idxsÚrecomputable_node_idxsÚexpected_runtimeÚmemories_banned_nodesÚ normalized_memories_banned_nodesÚruntimes_banned_nodesÚmin_cut_saved_values)r<  rC  r$   rã  ÚBaseExceptionÚissubsetr€   r�  r<   r   rQ  )Úmemory_budgetr;  rí   rs  rq  rr  r  r0  r)  r6  r1  Úaggressive_optionsr,  rt  r>  rv  s              €€€€€rJ   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsacky  s!  ø€ ñ ‹]ñ 	ô
 4ØØ%Ø%Ü�M 1Ó%ØØ-óñ	Ø ØØ&÷		ô )3«ˆØ)ò 	ˆCðØ—‘Ð:¸3Ñ?Õ@ð	ð × Ñ Ð!>Ô?Ü ØLóð ô (ØØØØó	
‰ˆ�aõ !Ü4Ø'Ø.KØ /Ø'=Ø!1à)Fö'Ø$%”H˜Q•Kò'ð 2GØ&;Ø%1õð Ð-Ð-Ð-÷]	ð 	ûô$ !ò Ùðüò*'s#   ‰B8Á CÂCÂ8CÃ	CÃCc                óN   •—  ‰| ‰‰¬«      \  }}| t        ‰«      |z
   ‰|«      fS )N)r;  rí   )rO  )rî  r)  rs  rj  r|  rí   r;  rv  s      €€€€€rJ   Úestimate_for_budgetz4choose_saved_values_set.<locals>.estimate_for_budget®  s@   ø€ Ù-FØ˜Y°Kô.Ñ*ˆLÐ*ð ÜÐ)Ó*Ð-=Ñ=Ù˜lÓ+ðð rL   r  rI  gü©ñÒMbP?r
  )é
   é   )ÚfigsizeÚo)Úmarkerz.4fzoffset points)r   r  Úcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation Runtime)Úexist_okr‰  Ú_rank_Úmemory_budget_paretor6  r¦  z%Generated Pareto frontier curve at %s)rz  r;  rí   )r)  r`   rW   rW  )rd  rW  rW   rW  )ri  r`   rW   rW  )r  rb   rW   r`   )rz  rW  r;  r_   rí   úfx.GraphrW   ztuple[list[fx.Node], float])rî  rW  rW   ztuple[float, float, float])8ræ   r‡   r   Úban_recompute_used_far_apartÚ!ban_recompute_long_fusible_chainsÚ#ban_recompute_materialized_backwardÚban_recompute_not_in_allowlistÚban_recompute_reductionsÚaggressive_recomputationr   ra   r�  Útorch._inductor.fx_utilsrk  r$   r�   r�   r%   r.  rt   rQ  rè   r\  Útorch.utils._mode_utilsr>  Úvisualize_memory_budget_paretor�  ré   ÚsortÚmatplotlib.pyplotÚpyplotÚfigureÚplotr|  ÚannotateÚxlabelÚylabelÚtitleÚgridÚgcfÚshowr›  ÚgetcwdÚmemory_budget_pareto_dirÚmakedirsrŸ   rà  rá  Úis_initializedÚget_rankrœ  r?  r2   Úsavefigr=   r3  )+rí   r;  rz  r  Úruntime_optimized_saved_valuesr6  rg  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesr  ro  Úrecomputable_banned_nodesr1  Úmust_save_nodesrI   r~  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltÚitemÚx_valuesÚy_valuesÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namer{  r,  rb  rj  rk  r|  rn  re  rt  rf  r>  rv  s+   ``                             @@@@@@@@@@@@rJ   Úchoose_saved_values_setr»  ý  sº  ÿý€ ð
 �qÒ˜M¨AÒ-ÜØXÐYfÐXgÐhó
ð 	
ô $Ü$×AÑAÜ#)×#KÑ#KÜ%+×%OÑ%OÜ &× EÑ EÜ×8Ñ8ô€Oô ×&Ò&Ü!ØØ"'Ø',Ø).Ø$)ô
ˆð ˜ÒØ×ÑÐä(5ØØØó)Ñ%Ð" Að ˜ÒØ-Ð-ó6ñ -¨Y×-=Ñ-=Ó>€LÙ,Ð-KÓL€Là�|Ò#Ø-Ð-ö:÷
ô
 &ØØ#Ø#(Ø%*ô	Ðô '4Ø�YÐ 7ó'Ñ#Ð  !ñ Ð1Ó2°]ÒBØ+Ð+ä ØØ %ôÐô ;HØ�YÐ 2ó;Ñ7Ð)¨<ñ Ð:Ó;¸mÒKØ4Ð4å9äÓTÀ9×CSÑCSÔTÓT€Nð
Ø)ð
à	ö
ñ  !>¸lÓ KÐð +öàØ�6‰6�:‰:�k 5Ó)Ô-=×-GÑ-GÒGò 	
ð€Oð ð -ö!Ø°¸Ò0HŠð!Ðð !ô %+Ø!¤x¸ô%Ð!ô Ð(Ó)¨QÒ.Ø×Ñ /Ñ1Ð1à2OöØ-.ÑœH Q›KÕ(òÐð ,IöØ#'Ô˜ÕòÐõ 4ð1.Øð1.Ø)1ð1.Ø@Hð1.à	$÷1.ñ 1.ôf ×,Ó,÷	ñ 	ñ ' sÓ+Ñ-@ÀÓ-EÐFˆà�1‰:�a�bˆ>˜W Q™Z¨¨˜^Ò+Ø ™
 G¨A¡JÐ/Ð0ˆGÙØ"Ÿ;™;›=‘��SØ�q‘6˜C ™F‘? TÒ)Ø—N‘N 3Ô'Ø—N‘N 3Ô'ØÙ)¨3¨q©6°C¸±F©?¸aÑ*?Ó@�Ø�q�r�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.Ø�q�r�7˜c ! "˜gÒ%Ø—N‘N C¨ :Ô.ò ð 	�‰Œå'à(/Ö0 �D˜“GÐ0ˆÐ0Ø(/Ö0 �D˜“GÐ0ˆÐ0ð 	�
‰
˜7ˆ
Ô#Ø�‰�˜8¨CˆÔ0ô   Ó)ò 	‰FˆAˆsØ�L‰LØ�s�)Ø�h˜q‘kÐ"Ø*ØØð õ ð	ð 	�
‰
�?Ô#Ø�
‰
Ð5Ô6Ø�	‰	ÐNÔOØ�‰�ŒØ�g‰g‹iˆØ�‰Œ
Ü—)‘)“+ˆÜ×*Ñ*Ð6Ü×5Ñ5ˆGÜ�K‰K˜¨$Õ/ØˆÜ×Ñ×)Ñ)Ô+´×0AÑ0A×0PÑ0PÔ0RØ"¤5×#4Ñ#4×#=Ñ#=Ó#?Ð"@ÐAˆKÜ—7‘7—<‘<ØÐ+¨K¨=¸Ô:LÓ:NÐ9OÈtÐTó
ˆð 	�‰�HÔÜ�‰Ð;¸XÔFñ %Ø#¨yÀkôàñ	ð 	ùòmùò
!ùòùòùòn 1ùÚ0s*   Æ
6T7Ç	T<ÇT<È	UÈ(UÍUÍ!Uc                óˆ  ‡‡— ddl mŠ dd„}dˆfd„}t        j                  j	                  «       �rct        j                  j                  «       �rDt        j                  j                  «       dkD  �r" || «      �r || «      �rt        «       5   ‰«       5  |D �cg c]  }|j                  ‘Œ c}g}t        t        j                  j                  «       «      D �cg c]  }g ‘Œ }}t        j                  j                  ||d   «       t        | «      }g }	i }
t        |«      D ]w  \  }}|D �cg c]  }||   ‘Œ	 }}d}|D ]C  }t        |«      }||z  }|t        j                  j                  «       k(  sŒ5||
|j                  <   ŒE ||
d<   |	j                  |«       Œy t        j                   |	t        j                  j"                  j%                  «       ¬«      }t        j                  j'                  |t        j                  j"                  j(                  j*                  ¬«       t-        t        j.                  |«      j1                  «       «      }d	|› d
|
› �Št3        dd„ ˆfd„¬«       ||   D �cg c]  }||   ‘Œ	 }}d d d «       d d d «       |S |S c c}w c c}w c c}w c c}w # 1 sw Y   Œ)xY w# 1 sw Y   |S xY w)Nr   )Úunset_fake_temporarilyc                ó¸   — | j                   D ]K  }t        |j                  t        j                  j
                  «      sŒ2|j                  j                  dv sŒK y y)N>   Úc10d_functionalr³   TF)r—   r¦   rž   rŸ   rý   rþ   r²   )rí   rI   s     rJ   Úhas_collectivesz3_sync_decision_cross_ranks.<locals>.has_collectives   sM   € Ø×%Ñ%ò 	ˆDÜØ—‘œUŸZ™Z×2Ñ2õà—+‘+×'Ñ'Ð+RÒRÙð		ð
 rL   c                ó   •‡— dj                  d„ | j                  D «       «      }t        j                  |j	                  d«      «      j                  «       }t        t        j                  j                  «       «      D �cg c]  }d ‘Œ c}Št        «       5   ‰«       5  t        j                  j                  ‰|«       d d d «       d d d «       t        ˆfd„‰D «       «      S c c}w # 1 sw Y   Œ*xY w# 1 sw Y   Œ.xY w)Nú/c              3  ó4   K  — | ]  }|j                   –— Œ y ­wrF   r‹  )rm   rÔ   s     rJ   ro   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>  s   è ø€ Ò> q˜AŸF�FÑ>ùr  r¤  c              3  ó.   •K  — | ]  }‰d    |k(  –— Œ y­wrÚ  r]   )rm   rÔ   Ú
all_inputss     €rJ   ro   zE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>  s   øè ø€ Ò:¨!�:˜a‘= AÕ%Ñ:ùrK  )r?  r—   ÚhashlibÚsha256ÚencodeÚ	hexdigestr.  rŸ   rà  Úget_world_sizer>  Úall_gather_objectrâ  )rí   Únode_strra   r6  rÅ  r½  s       @€rJ   Úhas_same_nodesz2_sync_decision_cross_ranks.<locals>.has_same_nodes  sÏ   ù€ ð
 —8‘8Ñ>¨K×,=Ñ,=Ô>Ó>ˆÜ—‘ §¡°Ó 8Ó9×CÑCÓEˆÜ$)¬%×*;Ñ*;×*JÑ*JÓ*LÓ$MÖN˜q’dÒNˆ
Ü‹]ñ 	DÑ2Ó4ñ 	Dä×Ñ×/Ñ/°
¸FÔC÷	D÷ 	Dô Ó:¨zÔ:Ó:Ð:ùò	 O÷	Dð 	Dú÷ 	Dð 	Dús*   Â 	C#ÂC4Â!C(Â?C4Ã(C1	Ã-C4Ã4C=r&   z
total size)rŠ  r  zpicked_rank_idx=z, saved_nodes of current rank=r�  c                 ó   — dddœS )NÚ)aot_joint_graph_sync_decision_cross_ranksr   r¡  r]   r]   rL   rJ   rq   z,_sync_decision_cross_ranks.<locals>.<lambda>=  s   € ØGØ (ñ%€ rL   c                 ó   •— ‰ S rF   r]   )Úsync_decision_cross_ranks_strs   €rJ   rq   z,_sync_decision_cross_ranks.<locals>.<lambda>A  s   ø€ Ð#@€ rL   r¯  )rí   útorch.fx.GraphrW   r;   )Útorch._subclasses.fake_tensorr½  rŸ   rà  rá  r¤  rÊ  r>  rÝ   r.  rË  rc  r|  rQ  r¥  ré   r[  Údistributed_c10dÚ_get_object_coll_deviceÚ
all_reduceÚReduceOpÚMAXrƒ   Úargminr³  r   )rí   r)  rÀ  rÍ  rÔ   Úobjectsr6  Úsaved_ops_names_all_ranksrO  Úsaved_sizesÚsaved_ops_with_sizesr0  Úsaved_ops_namesÚop_nameÚsaved_nodesÚ
saved_sizerI   Úsize_of_nodeÚsaved_sizes_tensorÚpicked_rank_idxrn   rÑ  r½  s                        @@rJ   r0  r0  ú  s¶  ù€ õ Eóõ;ô 	×Ñ×&Ñ&Õ(Ü×Ñ×,Ñ,Õ.Ü×Ñ×,Ñ,Ó.°Ó2Ù˜KÕ(Ù˜;Õ'ä‹]ñ *	Ñ2Ó4ñ *	Ø(4Ö5 1˜Ÿ›Ò5Ð6ˆGä!¤%×"3Ñ"3×"BÑ"BÓ"DÓEö:Ø’ð:Ð%ð :ô ×Ñ×/Ñ/Ð0IÈ7ÐSTÉ:ÔVÜ+¨KÓ8ˆLØ%'ˆKØ35Ð ä(1Ð2KÓ(Lò 	/Ñ$��_ØDSÖT¸˜|¨GÓ4ÐT�ÐTØ�
Ø'ò G�DÜ#+¨D£>�LØ ,Ñ.�JØœe×/Ñ/×8Ñ8Ó:Ó:Ø:FÐ,¨T¯Y©YÒ7ð	Gð
 6@Ð$ \Ñ2Ø×"Ñ" :Õ.ð	/ô "'§¡ØÜ×(Ñ(×9Ñ9×QÑQÓSô"Ðô ×Ñ×(Ñ(Ø"¤u×'8Ñ'8×'IÑ'I×'RÑ'R×'VÑ'Vð )ô ô "¤%§,¡,Ð/AÓ"B×"GÑ"GÓ"IÓJˆOØ.>¸Ð>OÐOmð  oCð  nDð  -EÐ)ÜØñó Aõð *CÀ?Ñ)SöØ$%�˜Q“ðˆLð ÷Q*	÷ *	ðX Ðˆ<ÐùòW 6ùò:ùò Uùò:÷Q*	ð *	ú÷ *	ðX Ðúsb   ÂJ7ÂJ+ÂJÂ/-J+Ã	JÃ%A	J+Ä.J!
Ä::J+Å5D J+É5J&ÊJ+ÊJ7ÊJ+Ê+J4	Ê0J7Ê7Kc                óü  — d}|rdnd}t        t        | j                  j                  d¬«      «      «      }| j                  j                  dt        j
                  j                  j                  ¬«      D �]ä  }t        | |j                  d   j                  «      }t        |t        j                  «      sŒBg }|j                  j                  d¬«      D ]‰  }||j                  v sŒ| j                  j                  |«      5  | j                  j!                  |› d|› �«      }	|d	z  }|j"                  d
   |	j"                  d
<   |	}|j%                  |	«       ddd«       Œ‹ |sŒï| j                  j                  |«      5  | j                  j'                  dt        j
                  j                  j                  g |j                  ¢|¢­i «      }
|j)                  |
d¬«       ddd«       |j"                  j+                  d«      }|r8|\  }}g |¢|D �cg c]  }|j"                  d
   ‘Œ c}¢­}||f
j"                  d<   | j                  j-                  |«       �Œç | S # 1 sw Y   �Œ”xY w# 1 sw Y   Œ‹xY wc c}w )uõ  
    Graph-safe RNG lets torch.compile use CUDA Graphs for graphs with RNG ops.
    For graphs without HOPs, the partitioner adds placeholder nodes
    fwd_rng_state_* and bw_rng_state_* to the forward and backward graphs. At
    runtime, the AOTDispatcher retrieves these RNG states and passes them to the
    compiled graphs.

    This works well for no-HOP graphs. With HOPs, the partitioner runs
    recursively: it first partitions the HOP (producing forward/backward HOP
    subgraphs) and then stitches them back into the outer joint graph. For HOPs
    that contain RNG ops, the outer joint graph now includes HOP subgraph
    modules with extra RNG placeholders. We must thread these placeholders
    through the outer module partitioned forward and backward graphsâ€”this
    function does exactly that. It collects the RNG placeholder nodes from the
    HOPs and creates corresponding placeholders in the outer forward and
    backward graphs.

    There is a catch: for a short period, the joint graph is in a â€œbadâ€� state.
    The HOP subgraphs expect additional inputs (because of the new
    placeholders), but the outer graph call sites don't yet provide them. We
    can't fix this in the joint graph because the joint graph's input signature
    is fixed (primals, tangents). As a compromise, we keep the joint graph in
    somewhat of a bad state for some time and, once the outer forward and
    backward graphs are partitioned, insert the corresponding RNG placeholders
    and wire up the calls.
    r   r’  r‘  rÑ   r  r·   )r¾   rž   r6  r&   r¤   NT)Úpropagate_metaÚeager_input_vals)r  rÃ  r–   r  rŸ   rÄ   rÿ   Úinvoke_subgraphr´   r»   rž   r¦   r¼   rw  rÝ   r8  rÑ   r�   ré   r†  rÁ  r�   rÂ  )Úmoduler  r‹  Ú
rng_stringÚ
last_inputÚhop_noderð   Únew_rng_inputsÚplaceholder_noder€  Únew_hop_node_with_fixed_argsÚ
eager_valsÚ
eager_argsÚeager_kwargsÚinpÚnew_eager_argss                   rJ   r4  r4  K  sf  € ð< €IÙ$/‘°_€JÜ”h˜vŸ|™|×6Ñ6¸-Ð6ÓHÓIÓJ€JØ—L‘L×+Ñ+Ø¤5§9¡9×#9Ñ#9×#IÑ#Ið ,ó ó ,2ˆô ˜6 8§=¡=°Ñ#3×#:Ñ#:Ó;ˆÜ�h¤§¡Õ/Ø,.ˆNØ$,§N¡N×$=Ñ$=ÀÐ$=Ó$Oò 9Ð ØÐ!1×!6Ñ!6Ò6ð  Ÿ™×5Ñ5°jÓAñ 9Ø$*§L¡L×$<Ñ$<Ø)˜l¨!¨I¨;Ð7ó%˜	ð " Q™˜	Ø0@×0EÑ0EÀeÑ0L˜	Ÿ™ uÑ-Ø%.˜
Ø&×-Ñ-¨iÔ8÷9ð 9ð	9ò à—\‘\×1Ñ1°(Ó;ñ 	Ø39·<±<×3KÑ3KØ'ÜŸ	™	×.Ñ.×>Ñ>Ø9˜(Ÿ-™-Ð9¨.Ñ9Øó	4Ð0ð ×2Ñ2Ø4ÀTð 3ô ÷	ð &Ÿ]™]×.Ñ.Ð/AÓB�
ÙØ/9Ñ,�J ð&Ø#ð&à5CÖD¨c˜#Ÿ(™( 5›/ÒDñ&�Nð
 'Ø$ðMÐ0×5Ñ5Ð6HÑIð —‘×'Ñ'¨Ö1ðY,2ð\ €M÷I9ñ 9ú÷	ð 	üò" Es    ÄAI Æ A#I-ÈI9É I*É-I6	c           	     óþ  ‡‡‡‡— t        | j                  «      Št        «       Š| j                  j                  D ]m  }|j                  dk(  r d|j
                  v r‰j                  |«       nt        |«      r‰j                  |«       |‰v sŒS‰j                  |j                  «       Œo t        t        t        | j                  j                  «      «      }t        t        t        | j                  j                  «      «      }||z   }t        | |¬«      \  }}}	}
‰j                  «       }‰j                  d„ |D «       «       t!        | j                  |||	d«      }t        ˆfd„|j                  D «       «      Št        ˆˆfd„| j                  j                  D «       «      }t        ˆfd„t#        |«      D «       «      }d	}i }| j                  j                  D ]  }|‰v sŒ|||<   |d
z  }Œ t%        |‰‰||||«      S )NrÑ   ÚtangentsrØ  c              3  óF   K  — | ]  }|€Œ|j                   dk7  sŒ|–— Œ y ­w)NrØ   r  )rm   r‚  s     rJ   ro   z!classify_nodes.<locals>.<genexpr>º  s$   è ø€ ò Ø !¡-°A·D±D¸HÓ4DŒñùs   ‚!Š!š!rÐ   c              3  óZ   •K  — | ]"  }|j                   d k7  r‰|j                     –— Œ$ y­wr  r  rN  s     €rJ   ro   z!classify_nodes.<locals>.<genexpr>À  s.   øè ø€ ò 8àØ�7‰7�hÒð 	�T—Y‘YÕñ8ùs   ƒ(+c              3  ó2   •K  — | ]  }|‰vr|‰vr|–— Œ y ­wrF   r]   )rm   rI   rd   rv   s     €€rJ   ro   z!classify_nodes.<locals>.<genexpr>Å  s*   øè ø€ ò 6àØÐ(Ñ(¨TÐ9JÑ-Jô 	ñ6ùs   ƒc              3  ó2   •K  — | ]  \  }}|‰v sŒ|–— Œ y ­wrF   r]   )rm   r1  Úpr  s      €rJ   ro   z!classify_nodes.<locals>.<genexpr>Ê  s"   øè ø€ ò -Ùˆa�°!Ð7TÒ2TŒñ-ùs   ƒ�r   r&   )rc  r–   r$   r—   r¾   rž   rã  rÞ   rÀ  r“  r’  rß  r5   r4   r&  r¼  rú   r|  r_   )r   r  r!  rI   rî  rð  ra   r"  r#  r$  r%  re   Úforward_only_graphrf   ri   Úfw_cntrh   rO  rd   rv   s    `               @@@rJ   r&  r&  �  s  û€ ô
 $ L×$6Ñ$6Ó7€LÜ-7«\ÐØ×"Ñ"×(Ñ(ò 1ˆØ�7‰7�mÒ#¨
°d·k±kÑ(AØ×!Ñ! $Õ'Ü! $Ô'Ø×!Ñ! $Ô'àÐ$Ò$Ø×$Ñ$ T§Z¡ZÕ0ð1ô œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÐ3Ñ3€Fä  ¸ÔOñ C€K�Ð/Ð1Bð )×-Ñ-Ó/ÐØ×Ññ Øôô ô <Ø×Ñ˜F KÐ1BÀIóÐô .8ó 8à&×,Ñ,ô8ó .Ðô
 ,6ô 6à ×&Ñ&×,Ñ,ô6ó ,€Oô
 #-ó -Ü Ó.ô-ó #Ðð €FØ€HØ×"Ñ"×(Ñ(ò ˆØÐ$Ò$Ø#ˆH�T‰NØ�a‰K‰Fðô ØØØØØØØ#óð rL   )r  c          	     ó²	  ‡— | j                   j                  «        | j                  «        | j                   }t        j                  rt        |«      }|| _         | j                   }t        | «      }t        | «      }	|rt        | d¬«      } t        j                  st        | «       t        | «       t        | «       |€g }t        | ||«      }
t        |
j                  «      dk(  rt!        | ||||
j"                  ¬«      S t%        | j                   j&                  «      D ]„  }|j(                  dk(  rt+        d«      |_        Œ#|
j/                  |«      sd|_        Œ<t+        d«      |_        |j0                  D ]*  }t3        |j,                  |j,                  dz   «      |_        Œ, Œ† t        j4                  }|j&                  D ]=  }t7        |j8                  j;                  d	d«      t<        «      sŒ.|j8                  d	   } n t?        ||
|¬
«      }t        j@                  rtA        ||«      }dd„ŠtC        tE        ˆfd„|«      «      }tC        tE        tF        |«      «      }tC        tE        d„ |«      «      }tI        | |||||
j"                  ¬«      \  }}|r|	rtK        | ||t        |«      «      \  }}tM        |«      }t        jN                  rddl(m'}  |||||
j"                  «       tS        |«      }tS        |«      }tU        |d¬«      }tU        |d¬«      }tV        �r±tY        |D �cg c]  }t[        |«      t]        |«      f‘Œ c}«      }t_        d„ |D «       «      dz  }t`        jc                  d|«       t`        jc                  d|«       te        d„ |j                   j&                  D «       «      }te        d„ |j                   j&                  D «       «      }||z  }tg        t*        «      }|j                   j&                  D ]R  }|jh                  |v sŒtk        |jl                  d«      sŒ)|t]        |jl                  jn                  «      xx   dz  cc<   ŒT t`        jc                  dt        |«      t        |«      t        |«      «       tY        |jq                  «       ts        jt                  d«      d¬«      }t`        jc                  d|«       ||fS c c}w )ax  
    Partitions the joint graph such that the backward recomputes the forward.
    Recomputing helps in trading off memory bandwidth with computation.

    To create the fwd and bwd graph, we copy the joint graph, manually set the
    outputs to just original forward or backward outputs. And then we run the
    resulting graphs through dead code elimination.

    .. warning::
        This API is experimental and likely to change.

    Args:
        joint_module(fx.GraphModule): The joint forward and backward graph. This
            is the result of AOT Autograd tracing.
        _joint_inputs: The inputs to the joint graph. This is unused.
        compiler: This option determines the default set of recomputable ops.
            Currently, there are two options: ``nvfuser`` and ``inductor``.
        recomputable_ops: This is an optional set of recomputable ops. If this
            is not None, then this set of ops will be used instead of the
            default set of ops.
        num_fwd_outputs: The number of outputs from the forward graph.

    Returns:
        Returns the generated forward and backward Fx graph modules.
    Fr  Nr   )r!  r  ri   rØ   r`  r&   rz  )rz  c                óØ   — t        | j                  j                  d«      t        j                  «      xr6 t        | j                  «      dkD  xr t        d„ | j                  D «       «      S )Nr¤   r   c              3  ó�   K  — | ]>  }|j                   t        j                  j                  j                  j
                  u –— Œ@ y ­wrF   )rž   rŸ   rÄ   rÅ   r(  rÇ   )rm   rJ  s     rJ   ro   zWmin_cut_rematerialization_partition.<locals>._is_assert_only_symbool.<locals>.<genexpr>G  s-   è ø€ ÒWÈ!�A—H‘H¤§	¡	§¡× =Ñ =× EÑ EÔEÑWùs   ‚AA)r¦   r�   r�   rŸ   r¨   rè   r“  râ  ©rn   s    rJ   Ú_is_assert_only_symboolzDmin_cut_rematerialization_partition.<locals>._is_assert_only_symboolC  sP   € ä�q—v‘v—z‘z %Ó(¬%¯-©-Ó8ò XÜ�A—G‘G“˜qÑ òXäÑWÈqÏwÉwÔWÓWð	
rL   c                ó0   •— t        | «      xr	  ‰| «       S rF   r  )rn   r  s    €rJ   rq   z5min_cut_rematerialization_partition.<locals>.<lambda>L  s   ø€ ”k !“nÒGÑ-DÀQÓ-GÐ)G€ rL   c                ó6   — t        | «       xr t        | «       S rF   )r   r1   r  s    rJ   rq   z5min_cut_rematerialization_partition.<locals>.<lambda>Q  s   € œ[¨›^Ð+ÒE´NÀ1Ó4EÐ0E€ rL   r  r  r  Tc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrF   )rQ  ræ  s     rJ   ro   z6min_cut_rematerialization_partition.<locals>.<genexpr>  s   è ø€ Ò'J¸¬°¯Ñ'Jùr  z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3  óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­w©r·   Nr  r  s     rJ   ro   z6min_cut_rematerialization_partition.<locals>.<genexpr>„  ó$   è ø€ ò %
Ø¸4¿7¹7ÀoÓ;UˆD�I�Iñ%
ùr  c              3  óT   K  — | ]   }|j                   d k(  sŒ|j                  –— Œ" y­wr  r  r  s     rJ   ro   z6min_cut_rematerialization_partition.<locals>.<genexpr>‡  r  r  rä  z# remat/fw/bw: %d/%d/%drT  zCount of Ops Rematerialized: %sr‚   );r–   rë   r½  r   Úcser8   rš   r¢   r!  r"  r#  r$  r%  r&  rè   rd   r?  ri   rÃ  r—   r¾   rƒ   r   ry   r“  rD  Úactivation_memory_budgetr¦   r�   r�   rW  r»  r0  r’  rß  r1   r   r1  r2  r  r3  r:   r4  r<   rt   rQ  r°   rO  r=   rs  r$   r   rÝ   r�   rž   rä  rP  r¹   rW  )r   r5  Úcompilerr!  r  r™   Ú	cse_graphrí   r9  r:  r;  rI   rš  rz  r)  rë  rì  r=  r>  r  r1  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opsr  s                               @rJ   r   r   Þ  sr  ø€ ðD ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‚zÜ  Ó&ˆ	Ø&ˆÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü-¨lÐQVÔWˆÜ×:Ò:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ð,Ø(*Ð%ÜØÐ3°_ó€Iô ˆ9×&Ñ&Ó'¨1Ò,Ü ØØØ+Ø*GØ(1×(MÑ(Mô
ð 	
ô ˜×+Ñ+×1Ñ1Ó2ò RˆØ�7‰7�hÒÜ # C£ˆDÕØ×)Ñ)¨$Ô/Ø !ˆDÕä # C£ˆDÔØŸ
™
ò R�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÑ;PÓ$Q�Õ!ñRðRô ×3Ñ3€MØ×!Ñ!ò ˆÜ�d—i‘i—m‘m O°TÓ:¼EÕBØ ŸI™I oÑ6ˆMÙðô +ØØØ#ô€Lô ×(Ò(Ü1°+¸|ÓLˆó
ô ÜÛGÈó	
ó€Oô
 œf¤^°\ÓBÓCÐÜÜÑEÀ|ÓTó€Lô
 4ØØà'Ø-Ø'Ø$-×$IÑ$IôÑ€Iˆyñ "Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 4°IÓ>€Iô ×*Ò*õ	
ñ 	%ØØØØ×1Ñ1ô		
ô ˜yÓ)€IÜ˜yÓ)€Iä.¨yÀeÔL€IÜ.¨yÀdÔK€Iæä¸lÖK¸¤¨£¬S°«VÒ4ÒKÓLˆô %(Ñ'J¸\Ô'JÓ$JÈSÑ$PÐ!Ü�‰Ð:Ð<UÔVô 	�‰Ð?ÀÔNÜ$ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆô %ñ %
Ø"+§/¡/×"7Ñ"7ô%
ó 
ˆð &¨Ñ7ˆä!,¬SÓ!1ˆØ—O‘O×)Ñ)ò 	>ˆDØ�y‰y˜KÒ'¬G°D·K±KÐARÕ,SØ”s˜4Ÿ;™;×6Ñ6Ó7Ó8¸AÑ=Ô8ð	>ô 	�‰Ø%Ü�ÓÜ�Ó Ü�Ó ô		
ô $Ø�L‰L‹N¤× 3Ñ 3°AÓ 6Àô
Ðô 	�‰Ð2Ð4FÔGØ�iÐÐùò= Ls   Ì(Sc                ó  — |rWt        j                  | j                  «      }t        j                  | |«      } | j                  j
                  D ]	  }i |_        Œ t        j                  j                  |«      \  }	}
|
sdt        j                  z   }
t        j                  d|	|
«       t        j                  | |||¬«      }|j!                  «       }t#        |d|
j%                  d«      z   «      }|	› |
› �}|€	 ||«       y  |||¬«       y )Nrb  zWriting FX graph to file: %s%s)Úparse_stack_traceÚdot_graph_shapeÚwrite_)Úprog)r¼  Údeepcopyr–   r¼   rw  r—   r�   r›  rœ  Úsplitextr   Útorch_compile_graph_formatr=   rs  r#   ÚFxGraphDrawerÚget_main_dot_graphr´   Úlstrip)ÚtracedÚfnameÚfignameÚ
clear_metar  r  r  rò   rI   r~  ÚextÚgrÔ   Úwrite_methods                 rJ   Ú
draw_graphr'  �  sî   € ñ Ü—M‘M &§,¡,Ó/ˆ	Ü—‘ ¨	Ó2ˆØ—L‘L×&Ñ&ò 	ˆDØˆD�Ið	ä—‘× Ñ  Ó'�I€Dˆ#ÙØ”F×5Ñ5Ñ5ˆÜ‡H�HÐ-¨t°SÔ9Ü×"Ñ"ØØØ+Ø'ô		€Að 	
×ÑÓ€AÜ˜1˜h¨¯©°C«Ñ8Ó9€LØˆf�S�EˆN€EØ€|Ù�UÕá�U Ö&rL   rU   )r™   r¯  rW   r;   )rI   rV   rW   rƒ   )r¿   rV   rW   úfx.Node | None)rI   rV   rW   r(  )rI   rV   rÌ   zdict[fx.Node, Any]rW   r(  )NF)rí   r‹  ra   r`   rî   r`   rï   zlist[AOTOutput]rð   rR  rñ   r;   rW   r‹  )r   r¯  r!  rƒ   rW   zEtuple[list[fx.Node], list[fx.Node], list[AOTOutput], list[AOTOutput]])r)  r`   rÝ   r°   rW   rt  )r/  z#list[fx.Node] | tuple[fx.Node, ...]rW   rƒ   )g      ì@rx  r   )r–   rÒ  rI   útorch.fx.NoderC  rW  rD  rW  rE  rƒ   rW   r)  )r–   rÒ  rI   r)  rL  r)  rQ  útorch.dtyper>  rW  rP  rW  rE  rƒ   rW   r)  )r[  r²  rW   rW  )rW   zlist[torch.dtype])rI   r)  rW   r;   )rW   r*  )rf  r*  rW   ztuple[float, float])r   )r–   rÒ  r!  rƒ   rW   rt  )r–   rÒ  rW   rt  )
r­  r¯  rº  r¯  rÄ  r°  r!  rƒ   rW   rt  )Nr   )r)  r`   r­  r¯  rº  r¯  ri   úOrderedSet[fx.Node] | Noner!  rƒ   rW   rt  rF   )r   r¯  r)  r`   rë  r`   rì  zlist[fx.Node] | Noner!  rƒ   ri   r+  rñ   r;   rÖ  r;   rW   ú%tuple[fx.GraphModule, fx.GraphModule])r   r¯  r5  r	   r!  rƒ   r  úlist[int] | Noneri   r+  rW   r,  )rY  rƒ   rf  r*  rW   rƒ   )r–   r‹  rW   rt  )rW   z!list[torch._ops.OpOverloadPacket])r»   ztuple[Any, ...]re  rg   rW   zlist[tuple[fx.Node, int]])rx  r¯  rW   r¯  )r=  útorch.fx.GraphModuler>  r.  rˆ  r)  r‰  r)  rŠ  ztorch.devicer‹  rƒ   rŒ  r)  r�  r)  rW   z#tuple[torch.fx.Node, torch.fx.Node])
r   r¯  r=  r¯  r>  r¯  r¾  rƒ   rW   r,  )r   r¯  rW   rt  )r   r¯  r  r;   rW   r¯  )
rí   r‹  r;  r_   r  r‡   r  r+  rW   z)tuple[list[fx.Node], OrderedSet[fx.Node]])r  únx.DiGraph[str, dict[str, Any]]rW   z!list[tuple[str, str, str]] | None)rž  r°   rŸ  r°   rW   r°   )r  r/  rW   ztuple[str | None, str | None])rW   r?   )r–   r‹  rW   r°  )rí   r‹  r6  úlist[float]r7  r0  r8  rW  r;  r_   r,  r`   rW   z"tuple[float, list[int], list[int]])rÔ   r²  rG  rƒ   rW   r²  )rI   rV   rW   rW  )r&   )rí   r‹  r;  r_   rz  rW  rW   r`   )rí   rÒ  r)  úlist[torch.fx.Node]rW   r1  )ré  r¯  r  r;   rW   r¯  )r   r¯  r  z	list[int]r!  rƒ   rW   r_   )ry  )r   r¯  r5  r	   r  r°   r!  rƒ   r  r-  rW   r,  )Úfx_graphTNFN)r   r.  r!  r°   r"  r°   r#  r;   r  zstr | list[str] | Noner  r;   r  rR  rW   rt  )ÀÚ
__future__r   r¼  r„   rÆ  r  rä  Úloggingru  r¹   r›  Úos.pathr¾  r  rV  r   r   Úcollections.abcr   Údataclassesr   r   Útypingr	   r
   rŸ   Útorch._inductor.inductor_primsÚtorch.distributedÚtorch.fxr¼   Útorch.utils._pytreeÚutilsÚ_pytreerá   Útorch._dynamo.utilsr   r   Ú;torch._functorch._activation_checkpointing.ac_logging_utilsr   Ú$torch._functorch._aot_autograd.utilsr   Útorch._inductorr   rê  Ú!torch._inductor.custom_graph_passr   r   Ú"torch._library.fake_class_registryr   Útorch._library.utilsr   Útorch._loggingr   r   Útorch._logging._internalr   rÓ  r   Ú%torch.fx.experimental._backward_stater   Ú"torch.fx.experimental.proxy_tensorr   r   Útorch.fx.experimental.sym_noder   r   Ú%torch.fx.experimental.symbolic_shapesr   r   r   r    r!   r"   Útorch.fx.passesr#   Útorch.utils._ordered_setr$   Útorch.utils.checkpointr%   r‰  Ú-_activation_checkpointing.graph_info_providerr'   Ú"_activation_checkpointing.knapsackr(   r)   r*   r+   Ú,_activation_checkpointing.knapsack_evaluatorr,   Ú_aot_autograd.descriptorsr-   r.   r/   Ú_aot_autograd.functional_utilsr0   Ú_aot_autograd.graph_compiler1   Ú_aot_autograd.logging_utilsr2   Ú_aot_autograd.utilsr3   r4   r5   r6   r7   Úcompile_utilsr8   r9   r:   rT  rD  ÚsympyÚdebug_partitionerr<   r\   Ú	getLoggerrX   r=   rÄ   rÅ   r;  r?   r_   r‡   r”   rš   r¢   r«   r­   rµ   rß   rÂ   rÊ   rÍ   rú   rü   r  r  r
  r  r  rà   rÞ   r&  r+  r2  rM  rW  r]  rg  rn  rp  rt  r„  r›  rÍ  rÕ  r   r?  rƒ   r  rB  rQ  rY  Úcacherc  rh  r2  r—  r1  r#  r$  r%  rÛ  r!  r�  r`  r\  rb  rS  rc  r<  r“  r>  rF  r\  r»  r0  r4  r&  r   r'  r]   rL   rJ   ú<module>r\     s  ðÞ "ã Û Û Û Û Û Û Û Û 	Û Û 	Û ß *Ý $ß *ß %ã Û %Û Ý ß $Ð $ß <õõ AÝ 5÷õ @Ý +ß 7Ý .Ý AÝ ?ß Hß L÷÷ õ )Ý /Ý 3å Ý L÷ó õ L÷ñ õ
 AÝ 7Ý ;÷õ ÷ IÑ Hñ ÛÛð %×6Ñ6Ð �tÓ 6Ø'�g×'Ñ'¨Ó1€€^Ó 1à‡y�y‡~�~€Ø�	‰	�‰€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ðB ÷ð ó ðóóóó÷ñ óIñ Ó€óó2-ðØ
ðà	ðð óðH  Ø$)ðrØðràðrð ðrð #ð	rð
 ðrð "ðrð órójóXóCóBóJóKóó5ðJØ ðJØ69ðJàJóJó$ðØ;ðàóð ØØðKØðKà
ðKð 
ðKð 
ð	Kð
 ðKð óKð\C!ØðC!à
ðC!ð ðC!ð ð	C!ð
 ðC!ð ðC!ð ðC!ð óC!óL9ó"óGó45ó	ôFGóRMGðh ð	XØðXàðXð *ðXð ð	Xð
 
óXð~ ?CØð'
Øð'
àð'
ð ð'
ð "<ð	'
ð
 ð'
ð 
ó'
ð\ 04ð	k"ð ?CØ$)Ø&+ñk"Ø ðk"àðk"ð #ðk"ð -ð	k"ð ðk"ð "<ðk"ð "ðk"ð  $ðk"ð +ók"ðf 7;Ø>Bñb Ø ðb àðb ð ð	b ð
 $4ðb ð "<ðb ð +ób ñJ ˆc‹(€ó"óó:Rð ‡‚òó ðð"PØ
ðPØ&8ðPàóPóKð\[*Ø#ð[*à#ð[*ð ð[*ð ð	[*ð
 ð[*ð ð[*ð "ð[*ð "ð[*ð )ó[*ð|a Ø ða àða ð ða ð ð	a ð
 +óa óH@ó'ó<ó.Kð5Ø ð5Ø;?ð5àó5ðx ,0ð	v	&Øðv	&àðv	&ð #ðv	&ð )ð	v	&ð
 /óv	&ðrØ-ðà&óóB/ð$!Ø-ð$!à"ó$!óNeóPð-TØð-Tàð-Tð ð-Tð ð	-Tð
 ð-Tð $1ð-Tð (ó-Tõ` 0ó5ó*Nð` ðz	Øðz	àðz	ð ðz	ð ó	z	ðzNØðNØ/BðNàóNðbOØðOØ)-ðOàóOðd>Ø ð>à#,ð>ð ð>ð ó	>ðH ð| ð 7;ñ| Ø ð| àð| ð ð| ð
 ð| ð $4ð| ð +ó| ðD ØØ#'Ø#Ø"&ð'Ø ð'àð'ð ð'ð ð	'ð
 !ð'ð ð'ð  ð'ð 
ô'rL   