ó
    Eñib3 ã                  óX  • % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKr
S SKrS SKrS SKJrJr  S SKJr  S SKJrJr  S SKJrJr  S SKrS SKrS SKrS SKJr  S SKJs  J r!  S SK"J#r#J$r$  S SK%J&r&  S S	K'J(r(  S S
K)J*r+  S SK,J-r-J.r.  S SK/J0r0  S SK1J2r2  S SK3J4r4J5r5  S SK6J7r7  S SK8J9r9  S SK:J;r;  S SK<J=r=J>r>  S SK?J@r@JArA  S SKBJCrCJDrDJErEJFrFJGrGJHrH  S SKIJJrJ  S SKKJLrL  S SKMJNrN  SS
KOJ*r*  SSKPJQrQ  SSKRJSrSJTrTJUrUJVrV  SSKWJXrX  SSKYJZrZJ[r[J\r\  SSK]J^r^  SSK_J`r`  SSKaJbrbJcrcJdrdJereJfrf  SS KgJhrhJiriJjrj  \(       a  S SKkrlS SKmrm\*RÜ                  roS!\pS"'   \Râ                  " \r5      rsS#\pS$'   \Rè                  Rê                  ru\Rè                  Rì                  rv\ " S% S&5      5       rw\ " S' S(5      5       rx\ " S) S*5      5       rySoS+ jrzSpS, jr{SpS- jr|SqS. jr} " S/ S05      r~SoS1 jr\~" 5       r€SrS2 jr�SsS3 jr‚      StS4 jrƒ  Su             SvS5 jjr„SoS6 jr…SoS7 jr†SoS8 jr‡SoS9 jrˆSoS: jr‰SoS; jrŠSoS< jr‹SoS= jrŒ      SwS> jr�SxS? jrŽ    SyS@ jr�   Sz           S{SA jjr�                S|SB jr‘S}SC jr’S~SD jr“SSE jr”S€SF jr•S�SG jr–S‚SH jr—S‚SI jr˜        SƒSJ jr™ S„         S…SK jjršSSL.           S†SM jjr›SSSN.           S‡SO jjrœ\�" SP5      ržSˆSQ jrŸSqSR jr S‰SS jr¡\GRD                  SŠST j5       r£      S‹SU jr¤SŒSV jr¥                  S�SW jr¦          SŽSX jr§S�SY jr¨S�SZ jr©S�S[ jrªSoS\ jr«      S�S] jr¬ S„         S‘S^ jjr­    S’S_ jr®S“S` jr¯    S”Sa jr°S•Sb jr±S–Sc jr²              S—Sd jr³S SeK´Jµrµ  S˜Sf jr¶S™Sg jr· Sš       S›Sh jjr¸      SœSi jr¹      S�Sj jrº        SžSk jr» SŸSSl.           S Sm jjjr¼     S¡               S¢Sn jjr½g)£é    )Ú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Ú	size_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)Ú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                  ó~   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   SS	 jrSS
 jrSS jrSS jr	SS jr
Srg)ÚOpTypesé]   z8Class for keeping track of different operator categorieszOrderedSet[Callable[..., Any]]Úfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsc                ó2   • [        U5      U R                  ;   $ ©N)r8   r@   ©ÚselfÚnodes     ÚZ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_functorch/partitioners.pyÚ
is_fusibleÚOpTypes.is_fusibleg   s   € Ü˜tÓ$¨×(8Ñ(8Ñ8Ð8ó    c                ó2   • [        U5      U R                  ;   $ rF   )r8   rA   rG   s     rJ   Úis_compute_intensiveÚOpTypes.is_compute_intensivej   s   € Ü˜tÓ$¨×(BÑ(BÑBÐBrM   c                ó2   • [        U5      U R                  ;   $ rF   )r8   rB   rG   s     rJ   Ú	is_randomÚOpTypes.is_randomm   s   € Ü˜tÓ$¨¯©Ñ7Ð7rM   c                ó2   • [        U5      U R                  ;   $ rF   )r8   rC   rG   s     rJ   Úis_viewÚOpTypes.is_viewp   s   € Ü˜tÓ$¨¯©Ñ5Ð5rM   c                ó2   • [        U5      U R                  ;   $ rF   )r8   rD   rG   s     rJ   Úis_recomputableÚOpTypes.is_recomputables   s   € Ü˜tÓ$¨×(=Ñ(=Ñ=Ð=rM   © N©rI   úfx.NodeÚreturnr:   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__rK   rO   rR   rU   rX   Ú__static_attributes__rZ   rM   rJ   r>   r>   ]   s=   ‡ áBà/Ó/Ø9Ó9Ø.Ó.Ø,Ó,Ø4Ó4ô9ôCô8ô6÷>rM   r>   c                  ó¬   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	\S
'   S\S'   \R                  SS j5       rSS jrSS jr	SS jr
SS jrSrg)ÚNodeInfoéw   ú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                óB   ^ • [        S T R                   5       U 4S jS9$ )Nc              3  ó$   #   • U  H  ov •  M     g 7frF   rZ   ©Ú.0Úns     rJ   Ú	<genexpr>Ú-NodeInfo.required_fw_nodes.<locals>.<genexpr>‡   s   é € Ð0Ò/�1ŒQÒ/ùs   ‚c                ó"   >• TR                   U    $ rF   )rp   )rv   rH   s    €rJ   Ú<lambda>Ú,NodeInfo.required_fw_nodes.<locals>.<lambda>‡   s   ø€ ÀÇÁÈaÒ@PrM   ©Úkey)Úsortedrk   ©rH   s   `rJ   Úrequired_fw_nodesÚNodeInfo.required_fw_nodes„   s!   ø€ äÙ0˜×/Ò/Ó0Ô6Pñ
ð 	
rM   c                ó   • XR                   ;   $ rF   )rk   ©rH   rv   s     rJ   Úis_required_fwÚNodeInfo.is_required_fwŠ   s   € Ø×+Ñ+Ñ+Ð+rM   c                ó   • XR                   ;   $ rF   )rl   rƒ   s     rJ   Úis_required_bwÚNodeInfo.is_required_bw�   s   € Ø×*Ñ*Ñ*Ð*rM   c                ó   • XR                   ;   $ rF   )rn   rƒ   s     rJ   Úis_unclaimedÚNodeInfo.is_unclaimed�   s   € Ø×(Ñ(Ñ(Ð(rM   c                ó\   • XR                   ;  a  [        SU S35      eU R                  U   $ )NúNode z not in fw nodes!)rk   ÚAssertionErrorrp   rƒ   s     rJ   Úget_fw_orderÚNodeInfo.get_fw_order“   s2   € Ø×+Ñ+Ó+Ü  5¨¨Ð+<Ð!=Ó>Ð>Ø�}‰}˜QÑÐrM   rZ   N)r]   rh   )rv   r\   r]   r:   )rv   r\   r]   Úint)r^   r_   r`   ra   rc   Ú	functoolsÚcached_propertyr€   r„   r‡   rŠ   r�   rd   rZ   rM   rJ   rf   rf   w   sZ   ‡ ð ÓØ+Ó+Ø*Ó*Ø)Ó)Ø(Ó(Ø Ó à!4Ó4à×Ñó
ó ð
ô
,ô+ô)÷ rM   rf   c                  óH   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   Srg	)
ÚMinCutOptionsé™   r:   Úban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionrZ   N)r^   r_   r`   ra   rc   rd   rZ   rM   rJ   r•   r•   ™   s    ‡ àÓØ $Ó$Ø"&Ó&Ø!Ó!ØÖrM   r•   c                ó|   • U R                   R                  SS 5      [        R                  [        R                  4;   $ )NÚ	recompute)ÚmetaÚgetr%   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©rI   s    rJ   Úmust_recomputer£   ¢   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ñ ð rM   c                ób   • U R                   R                   H  n[        U5      (       d  M    g   g)NTF)ÚgraphÚnodesr£   ©Úfx_grI   s     rJ   Úhas_recomputable_opsr©   ©   s)   € Ø—
‘
× Ô ˆÜ˜$×ÓÙñ !ð rM   c                ó  • U R                   R                   Hf  n[        U5      (       d  M  [        UR                  S5      (       d  M2  [
        R                  R                  UR                  R                  ;   d  Mf    g   g)NÚtagsTF)	r¥   r¦   r£   ÚhasattrÚtargetÚtorchÚTagÚnondeterministic_seededr«   r§   s     rJ   Úhas_recomputable_rng_opsr±   °   sV   € Ø—
‘
× Ô ˆä˜4× Ó Ü˜Ÿ™ V×,Ó,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÕEáñ !ð rM   c                ó  • [        U R                  S   [        R                  [        R                  45      (       a  g[        U R                  S   [        R
                  5      (       d$  [        S[        U R                  S   5       35      eg)NÚvalr&   z.expected node.meta['val'] to be SymFloat, got é   )Ú
isinstancerž   r®   ÚSymIntÚSymBoolÚSymFloatrŽ   Útyper¢   s    rJ   Úsym_node_sizerº   »   sm   € Ü�$—)‘)˜EÑ"¤U§\¡\´5·=±=Ð$A×BÑBØÜ�d—i‘i Ñ&¬¯©×7Ñ7ÜØ<¼TÀ$Ç)Á)ÈEÑBRÓ=SÐ<TÐUó
ð 	
ð rM   c                  ó   • \ rS rSrSS jrSrg)ÚInvalidNodeBaseéÅ   c                ó   • g)NzInvalid NoderZ   r   s    rJ   Ú__repr__ÚInvalidNodeBase.__repr__Æ   s   € ØrM   rZ   N)r]   Ústr)r^   r_   r`   ra   r¿   rd   rZ   rM   rJ   r¼   r¼   Å   s   † ÷rM   r¼   c                ó6   • [        U R                  SS 5      S:g  $ )NÚ	namespaceÚ_c10d_functional)Úgetattrr­   r¢   s    rJ   Úis_not_collectiverÆ   Ë   s   € Ü�4—;‘; ¨TÓ2Ð6HÑHÐHrM   c                ót  • U R                   [        R                  :w  a  gU R                  S   nU R                  S   n[	        U[
        R                  5      (       a  UR                  S:w  a  gSUR                  ;  a  gUR                  S   nX#;  a  gX2   n[	        U[
        R                  5      (       a  U$ g)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_resultr}   rÉ   Úoriginal_inputs        rJ   Ú_get_ho_op_original_inputrÓ   Ò   s¥   € ð ×Ñœh×.Ñ.Ó.ØØ×!Ñ! !Ñ$€IØ
×
Ñ
˜AÑ
€CÜ�i¤§¡×)Ñ)¨Y¯\©\¸_Ó-LØØ�y×'Ñ'Ó'ØØ×Ñ˜hÑ'€Fà
ÓØà‘[€NÜ�.¤"§'¡'×*Ñ*ØÐØrM   c                óL  • U R                   [        R                  R                  R                  R
                  [        R                  R                  R                  R
                  4;  a  gU R                  S   n[        U[        R                  5      (       d  g[        U5      $ )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Û   ë   sl   € ð ‡{�{œ5Ÿ9™9Ÿ>™>×.Ñ.×6Ñ6¼¿	¹	¿¹×8NÑ8N×8VÑ8VÐWÓWØØ�Y‰Y�q‰\€FÜ�fœbŸg™g×&Ñ&ØÜ$ VÓ,Ð,rM   c                ó¼   • [        U 5      nUb   X!;   a  [        X   [        5      (       d  X   $ [        U 5      nUb   X!;   a  [        X   [        5      (       d  X   $ g)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Þ   ù   se   € ô +¨4Ó0€NàÑ"ØÓ!Ü˜3Ñ.´×@Ñ@àÑ"Ð"ä.¨tÓ4€NàÑ"ØÓ!Ü˜3Ñ.´×@Ñ@àÑ"Ð"ØrM   c                ó‚  ^• [         R                  " 5       n0 mU H4  nUR                  UR                  5      nUR                  Ul        UTU'   M6     U R
                   GHo  nU(       dL  [        U5      (       a  US:w  a  Xq;  a  [        TU'   M1  [        U5      (       a  US:w  a  Xq;  a  [        TU'   MW  UT;   a  M_  UR                  S:X  a  [        TU'   Mz  UR                  S:X  a¦  [        R                  " UR                  0 UR                  D6n	U	 V
s/ s H7  n
[        U
[         R                  5      (       d  M$  [        TU
   [         5      PM9     n	n
[#        U	5      (       a  [        TU'   GM  UR%                  UU4S j5      TU'   GM0  UR                  S:X  a  UR%                  UU4S j5      TU'   GM\  UR                  S:X  d  GMo  GMr     / n['        X#5       GH�  u  p¬[        U
[         R                  5      (       GaV  U
T;  a  [)        S	U
 S
35      e[        TU
   [         5      (       Ga  SnU
R*                  [,        R.                  R0                  R2                  R4                  L aŸ  [        U
5      (       a�  [7        U
R                  5      S:¼  av  [        U
R                  S   [         R                  5      (       aJ  U
R                  S   T;   a7  [        TU
R                  S      [         5      (       d  TU
R                  S      nUc  [9        U
T5      nUb  UR;                  U5        GMV  [=        S	U
 S35      eUR;                  TU
   5        GM|  UR;                  U
5        GM�     UR?                  [A        U5      5      nX>R                  S'   URC                  5         URE                  5         U$ s  sn
f )au  
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                ó   >• TU    $ rF   rZ   ©ÚxrÝ   s    €rJ   rz   Ú4_extract_graph_with_inputs_outputs.<locals>.<lambda>Y  ó	   ø€ ¸CÀºFrM   Úget_attrc                ó   >• TU    $ rF   rZ   rä   s    €rJ   rz   ræ   \  rç   rM   Úoutputr�   z couldn't be found in envNr&   r   z was invalid, but is outputÚdesc)#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ê   ÚtupleÚeliminate_dead_codeÚlint)Újoint_graphri   ÚoutputsÚoutputs_descsÚsubgraphÚignore_must_be_in_fw_bwÚ	new_graphrI   Únew_nodeÚall_argsrå   Úoutput_valuesÚx_descÚreplacementÚoutrÝ   s                  @rJ   Ú"_extract_graph_with_inputs_outputsr	    s%  ø€ ô$ —’“
€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Ü˜a¤§¡×)ó 4”
˜3˜q™6¤?Ö3Ù!ð ð ô
 �8�}‰}Ü'��D‘	Úà!×+Ñ+¨DÔ2BÓCˆC�ŒIØ�W‰W˜
Ó"à!×+Ñ+¨DÔ2BÓCˆC�ŒIØ�W‰W˜Ö ÚñS "ðT €MÜ˜×0‰	ˆÜ�aœŸ™×!Ò!Ø˜‹|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ˜#˜a™&¤/×2Ò2ð #�ð —H‘H¤§	¡	§¡× 4Ñ 4× <Ñ <Ò<Ü,¨Q×/Ñ/Ü˜AŸF™F› qÓ(Ü" 1§6¡6¨!¡9¬b¯g©g×6Ñ6ØŸ™˜q™	 SÓ(Ü& s¨1¯6©6°!©9¡~´×GÑGà"% a§f¡f¨Q¡i¡.�Kð Ñ&Ü"@ÀÀCÓ"H�KØÑ*Ø!×(Ñ(¨Ô5ÚÜ$ u¨Q¨CÐ/JÐ%KÓLÐLØ× Ñ   Q¡×(à× Ñ  ×#ñ= 1ð> ×
Ñ
œ5 Ó/Ó
0€CØ$‡H�HˆVÑà×!Ñ!Ô#Ø‡N�NÔØÐùòis   Ä#N<Ä>N<c                ó>  • [         R                  =(       a‡    [        U R                  [        R
                  R                  5      =(       a    [        U R                  5      (       + =(       d1    U R                  [        R                  R                  R                  :H  $ 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ðrM   c                ó€   • U R                   S:H  =(       a)    [        U R                  R                  S5      [        5      $ )Nrâ   r³   )rÏ   rµ   rž   rŸ   r   r¢   s    rJ   Ú_is_backward_stater  Ž  s*   € Ø�7‰7�mÑ#×W¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWrM   c                ó@   • U R                   R                  SS 5      S:H  $ )NÚpartitioner_tagÚis_backward©rž   rŸ   r¢   s    rJ   Ú_has_tag_is_backwardr  ’  s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBrM   c                ó@   • U R                   R                  SS 5      S:H  $ )Nr  Ú
is_forwardr  r¢   s    rJ   Ú_has_tag_is_forwardr  –  s   € Ø�9‰9�=‰=Ð*¨DÓ1°\ÑAÐArM   c                ó@   • U R                   R                  SS 5      S:H  $ )Nr  Úmust_be_in_forwardr  r¢   s    rJ   Ú_has_tag_must_be_in_forwardr  š  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5IÑIÐIrM   c                ó@   • U R                   R                  SS 5      S:H  $ )Nr  Úmust_be_in_backwardr  r¢   s    rJ   Ú_has_tag_must_be_in_backwardr  ž  s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJrM   c                ó.  • [        U 5      (       a  g[        U R                  [        R                  R
                  5      =(       a     U R                  R                  R                  n[        U 5      (       + =(       a    [        U 5      (       + =(       a    U$ ©NT)
r  rµ   r­   r®   r  r  Ú_schemaÚ
is_mutabler  r  ©rI   r#  s     rJ   rð   rð   ¢  sq   € Ü" 4×(Ñ(Øô 	�4—;‘;¤§
¡
× 5Ñ 5Ó6÷ 	+Ø�K‰K×Ñ×*Ñ*ð ô
 ! Ó&Ô&÷ 	Ü,¨TÓ2Ô2÷	àðrM   c                óö   • [        U 5      (       a  g[        U R                  [        R                  R
                  5      =(       a     U R                  R                  R                  n[        U 5      =(       a    U$ r!  )	r  rµ   r­   r®   r  r  r"  r#  r  r$  s     rJ   rî   rî   ±  sW   € Ü# D×)Ñ)Øä�4—;‘;¤§
¡
× 5Ñ 5Ó6÷ 	+Ø�K‰K×Ñ×*Ñ*ð ô   Ó%×4¨*Ð4rM   c          
     ó\  • [         R                  " S U R                  R                  SS9 5       6 n[         R                  " [	        [        U R                  R                  SS95      5      R                  R                  SS /[        U5      -  5      5      nUS U nX!S  nUS U nX1S  nXEXg4$ )Nc              3  ó8   #   • U  H  oR                   v •  M     g 7frF   ©rÌ   ©ru   rI   s     rJ   rw   Ú+_extract_fwd_bwd_outputs.<locals>.<genexpr>¿  s   é € Ð	KÒ J˜�)Ž)Ò Jùó   ‚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_outputsr6  »  sÄ   € ô ×$Ò$Ù	K × 2Ñ 2× =Ñ =ÀÐ =Ñ JÓ	Kð€Gô ×*Ò*ÜŒT�,×$Ñ$×/Ñ/°8Ð/Ð<Ó=Ó>×CÑC×GÑGØ�T�FœS ›\Ñ)ó	
ó€Mð
 Ð*˜?Ð+€KØÐ*Ð+€KØ%Ð&6 Ð7ÐØ%Ð&6Ð7ÐØÐ%6ÐIÐIrM   c                ó\   • U  H&  nUR                   U:X  d  M  U R                  U5          g    g rF   )rí   Úremove)Úsaved_valuesrí   Úsaved_values      rJ   Ú_remove_by_namer;  Í  s+   € Û#ˆØ×Ñ˜tÕ#Ø×Ñ Ô,Ùò $rM   c                ó�   • [        U 5      n[        [        U 5      S-
  SS5       H  n[        X   5      (       a  M  US-   n  U$    U$ )Nr&   éÿÿÿÿ)rø   Úranger   )Úfwd_module_outputsÚidxÚis      rJ   Úfind_first_sym_noderB  Ô  sT   € ô Ð Ó
!€CÜ”3Ð)Ó*¨QÑ.°°BÖ7ˆÜÐ-Ñ0×1Ó1Ø�a‘%ˆCØØ€Jñ	 8ð €JrM   c           	     óª  • U R                  U5         U R                  [        R                  R                  R
                  R                  U4S9n[        R                  R                  R
                  R                  UR                  S   5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  US/S4S9n[        R                  R                  R                  R                  UR                  S   S/S5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  U[        R                  4S9n[        R                  R                  R                  R                  UR                  S   [        R                  5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  Xs4S9n[        R                  R                  R                  R                  UR                  S   U5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  U4S9n	[        R                  R                  R                  R                  UR                  S   5      U	R                  S'   [        U	R                  S   5      U	R                  S'   S S S 5        U R                  W	5         U R                  [        R                  R                  R                  R                   X’4S9n
[        R                  R                  R                  R!                  U	R                  S   U5      U
R                  S'   [        U
R                  S   5      U
R                  S'   S S S 5        U R                  W
5         U R                  [        R                  R                  R                  R                  U
[        R"                  4SU SUR$                   3S9n[        R                  R                  R                  R                  U
R                  S   [        R"                  5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U$ ! , (       d  f       GN= f! , (       d  f       GN_= f! , (       d  f       GNŠ= f! , (       d  f       GNÒ= f! , (       d  f       GN= f! , (       d  f       GNc= f! , (       d  f       W$ = f)	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_scalingr]  ß  så  € ð 
×	Ñ	˜tÕ	$Ø×&Ñ&Ü�I‰I�N‰N×Ñ×&Ñ&Ø�ð 'ð 
ˆô  %Ÿy™yŸ~™~×1Ñ1×9Ñ9¸$¿)¹)ÀEÑ:JÓKˆ�‰�eÑÜ'>¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷ 
%ð 
×	Ñ	˜xÕ	(Ø×'Ñ'Ü�I‰I�N‰N×Ñ×'Ñ'Ø˜R˜D $Ð'ð (ð 
ˆ	ô !&§	¡	§¡× 3Ñ 3× ;Ñ ;Ø�M‰M˜%Ñ  2 $¨ó!
ˆ	�‰�uÑô )@À	ÇÁÈuÑ@UÓ(Vˆ	�‰�}Ñ%÷ 
)ð 
×	Ñ	˜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Ø× Ñ  Ñ'ó/
ˆ×Ñ˜]Ñ+÷ 
/ð 
×	Ñ	˜Õ	/Ø×&Ñ&Ü�I‰I�N‰N×Ñ×%Ñ%Ø!Ð'ð 'ð 
ˆô  %Ÿy™yŸ~™~×1Ñ1×8Ñ8Ø× Ñ  Ñ'¨ó 
ˆ�‰�eÑô (?¸x¿}¹}ÈUÑ?SÓ'Tˆ�‰�mÑ$÷ 
0ð 
×	Ñ	˜xÕ	(Ø×(Ñ(Ü�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ˆ
�‰˜Ñ&÷ 
)ð Ð÷I 
%Ö	$ú÷ 
)Ö	(ú÷ 
*Ö	)ú÷ 
-Ö	,ú÷ 
/Ö	.ú÷ 
0Ö	/ú÷ 
)Ô	(ð ÐúsZ   ’B0WÃB6W)Æ*CW;ÊB1XÍB0XÐ$B1X1Ó.CY×
W&×)
W8×;
X
Ø
XØ
X.Ø1
Y Ù
Yc           	     ó	  • U R                  U5         U R                  [        R                  R                  R
                  R                  U[        R                  4S9n[        R                  R                  R
                  R                  UR                  S   [        R                  5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  Xr4S9n[        R                  R                  R                  R                  UR                  S   UR                  S   5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [        R                  R                  R                  R                  X„4S9n	[        R                  R                  R                  R                  UR                  S   U5      U	R                  S'   [        U	R                  S   5      U	R                  S'   S S S 5        U R                  W	5         U R                  [        R                  R                  R                  R                  X•4S9n
[        R                  R                  R                  R                  U	R                  S   U5      U
R                  S'   [        U
R                  S   5      U
R                  S'   S S S 5        U R                  W
5         U R                  [        R                  R                  R
                  R                  X£4SU SUR                   3S9n[        R                  R                  R
                  R                  U
R                  S   U5      UR                  S'   [        UR                  S   5      UR                  S'   S S S 5        U$ ! , (       d  f       GNW= f! , (       d  f       GN’= f! , (       d  f       GNÚ= f! , (       d  f       GN"= f! , (       d  f       W$ = f)Nr(  r³   rD  Úfp8_quant_pos_rF  rG  )rH  rÈ   r®   rÕ   rK  rL  rØ   rR  rž   r   rÖ   rP  rQ  rN  Ú	clamp_maxrí   )r¥   rI   r\  Ú
quant_typerN  r`  rU  Útarget_node_32Úscaled_target_nodeÚclamp_min_scaled_nodeÚclamp_max_scaled_nodeÚquant_activation_nodes               rJ   Úperform_quantizationrg  -  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×$Ñ$×,Ñ,Ø$Ð0ð !4ð !
Ðô -2¯I©I¯N©N×,DÑ,D×,LÑ,LØ×#Ñ# EÑ*¨Ió-
Ð×"Ñ" 5Ñ)ô 5LØ!×&Ñ& uÑ-ó5
Ð×"Ñ" =Ñ1÷ 
3ð 
×	Ñ	Ð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÷ 
6ð 
×	Ñ	Ð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÷ 
6ð !Ð ÷u 
+Ö	*ú÷ 
/Ö	.ú÷ 
3Ö	2ú÷ 
6Ö	5ú÷ 
6Ô	5ð !Ð ús@   ’CP0Ã9B>QÇB1QÊB1Q&Í$CQ8Ð0
P?Ñ
QÑ
Q#Ñ&
Q5Ñ8
Rc                óP   • U R                  5       nU R                  5       nX-  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_elementsrj  s      rJ   Úcalculate_tensor_sizerm  s  s+   € ð —<‘<“>€LØ×&Ñ&Ó(€LàÑ'¨KÑ8Ð8rM   c            	     ó   • [         R                  R                  R                  S   R	                  SS5      n U R                  S5       Vs/ s H%  n[        [         UR                  S5      S   5      PM'     n nU $ s  snf )NÚ!activation_quantization_aten_passÚallowed_dtypesztorch.bfloat16Ú;Ú.r=  )r®   Ú	_inductorr   Úpost_grad_fusion_optionsrŸ   ÚsplitrÅ   )rp  Údtypes     rJ   Úget_allowed_dtypesrw  „  s}   € Ü—_‘_×+Ñ+×DÑDØ+ñç	�cÐ
Ð,Ó-ð ð ;I×:NÑ:NÈsÔ:SóÚ:S°Œ”�u—{‘{ 3Ó'¨Ñ+Ö,Ñ:Sð ð ð Ðùòs   Á,A;c                ón  • [        5       n[        U 5      (       a  U R                  S   R                  U;  a  g[        R
                  R                  R                  S   R                  SS5      n[        U R                  S   5      n[        R
                  R                  R                  S   R                  SS5      (       d  X2:¬  $ [        R
                  R                  R                  S   R                  SS5      (       a&  [        X2:¬  5      =(       d    [        X2:¬  5      (       + $ [        X2:¬  5      $ )Nr³   Fro  Ú
size_in_mbéd   Úskip_dynamo_guardsÚquantize_dynamic_shape)rw  r   rž   rv  r®   rs  r   rt  rŸ   rm  r"   r!   )rI   rp  Úsize_thresholdry  s       rJ   Úshould_quantizer~  Ž  s  € Ü'Ó)€NÜ˜d×#Ñ# t§y¡y°Ñ'7×'=Ñ'=À^Ó'SØÜ—_‘_×+Ñ+×DÑDØ+ñç	�cˆ,˜Óð ô ' t§y¡y°Ñ'7Ó8€JÜ�?‰?×!Ñ!×:Ñ:Ø+ñç	�cÐ
 Ó&õ'ð Ñ+Ð+ô �?‰?×!Ñ!×:Ñ:Ø/ñ
ç
‰#Ð&¨Ó
.õ/ô )ØÑ,ó÷ Jä+¨JÑ,HÓIÔIðJô
 )¨Ñ)EÓFÐFrM   c                 ó´   • [         R                  R                  R                  S   R	                  SS5      n [        [         U R                  S5      S   5      $ )Nro  ra  ztorch.float8_e5m2rr  r=  )r®   rs  r   rt  rŸ   rÅ   ru  )ra  s    rJ   Úget_quant_typer€  ¨  sN   € Ü—‘×'Ñ'×@Ñ@Ø+ñç	�cˆ,Ð+Ó,ð ô ”5˜*×*Ñ*¨3Ó/°Ñ3Ó4Ð4rM   c                ó^   • [         R                  " U 5      nUR                  UR                  4$ )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®   ÚfinforT  rS  )rv  Úinfos     rJ   Úcalculate_ranger„  °  s%   € ô �;Š;�uÓ€DØ�8‰8�T—X‘XÐÐrM   c           
     ó  • U R                  SS9S   nUR                  S   n[        5       n[        U5      u  pE[	        5       n/ n/ n[        U5       GH”  u  pšU
R                  R                  SS5      (       d  M)  [        R                  R                  R                  S   R                  SS5      (       aP  [        X
US	U	5      n[        X
X³XEU	5      n[        U5      (       d  UR                  U5        OíUR                  U5        OÛU R!                  U
5         U R#                  [        R$                  R&                  R(                  R*                  X£4S
U	 SU
R,                   3S9n[        R$                  R&                  R(                  R+                  U
R                  S   U5      UR                  S'   [/        UR                  S   5      UR                  S'   S S S 5        WXi'   GM—     [        U5       VV
s/ s H  u  pÚUR                  XÚ5      PM     nnn
[1        U5      nXx-   nU(       a  US U U-   XïS  -   nUR3                  S[5        U5      5        [6        S   S==   S-  ss'   g ! , (       d  f       N˜= fs  sn
nf )Nrê   r,  r   Úsaved_for_quantizationFro  Úuse_scalingTçê-�™—q=r_  rF  rG  r³   rD  ÚinductorÚ%activation_quantization_fwd_aten_passr&   )r-  rÌ   r€  r„  ÚdictÚ	enumeraterž   rŸ   r®   rs  r   rt  r]  rg  r   rù   rH  rÈ   rÕ   rK  rL  rØ   rí   r   rB  Ú
update_argrú   r   )r¥   rê   r2  ra  rN  r`  Úposition_to_quantÚtensor_scale_nodesÚsym_scale_nodesrU  rI   r\  Ú
quant_noderA  Úoutput_updated_argsr@  Úscale_nodess                    rJ   Úquantize_activation_fwr”  ¼  s_  € Ø×Ñ ÐÐ*¨1Ñ-€FØ—+‘+˜a‘.€KÜÓ!€JÜ*¨:Ó6Ñ€IÜ›ÐØ(*ÐØ%'€OÜ# K×0‰ˆà�9‰9�=‰=Ð1°5×9Ó9ä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó&õ'ô <Ø ¨E°8ó�
ô
 2Ø ¸Èxó�
ô # :×.Ñ.Ø&×-Ñ-¨jÕ9à#×*Ñ*¨:Õ6ð ×*Ñ*¨4Õ0Ø!&×!4Ñ!4ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð/Ø-¨h¨Z°q¸¿¹¸ÐDð "5ð "�Jô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨jóð —O‘O EÑ*ô
 6MØ"Ÿ™¨Ñ.ó6�J—O‘O MÑ2÷ 1ð +5ÐÔ'ñK 1ôT 7@ÀÔ6LôÚ6L©7¨1Ð×Ñ˜aÖ&Ñ6Lð ñ ô
 Ð1Ó
2€CØ$Ñ6€KÞà  Ð%¨Ñ3Ð6IÈ$Ð6OÑOð 	ð ×Ñ�aœÐ2Ó3Ô4ÜˆZÑÐ@ÓAÀQÑFÔA÷A 1Õ0üó&s   ÄCI,Ç9I=É,
I:	c           
     óR
  ^	• U R                    Vs/ s H  oR                  S:X  d  M  UPM     nnS nU GH  nUR                  R                  SS5      (       d  M'  UR                  R	                  S5        UR                  R	                  S5      n[
        R                  R                  R                  S   R                  SS5      (       Gaº  U R                  U5         SUR                  R                  SS	5      -   m	[        U	4S
 jU 5       5      nS S S 5        U R                  W5         U R                  [
        R                  R                  R                   R"                  X4S9n[
        R                  R                  R                   R#                  UR                  S   U5      UR                  S'   [%        UR                  S   5      UR                  S'   S S S 5        U R                  U5         U R                  [
        R                  R&                  R(                  R*                  X54S9n[
        R                  R&                  R(                  R+                  UR                  S   UR                  S   5      UR                  S'   [%        UR                  S   5      UR                  S'   S S S 5        U R                  W5         U R                  [
        R                  R                  R                   R"                  Xd4S9n[
        R                  R                  R                   R#                  UR                  S   U5      UR                  S'   [%        UR                  S   5      UR                  S'   S S S 5        OáU R                  U5         U R                  [
        R                  R                  R                   R"                  X4S[-        UR                  5      -   S9n[
        R                  R                  R                   R#                  UR                  S   U5      UR                  S'   [%        UR                  S   5      UR                  S'   S S S 5        [/        UR0                  R3                  5       5       H#  nUW:w  d  M  Xƒ:w  d  M  UR5                  X5        M%     GM‚     [6        S   S==   S-  ss'   g s  snf ! , (       d  f       GNÅ= f! , (       d  f       GN= f! , (       d  f       GNH= f! , (       d  f       N­= f! , (       d  f       N¾= f)Nrâ   r†  FÚdequant_typero  r‡  Ú
fp8_scale_Ú
fp8_quant_Ú c              3  óL   >#   • U  H  nUR                   T:X  d  M  Uv •  M     g 7frF   ©rí   )ru   Ú	bwd_inputÚ
scale_names     €rJ   rw   Ú)quantize_activation_bw.<locals>.<genexpr>  s&   øé € ð &â)2˜IØ$Ÿ>™>¨ZÑ7÷ "™	Ú)2ùs   ƒ$›	$r(  r³   rD  Údequant_rG  r‰  Ú%activation_quantization_bwd_aten_passr&   )r¦   rÏ   rž   rŸ   Úpopr®   rs  r   rt  rH  rí   r   r.  rÈ   rÕ   rK  rL  rØ   r   rÖ   ÚdivrQ  rÁ   ÚlistÚusersÚkeysÚreplace_input_withr   )
r¥   rI   Ú	bw_inputsÚactivation_noder–  r\  Údivided_target_node_32Údequant_nodeÚuserr�  s
            @rJ   Úquantize_activation_bwr¬  ý  s,  ø€ Ø"'§+¢+ÓJ¢+˜$·±¸MÑ1I—¡+€IÐJØ€OÜˆØ�9‰9�=‰=Ð1°5×9Ó9Ø�I‰I�M‰MÐ2Ô3ØŸ9™9Ÿ=™=¨Ó8ˆLä�‰×%Ñ%×>Ñ>Ø3ñç‰c�- Ó'ö(ð ×*Ñ*¨4Õ0à!-°·	±	×0AÑ0AÀ,ÐPRÓ0SÑ!S�JÜ!%ô &á)2ó&ó "�J÷ 1ð ×*Ñ*¨:Õ6Ø&+×&9Ñ&9ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð1ð ':ð '�Oô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð $×(Ñ(¨Ñ/ô
 ;RØ'×,Ñ,¨UÑ3ó;�O×(Ñ(¨Ñ7÷ 7ð ×*Ñ*¨?Õ;Ø-2×-@Ñ-@ÜŸ	™	Ÿ™×*Ñ*×1Ñ1Ø-Ð:ð .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ÐCð $7ð $�Lô
 Ÿ	™	Ÿ™×<Ñ<×DÑDØ2×7Ñ7¸Ñ>Àóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ CÐBð ×*Ñ*¨4Õ0Ø#(×#6Ñ#6ÜŸ	™	Ÿ™×<Ñ<×DÑDØ"Ð1Ø'¬#¨d¯i©i«.Ñ8ð $7ð $�Lô Ÿ	™	Ÿ™×<Ñ<×DÑDØ ŸI™I eÑ,¨lóð !×%Ñ% eÑ,ô
 8OØ$×)Ñ)¨%Ñ0ó8�L×%Ñ% mÑ4÷ 1ô ˜TŸZ™ZŸ_™_Ó.Ö/�Ø˜<Õ'¨DÕ,CØ×+Ñ+¨DÖ?ô 0ñM ôT ˆZÑÐ@ÓAÀQÑFÔAùòY K÷ 1Ö0ú÷ 7Ö6ú÷ <Ö;ú÷ CÕBú÷ 1Õ0úsJ   �S§SÃ5SÄ,B1S#Ç6B>S5ËB1TÎCTÓ
S 	Ó#
S2	Ó5
T	Ô
T	Ô
T&	c                óô  ^ ^• [        SS U 4S jS9  [        T R                  5        [        SS U 4S jS9  [        SS U4S jS9  T R                  R                  S	S
9S   R                  S   nU Hÿ  nSUR
                  ;   d  M  U[        R                  " SSUR
                  5         nTR                  R                  U5         TR                  R                  UR
                  S9nS S S 5        UR                  S   nWR                  R                  UR                  5        SUR                  S'   XvR                  S'   UR                  U5        TR                  R                  U5        GM     [        R                  R                   R"                  S   R%                  SS5      (       aÿ  ['        TR                  R                  SS
95      nUS   n	[)        U5       H  n
[+        U
5      (       a  M  U
n	  O   T R                  R                  S	S
9S   R                  S   nU Hƒ  nSUR
                  ;   d  M  TR                  R                  U	5         TR                  R                  UR
                  S9nS S S 5        WR                  R                  UR                  5        Un	M…     [-        TR                  5        [        SS U4S jS9  g ! , (       d  f       GNò= f! , (       d  f       Nq= f)NÚartifactc                 ó   • SSS.$ )NÚ,before_activation_quantization_fwd_aten_passÚstring©rí   ÚencodingrZ   rZ   rM   rJ   rz   Ú5perform_fp8_activation_quantization.<locals>.<lambda>T  ó   € ØBØ ò
rM   c                 ó&   >• T R                  SSSS9$ ©NFT©Úprint_outputÚinclude_strideÚinclude_device©Úprint_readable©Ú
fwd_modules   €rJ   rz   r´  X  ó   ø€ ˜:×4Ñ4Ø¨tÀDð 5ñ 
rM   ©Úmetadata_fnÚ
payload_fnc                 ó   • SSS.$ )NÚ+after_activation_quantization_fwd_aten_passr±  r²  rZ   rZ   rM   rJ   rz   r´  a  ó   € ØAØ ò
rM   c                 ó&   >• T R                  SSSS9$ r·  r¼  r¾  s   €rJ   rz   r´  e  rÀ  rM   c                 ó   • SSS.$ )NÚ,before_activation_quantization_bwd_aten_passr±  r²  rZ   rZ   rM   rJ   rz   r´  l  rµ  rM   c                 ó&   >• T R                  SSSS9$ r·  r¼  ©Ú
bwd_modules   €rJ   rz   r´  p  rÀ  rM   rê   r,  r   r˜  z^fp8_quant_pos_\d+_r™  r›  r–  Tr†  ro  r‡  râ   r=  r—  c                 ó   • SSS.$ )NÚ+after_activation_quantization_bwd_aten_passr±  r²  rZ   rZ   rM   rJ   rz   r´  �  rÆ  rM   c                 ó&   >• T R                  SSSS9$ r·  r¼  rË  s   €rJ   rz   r´  ¡  rÀ  rM   )r   r”  r¥   r-  rÌ   rí   ÚreÚsubrH  râ   rž   ÚupdateÚreplace_all_uses_withÚ
erase_noder®   rs  r   rt  rŸ   r£  Úreversedr5   r¬  )r¿  rÌ  Úbwd_module_inputsÚ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ß  M  s¢  ù€ ô
 Øñ
ô
ò	ô ˜:×+Ñ+Ô,äØñ
ô
ò	ô Øñ
ô
ò	ð  *×/Ñ/×:Ñ:¸hÐ:ÐGÈÑJ×OÑOÐPQÑRÐã,ˆØ˜8Ÿ=™=Õ(Ø)Ü—’Ð-¨r°8·=±=ÓAñˆIð ×!Ñ!×1Ñ1°)Õ<Ø",×"2Ñ"2×">Ñ">ÀHÇMÁMÐ">Ð"R�÷ =à$Ÿ>™>¨.Ñ9ˆLØ× Ñ ×'Ñ'¨¯©Ô6Ø=AˆO× Ñ Ð!9Ñ:Ø3?× Ñ  Ñ0Ø×+Ñ+¨OÔ<Ø×Ñ×'Ñ'¨	×2ñ -ô ‡�×Ñ×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ˆHØ˜xŸ}™}Õ,à×%Ñ%×5Ñ5°mÕDØ&0×&6Ñ&6×&BÑ&BÈÏÉÐ&BÐ&V�O÷ Eà×$Ñ$×+Ñ+¨H¯M©MÔ:Ø /’ñ 2ô ˜:×+Ñ+Ô,äØñ
ô
ó	÷? =Ö<ú÷0 EÕDús   Ã$KÉ$K)Ë
K&	Ë)
K7	c                ót  • [         R                  R                  SS 5       c  g U(       a  U Vs/ s H  oDR                  PM     snO/ nU  Vs0 s H  oDR                  U_M     nn[        R
                  R                  R                  S   R                  SS5      (       a/  U  Vs0 s H"  nSUR                  ;  d  M  UR                  U_M$     nnUR                  R                  SS9S   R                  S   nUR                  R                  SS9 Vs0 s H  oDR                  U_M     nnSn	U HÝ  nUR                  U;   d  M  [        U5      (       d  M'  UR                  U;   a"  [        R                  S	UR                  5        MY  S
UR                  S'   UR                  S   R                  UR                  S'   S
X„R                     R                  S'   UR                  S   R                  X„R                     R                  S'   S
n	Mß     U	(       a  [        XU5        g g s  snf s  snf s  snf s  snf )Nro  Úexclude_primalsFÚprimalsrê   r,  r   râ   z*Skipping quantization of static input %s: Tr†  r³   r–  )Úinductor_configrt  rŸ   rí   r®   rs  r   r¥   r-  rÌ   r~  r<   Údebugrž   rv  rß  )
r9  r¿  rÌ  rq   rI   Ústatic_input_namesÚsaved_values_namesr?  rÖ  Úshould_perform_fp8_quants
             rJ   Úenable_activation_quantizationrè  §  s  € ô 	×0Ñ0×4Ñ4Ø/°ó	
ð ñ	ð
 	ö 'ñ  ;Ó;Ò:�t�ŒÑ:Ò;àð ñ
 7CÓC²l¨dŸ)™) Tš/±lÐÐCÜ‡�×Ñ×6Ñ6Ø+ñç	�cÐ
˜UÓ#õ$ñ )5ó
Ú(4 ¸	ÈÏÉÑ8R‹OˆD�I‰I�tŠO©ð 	ð 
ð $×)Ñ)×4Ñ4¸Ð4ÐAÀ!ÑD×IÑIÈ!ÑLÐà$.×$4Ñ$4×$?Ñ$?À=Ð$?Ñ$QóÚ$Q˜D�	‰	�4ŠÑ$Qð ð ð  %ÐÛ"ˆØ�9‰9Ð*Õ*¬¸t×/DÓ/DØ�y‰yÐ.Ó.Ü—	‘	ÐFÈÏ	É	ÔRÙØ26ˆD�I‰IÐ.Ñ/Ø(,¯	©	°%Ñ(8×(>Ñ(>ˆD�I‰I�nÑ%àJNÐŸi™iÑ(×-Ñ-Ð.FÑGØ@DÇ	Á	È%Ñ@P×@VÑ@VÐŸi™iÑ(×-Ñ-¨nÑ=Ø'+Ò$ñ #ö  Ü+¨JÐDUÕVð  ùò9 	<ùò Dùò
ùòs   ¯H&ÁH+Â%H0Â=H0ÄH5)rq   c               óÀ	  • [        XS9u  pVpxU R                  R                  SS9n	/ [        [        U	5      Qn
/ [        [
        U	5      Qn/ [        [        U	5      Qn/ [        [        U	5      Qn/ [        [        U	5      Qn[        U R                  X!-   U-   U-   UUS5      n[        R                  R                  5       nUR                  SS9 HÒ  nUR                  (       d.  [        UUR                  5        [        UUR                  5        MB  U(       aO  [!        S UR                   5       5      (       a.  [        UUR                  5        [        UUR                  5        M˜  [        U5      (       d  Mª  [        UUR                  5        U(       a  MÉ  [#        S5      e   [%        5       n/ n/ nU HJ  n['        U5      nU(       a$  UR)                  U5        UR+                  U5        M9  UR+                  U5        ML     [-        U R                  5      n[.        R0                  " UX5       Hc  nSUR2                  ;  a  M  [5        UR2                  S   5      U-
  n[7        US S	9 H  nUU;  a  M  UR+                  UU   5        M!     UU-  nMe     UR9                  5         UR;                  UU-   5        / n/ n/ nU H‰  n[=        UR2                  R?                  S5      [@        5      (       a  UR+                  U5        MD  UR2                  R?                  S
S5      (       a  UR+                  U5        Mx  UR+                  U5        M‹     UR9                  5         UR;                  UU-   5        [C        U5      n[E        U5       HL  u  nnUU:¼  d  M  UR2                  R?                  S
S5      (       a  M1  [#        SU SU S[C        U5       35      e   [        U R                  X¬-   XQ-   U-   U-   U[G        [C        U5      [C        U5      -   [C        U5      -   5       Vs/ s H.  nUU:¼  a  U[C        U5      :  a  [I        U5      O
[K        U5      PM0     sn-   S5      n[        U R                  UU-   U-   U-   U-   U-   UUS5      n[L        RN                  RQ                  U U5      n[L        RN                  RQ                  X5      n [S        UUU U5        UU 4$ s  snf )N©r1  râ   r,  rà   c              3  óÔ   #   • U  H^  nUR                   [        R                  R                  R                  R
                  L =(       a    [        UR                  5      S :H  v •  M`     g7f©r   N)r­   r®   rÕ   rÄ   Úwait_tensorrØ   rø   r¤  rt   s     rJ   rw   Ú+_extract_fwd_bwd_modules.<locals>.<genexpr>û  sR   é € ð )
ò  �ð �H‰HœŸ	™	×2Ñ2×>Ñ>×FÑFÐF÷ "Ü�A—G‘G“ Ñ!ô"âùs   ‚A&A(z'backward_state_inputs must not be emptyr³   c                ó   • U R                   $ rF   r›  )Úss    rJ   rz   Ú*_extract_fwd_bwd_modules.<locals>.<lambda>"  s   € °1·6²6rM   r|   Úsaved_tensor_with_no_vc_checkFzi=z, no_vc_check_start_idx=z, len(saved_values)=rá   )*r6  r¥   r-  Úfilterr4   r5   r3   r2   r  r	  r®   ÚdistributedÚis_availabler¤  r;  rí   ÚallrŽ   r$   r   Úaddrù   r   Ú	itertoolsÚchainrž   r   r~   ÚclearÚextendrµ   rŸ   r   rø   rŒ  r>  r/   r.   rÍ   Ú_lazy_graph_moduleÚ_make_graph_modulerè  )!r0  r9  Úsaved_sym_nodesr1  rq   r2  r3  r4  r5  Ú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_idxrA  Ú	fwd_graphr¿  rÌ  s!                                    rJ   Ú_extract_fwd_bwd_modulesr  Ö  s×  € ô 	! ÑOñ C€KÐ/ð  ×%Ñ%×0Ñ0°MÐ0ÐB€LØ7”fœZ¨Ó6Ð7€MØ9”vœk¨<Ó8Ð9€NØIœvÔ&9¸<ÓHÐIÐØIœvÔ&9¸<ÓHÐIÐØGœfÔ%7¸ÓFÐGÐä2Ø×ÑØÑ&¨Ñ7Ð:PÑPØØØó€Iô  ×+Ñ+×8Ñ8Ó:Ðà×$Ñ$¨Ð$Ó6ˆà�z�zÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÖ7ö
 !¤Sñ )
ð —Z’Zó)
÷ &
ñ &
ô
 ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÖ7Ü ×%Ó%ä˜L¨$¯)©)Ô4ß(Ð(Ü$Ð%NÓOÐOñ) 7ô4 /9«l€MØ ÐØ Ðó  ˆÜ*¨4Ó0ˆÞØ×Ñ˜fÔ%Ø#×*Ñ*¨4Ö0à#×*Ñ*¨4Ö0ñ  ô 3°<×3EÑ3EÓF€OÜ—’Ð 7¸ÖVˆØ˜Ÿ	™	Ó!ÙÜ" 4§9¡9¨UÑ#3Ó4°}ÑDˆä˜Ñ)9Ô:ˆAð ˜Ó'ÙØ#×*Ñ*¨?¸1Ñ+=Ö>ñ ;ð 	˜Ñ$Šñ Wð" ×ÑÔØ×ÑÐ2Ð5LÑLÔMð "$ÐØ!ÐØÐÛˆä�d—i‘i—m‘m EÓ*Ô,<×=Ñ=Ø ×'Ñ'¨Ö-Ø�Y‰Y�]‰]Ð:¸E×BÑBØ$×+Ñ+¨DÖ1à&×-Ñ-¨dÖ3ñ ð ×ÑÔØ×ÑÐ2Ð5MÑMÔNÜÐ :Ó;Ðô ˜\Ö*‰ˆˆ4ØÐ%Õ%Ø—9‘9—=‘=Ð!@À%×HÓHÜ$Ø˜˜Ð3Ð4IÐ3JÐJ^Ô_bÐcoÓ_pÐ^qÐróð ñ +ô 3Ø×ÑØÑ.ØÑ"Ð%9Ñ9¸OÑKØô
 Ü�LÓ!¤CÐ(<Ó$=Ñ=ÄÀOÓ@TÑTôó	
ò�ð Ð)Ó)¨a´#°lÓ2CÓ.Cô 0°Ô2ä+¨AÓ.ò/ññ	
ñ	
ð 	ó€Iô 3Ø×ÑØØ
ñ	à
ñ	ð ñ	ð !ñ		!ð
  ñ	 ð 	ØØó€Iô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,ÓR€JÜ"Ø�j *Ð.Iôð �zÐ!Ð!ùò9
s   Ð#5S)Ústatic_lifetime_input_indicesrq   c               ó¬  ^• / nSnU R                   R                   H7  n[        U5      (       d"  [        U5      (       d  [	        U5      (       d  M5  UnM9     Uc  [        S5      eU R                   R                   H*  n[        U5      (       d  UR                  U5        XvL d  M*    O   [        S U 5       5      n[        U 5      n	[        U 5      n
U	(       aE  [        U R                   5      S   b"  [        R                  " S5        [        U UUUS9$ [        U SS9n [         R"                  (       d  [%        U 5        ['        U 5        [)        U 5        Uc  / n[+        XU5      n/ n/ n[,        R.                  R1                  5       mSS	 jnSS
 jnSU4S jjnU R                   R                   GH¢  nUR2                  U;  a  M  UR4                  S:X  a'  UR2                  S U R7                  5        5       ;   a  MM  UR8                  [,        R:                  R<                  R>                  R@                  [,        R:                  RB                  RD                  R@                  [,        R:                  RB                  RF                  R@                  [,        R:                  RB                  RH                  R@                  [,        R:                  RB                  RH                  RJ                  4;   a  GMA  [M        U5      (       a  UR                  U5        GMe  U" U5      (       a  GMu  URN                  RQ                  S5      [R        RT                  :X  a  UR                  U5        GM¶  U" U5      (       a6  U	(       a  [        SU SUR8                   35      eUR                  U5        GMù  U" U5      (       d  UR4                  S:X  a  [        SU S35      eURV                   Vs/ s H  nUR2                  U;  d  M  UPM     nn[Y        S U 5       5      (       a  UR[                  U5        GM~  []        U5      (       a  GM‘  UR                  U5        GM¥     [_        [`        Rc                  U5      Re                  5       5      n[_        [`        Rc                  U5      Re                  5       5      n[         Rf                  (       a  [g        U R                   U5      nUc  URh                  n[k        U UUUUS9u  nnUR                   Rm                  [n        S9  UR                   Rm                  [n        S9  U	(       a,  U
(       a  [q        U UU[s        U5      5      u  nn[u        U5      n[         Rv                  (       a  SSK<J;n  U" UUUU5        [{        U5      n[{        U5      n[}        USS9n[s        UR~                  5      S:”  a
  [}        USS9nUU4$ s  snf )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  ó\   #   • U  H"  oR                   S :w  d  M  UR                  v •  M$     g7f©rê   N©rÏ   rí   r)  s     rJ   rw   Ú$default_partition.<locals>.<genexpr>¥  s"   é € ð $Ú+�d¯w©w¸(Ñ/B‹	ˆ�	Ž	šmùó   ‚,™,r   zxTrying to unsafely apply AC to a non-functional graph with the default partitioner. Falling back to min-cut partitioner.)r1  r  T©Úis_default_partitionc                ó¨   • SU R                   ;   =(       d=    [        U R                   R                  S5      [        R                  R
                  5      $ )NrD  r³   )rž   rµ   rŸ   r®   Ú_subclassesÚ
FakeTensorr¢   s    rJ   Ú	is_tensorÚ$default_partition.<locals>.is_tensorÌ  s=   € Ø §	¡	Ñ)÷ 
¬ZØ�I‰I�M‰M˜%Ó ¤%×"3Ñ"3×">Ñ">ó.
ð 	
rM   c                óx   • [        S U R                   5       5      =(       a    [        U R                  5      S:„  $ )Nc              3  óZ   #   • U  H!  oR                   [        R                  :H  v •  M#     g 7frF   )r­   rÊ   rË   ©ru   r«  s     rJ   rw   Ú=default_partition.<locals>.is_multi_output.<locals>.<genexpr>Ó  s   é € ÐGºJ°D—‘œx×/Ñ/Ö/ºJùs   ‚)+r   )rö  r¤  rø   r¢   s    rJ   Úis_multi_outputÚ*default_partition.<locals>.is_multi_outputÑ  s.   € äÑG¸D¿JºJÓGÓG÷ $Ü�D—J‘J“ !Ñ#ð	
rM   c                óì   >• U R                  SS9=(       a^    U R                  S;  =(       aH    T(       + =(       d:    U R                  [        R                  R
                  R                  R                  L$ )NF)Úimpure_random)râ   rê   )Ú	is_impurerÏ   r­   r®   rÕ   rÄ   rí  rØ   )rI   r  s    €rJ   r)  Ú$default_partition.<locals>.is_impure×  sc   ø€ ð �N‰N¨ˆNÐ/÷ 	Ø—‘ðñ÷	ð (Ô'÷ UØ—;‘;¤e§i¡i×&@Ñ&@×&LÑ&L×&TÑ&TÐTð	
rM   rè   c              3  ó*   #   • U  H	  u  pUv •  M     g 7frF   rZ   )ru   ÚkÚvs      rJ   rw   r  ì  s   é € ð 3
Ú6‘$�!�AÒ6ùs   ‚r�   z.Trying to apply AC on a graph with impure op: z, rÈ   z	Expected z to be a tensorc              3  ó8   #   • U  H  n[        U5      v •  M     g 7frF   ©r   rt   s     rJ   rw   r    s   é € Ð7¢ !Œ{˜1�~ˆ~¢ùr+  ©rþ  r1  rq   )Úis_impure_noder&   ©Úenable_activation_offloadingF©r  r[   )@r¥   r¦   r  r4   r3   rŽ   r5   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_SAVEr¤  rö  rû  r£   r£  r‹  Úfromkeysr¥  Ú_sync_decision_cross_ranksrq   r  rû   rÆ   Úfunctionalize_rng_opsrø   Ú#reordering_to_mimic_autograd_enginer3  Ú,_activation_offloading.activation_offloadingr9   Úthread_graphsafe_rng_from_hopsrl   )r0  Ú_joint_inputsr1  r  rq   Úforward_nodesÚ	last_noderI   Úforward_node_namesÚgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsÚ	node_infor9  rþ  r  r%  r)  rv   Úbackward_usagesÚ	fw_moduleÚ	bw_moduler3  r  s                         @rJ   Údefault_partitionrV  y  sù  ø€ ð@ €MØ€IØ×"Ñ"×(Ô(ˆÜ˜t×$Ñ$¬
°4×(8Ñ(8Ô<OÐPT×<UÓ<UØŠIñ )ð ÑÜÐ9Ó:Ð:Ø×"Ñ"×(Ô(ˆÜ˜4× Ñ Ø× Ñ  Ô&ØÔÙñ	 )ô
 $ñ $Ù+ó$ó Ðô "6°lÓ!CÐÜ%=¸lÓ%KÐ"Þ!Ü × 2Ñ 2Ó3°AÑ6ÑBô �MŠMðLôô 7ØØØ /Ø.Kñ	ð ô .¨lÐQUÑVˆä×:×:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ñ,Ø(*Ð%ÜØ°_ó€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Ø×Ñ Ô%ÚÙ�T�?‰?Þ)Ü$ØDÀTÀFÈ"ÈTÏ[É[ÈMÐZóð ð ×Ñ Ô%ÚÙ˜�‰ 4§7¡7¨oÓ#=Ü  9¨T¨F°/Ð!BÓCÐCØ&*§j¢jÓU¢j °A·F±FÐBTÑ4TŸ1¡jˆÐUÜÑ7¡Ó7×7Ñ7ð ×"Ñ" ?Ô3ÚÜ˜d×#Ô#Ø×Ñ ×%ñg )ôj œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€Oä×(×(Ü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ÐÐùòA Vs   Ï!WÏ9Wg    €„.Ac                ó   • XR                   -  $ rF   )Úitemsize)ri  rv  s     rJ   Ú_tensor_nbytesrY  U  s   € Ø—>‘>Ñ!Ð!rM   c                ó€  ^• SS jmSU R                   ;   aÎ  U R                   S   n[        U[        5      (       a  g[        U[        [        45      (       a  [        U4S jU 5       5      $ [        U[        5      (       a#  [        U4S jUR                  5        5       5      $ [        U[        R                  5      (       a  T" U5      $ [        S[        U5       SU  35      eU R                  S:X  d;  U R                  [        R                  R                  R                   R"                  L a  g	[        S
U  S35      e)Nc                óš   • [        U [        R                  5      (       d  g[        [	        U R                  5       SS9U R                  5      $ )Nr   é   ©Úfallback)rµ   r®   rQ  rY  r    ri  rv  ©rå   s    rJ   Úobject_nbytesÚ_size_of.<locals>.object_nbytesZ  s4   € Ü˜!œUŸ\™\×*Ñ*ØÜœi¨¯©«	¸DÑAÀ1Ç7Á7ÓKÐKrM   r³   r&   c              3  ó4   >#   • U  H  nT" U5      v •  M     g 7frF   rZ   )ru   rv   r`  s     €rJ   rw   Ú_size_of.<locals>.<genexpr>g  s   øé € Ð5²¨A‘} Q×'Ð'²ùó   ƒc              3  ó8   >#   • U  H  u  pT" U5      v •  M     g 7frF   rZ   )ru   rF  rv   r`  s      €rJ   rw   rc  i  s   øé € Ð@²K©D¨A‘} Q×'Ð'²Kùs   ƒ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å   Úobjectr]   r‘   )rž   rµ   r   r£  rú   Úsumr‹  Úitemsr®   rQ  rö   r¹   rÏ   r­   rÕ   rÖ   r?  rØ   )rI   r³   r`  s     @rJ   Ú_size_ofri  Y  sþ   ø€ ôLð
 �—	‘	ÓØ�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óð rM   c           	     ó4  • SSK Jn  U" [        5      nU R                   H5  nUR                  S:X  d  M  X#R
                  R                  ==   S-  ss'   M7     [        R                  S[        UR                  5       [        R                  " S5      SS95        g )Nr   )r   rÈ   r&   ú%sT©r}   Úreverse)Úcollectionsr   r‘   r¦   rÏ   r­   r^   r<   rƒ  r~   rh  rÊ   Ú
itemgetter)r¥   r   ÚcntrI   s       rJ   Ú
_count_opsrq  v  sk   € Ý'á%¤cÓ*€CØ—”ˆØ�7‰7�oÕ%Ø—‘×$Ñ$Ó%¨Ñ*Õ%ñ ô ‡H�HˆT”6˜#Ÿ)™)›+¬8×+>Ò+>¸qÓ+AÈ4ÑPÕQrM   c                 ó¸  • / n [        [        R                  R                  5       H°  n[	        [        R                  R                  U5      n[        U[        R                  R                  5      (       d  MR  UR                  5        HJ  n[	        X#5      n[        R                  R                  UR                  ;   d  M8  U R                  U5          M®     M²     U $ rF   )Údirr®   rÕ   rÖ   rÅ   rµ   r  ÚOpOverloadPacketÚ	overloadsr¯   Ú	pointwiser«   rù   )rÕ   Ú	attr_nameÚopoverloadpacketÚoverloadÚop_overloads        rJ   Úpointwise_opsr{  €  s›   € à-/€CÜœŸ™Ÿ™Ö(ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,G×HÑHÙà(×2Ñ2Ö4ˆHÜ!Ð"2Ó=ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Õ6à—
‘
Ð+Ô,Úó 5ñ )ð €JrM   c                óú   • U  Vs0 s H=  n[        U[        R                  R                  R                  5      (       d  M8  X!U   _M?     nn[        UR                  5       [        R                  " S5      SS9$ s  snf )Nr&   Trl  )	rµ   r®   rÍ   rI   rÎ   r~   rh  rÊ   ro  )rÌ   Ú	depth_mapÚargÚ
arg_depthss       rJ   Úsort_depthsr€  ’  sk   € ñ (,óÚ'+ ¬z¸#¼u¿x¹x¿}¹}×?QÑ?Q×/RÓˆ�s‰^Ò¡tð ð ô �*×"Ñ"Ó$¬(×*=Ò*=¸aÓ*@È$ÑOÐOùòs   …7A8Á 	A8c                óÆ  ^
^^• [         R                  " 5       m0 m
U R                  R                  SS9 H  nTR	                  UU
4S j5      T
U'   M     [        U R                  R                  5       VVs0 s H  u  p!X_M	     snnmSU
UU4S jjn[        [        [        U R                  R                  5      5      nSn[        R                  nU H(  nUR                   H  nTU   U:  d  M  TU   nUnM     M*     Uc  U $ [        U R                  R                  5      STU     HZ  nUR                  S:X  d  M  UR                  [        R                   R"                  R$                  R&                  L d  MR  U" U5        M\     [        U R                  R                  5      TU   S  H  nU" U5        M     [        R                   R)                  U T5      n	U	$ s  snnf )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                ó   >• TU    $ rF   rZ   rä   s    €rJ   rz   Ú5reordering_to_mimic_autograd_engine.<locals>.<lambda>·  s	   ø€ ¸¸AºrM   c                ó8  >• U /n[        5       n[        U5      S:”  aM  UR                  5       n X;   d  U T;   a  M,  UR                  U 5        XR                  -  n[        U5      S:”  a  MM  [        UU4S jS9nU H  n TR                  U U4S j5      TU '   M     g )Nr   c                ó   >• TU    $ rF   rZ   )rv   Úorders    €rJ   rz   ÚSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>É  s	   ø€ À%ÈÂ(rM   r|   c                ó   >• TU    $ rF   rZ   rä   s    €rJ   rz   r‡  Ë  rç   rM   )r$   rø   r¡  r÷  Úall_input_nodesr~   rô   )rI   Ú	cur_nodesÚinsertable_nodesrÝ   r  r†  s      €€€rJ   Úinsert_node_in_graphÚAreordering_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Ô2BÓCˆC�‹Iò %rM   NrÈ   ©rI   r\   r]   ÚNone)rÍ   rì   r¥   r-  rô   rŒ  r¦   r£  ró  r5   ÚmathÚinfr¤  rÏ   r­   r®   rÕ   rÖ   r÷   rØ   ÚGraphModule)ÚgmrI   r@  rŒ  r  Úfirst_node_in_bwdÚminimum_orderÚtangentr«  Únew_gmrÝ   r  r†  s             @@@rJ   rI  rI  ›  s˜  ú€ ô. —’“
€IØ"$€Cð —‘×#Ñ# }Ð#Ó5ˆØ×'Ñ'¨Ô.>Ó?ˆˆD‹	ñ 6ô )2°"·(±(·.±.Ô(AÔBÒ(A™9˜3ˆTŠYÑ(AÒB€E÷Dñ 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Ù  Ö&ñ Aô �R—X‘X—^‘^Ó$ UÐ+<Ñ%=Ð%?Ó@ˆÙ˜TÖ"ñ Aô �X‰X×!Ñ! " iÓ0€FØ€Mùó[ Cs   Á6Gc                óÈ  • UR                   nUc  [        S5      eU R                  n	UR                  n
[        R                  R
                  R                  nU R                  R                  U5         U R                  R                  SU 35      n[        U5      UR                  S'   UnSSS5        UR                  R                  U5         UR                  R                  SU 35      n[        U5      UR                  S'   UnSSS5        [        UR                  5      nWUS'   U R                  R                  U5         U	R                  SUUR                  /UR                  Q7US9nSSS5        UR!                  W5        U	R#                  U5        [        UR                  5      nWUS'   U
R%                  U5         U
R                  SUUR                  /UR                  Q7US9nUR!                  U5        U
R#                  U5        SSS5        Xg4$ ! , (       d  f       GNx= f! , (       d  f       GN.= f! , (       d  f       N×= f! , (       d  f       Xg4$ = f)	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_staterH  râ   r6   rž   r‹  rÉ   Úcreate_noder­   rÌ   rÓ  rÔ  Úinserting_before)rT  rU  Ú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²  é  s  € ðR —‘€JØÑÜÐ:Ó;Ð;Ø�‰€HØ�‰€HÜ#(§<¡<×#9Ñ#9×#VÑ#VÐ ð 
�‰×	(Ñ	(¨Õ	8Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆÜ$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷ 
9ð 
�‰×	(Ñ	(¨Õ	8Ø!Ÿ™×3Ñ3°nÀYÀKÐ4PÓQˆä$?À
Ó$Kˆ×Ñ˜5Ñ!Ø&ˆ÷	 
9ô �W—^‘^Ó$€IØ*€IˆkÑØ	�‰×	(Ñ	(¨Õ	1Ø%×1Ñ1ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 2ð 
Ð÷ 
2ð ×!Ñ!Ð"4Ô5Ø×Ñ˜Ô ô �g—n‘nÓ%€JØ+€Jˆ{ÑØ	×	"Ñ	" 7Õ	+Ø×)Ñ)ØØ(Ø—.‘.Ð0 7§<¡<Ñ0Øð	 *ð 
ˆ
ð 	×%Ñ% jÔ1Ø×Ñ˜GÔ$÷ 
,ð Ð)Ð)÷M 
9Ö	8ú÷ 
9Ö	8ú÷ 
2Õ	1ú÷ 
,Ô	+ð Ð)Ð)ús1   Á29HÃ9H.Å+I ÇAIÈ
H+È.
H=É 
IÉ
I!c                óÚ  ^'• [         R                  " 5       nSS jnSS jm'SS jnU" U 5      nU" U5      nU" U5      n	0 n
U R                  R                   H¸  n[	        U5      (       d  M  [        UR                  S5      (       d  M2  [        R                  R                  UR                  R                  ;   d  Mf  UR                  U;  d  UR                  U	;  a  Mˆ  X{R                     nX‹R                     nX›R                     nXÞS.X¬'   Mº     [        R                  R                  R                  n[        R                  R                  R                  nS nUR                  R!                  SS9 H  nSUR                  ;   d  M  Un  O   Uc  [#        S	5      e/ n[%        ['        UR                  R!                  SS95      5      n[%        ['        UR                  R!                  SS95      5      n[)        U'4S
 jU
R+                  5        5       5      nUR-                  [        R.                  " S5      5        [1        U5      S:„  n[        R2                  R4                  n[4        R6                  =(       a<    U(       + =(       a.    UR8                  (       + =(       d    UR:                  R<                  n[?        U
R+                  5       5       GH   u  nnUS   nUS   nT'" U5      nUR                  nUR                  nU(       a*  Ub'  UR@                  S:X  a  [C        UUUUUUUU5      u  nnMb  URE                  U5         URG                  SUUR                  /URH                  Q7URJ                  S9nURG                  S[L        RN                  US40 S9nU" U5      URP                  S'   URG                  S[L        RN                  US40 S9n [R        RR                  " URP                  5      U l(        URU                  U 5        URW                  U5        URY                  U5        S S S 5        URE                  U5         S[%        U5       3n!UR[                  U!5      n"U" U5      U"RP                  S'   S S S 5        URE                  U5         URG                  SUW"UR                  /URH                  Q7URJ                  S9n URU                  U 5        URW                  U5        S S S 5        GM#     U(       a•  [%        []        UR                  R!                  SS95      5      n#U#RH                  S   n$[1        U$5      U-
  n%U$S U% [_        U5      -   U$U%S  -   n&UR                  Ra                  U&5        UR                  RW                  U#5        URc                  5         URc                  5         X4$ ! , (       d  f       GN’= f! , (       d  f       GNV= f! , (       d  f       GM  = f)Nc                ó&  • 0 nU R                   R                   Ht  nUR                  S:X  d  M  [        UR                  S5      (       d  M2  [
        R                  R                  UR                  R                  ;   d  Mf  X!UR                  '   Mv     U$ )NrÈ   r«   )
r¥   r¦   rÏ   r¬   r­   r®   r¯   r°   r«   rí   )ÚgmodÚrandom_nodesrI   s      rJ   Úget_rng_opsÚ*functionalize_rng_ops.<locals>.get_rng_opsb  sh   € Ø+-ˆØ—J‘J×$Ô$ˆDà—‘˜?Õ*Ü˜DŸK™K¨×0Ó0Ü—I‘I×5Ñ5¸¿¹×9IÑ9IÕIà*.˜TŸY™YÓ'ñ %ð ÐrM   c                óB  • SU R                   ;  a  gU R                   S   n[        U[        5      (       d  U4nU HL  n[        U[        R                  5      (       d  M$  UR
                  R                  S:X  d  M@  UR
                  s  $    [        R
                  " S5      $ )zF
Check the example value of the node outputs to find the device type.
r³   NÚcudaÚcpu)rž   rµ   rú   r®   rQ  r¥  r¹   )rI   Ú
candidatesÚ	candidates      rJ   Ú
get_deviceÚ)functionalize_rng_ops.<locals>.get_devicem  s�   € ð ˜Ÿ	™	Ó!Øà—Y‘Y˜uÑ%ˆ
Ü˜*¤e×,Ñ,Ø$˜ˆJã#ˆIÜ˜)¤U§\¡\×2Ó2Ø×#Ñ#×(Ñ(¨FÕ2Ø$×+Ñ+Ò+ñ $ô
 �|Š|˜EÓ"Ð"rM   c                óL  • SSK Jn  U" 5       nUc  [        S5      eU   U bF  U R                  S:X  a6  UR	                  [
        R                  R                  5       5      sS S S 5        $ UR	                  [
        R                  " 5       5      sS S S 5        $ ! , (       d  f       g = f)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_stateÚ3functionalize_rng_ops.<locals>.get_sample_rng_state  sx   € Ý2á$Ó&ˆ	ØÑÜ Ð!=Ó>Ð>ÚØÑ! f§k¡k°VÓ&;Ø ×,Ñ,¬U¯Z©Z×-EÑ-EÓ-GÓH÷ ‰Yð ×(Ñ(¬×)<Ò)<Ó)>Ó?÷ �Y�Yús   žA 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  ó:   >#   • U  H  nT" US    5      v •  M     g7f)rÈ  NrZ   )ru   Ú	node_pairr¾  s     €rJ   rw   Ú(functionalize_rng_ops.<locals>.<genexpr>±  s"   øé € ð Ú6W¨‰
�9˜UÑ#×$Ð$Ò6Wùs   ƒr»  r&   rÈ  rÉ  rº  rÈ   rœ  r   r³   Úrng_state_output_rê   )rµ  úfx.GraphModuler]   údict[str, fx.Node])rI   r\   r]   útorch.device | None)r¥  rÐ  r]   ú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ø   rs  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)(r0  rT  rU  Ú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   rH  rH  G  sƒ  ø€ ô2 �/Š/Ó
€Cô	ô#ô$	@ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ô(ˆä˜4× Ó Ü˜Ÿ™ V×,Ó,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÕEð
 �y‰yÐ 0Ó0°D·I±IÐEUÓ4UÙØ+¯I©IÑ6ˆIØ&§y¡yÑ1ˆGØ&§y¡yÑ1ˆGØ:AÑ2RÐ$Ó/ñ )ô  —|‘|×-Ñ-×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Ñˆ	�9à˜EÑ"ˆØ˜EÑ"ˆÙ˜GÓ$ˆà—?‘?ˆØ—?‘?ˆö 4ØÑ"Ø—‘˜vÓ%ä-RØØØØØØØØó	.Ñ*ˆNšNð ×*Ñ*¨7Õ3Ø%-×%9Ñ%9Ø#Ø$ð  Ÿ™ðà Ÿ™ñð #Ÿ>™>ð &:ð 	&Ð"ð !×,Ñ,Ø#Ü×$Ñ$Ø,¨aÐ0Øð	 -ð �ñ %9¸Ó$@�—
‘
˜5Ñ!à%×1Ñ1Ø#Ü×$Ñ$à*Øðð ð 2ð �
ô #'§)¢)¨G¯L©LÓ"9�
”à×-Ñ-¨jÔ9Ø×#Ñ# GÔ,Ø$×+Ñ+¨EÔ2÷C 4ðH ×*Ñ*Ð+@ÕAØ0´°c³°Ð<�
Ø$,×$8Ñ$8¸Ó$DÐ!Ù0DÀVÓ0LÐ!×&Ñ& uÑ-÷ Bð
 ×*Ñ*¨7Õ3Ø%×1Ñ1Ø#Ø&ð *ØŸ™ðð !Ÿ™ñð
 #Ÿ>™>ð 2ð 
�
ð ×-Ñ-¨jÔ9Ø×#Ñ# GÔ,÷ 4Ò3ñE !Möj Üœd 9§?¡?×#=Ñ#=ÀÐ#=Ð#JÓKÓLˆØ#×(Ñ(¨Ñ+ˆ
Ü  ›_¨}Ñ<ÐàÐ*Ð*Ð+ÜÐ(Ó)ñ*àÐ+Ð,Ð-ñ.ð 	ð
 	�‰×Ñ˜wÔ'Ø�‰×"Ñ" >Ô2Ø×ÑÔØ×ÑÔØÐÐ÷S 4Ö3ú÷H BÖAú÷
 4×3ús&   ÍC&V6Ñ5WÒAWÖ6
W	×
W	×
W*	c                ó>  • U R                   R                   Hƒ  n[        UR                  [        R
                  R                  5      (       d  M8  UR                  R                  S:X  d  MT  [        U5      (       a  Mf  [        R                  UR                  S'   M…     g)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%   rE  rž   )r0  rI   s     rJ   r:  r:  +  sg   € ð ×"Ñ"×(Ô(ˆä�t—{‘{¤E§J¡J×$9Ñ$9×:Ó:Ø—‘×%Ñ%Ð);Õ;Ü" 4×(Ó(ä%5×%?Ñ%?ˆD�I‰I�kÓ"ò )rM   c                óÌ   ^• SU4S jjmU R                   R                   HA  n[        U5      (       d  M  [        U5      (       a  M'  [	        U5      (       a  M9  T" U5        MC     g)a8  
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                ó   >• U R                    H}  nUR                  [        R                  L d  M"  T" U5        [	        UR
                  R                  S5      [        [        45      (       a  M`  [        R                  UR
                  S'   M     g )Nr³   r�   )r¤  r­   rÊ   rË   rµ   rž   rŸ   rú   r£  r%   rE  )rI   r«  Úmark_getitem_outputss     €rJ   rô  Ú6force_save_effectful_ops.<locals>.mark_getitem_outputsH  s]   ø€ Ø—J”JˆDØ�{‰{œh×.Ñ.Ô.Ù$ TÔ*Ü! $§)¡)§-¡-°Ó"6¼Ä¸×FÓFÜ-=×-GÑ-G�D—I‘I˜kÓ*ò	 rM   NrŽ  )r¥   r¦   r   r£   r  )r0  rI   rô  s     @rJ   r;  r;  :  sJ   ø€ ÷Hð ×"Ñ"×(Ô(ˆä˜D×!Ó!Ü" 4×(Ó(Ü(¨×.Ó.á  Ö&ò )rM   c                ó  • [        5       n[        U R                  R                  5       H×  nUR                  S:X  a  M  UR
                  [        R                  R                  R                  R                  L nU(       a�  [        U5      (       a  UR                  UR                  S   5        [        U5      (       aA  UR                  S   U;   a,  [        R                   UR                  S   R"                  S'   MÓ  MÕ  M×    g    g )Nrê   r   r&   r�   )r$   rÕ  r¥   r¦   rÏ   r­   r®   rÕ   rÖ   r÷   rØ   r  r÷  rÌ   r  r%   rE  rž   )r0  Úhas_mutation_in_bwrI   Úis_copy_s       rJ   r<  r<  X  sÃ   € ô 5?³LÐÜ˜×+Ñ+×1Ñ1Ö2ˆØ�7‰7�hÓÙà—;‘;¤%§)¡)§.¡.×"6Ñ"6×">Ñ">Ð>ˆÞÜ+¨D×1Ñ1Ø"×&Ñ& t§y¡y°¡|Ô4ä*¨4×0Ñ0°T·Y±Y¸q±\ÐEWÓ5WÜ1A×1KÑ1K�—	‘	˜!‘×!Ñ! +Ó.ñ 6XÑ0ñ ò! 3rM   c                ó  • U R                   [        R                  :w  a  gU R                  S   n[	        U5      [
        R                  La  [        S[	        U5       35      eSUR                  ;  =(       a    U R                  S:H  $ )NFr   z#expected parent to be fx.Node, got rD  rÈ   )
r­   rÊ   rË   rÌ   r¹   rÍ   rÎ   rŽ   rž   rÏ   )rI   Úparents     rJ   Úis_getitem_of_multi_outputrû  o  sh   € Ø‡{�{”h×&Ñ&Ó&ØØ�Y‰Y�q‰\€FÜˆFƒ|œ2Ÿ7™7Ò"ÜÐBÄ4ÈÃ<À.ÐQÓRÐRØ §¡Ñ+×J°·±¸?Ñ0JÐJrM   c               ó\  • U R                   R                   GH�  n[        U5      (       aî  UR                   Hx  n[        U5      (       d  M  SUR                  ;   d  M'  SUR                  ;   d  M9  UR                  S   UR                  S   :”  d  M[  [
        R                  UR                  S'   Mz     UR                  R                  SS5      (       aB  [        S UR                   5       5      (       d  [
        R                  UR                  S'   Mý  Mÿ  GM  SUR                  ;  d  GM  [        S UR                   5       5      (       d  GM9  [        U5      (       a   SUR                  S   R                  ;   a  GMi  U(       d  GMs  [
        R                  UR                  S'   GM“     U $ )zñ
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  ó8   #   • U  H  n[        U5      v •  M     g 7frF   ©r£   r#  s     rJ   rw   Ú)cleanup_recompute_tags.<locals>.<genexpr>‹  s   é € ð EÚ1;¨”˜t×$Ð$²ùr+  c              3  ó8   #   • U  H  n[        U5      v •  M     g 7frF   r   r#  s     rJ   rw   r  ¡  s   é € Ð@²Z¨T”N 4×(Ð(²Zùr+  r   )r¥   r¦   r£   r¤  rž   r%   rE  rŸ   ró   rû  rÌ   )r0  r  rI   r«  s       rJ   r8  r8  x  sH  € ð ×"Ñ"×(Õ(ˆÜ˜$×ÑØŸ
œ
�ä" 4×(Ó(Ø%¨¯©Õ2Ø%¨¯©Õ2ØŸ	™	 -Ñ0°4·9±9¸]Ñ3KÕKä-=×-GÑ-G�D—I‘I˜kÓ*ñ #ð �y‰y�}‰}Ð0°%×8Ñ8Äñ EØ15·²óE÷ Bñ Bô& *:×)CÑ)C�—	‘	˜+Ó&ñ'BÒ8ð*  §¡Ö*ÜÑ@°T·Z²ZÓ@×@Ô@ô +¨4×0Ñ0°]ÀdÇiÁiÐPQÁl×FWÑFWÖ5Wç$Ñ$ô &6×%?Ñ%?ˆD�I‰I�kÔ"ñW )ðX ÐrM   c                óz  ^^^^=^>^?^@^A^B^C^D^E^F^G^H^I^J^K^L• Tc
  [        5       m[        5       mJ[        (       aQ  [        S U R                   5       5      nU[        S TJR                   5       5      -
  n[
        R                  SU5        SNS jm>SNS jm?SNU>U?UJ4S jjmB SS KmHSOUBUUJ4S	 jjmDSPUDUUJ4S
 jjnSOUB4S jjmC      SQUCUJ4S jjnTHR                  " 5       mI[        5       m=SRSSU=UUIUJ4S jjjn	U R                   GHü  n
U
R                  S:X  a  M  U
TR                  ;   am  U
TR                  ;  a.  TIR                  U
R                  S-   S[         R"                  SS9  O/TIR                  U
R                  S-   S[         R"                  SS9  M“  [%        U
5      (       a/  TIR                  U
R                  S-   S[         R"                  SS9  MÒ  ['        U
5      (       a
  U	" U
S5        O[)        U
5      (       a	  U	" U
S5        U" U
5      nTR+                  U
5      (       a  U(       a  U	" X«5        SU
R,                  ;  =(       a    SU
R,                  ;  =(       dB    SU
R,                  ;   =(       a,    [/        U
R,                  S   [0        R2                  5      (       + n[5        U
5      (       a  [7        [9        U
5      5      nS nOhU(       aL  [/        U
R,                  R;                  S5      [<        [>        45      (       a  SnS nO([         R"                  nSnOU" U
TR@                  5      u  pÞU(       aN  U[         R"                  :X  d
  U[B        :X  a0  TIR                  U
R                  S-   U
R                  S-   USU 3S9  O+TIR                  U
R                  S-   U
R                  S-   US9  U
RD                   H=  nTIR                  U
R                  S-   UR                  S-   [         R"                  SS9  M?     GMÿ     STUBU4S  jjnTRF                  (       GaR  TRH                   GHA  nURD                   Vs/ s H,  nTR+                  U5      (       d  M  TRK                  U5      PM.     nnURD                   Vs/ s H  nTR+                  U5      (       d  M  UPM     nn[M        U5      S:”  d  MŒ  U" U[O        U5      5      n[Q        URD                  5       HŠ  nTR+                  U5      (       d  M  TRK                  U5      U:”  d  M2  TB" UU5      (       d  MB  UT=;   a  MJ  [
        R                  S!UTRK                  U5      UUTRK                  U5      5        U	" U5        MŒ     GMD     TRR                  (       Ga„  [        5       nU R                   GHi  nTR+                  U5      (       d  M  TRK                  U5      U4/nTRK                  U5      n[M        U5      S:”  d  MR  [T        RV                  " U5      u  nnUU;   a  M2  URY                  U5        TRK                  U5      US"-   :”  aP  [M        U5      S:X  aA  [
        R                  S#UUTRK                  U5      TRK                  U5      5        U	" U5        Mì  URD                   H[  nTR+                  U5      (       d  M  TB" UU5      (       d  M+  UT=;  d  M3  [T        RZ                  " UTRK                  U5      U45        M]     [M        U5      S:”  a  GM  GMl      THR\                  " TIS$S5      u  nnUu  n5mG[        5       n6UI4SE jU5 5        H"  u  mLn7U6R‹                  UGUL4SF jU7 5       5        M$     [        5       n8U6 H?  u  n9n:U9S SG U:S SH :w  a  [�        SIU9S SG  SJU:S SH  35      eU9S SG n-U8RY                  U-5        MA     [�        U 5      mE[‘        U R                  5       V;V
s0 s H  u  n;oªU;_M
     sn
n;mF[“        UE4SK jU8 5       UF4SL jSM9n<U<T=4$ ! [         a  n[        S5      UeS nAff = fs  snf s  snf ! THR^                   Ga0  n[a        [b        Rd                  5      nS nS mAU Rf                  n  U (       a  U Ri                  S%S&S&S'9O
[k        U 5      mA[m        S(S) UA4S* jS+9  [o        S,S-5      n[q        US.5       n!U!Rs                  TA5        S S S 5        O.! , (       d  f       O = f! [t         a  nS/U S03n S nAOS nAff = fS1Rw                  THRx                  Rz                  R}                  TI5      5      m@[m        S(S2 U@4S3 jS+9  [        TI5      n"U"(       GaÑ  0 n#S$/n$SUS4 jn%U" Hë  u  n&n'n(U$R�                  U'5        U&S$:X  a+  U%" U'5      n)U#Rƒ                  U)/ 5      R�                  U(5        MI  U'S:X  a+  U%" U&5      n)U#Rƒ                  U)/ 5      R�                  U(5        Mz  U%" U&5      U%" U'5      :X  a+  U%" U&5      n)U#Rƒ                  U)/ 5      R�                  U(5        M·  U%" U&5      n*U%" U'5      n+U#Rƒ                  U+/ 5      R�                  S5U* 35        Mí     / n,U#R…                  5        H8  u  n-n.U,R�                  S6U- S735        U. H  n/U,R�                  S8U/ 35        M     M:     S1Rw                  U,5      n0S9Rw                  U$5      n1[‡        TI5      u  n2mKTK(       a  [m        S(S: UK4S; jS+9  U(       a  S<U S13OSn3U2(       a	  U3S=U2 S13-  n3Sn4U(       a  S>n4[        S?U0 S@U1 S1U3 U4 35      Ue[
        R                  SA5        [
        R                  SB[‰        UHUI4SC j5      5        [‡        TI5        e S nAf[t         aF    [
        R                  SA5        [
        R                  SB[‰        UHUI4SD j5      5        [‡        TI5        e f = fs  sn
n;f )VNc              3  ó¾   #   • U  HS  nUR                   S :X  d  M  [        UR                  S5      (       d  M2  [        UR                  R                  5      v •  MU     g7f)rÈ   Ú_overloadpacketN)rÏ   r¬   r­   rÁ   r  r)  s     rJ   rw   Ú solve_min_cut.<locals>.<genexpr>»  sK   é € ð &
â)�Ø�w‰w˜/Ñ)ó -ä.5°d·k±kÐCT×.Uó -ŒC�—‘×+Ñ+×,Ð,Ú)ùs   ‚AšA·&Ac              3  ó8   #   • U  H  n[        U5      v •  M     g 7frF   )rÁ   ©ru   rA  s     rJ   rw   r  À  s   é € ð 4
Ú5�qŒC��FˆFÒ5ùr+  z&Ops banned from re-materialization: %sc                óX  • UR                   [        R                  R                  R                  :w  a  gUR
                  S   n[        R                  R                  R                  U5      u  nnU H6  nUR                  U   nXL a    g[        U[        5      (       d  M/  X;   d  M6    g   g©NFr   T)r­   r®   rÕ   r  Úauto_functionalizedrÌ   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsrÉ   rµ   r£  )ÚaÚbÚ
mutable_opÚmutable_arg_namesrF  rí   r~  s          rJ   Ú!can_fuse_into_auto_functionalizedÚ8solve_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ØŠxÙÜ˜#œt×$Ó$Ø•8Ùñ &ð rM   c                óè   • UR                   [        R                  R                  R                  :w  a  gUR
                  S   nU H*  nUR
                  S   nUc  [        S5      eXC   nXL d  M*    g   g)NFÚtensors_to_clonerÉ   zkwargs must not be NoneT)r­   r®   rÕ   r  r  rÉ   rŽ   )r  r  r  rí   rÉ   r~  s         rJ   Ú.can_fuse_into_triton_kernel_wrapper_functionalÚEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functionalÙ  sn   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÓNØØŸH™HÐ%7Ñ8ÐÛ%ˆDØŸ(™( 8Ñ,ˆFØ‰~Ü$Ð%>Ó?Ð?Ø‘,ˆCØŒxÙñ &ð rM   c                ó‚  >• [        U5      [        R                  :X  a  gT" X5      (       a  gT" X5      (       a  gU R                  [        R
                  L a?  U R                  S   R                  [        R                  R                  R                  L a  gTR                  U 5      =(       a    TR                  U5      $ )NTr   F)r8   rÖ   Úcatr­   rÊ   rË   rÌ   r®   rÕ   r  r  rK   )r  r  r  r  Úop_typess     €€€rJ   rK   Ú!solve_min_cut.<locals>.is_fusibleæ  s—   ø€ ô ˜1Ó¤§¡Ó)ØÙ,¨Q×2Ñ2ØÙ9¸!×?Ñ?Øà�H‰Hœ×(Ñ(Ò(Ø—‘�q‘	× Ñ Ü�y‰y×%Ñ%×FÑFòGð
 Ø×"Ñ" 1Ó%×@¨(×*=Ñ*=¸aÓ*@Ð@rM   r   zANeed networkx installed to perform smart recomputation heuristicsc                ón  >• TR                  U 5      (       a  g[        U /5      n[        U5      S:”  a‚  UR                  5       nUR                   HQ  nTR                  U5      (       d  T" X#5      (       d    gTR                  U5      (       d  M@  UR                  U5        MS     [        U5      S:”  a  M‚  gr
  )rU   r$   rø   r¡  r¤  r„   r÷  )rI   rŠ  Úcurr«  rK   rR  r  s       €€€rJ   Úis_materialized_backwardsÚ0solve_min_cut.<locals>.is_materialized_backwards   s–   ø€ Ø×Ñ˜D×!Ñ!ØÜ ˜vÓ&ˆ	Ü�)‹n˜qÓ Ø—-‘-“/ˆCØŸ	œ	�Ø ×/Ñ/°×5Ñ5¹jÈ×>SÑ>SÙØ×#Ñ# D×)Ó)Ø—M‘M $Ö'ñ	 "ô �)‹n˜qÕ ð rM   c                óä  >• U R                   S:w  a  gU R                  [        R                  L a  gU R                  R                  SS5      [        R                  :X  a  g[        R                  (       a  TR                  U 5      (       a  gU R                  [        R                  R                  [        R                  R                  4;   a  gTR                  (       a  TR!                  U 5      (       d  gO?TR#                  U 5      (       a  gTR%                  U 5      (       a  g['        U 5      (       a  gTR(                  (       a8  T" U 5      (       a+  [*        R-                  S	U [/        U R0                  5      5        g
U R2                  S:  a  U R2                  [        R4                  :”  a  gTR6                  (       a1  [9        S U R:                   5       5      n[=        U 5      nUS-  U:  a  gg)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  óz   #   • U  H1  n[        U[        R                  5      (       d  M$  [        U5      v •  M3     g 7frF   )rµ   rÍ   rÎ   ri  r  s     rJ   rw   ÚBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>A  s(   é € ð %Ú%. ´*¸QÄÇÁ×2H“”˜—�¢Yùs   ‚#;©;r´   zreduction op)rÏ   r­   rÊ   rË   rž   rŸ   r%   rE  r   Úrecompute_viewsrU   rÖ   Úlift_fresh_copyrØ   Ú
lift_freshrš   rX   rR   rO   r  r™   r<   rä  rú   r¤  Údist_from_bwÚmax_dist_from_bwr›   rg  rÌ   ri  )rI   Úinput_tensors_sizeÚoutput_sizer  Úmin_cut_optionsr  s      €€€rJ   Úshould_ban_recomputationÚ/solve_min_cut.<locals>.should_ban_recomputation  s�  ø€ à�7‰7�oÓ%ØØ�;‰;œ(×*Ñ*Ò*ØØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÓIØ%Ü×!×! h×&6Ñ&6°t×&<Ñ&<ØØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÓQØà×2×2Ø×+Ñ+¨D×1Ñ1Ø6ð 2ð ×!Ñ! $×'Ñ'Ø"Ø×,Ñ,¨T×2Ñ2Ø-Ü(¨×.Ñ.Ø'ð ×7×7Ñ<UØ÷=
ñ =
ô �I‰IÐ5°t¼UÀ4Ç:Á:Ó=NÔOØ-ð ×Ñ Ó$¨×):Ñ):¼V×=TÑ=TÓ)Tà*ð ×+×+Ü!$ñ %Ø%)§Y¢Yó%ó "Ðô # 4›.ˆKØ˜Q‰Ð!3Ó3Ø%ØrM   c                ór   >^ • T R                   S:X  a  g[        UU 4S jT R                   5       5      (       + $ )Nrâ   Tc              3  ó6   >#   • U  H  nT" TU5      v •  M     g 7frF   rZ   )ru   r«  rK   rI   s     €€rJ   rw   Ú9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>M  s   øé € ÐEº*°$‘z $¨×-Ð-º*ùs   ƒ)rÏ   rö  r¤  )rI   rK   s   `€rJ   Úis_materializedÚ&solve_min_cut.<locals>.is_materializedI  s*   ù€ Ø�7‰7�mÓ#ØäÕE¸$¿*º*ÓEÓEÔEÐErM   c           
     ó  >• [         R                  (       a  X;   a  g[        U 5      n[         R                  (       a(  TR	                  U 5      (       a  [
        R                  S4$ [        U R                  S   [        5      (       a4  [        U R                  S   [        R                  5      (       d  [        S4$ [        US[        [        U R                   S5      S5      -  -  5      nT" U 5      (       a  US4$ US	-  S4$ )
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š™™™™™ñ?rz  r&   Né   )r   Ú treat_parameters_as_free_to_saveri  r$  rU   r�  r‘  rµ   rž   r   r®   r¶   ÚINT_INFr‘   rS  rT  r'  )rI   rq   Úmem_szr1  r  s      €€rJ   Úget_node_weightÚ&solve_min_cut.<locals>.get_node_weightO  sÚ   ø€ ô ×3×3ØÓ3àÜ˜$“ˆÜ×!×! h×&6Ñ&6°t×&<Ñ&<ô —8‘8Ð=Ð=Ð=ä�d—i‘i Ñ&¬×5Ñ5ä˜dŸi™i¨Ñ.´·±×=Ñ=ÜÐ FÐFÐFô à�cœS¤ T×%6Ñ%6¸Ó!<¸aÓ@Ñ@ÑAó
ˆñ ˜4× Ñ Ø˜4�<Ðà˜A‘:˜tÐ#Ð#rM   r™  c                óF  >• TR                  U 5      (       a  gU T;   ak  [        U R                  [        R                  R
                  5      =(       a    U R                  R                  S:H  n[        R                  (       d  U(       d  g[        U 5      (       a  gSU R                  ;   a-  [        U R                  S   [        R                  5      (       a  gTR                  U 5        TR                  SU R                  S-   [        R                   U(       a  SU 3OSS9  g	)
NFrÄ   r³   rÚ   Ú_inzcannot recompute: zcannot recompute©ÚcapacityÚreasonT)rU   rµ   r­   r®   r  r  rÃ   r   r9  r£   rž   r¸   r÷  Úadd_edgerí   r�  r‘  )rI   r>  Úis_collectiveÚbanned_nodesÚdont_banÚnx_graphr  s      €€€€rJ   Úban_recomputation_if_allowedÚ3solve_min_cut.<locals>.ban_recomputation_if_allowedz  sí   ø€ Ø×Ñ˜D×!Ñ!ØØ�8Óô ˜4Ÿ;™;¬¯
©
×(=Ñ(=Ó>÷ @Ø—K‘K×)Ñ)Ð-?Ñ?ð ô ×>×>ÆmØô ˜$×ÑØà�D—I‘IÓ¤*¨T¯Y©Y°uÑ-=¼u¿~¹~×"NÑ"NØØ×Ñ˜Ôð
 	×ÑØØ�I‰I˜ÑÜ—X‘XÞ4:Ð'¨ xÑ0Ð@Rð	 	ñ 	
ð rM   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³   rD  ç        znon-tensor outputzcannot save: )r=  zdata dependencyc                ó  >• / nU  H,  n[         R                  " UT
R                  U5      US45        M.     [        U5      S:”  a»  [         R                  " U5      u  pEnU(       d  T
R                  U5      $ UR
                   Hi  nT
R                  U5      (       d  M  T
R                  U5      U:”  a  M2  T
R                  U5      UT	" XW5      4nX‚;  d  MS  [         R                  " X(5        Mk     [        U5      S:”  a  M»  U$ )zl
Finds the first unfusible node in the chain of nodes starting from
`start_nodes` and returns its position.
Tr   )ÚheapqÚheappushr�   rø   Úheappopr¤  r„   )Ústart_nodesÚ	max_rangeÚsorted_nodesrv   rF  rI   Únode_is_fusibler«  r³   rK   rR  s            €€rJ   Úfind_first_unfusibleÚ+solve_min_cut.<locals>.find_first_unfusible	  sê   ø€ ð
 9;ˆÛˆAÜ�NŠN˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÖNñ ô �,Ó !Ó#Ü',§}¢}°\Ó'BÑ$ˆA�_Þ"Ø ×-Ñ-¨dÓ3Ð3ØŸ
œ
�Ø×+Ñ+¨D×1Ó1Ø ×-Ñ-¨dÓ3°iÓ?Ù à!×.Ñ.¨tÓ4ØÙ" 4Ó.ð6�Cð
 Õ.ÜŸš |Ö9ñ #ô	 �,Ó !Õ#ð ÐrM   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rz  ztoo long %s %s %s %srÚ   FTr¸  r®  c                 ó   • SSS.$ )NÚmin_cut_failed_fx_graphr±  r²  rZ   rZ   rM   rJ   rz   Úsolve_min_cut.<locals>.<lambda>€	  s   € Ø5Ø (ò%rM   c                 ó   >• T $ rF   rZ   )Úfx_graph_strs   €rJ   rz   rU  „	  s   ø€ ¡<rM   rÁ  Úmin_cut_failed_graphz.txtÚwz(failed to write: Ú)Ú
c                 ó   • SSS.$ )NÚmin_cut_failed_edge_listr±  r²  rZ   rZ   rM   rJ   rz   rU  ‘	  s   € Ø2Ø$ò!rM   c                 ó   >• T $ rF   rZ   )Úedge_list_strs   €rJ   rz   rU  •	  s   ø€ ™}rM   c                óf   • S H*  nU R                  U5      (       d  M  U S [        U5      *  s  $    U $ )N)r;  rF  )Úendswithrø   )Ú	node_nameÚsuffixs     rJ   Úget_base_nameÚ$solve_min_cut.<locals>.get_base_name©	  s8   € Û-�FØ ×)Ñ)¨&×1Ó1Ø(¨¬C°«K¨<Ð8Ò8ñ .ð !Ð rM   zdepends on z  Ú:z    - z -> c                 ó   • SSS.$ )NÚmin_cut_failed_svgr±  r²  rZ   rZ   rM   rJ   rz   rU  Ô	  s   € Ø 4Ø$,ò)rM   c                 ó   >• T $ rF   rZ   )Úsvg_contents   €rJ   rz   rU  Ø	  s   ø€ ¡{rM   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:rk  c                 ól   >• SR                  T R                  R                  R                  T5      5      $ ©Nr[  ©ÚjoinÚ	readwriteÚedgelistÚgenerate_edgelist©ÚnxrC  s   €€rJ   rz   rU  ÿ	  ó#   ø€ ˜Ÿ	™	 "§,¡,×"7Ñ"7×"IÑ"IÈ(Ó"SÔTrM   c                 ól   >• SR                  T R                  R                  R                  T5      5      $ rl  rm  rr  s   €€rJ   rz   rU  	
  rt  rM   c              3  ó0   >#   • U  H  oTU   4v •  M     g 7frF   rZ   )ru   rv   rC  s     €rJ   rw   r  
  s   øé € Ð8ªi¨˜ ™Õ$ªiùs   ƒc              3  ó:   >#   • U  H  oT;   d  M
  TU4v •  M     g 7frF   rZ   )ru   r-  Únon_reachableÚus     €€rJ   rw   r  
  s   øé € ÐA¢d °=Ñ.@“f�q˜!•f¢dùs   ƒ	�éýÿÿÿéüÿÿÿznode_in[:-3]=z != node_out[:-4]=c              3  ó.   >#   • U  H
  nTU   v •  M     g 7frF   rZ   ©ru   rI   Úname_to_nodes     €rJ   rw   r  !
  s   øé € Ð2ª	 ˆ�dÖ	ª	ùs   ƒc                ó   >• TU    $ rF   rZ   )rå   Únode_idxs    €rJ   rz   rU  !
  s	   ø€ À(È1Â+rM   r|   )r  r\   r  r\   r]   r:   r[   )rI   r\   r]   ú
str | None)rI   r\   rq   rj   r]   ztuple[float, str | None])r™  )rI   r\   r>  rÁ   r]   r:   )rM  rh   rN  r‘   r]   r‘   )rb  rÁ   r]   rÁ   )Jr$   Úget_default_op_listr;   r¦   rD   r<   rƒ  ÚnetworkxÚImportErrorrö   ÚDiGraphrÏ   rl   rm   r?  rí   r�  r‘  r£   r4   r3   r„   rž   rµ   r®   rQ  r   Úfloatrº   rŸ   r   r   rq   r6  r¤  r—   r€   r�   rø   rS  rú   r˜   rJ  rL  r÷  rK  Úminimum_cutÚNetworkXUnboundedr:   r   ÚhandlersÚowning_moduler½  rÁ   r   Ú_get_unique_pathÚopenÚwriteÚ	Exceptionrn  ro  rp  rq  Ú_find_infinite_capacity_pathrù   Ú
setdefaultrh  Úvisualize_min_cut_graphr   rÒ  rŽ   Úget_name_to_noderŒ  r~   )Mrý   rR  r+  rB  Újoint_module_opsÚops_ignoredÚer,  r8  rD  rI   Ú
ban_reasonÚis_non_tensor_nodeÚweightÚcannot_save_reasonr«  rQ  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderrF  r  Ú	cut_valueÚ	partitionÚunbounded_excÚstructured_tracing_enabledÚfx_graph_filer0  ÚfÚinf_pathÚnode_constraintsÚraw_path_nodesrd  Ú	from_nodeÚto_noder>  ÚbaseÚ	from_baseÚto_baseÚconstraint_linesrb  ÚconstraintsÚcÚconstraints_strÚraw_path_strÚsvg_pathÚlocal_files_msgÚtlparse_msgÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outr@  r9  rA  r  r  r_  rW  rK   r1  r  r~  r€  rx  rs  rC  r  rj  ry  sM    ```                                                         @@@@@@@@@@@@@@@@rJ   Úsolve_min_cutr¾  °  sY  ÿÿú€ ð ÑÜ“<ˆÜ"Ó$€HçÒÜ%ñ &
à#×)Ò)ó&
ó 
Ðð
 '¬ñ 4
Ø$×5Ò5ó4
ó *
ñ 
ˆô 	�‰Ð9¸;ÔGôô(÷Añ Að&Û÷ñ ÷9ñ 9÷vFð&$Øð&$Ø4Gð&$à	!÷&$ð &$ðP �zŠz‹|€HÜ(2«€L÷ô ð@ ×!Õ!ˆØ�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Ù(¨Ô:ð ˜Ÿ™Ñ"×E }¸D¿I¹IÑ'E÷Uà�t—y‘yÑ ×S¬°D·I±I¸eÑ4DÄeÇlÁlÓ)SÔ%Sð 	ô �t×ÑÜœ=¨Ó.Ó/ˆFØ!%ÑÞô ˜$Ÿ)™)Ÿ-™-¨Ó.´Ô@PÐ0Q×RÑRØ�Ø%)Ñ"äŸ™�Ø%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Ñ!ÜŸ™Ø(ð	 ó ô ña "÷Rð ð4 ×,×,Ð,Ø"×4Õ4ˆIð &ŸOšOóâ+�DØ×+Ñ+¨D×1ó -�	×&Ñ& tÖ,Ù+ð ð ð "+§¢óÚ!0˜°I×4LÑ4LÈT×4R—¡ð ð ô �6‹{˜Q�Ù&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ö2�Dà!×0Ñ0°×6Ó6Ø%×2Ñ2°4Ó8Ð;NÕNÙ& y°$×7Ó7à <Ó/Ù$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÖ:ô! 3ñ 5ðP ×1×1Ð1Ü'1£|ˆØ%×+Õ+ˆJØ×+Ñ+¨J×7Ñ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�Dà!×0Ñ0°×6Ó6Ù& s¨D×1Ó1Ø ¨Õ4äŸš w°×1GÑ1GÈÓ1MÈtÐ0TÖUñ &ô) �g“, ×"Ñ"ñ ,ðFbØ!Ÿ~š~¨h¸À&ÓIÑˆ	�9ðF  )Ñ€Iˆ}Ü*4«,€FÜ8©iÖ8‰ˆˆ4Ø�‰ÕA¡dÓAÖAñ 9ô ",£€IÛ#Ñˆ�Ø�3�Bˆ<˜8 C R˜=Ó(Ü Ø ¨¨ ˜~Ð-?ÀÈÈ"À¸ÐOóð ð ˜C˜R�Lˆ	Ø�‰�iÖ ñ $ô $ KÓ0€Lä+4°[×5FÑ5FÔ+GÔHÒ+G™i˜c 4�c’	Ñ+GÒH€HÜÜ2©	Ó2Ô8Mñ€Lð ˜Ð%Ð%øôQ ó ÜØOó
àð	ûðüòH	ùò
øð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öñ% /7ð. +-ÐØ*:×*@Ñ*@Ö*BÑ&�	˜;Ø ×'Ñ'¨"¨Y¨K°qÐ(9Ô:Û$�AØ$×+Ñ+¨f°Q°C¨LÖ9ó %ñ +Cð
 #Ÿ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Ÿ   Â_= Ð9`Ñ`Ñ<` Ò` Ü`% ßn7ß=
`à`à`à%n4à6)m!á Acâ+câ=cãm!ã
c	ãcãm!ãcã
c1ã!c,ã'm!ã,c1ã1I0m!í!An4c                ó¼  • [        S/5      n[        S/ 4/5      nU(       a»  UR                  5       u  p4U R                  U5       H‹  nXQ;   a  M
  X   U   nUR	                  SS5      nU[
        R                  :X  d  U[        :X  d  MC  UR	                  SS5      nX5U4n	XI/-   n
US:X  a  U
s  $ UR                  U5        UR                  XZ45        M�     U(       a  M»  g)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>  ÚunknownrG  N)
r$   r   ÚpopleftÚ
successorsrŸ   r�  r‘  r6  r÷  rù   )rC  rž  ÚqueuerI   Ú	edge_pathÚneighborÚ	edge_datar=  r>  Únew_edgeÚnew_paths              rJ   r�  r�  &
  sÙ   € ô ˜(˜Ó$€Gô <AÀ8ÈRÀ.ÐAQÓ;R€Eæ
ØŸ-™-›/‰ˆØ ×+Ñ+¨DÖ1ˆHØÓ"ÙØ ™ xÑ0ˆIØ —}‘} Z°Ó3ˆHàœ4Ÿ8™8Ó# x´7Õ':Ø"Ÿ™ x°Ó;�Ø ¨FÐ3�Ø$ zÑ1�Ø˜vÓ%Ø#’OØ—‘˜HÔ%Ø—‘˜hÐ1Ö2ñ 2÷ ˆ%ð  rM   c                ó*  • U  U 3n[         R                  R                  U5      (       d  U$ Sn[         R                  R                  U  SU U 35      (       a2  US-  n[         R                  R                  U  SU U 35      (       a  M2  U  SU U 3$ )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&   rF  )ÚosÚpathÚexists)Ú	base_nameÚ	extensionrË  Úcounters       rJ   r‹  r‹  G
  s“   € ð
 ˆ[˜˜Ð$€DÜ�7‰7�>‰>˜$×ÑØˆà€GÜ
�'‰'�.‰.˜I˜; a¨ y°°Ð<×
=Ñ
=Ø�1‰ˆô �'‰'�.‰.˜I˜; a¨ y°°Ð<×
=Ó
=àˆ[˜˜'˜ 9 +Ð.Ð.rM   c                ó–  • SSK n SSKnUR
                  R                  U 5      R                  5       nUR                  U5      S   nUR                  5        He  nXR                  5          UR                  5          S   nUR                  [        U5      5        U[        S5      :X  d  MT  UR                  S	5        Mg     UR!                  5       R#                  S
5      n[%        SS5      n['        US5       n	U	R)                  U5        SSS5        X‡4$ ! [         a    [        R	                  SSS9   gf = f! , (       d  f       X‡4$ = f)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=  r‘  Úredúutf-8Úmin_cut_failedú.svgrY  )rƒ  Úpydotr„  r<   rƒ  Únx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelrÁ   r†  Ú	set_colorÚ
create_svgÚdecoder‹  rŒ  r�  )
rC  rs  rÖ  Ú
dot_formatÚ	dot_graphÚedger˜  rj  rµ  r§  s
             rJ   r‘  r‘  V
  s3  € ó ðÛð —‘×%Ñ% 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 Ã7D8ÄD5Ä4D5Ä8
Ec                 ó|  • / [         R                  P[         R                  P[         R                  P[         R                  P[         R
                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                  P[         R                   P[         R"                  P[         R$                  P[         R&                  P[         R(                  P[         R*                  P[         R,                  P[         R.                  P[         R0                  P[         R2                  P[         R4                  P[         R6                  P[         R8                  P[         R:                  P[         R<                  P[         R>                  P[         R@                  P[         RB                  P[         RD                  P[         RF                  P[         RH                  P[         RJ                  P[         RL                  P[         RN                  P[         RP                  P[         RR                  P[         RT                  P[         RV                  P[         RX                  P[         RZ                  P[         R\                  P[         R^                  P[         R`                  P[         Rb                  P[         Rd                  P[         Rf                  P[         Rh                  P[         Rj                  P[         Rl                  P[         Rn                  P[         Rp                  P[         Rr                  P[         Rt                  P[         Rv                  P[         Rx                  P[         Rz                  P[         R|                  P[         R~                  P[         R€                  P[         R‚                  P[         R„                  P[         R†                  P[         Rˆ                  P[         RŠ                  P[         RŒ                  P[Ž        R�                  P[         R’                  P[         R”                  P[         R–                  P[         R˜                  Pn [         R’                  [         R”                  [         Rš                  /nU[         Rœ                  [         Rž                  [         R                   [¢        R¤                  [         R¦                  [         R¨                  [         Rª                  [         R¬                  [         R®                  /	-  nUnU / [¢        R                  P[¢        R°                  P[         R²                  P[         R˜                  P[         R´                  P[¢        R¶                  P[¢        R€                  P[         R¶                  P[         R¸                  P[¢        R¤                  P[         R¬                  P[         Rº                  P[         Rœ                  P[         R¦                  P[         Rž                  P[         R¼                  P[         R¾                  P[         RÀ                  P[         RÂ                  P[         RÄ                  P[         RÆ                  P[         RÈ                  P[         RÊ                  P[         RÌ                  P[         RÎ                  P[         RÐ                  P[         RÒ                  P[         R¨                  P[         RÔ                  P[         RÖ                  P[         RØ                  P[         RÚ                  P[         RÜ                  P[¢        RÞ                  P[¢        Rà                  P-  n U [         Râ                  [         Rä                  /-  n X-  n U [ç        5       -  n U [         Rè                  /-  n U [ê         Vs/ s H  n[í        U5      PM     sn-  n [ï        U 5      n[î        [ð        S[ò        4      " [         Rô                  [         Rö                  [         Rø                  /5      n[         Rú                  [         Rü                  [         Rþ                  [         GR                   [         GR                  [         GR                  [         GR                  [         GR                  [         GR
                  [         GR                  [         GR                  /nXE-  nG[        U[ï        U5      U[ï        U5      U5      $ s  snf )N.)‰rÖ   r÷  rÑ  r¢  Úatan2rP  rS  rT  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltrI  Ú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ÚrsqrtrO  ÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardrg  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizerJ  ÚtoÚtype_asrÊ   rË   ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasr×   ÚsliceÚtrK  Úbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚselectru  rL  Ú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�  Úgatherr{  Ú
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   r‚  r‚  }
  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Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð #Ñ/€KÝØÜÐ(Ó)ØÜ�8ÓØóð ùò+ !Os   ß6d9c                óL   • 0 nU R                    H  nX!UR                  '   M     U$ rF   )r¦   rí   )r¥   r~  rI   s      rJ   r’  r’  %  s'   € Ø')€LØ—”ˆØ"&�T—Y‘YÓñ àÐrM   c           	     óÈ  • [         R                  nUS:X  a  [        XU5      $ US:X  a  [        XU5      $ US:X  a  [	        XU5      $ US:X  a  [        XU5      $ US:X  aR  [        R                  S5        [        R                  " U UUUS9n[	        UU[        US9R                  [        US	95      $ [        U[        5      (       a  U" XX4U5      u  p‰S
X‰4$ [        SU 35      e)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_budgetrH  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_memoryrR  r[  ÚSOLVERr^  Úsaved_node_idxÚrecomp_node_idxs
             rJ   Ú#_optimize_runtime_with_given_memoryrk  ,  s  € ô ×3Ñ3€FØ�ÓÜ˜v°Ó<Ð<Ø	�5‹Ü˜F¨jÓ9Ð9Ø	�4‹Ü˜6¨ZÓ8Ð8Ø	Ð3Ó	3Ü-¨fÀ
ÓKÐKØ	Ð-Ó	-Ü�‰ð?ô	
ô
 0×CÒCØ#Ø*GØ-3Ø-5ñ	
Ðô ØØÜØ$7ñç*Ñ*Ü)Ø)ð +ð ó	
ð 		
ô 
�FÔ0×	1Ñ	1Ù*0Ø Ð8Uó+
Ñ'ˆð �^Ð5Ð5äÐIÈ&ÈÐRÓSÐSrM   ©Úno_dispatchc                óè   ^• [        U R                  5      nSU4S jjnU Vs/ s H
  oC" U5      PM     nnU R                  5        Vs/ s H
  oC" U5      PM     nnU R                  X%S9$ s  snf s  snf )Nc                ó   >• [        U TS9$ )Nr]  )r    )Údr^  s    €rJ   Úrealize_symbolÚ8_remove_symbols_without_guarding.<locals>.realize_symbolc  s   ø€ Ü˜ XÑ.Ð.rM   )Ústride)rp  ztorch.SymInt | intr]   r‘   )r£  Úshapers  Únew_empty_strided)rå   r^  rt  rq  rð  rs  s    `    rJ   Ú _remove_symbols_without_guardingrv  `  sk   ø€ Ü�—‘‹M€E÷/ñ ).Ó.ª 1ˆ^˜AÖ©€EÐ.Ø)*¯©¬Ó4ª Aˆn˜QÖ©€FÐ4Ø×Ñ˜uÐÐ4Ð4ùò /ùÚ4s   £A*ÁA/c                óž  ^ ^^	• [         R                  nSS jnUS:X  a  gUS:X  ac  [        5          SSKJn  [
        R                  " UT R                  T R                  45      u  mm	UR                  UU	U 4S j5      nUsS S S 5        $ US:X  as  SS	K
Jn  [
        R                  " UT R                  T R                  45      u  mm	U" S
S9 nT R                  " T0 T	D6  S S S 5        WR                  5       n[        US5      $ [        U[         5      (       a  U" T 5      $ [#        SU 35      e! , (       d  f       g = f! , (       d  f       Nf= f)Nc                ó¾  • [        U [        R                  5      (       aC  [        U R                  S   [        R
                  5      (       a  [        U R                  S   SS9$ [        U [        R                  5      (       aC  [        U R                  S   [        R                  5      (       a  [        U R                  S   SS9$ [        U [        R                  5      (       a-  [        U R                  S   [        R                  5      (       a  g[        U [        R                  5      (       a-  [        U R                  S   [        R                  5      (       a  gU $ )Nr³   r\  r]  ç      ð?T)rµ   rÍ   rÎ   rž   r®   rQ  rv  r¶   r    r¸   r·   r_  s    rJ   Úmaterialize_argÚ)estimate_runtime.<locals>.materialize_argn  sÛ   € Ü�aœŸ™×!Ñ!¤j°·±¸±ÄÇÁ×&MÑ&MÜ3°A·F±F¸5±MÈDÑQÐQÜ˜œ2Ÿ7™7×#Ñ#¬
°1·6±6¸%±=Ä%Ç,Á,×(OÑ(OÜ˜QŸV™V E™]°TÑ:Ð:Ü˜œ2Ÿ7™7×#Ñ#¬
°1·6±6¸%±=Ä%Ç.Á.×(QÑ(QØÜ˜œ2Ÿ7™7×#Ñ#¬
°1·6±6¸%±=Ä%Ç-Á-×(PÑ(PØàˆHrM   Útestingr&   Úprofiler   )Úbenchmarkerc                 ó(   >• TR                   " T 0 TD6$ rF   )r­   )rÌ   rÉ   rI   s   €€€rJ   rz   Ú"estimate_runtime.<locals>.<lambda>ƒ  s   ø€ °4·;²;ÀÐ3OÈÒ3OrM   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )rå   r	   r]   r	   )r   Ú*activation_memory_budget_runtime_estimatorrm  Ú$torch._inductor.runtime.benchmarkingr~  rñ   Útree_maprÌ   rÉ   Úbenchmark_gpuÚtorch.utils.flop_counterr‚  r­   Úget_total_flopsrS  rµ   r   rö   )
rI   ÚRUNTIME_MODErz  r~  Úmsr‚  ÚmodeÚcounted_flopsrÌ   rÉ   s
   `       @@rJ   Úestimate_runtimerŽ  k  s  ú€ Ü×DÑD€Lô
ð �yÓ Øà	˜Ó	"Ü�]ÝHä!Ÿ?š?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&à×*Ñ*Ö+OÓPˆBØ÷ ‰]ð 
˜Ó	 å<ä—’ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ UÒ+¨tà�KŠK˜Ð( Ò(÷ ,ð ×,Ñ,Ó.ˆÜ�= !Ó$Ð$ä	�LÔ"8×	9Ñ	9Ù˜DÓ!Ð!ô Ð=¸l¸^ÐLÓMÐM÷/ �]ú÷ ,Õ+ús   °AD-ÃD>Ä-
D;Ä>
Ec           	     ó  ^ ^^^ ^!^"^#^$^%^&^'^(^)^*• US:”  d  US:  a  [        SU 35      e[        [        R                  [        R                  [        R
                  [        R                  [        R                  S9n[        R                  (       a  [        USSSSS9nUS:X  a  TR                  $ [        T TU5      u  pEUS:X  a  U$ S-S jm!T!" TR                  5      m(T!" U5      m&T&T(::  a  U$ S.U&U(4S jjnS/U!U&U(4S	 jjm"[        USSSS
9n[        T TU5      u  p…T"" U5      U:  a  U$ [        USS9m[        T TT5      u  pšT"" U	5      U:  a  U	$ SSKJm#  [        U#4S jTR                   5       5      m%    S0U#U%4S jjnU" U
5      nU Vs/ s H5  nUR                  R!                  SS5      ["        R$                  :X  d  M3  UPM7     nnU Vs/ s H  oÝU;  d  M
  UPM     nn['        U[(        SS9m [+        T 5      S:X  a  TR                  U-   $ T  Vs/ s H  oÖ" [)        U5      5      PM     snm'T  Vs/ s H  n[-        U5      PM     snm*SSKJm)          S1UU U'U)U*4S jjm$[        R2                  (       GaÞ  S2U"U$U UU*4S jjnU" S5      U" S5      /nUS   SS  US   SS  :w  a³  US   US   4/nU(       a¡  UR5                  5       u  nnUS   US   -
  S:  a$  UR7                  U5        UR7                  U5        MM  U" US   US   -   S-  5      nUSS  USS  :w  a  UR7                  UU45        USS  USS  :w  a  UR7                  UU45        U(       a  M¡  UR9                  5         SS KJn  U Vs/ s H  nUS   PM
     nnU Vs/ s H  nUS   PM
     nnUR?                  SS9  URA                  UUSS9  [C        U5       H   u  nnURE                  US UUU   4SSS S!9  M"     URG                  S"5        URI                  S#5        URK                  S$5        URM                  S5        URO                  5       nURQ                  5         [R        RT                  " 5       n[        RV                  b%  [        RV                  n[R        RX                  " USS%9  S&n[Z        R\                  R_                  5       (       aD  [Z        R\                  Ra                  5       (       a!  S'[Z        R\                  Rc                  5        3n[R        Rd                  Rg                  US(U S)[i        5        S*35      nURk                  U5        [l        Ro                  S+U5        T$" UTT S,9S   $ s  snf s  snf s  snf s  snf s  snf s  snf )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                ó:   • [        [        [        U 5      5      S-  $ ©Nç    eÍÍA)rg  Úmapri  )r9  s    rJ   Úestimate_activations_sizeÚ:choose_saved_values_set.<locals>.estimate_activations_size½  s   € Ü”3”x Ó.Ó/°#Ñ5Ð5rM   c                ó   >• U S-  TT-
  -  $ r‘  rZ   )ÚszÚmax_act_sizeÚmin_act_sizes    €€rJ   Úget_normalized_sizeÚ4choose_saved_values_set.<locals>.get_normalized_sizeÆ  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9rM   c                ó&   >• T" U 5      T-
  TT-
  -  $ rF   rZ   )Úactivationsr”  r˜  r™  s    €€€rJ   Úget_mem_ratioÚ.choose_saved_values_set.<locals>.get_mem_ratioÉ  s"   ø€ Ù)¨+Ó6¸ÑEØ˜<Ñ'ñ
ð 	
rM   )r—   r˜   r™   )rš   )Úget_node_storagec              3  ó4   >#   • U  H  nT" U5      v •  M     g 7frF   rZ   )ru   rI   r   s     €rJ   rw   Ú*choose_saved_values_set.<locals>.<genexpr>ç  s   øé € ÐTÒCS¸4Ñ 0°× 6Ð 6ÒCSùrd  c                ó¦   >• U  Vs/ s H>  nUR                   [        S5      :  d  M  T" U5      T;  d  [        U5      (       d  M<  UPM@     sn$ s  snf r‘  )r'  r‘   r  )rA  rA  r   Úinput_storagess     €€rJ   Úget_recomputable_banned_nodesÚ>choose_saved_values_set.<locals>.get_recomputable_banned_nodesé  sX   ø€ ñ
 "ó
â!�ð —‘¤ S£Ñ)ó	 ñ % QÓ'¨~Ó=Ü0°×3÷ Ù!ñ
ð 	
ùò 
s   †A§AÁAr�   Trl  rl  c                óÔ  >• T" 5          [        UTT[        U S5      UT5      u  nnnS S S 5        [        5       nW H  n UR                  TU   5        M     UR                  T5      (       d  [        S5      e[        UUTU5      u  p‰[        (       a+  [        UTWUWT V
s/ s H  n
[        U
5      PM     sn
TTUS9	  UW4$ ! , (       d  f       N¡= f! [         a     M¥  f = fs  sn
f )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)rk  rS  r$   r÷  ÚBaseExceptionÚissubsetrŽ   r¾  r;   r   ri  )Úmemory_budgetrR  rý   rª  r¨  r©  rB  r@  r9  rF  rA  Úaggressive_optionsr[  r«  rm  r­  s              €€€€€rJ   Úget_saved_values_knapsackÚ:choose_saved_values_set.<locals>.get_saved_values_knapsack  s  ø€ ñ �]ô
 4ØØ%Ø%Ü�M 1Ó%ØØ-óñ	Ø ØØ&÷	 ô )3«ˆÛ)ˆCðØ—‘Ð:¸3Ñ?Ö@ñ *ð × Ñ Ð!>×?Ñ?Ü ØLóð ô (ØØØØó	
‰ˆ÷ !Ò Ü4Ø'Ø.KØ /Ø'=Ø!1á)Fó'Ú)F A”H˜Q–KÑ)Fñ'ð 2GØ&;Ø%1òð Ð-Ð-Ð-÷] �]ûô$ !ó Úðüò*'s#   ‰CÁ CÂ"C%Ã
CÃ
C"Ã!C"c                óF   >• T" U TTS9u  pU [        T5      U-
  T" U5      4$ )N)rR  rý   )rg  )r  r9  rª  rž  r³  rý   rR  r­  s      €€€€€rJ   Úestimate_for_budgetÚ4choose_saved_values_set.<locals>.estimate_for_budgetI  s=   ø€ Ù-FØ˜Y°Kñ.Ñ*ˆLð ÜÐ)Ó*Ð-=Ñ=Ù˜lÓ+ðð rM   rH  ry  gü©ñÒMbP?r4  )é
   é   )Ú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_paretorF  rÕ  z%Generated Pareto frontier curve at %s)r±  rR  rý   )r9  rh   r]   r†  )r—  r†  r]   r†  )r�  rh   r]   r†  )rA  rj   r]   rh   )r±  r†  rR  rf   rý   úfx.Graphr]   ztuple[list[fx.Node], float])r  r†  r]   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   ri   r¾  Útorch._inductor.fx_utilsr   r$   rž   rŸ   r%   rE  r~   ri  rø   rŽ  Útorch.utils._mode_utilsrm  Ú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Ë  rn  r1   Úsavefigr<   rb  )+rý   rR  r±  r+  Úruntime_optimized_saved_valuesrF  rš  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesrA  r¥  Úrecomputable_banned_nodesrA  Úmust_save_nodesrI   r¶  ÚoptionsÚbisectsÚlhsÚrhsÚmidÚpltÚitemÚx_valuesÚy_valuesÚtxtÚfigÚfig_dirÚrank_suffixÚfig_namer²  r[  r”  rž  r   r³  r¤  r˜  r«  r™  rm  r­  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ØØØó)Ñ%Ð"ð ˜ÓØ-Ð-ô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Ðñ +óâ*ˆAØ�6‰6�:‰:�k 5Ó)Ô-=×-GÑ-GÑG÷ 	
Ù*ð ð ñ -ó!Ú,ˆa¸Ñ0H�Ñ,ð ð !ô %+Ø!¤x¸ñ%Ð!ô Ð(Ó)¨QÓ.Ø×Ñ /Ñ1Ð1á2OóÚ2O¨QÐœH Q›KÖ(Ñ2OñÐñ ,IóÚ+H 4Ô˜ÖÑ+HñÐõ 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ª �D˜”G©ˆÐ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Ñ0RØ"¤5×#4Ñ#4×#=Ñ#=Ó#?Ð"@ÐAˆKÜ—7‘7—<‘<ØÐ+¨K¨=¸Ô:LÓ:NÐ9OÈtÐTó
ˆð 	�‰�HÔÜ�‰Ð;¸XÔFñ %Ø#¨yÀkñàñ	ð 	ùòmùò
!ùòùòùòn 1ùÚ0s0   Æ2U)ÇU)Ç	U.ÇU.ÈU3È8U8Í;U=ÎVc                óÚ  ^^• SSK Jm  SS jnSU4S jjn[        R                  R	                  5       (       Gaz  [        R                  R                  5       (       GaV  [        R                  R                  5       S:”  Ga3  U" U 5      (       Ga%  U" U 5      (       Ga  [        5          T" 5          U Vs/ s H  oDR                  PM     sn/n[        [        R                  R                  5       5       Vs/ s H  n/ PM     nn[        R                  R                  XuS   5        [        U 5      n/ n	0 n
[        U5       H|  u  p¼U Vs/ s H  oØU   PM	     nnSnU HF  n[        U5      nUU-  nU[        R                  R                  5       :X  d  M7  UU
UR                  '   MH     XúS'   U	R                  U5        M~     [        R                   " U	[        R                  R"                  R%                  5       S9n[        R                  R'                  U[        R                  R"                  R(                  R*                  S9  [-        [        R.                  " U5      R1                  5       5      nS	U S
U
 3m[3        SS U4S jS9  UU    Vs/ s H  nUU   PM
     nnS S S 5        S S S 5        U$ U$ s  snf s  snf s  snf s  snf ! , (       d  f       N.= f! , (       d  f       U$ = f)Nr   )Úunset_fake_temporarilyc                óÌ   • U R                    HT  n[        UR                  [        R                  R
                  5      (       d  M8  UR                  R                  S;   d  MT    g   g)N>   Úc10d_functionalrÄ   TF)r¦   rµ   r­   r®   r  r  rÃ   )rý   rI   s     rJ   Úhas_collectivesÚ3_sync_decision_cross_ranks.<locals>.has_collectives›  sM   € Ø×%Ô%ˆDÜØ—‘œUŸZ™Z×2Ñ2÷ó à—+‘+×'Ñ'Ð+RÕRÙñ	 &ð
 rM   c                ó  >^• SR                  S U R                   5       5      n[        R                  " UR	                  S5      5      R                  5       n[        [        R                  R                  5       5       Vs/ s H  nS PM     snm[        5          T" 5          [        R                  R                  TU5        S S S 5        S S S 5        [        U4S jT 5       5      $ s  snf ! , (       d  f       N0= f! , (       d  f       N9= f)NÚ/c              3  ó8   #   • U  H  oR                   v •  M     g 7frF   r›  )ru   rå   s     rJ   rw   ÚE_sync_decision_cross_ranks.<locals>.has_same_nodes.<locals>.<genexpr>¨  s   é € Ð>Ò,= qŸFžFÒ,=ùr+  rÓ  c              3  ó4   >#   • U  H  nTS    U:H  v •  M     g7frì  rZ   )ru   rå   Ú
all_inputss     €rJ   rw   rþ  ®  s   øé € Ð:ªz¨!�:˜a‘= AÖ%ªzùrd  )rn  r¦   ÚhashlibÚsha256ÚencodeÚ	hexdigestr>  r®   rô  Úget_world_sizerm  Úall_gather_objectrö  )rý   Únode_strri   rF  r   rö  s       @€rJ   Úhas_same_nodesÚ2_sync_decision_cross_ranks.<locals>.has_same_nodes£  s¶   ù€ ð
 —8‘8Ñ>¨K×,=Ò,=Ó>Ó>ˆÜ—’ §¡°Ó 8Ó9×CÑCÓEˆÜ$)¬%×*;Ñ*;×*JÑ*JÓ*LÔ$MÓNÒ$M˜q“dÑ$MÑNˆ
Ü�]Ñ2Õ4ä×Ñ×/Ñ/°
¸FÔC÷ 5�]ô Ô:©zÓ:Ó:Ð:ùò	 Oß4Õ4ú�]�]ús*   ÂC(ÂC>Â"!C-ÃC>Ã-
C;	Ã7C>Ã>
Dr&   z
total size)r¥  r,  zpicked_rank_idx=z, saved_nodes of current rank=r®  c                 ó   • SSS.$ )NÚ)aot_joint_graph_sync_decision_cross_ranksr±  r²  rZ   rZ   rM   rJ   rz   Ú,_sync_decision_cross_ranks.<locals>.<lambda>Ø  s   € ØGØ (ò%rM   c                 ó   >• T $ rF   rZ   )Úsync_decision_cross_ranks_strs   €rJ   rz   r  Ü  s   ø€ Ñ#@rM   rÁ  )rý   útorch.fx.Graphr]   r:   )Útorch._subclasses.fake_tensorrö  r®   rô  rõ  rÝ  r  rm  rí   r>  r  r’  rŒ  ri  rÞ  rù   rk  Údistributed_c10dÚ_get_object_coll_deviceÚ
all_reduceÚReduceOpÚMAXr‘   Úargminrì  r   )rý   r9  rù  r  rå   ÚobjectsrF  Úsaved_ops_names_all_ranksr~  Úsaved_sizesÚsaved_ops_with_sizesr@  Úsaved_ops_namesÚop_nameÚsaved_nodesÚ
saved_sizerI   Úsize_of_nodeÚsaved_sizes_tensorÚpicked_rank_idxrv   r  rö  s                        @@rJ   rG  rG  •  s¦  ù€ õ Eô÷;ô 	×Ñ×&Ñ&×(Ò(Ü×Ñ×,Ñ,×.Ò.Ü×Ñ×,Ñ,Ó.°Ô2Ù˜K×(Ò(Ù˜;×'Ò'ä�]Ñ2Õ4Ù(4Ó5ª 1Ÿœ©Ñ5Ð6ˆGä!¤%×"3Ñ"3×"BÑ"BÓ"DÔEó:ÚE�q“ÑEð &ð :ô ×Ñ×/Ñ/Ð0IÐSTÉ:ÔVÜ+¨KÓ8ˆLØ%'ˆKØ35Ð ä(1Ð2KÖ(LÑ$�ÙDSÓTÂO¸¨GÔ4ÁO�ÐTØ�
Û'�DÜ#+¨D£>�LØ ,Ñ.�JØœe×/Ñ/×8Ñ8Ó:Õ:Ø:FÐ,¨T¯Y©YÓ7ñ	 (ð
 6@ \Ñ2Ø×"Ñ" :Ö.ñ )Mô "'§¢ØÜ×(Ñ(×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óÚ)S A�˜Q”Ñ)Sð ð ÷Q 5�]ðX Ðˆ<ÐùòW 6ùò:ùò Uùò:÷Q 5Õ4ú�]Œ]ðX Ðúsb   Â'KÂ/K
Â4J6Ã	-K
Ã6J;ÄAK
Å	K 
Å9K
ÆC=K
ÊKÊ K
Ê"KÊ6K
Ë

K	ËKË
K*c                ó2  • SnU(       a  SOSn[        [        U R                  R                  SS95      5      nU R                  R                  S[        R
                  R                  R                  S9 GHô  n[        XR                  S   R                  5      n[        U[        R                  5      (       d  MG  / nUR                  R                  SS9 HŒ  nX8R                  ;   d  M  U R                  R                  U5         U R                  R!                  U SU 35      n	US	-  nUR"                  S
   U	R"                  S
'   U	nUR%                  U	5        SSS5        MŽ     U(       d  Mû  U R                  R                  U5         U R                  R'                  S[        R
                  R                  R                  / UR                  QUQ70 5      n
UR)                  U
SS9  SSS5        UR"                  R+                  S5      nU(       a9  Uu  pÍ/ UQU Vs/ s H  oîR"                  S
   PM     snQ7nUU4W
R"                  S'   U R                  R-                  U5        GM÷     U $ ! , (       d  f       GM©  = f! , (       d  f       Nž= fs  snf )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­   rF  r&   r³   NT)Úpropagate_metaÚeager_input_vals)r.  rÕ  r¥   r-  r®   rÕ   r  Úinvoke_subgraphrÅ   rÌ   r­   rµ   rÍ   r’  rí   rH  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   rK  rK  æ  sO  € ð< €IÞ$/‘°_€JÜ”h˜vŸ|™|×6Ñ6¸-Ð6ÐHÓIÓJ€JØ—L‘L×+Ñ+Ø¤5§9¡9×#9Ñ#9×#IÑ#Ið ,ô ˆô ˜6§=¡=°Ñ#3×#:Ñ#:Ó;ˆÜ�h¤§¡×/Ó/Ø,.ˆNØ$,§N¡N×$=Ñ$=ÀÐ$=Ó$OÐ Ø×!6Ñ!6Õ6ð  Ÿ™×5Ñ5°jÕAØ$*§L¡L×$<Ñ$<Ø)˜l¨!¨I¨;Ð7ó%˜	ð " Q™˜	Ø0@×0EÑ0EÀeÑ0L˜	Ÿ™ uÑ-Ø%.˜
Ø&×-Ñ-¨iÔ8÷ BÑAñ	 %P÷ ˆ~à—\‘\×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ð\ €M÷I B×Aú÷ <Õ;üò" Es    ÄAI0ÆA JÈ JÉ0
J Ê
J	c           	     ó  ^^^^• [        U R                  5      m[        5       mU R                  R                   Hy  nUR                  S:X  a"  SUR
                  ;   a  TR                  U5        O![        U5      (       a  TR                  U5        UT;   d  M^  TR                  UR                  5        M{     [        [        [        U R                  R                  5      5      n[        [        [        U R                  R                  5      5      nXE-   n[        XS9u  pxpšTR                  5       nTR                  S U 5       5        [!        U R                  XgU	S5      n[        U4S jUR                   5       5      m[        UU4S jU R                  R                   5       5      n[        U4S j[#        U5       5       5      nS	n0 nU R                  R                   H  nUT;   d  M  UUU'   US
-  nM     [%        UTTUUUU5      $ )Nrâ   Útangentsrê  c              3  óR   #   • U  H  oc  M  UR                   S:w  d  M  Uv •  M     g 7f)Nrê   r,  )ru   r»  s     rJ   rw   Ú!classify_nodes.<locals>.<genexpr>U  s"   é € ð Úˆa‹°A·D±D¸HÑ4D�‰’;ùs   ‚'Œ'ž	'rá   c              3  óf   >#   • U  H&  nUR                   S :w  d  M  TUR                     v •  M(     g7fr  r  r}  s     €rJ   rw   r5  [  s/   øé € ð 8â,ˆDØ�7‰7�hÑó 	 ˆ�T—Y‘YÖÚ,ùs   ƒ1›1c              3  óH   >#   • U  H  nUT;  d  M  UT;  d  M  Uv •  M     g 7frF   rZ   )ru   rI   rl   r€   s     €€rJ   rw   r5  `  s1   øé € ð 6â,ˆDØÐ(Ñ(ó 	à-1Ð9JÑ-J÷ 	‰Ú,ùs   ƒ
"‘"™	"c              3  ó<   >#   • U  H  u  pUT;   d  M  Uv •  M     g 7frF   rZ   )ru   rA  Úpr  s      €rJ   rw   r5  e  s!   øé € ð -Ú.‰dˆa°!Ð7TÑ2T�‰Ò.ùs   ƒ“	r   r&   )r’  r¥   r$   r¦   rÏ   r­   r÷  rî   rÒ  r¤  r£  ró  r4   r3   r6  rÛ  r	  rŒ  rf   )r0  r  r1  rI   r   r  ri   r2  r3  r4  r5  rm   Úforward_only_graphrn   rq   Úfw_cntrp   r~  rl   r€   s    `               @@@rJ   r=  r=  8  só  û€ ô
 $ L×$6Ñ$6Ó7€LÜ-7«\ÐØ×"Ñ"×(Ô(ˆØ�7‰7�mÓ#¨
°d·k±kÓ(AØ×!Ñ! $Õ'Ü! $×'Ñ'Ø×!Ñ! $Ô'àÐ$Õ$Ø×$Ñ$ T§Z¡ZÖ0ñ )ô œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÑ3€Fä  ÑOñ C€KÐ/ð )×-Ñ-Ó/ÐØ×Ññ Ùóô ô <Ø×Ñ˜FÐ1BÀIóÐô .8ô 8à&×,Ò,ó8ó .Ðô
 ,6õ 6à ×&Ñ&×,Ò,ó6ó ,€Oô
 #-ô -Ü Ô.ó-ó #Ðð €FØ€HØ×"Ñ"×(Ô(ˆØÐ$Õ$Ø#ˆH�T‰NØ�a‰KŠFñ )ô ØØØØØØØ#óð rM   )r  c          	     óÞ	  • U R                   R                  5         U R                  5         U R                   n[        R                  (       a  [        U5      nX`l         U R                   n[        U 5      n[        U 5      n	U(       a
  [        U SS9n [        R                  (       d  [        U 5        [        U 5        [        U 5        Uc  / n[        XU5      n
[        U
R                  5      S:X  a  [!        U UUUU
R"                  S9$ [%        U R                   R&                  5       H�  nUR(                  S:X  a  [+        S5      Ul        M%  U
R/                  U5      (       d	  SUl        MD  [+        S5      Ul        UR0                   H+  n[3        UR,                  UR,                  S-   5      Ul        M-     M‘     [        R4                  nUR&                   HC  n[7        UR8                  R;                  S	S5      [<        5      (       d  M4  UR8                  S	   n  O   [?        UU
US
9n[        R@                  (       a  [A        X~5      n[C        [E        [F        U5      5      n[C        [E        S U5      5      n[I        U UUUU
R"                  S9u  nnU(       a!  U	(       a  [K        U UU[        U5      5      u  nn[M        U5      n[        RN                  (       a  SSK(J'n  U" UUUU
R"                  5        [S        U5      n[S        U5      n[U        USS9n[U        USS9n[V        (       Ga½  [Y        U Vs/ s H  n[[        U5      []        U5      4PM     sn5      n[_        S U 5       5      S-  n[`        Rc                  SU5        [`        Rc                  SU5        [e        S UR                   R&                   5       5      n[e        S UR                   R&                   5       5      nUU-  n[g        [*        5      nUR                   R&                   H\  nURh                  U;   d  M  [k        URl                  S5      (       d  M2  U[]        URl                  Rn                  5      ==   S-  ss'   M^     [`        Rc                  S[        U5      [        U5      [        U5      5        [Y        URq                  5       [r        Rt                  " S5      SS9n[`        Rc                  SU5        UU4$ s  snf )a(  
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   )r1  r  rq   rê   r’  r&   r±  )r±  c                ó"   • [        U 5      (       + $ rF   r/  )rv   s    rJ   rz   Ú5min_cut_rematerialization_partition.<locals>.<lambda>Û  s   € ¬[¸«^Õ);rM   r0  r2  r4  Tc              3  ó8   #   • U  H  n[        U5      v •  M     g 7frF   )ri  r  s     rJ   rw   Ú6min_cut_rematerialization_partition.<locals>.<genexpr>  s   é € Ð'Jº\¸¬°¯¨º\ùr+  z'Theoretical Activations Stored: %.2f GBz,Theoretical Per Activation Storage Sizes: %sc              3  ó\   #   • U  H"  oR                   S :X  d  M  UR                  v •  M$     g7f©rÈ   Nr  r)  s     rJ   rw   r@    ó#   é € ð %
Ú"7˜$¿7¹7ÀoÑ;U‹IˆD�IŽIÒ"7ùr  c              3  ó\   #   • U  H"  oR                   S :X  d  M  UR                  v •  M$     g7frB  r  r)  s     rJ   rw   r@    rC  r  r  z# remat/fw/bw: %d/%d/%drl  zCount of Ops Rematerialized: %s);r¥   rû   rÜ  r   Úcser7   r©   r±   r8  r9  r:  r;  r<  r=  rø   rl   rV  rq   rÕ  r¦   rÏ   r‘   r'  r„   r¤  rT  Úactivation_memory_budgetrµ   rž   rŸ   r†  rô  rG  r£  ró  r   r  rH  rI  r3  rJ  r9   rK  r;   r~   ri  rÁ   rg  r<   rƒ  r$   r   rí   r¬   r­   r  rh  rÊ   ro  )r0  rL  Úcompilerr1  r  r¨   Ú	cse_graphrý   rP  rQ  rR  rI   r«  r±  r9  rþ  rT  rU  r3  rA  Úsorted_sizesÚtotal_activations_size_gbÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountsÚrematerialized_opss                              rJ   r7  r7  y  s;  € ðD ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‡zÜ  Ó&ˆ	Ø&ÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"Þ!Ü-¨lÐQVÑWˆÜ×:×:Ü˜|Ô,ä˜\Ô*Ü˜|Ô,à$Ñ,Ø(*Ð%ÜØ°_ó€Iô ˆ9×&Ñ&Ó'¨1Ó,Ü ØØØ+Ø*GØ(1×(MÑ(Mñ
ð 	
ô ˜×+Ñ+×1Ñ1Ö2ˆØ�7‰7�hÓÜ # C£ˆDÖØ×)Ñ)¨$×/Ñ/Ø !ˆDÖä # C£ˆDÔØŸ
œ
�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÑ;PÓ$Q�Ö!ó #ñ 3ô ×3Ñ3€MØ×!Ô!ˆÜ�d—i‘i—m‘m O°TÓ:¼E×BÓBØ ŸI™I oÑ6ˆMÙñ "ô +ØØØ#ñ€Lô ×(×(Ü1°+ÓLˆäœ6¤+¨|Ó<Ó=€OÜœÑ;¸\ÓJÓK€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ºl¸¤¨£¬S°«VÓ4¹lÑ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Ø”s˜4Ÿ;™;×6Ñ6Ó7Ó8¸AÑ=Õ8ñ *ô 	�‰Ø%Ü�ÓÜ�Ó Ü�Ó ô		
ô $Ø�L‰L‹N¤× 3Ò 3°AÓ 6Àñ
Ðô 	�‰Ð2Ð4FÔGØ�iÐÐùò= Ls   Ì2 S*c                ó"  • U(       aZ  [         R                  " U R                  5      n[        R                  " X5      n U R                  R
                   H
  n0 Ul        M     [        R                  R                  U5      u  pšU
(       d  S[        R                  -   n
[        R                  SXš5        [        R                  " U UUUS9nUR!                  5       n[#        USU
R%                  S5      -   5      nU	 U
 3nUc	  U" U5        g U" XS9  g )Nrr  zWriting FX graph to file: %s%s)Úparse_stack_traceÚdot_graph_shapeÚwrite_)Úprog)rÛ  Údeepcopyr¥   rÍ   r’  r¦   rž   rÊ  rË  Úsplitextr   Útorch_compile_graph_formatr<   rƒ  r#   ÚFxGraphDrawerÚget_main_dot_graphrÅ   Úlstrip)ÚtracedÚfnameÚfignameÚ
clear_metarT  rQ  rR  r  rI   r­  ÚextÚgrå   Úwrite_methods                 rJ   Ú
draw_graphrb  %  sá   € ö Ü—M’M &§,¡,Ó/ˆ	Ü—’ Ó2ˆØ—L‘L×&Ô&ˆDØˆDŽIñ 'ä—‘× Ñ  Ó'�I€DÞØ”F×5Ñ5Ñ5ˆÜ‡H�HÐ-¨tÔ9Ü×"Ò"ØØØ+Ø'ñ		€Að 	
×ÑÓ€AÜ˜1˜h¨¯©°C«Ñ8Ó9€LØˆf�S�EˆN€EØ�|Ù�UÕá�UÓ&rM   r[   )r¨   rÎ  r]   r:   )rI   r\   r]   r‘   )rÐ   r\   r]   úfx.Node | None)rI   r\   r]   rc  )rI   r\   rÝ   zdict[fx.Node, Any]r]   rc  )NF)rý   rÄ  ri   rh   rþ   rh   rÿ   zlist[AOTOutput]r   r�  r  r:   r]   rÄ  )r0  rÎ  r1  r‘   r]   zEtuple[list[fx.Node], list[fx.Node], list[AOTOutput], list[AOTOutput]])r9  rh   rí   rÁ   r]   r�  )r?  z#list[fx.Node] | tuple[fx.Node, ...]r]   r‘   )g      ì@rˆ  r   )r¥   r  rI   útorch.fx.NoderS  r†  rT  r†  rU  r‘   r]   rd  )r¥   r  rI   rd  r\  rd  ra  útorch.dtyperN  r†  r`  r†  rU  r‘   r]   rd  )rk  rÑ  r]   r†  )r]   zlist[torch.dtype])rI   rd  r]   r:   )r]   re  )rv  re  r]   ztuple[float, float])r¥   r  r]   r�  )r¿  rÎ  rÌ  rÎ  rÖ  rÏ  r]   r�  rF   )
r9  rh   r¿  rÎ  rÌ  rÎ  rq   úOrderedSet[fx.Node] | Noner]   r�  )r0  rÎ  r9  rh   rþ  rh   r1  r‘   rq   rf  r]   ú%tuple[fx.GraphModule, fx.GraphModule])r0  rÎ  rL  r	   r1  r‘   r  úlist[int] | Nonerq   rf  r]   rg  )ri  r‘   rv  re  r]   r‘   )r¥   rÄ  r]   r�  )r]   z!list[torch._ops.OpOverloadPacket])rÌ   ztuple[Any, ...]r}  ro   r]   zlist[tuple[fx.Node, int]])r“  rÎ  r]   rÎ  )rT  útorch.fx.GraphModulerU  ri  r£  rd  r¤  rd  r¥  ztorch.devicer¦  r‘   r§  rd  r¨  rd  r]   z#tuple[torch.fx.Node, torch.fx.Node])
r0  rÎ  rT  rÎ  rU  rÎ  rÝ  r‘   r]   rg  )r0  rÎ  r]   r�  )r0  rÎ  r  r:   r]   rÎ  )
rý   rÄ  rR  rf   r+  r•   rB  rf  r]   z)tuple[list[fx.Node], OrderedSet[fx.Node]])rC  únx.DiGraph[str, dict[str, Any]]r]   z!list[tuple[str, str, str]] | None)rÍ  rÁ   rÎ  rÁ   r]   rÁ   )rC  rj  r]   ztuple[str | None, str | None])r]   r>   )r¥   rÄ  r]   rÏ  )rý   rÄ  re  úlist[float]rf  rk  rg  r†  rR  rf   r[  rh   r]   z"tuple[float, list[int], list[int]])rå   rÑ  r^  r‘   r]   rÑ  )rI   r\   r]   r†  )r&   )rý   rÄ  rR  rf   r±  r†  r]   rh   )rý   r  r9  úlist[torch.fx.Node]r]   rl  )r&  rÎ  r  r:   r]   rÎ  )r0  rÎ  r  z	list[int]r1  r‘   r]   rf   )r‰  )r0  rÎ  rL  r	   rG  rÁ   r1  r‘   r  rh  r]   rg  )Úfx_graphTNFN)r[  ri  r\  rÁ   r]  rÁ   r^  r:   rT  zstr | list[str] | NonerQ  r:   rR  r�  r]   r�  )¾Ú
__future__r   rÛ  r’   r  rJ  rø  Úloggingr�  rÊ   rÊ  Úos.pathrÐ  r5  rn  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.logging_utilsr1   Ú_aot_autograd.utilsr2   r3   r4   r5   r6   Úcompile_utilsr7   r8   r9   rƒ  rs  ÚsympyÚdebug_partitionerr;   rc   Ú	getLoggerr^   r<   rÕ   rÖ   rK  r>   rf   r•   r£   r©   r±   rº   r¼   rÆ   rï   rÓ   rÛ   rÞ   r	  r  r  r  r  r  r  rð   rî   r6  r;  rB  r]  rg  rm  rw  r~  r€  r„  r”  r¬  rß  rè  r  rV  r‘   r6  rY  ri  rq  Úcacher{  r€  rI  r²  rH  r:  r;  r<  rû  r8  r¾  r�  r‹  r‘  r‚  r’  rk  rÌ  rm  rv  rŽ  rô  rG  rK  r=  r7  rb  rZ   rM   rJ   Ú<module>r–     s½  ðÞ "ã Û Û Û Û Û Û Û Û 	Û Û 	Û ß *Ý $ß *ß %ã Û %Û Ý ß $Ð $ß <õõ AÝ 5÷õ @Ý +ß 7Ý .Ý AÝ ?ß Hß L÷÷ õ )Ý /Ý 3å Ý L÷ó õ L÷ñ õ
 AÝ ;÷õ ÷ IÑ Hö ÛÛð %×6Ñ6Ð �tÓ 6Ø×'Ò'¨Ó1€€^Ó 1à‡y�y‡~�~€Ø�	‰	�‰€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ðB ÷ð ó ðôôôô÷ñ ôIñ Ó€ôô2-ðØ
ðà	ðð ôðH  Ø$)ðlØðlàðlð ðlð #ð	lð
 ðlð "ðlð õlô^ô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ô	ô>GôBMGð`WØðWàðWð *ðWð 
ô	Wð| ?Cð	,WØð,Wàð,Wð ð,Wð "<ð	,Wð
 
õ,Wðj ?Cñ`"Ø ð`"àð`"ð #ð`"ð
 ð`"ð "<ð`"ð +õ`"ðP 7;Ø>BñV Ø ðV àðV ð ð	V ð
 $4ðV ð "<ðV ð +õV ñr ˆc‹(€ô"ôô:Rð ‡‚óó ðð"PØ
ðPØ&8ðPàôPôKð\[*Ø#ð[*à#ð[*ð ð[*ð ð	[*ð
 ð[*ð ð[*ð "ð[*ð "ð[*ð )ô[*ð|a Ø ða àða ð ða ð ð	a ð
 +ôa ôH@ô'ô<ô.Kð5Ø ð5Ø;?ð5àô5ðx ,0ð	s	&Øðs	&àðs	&ð #ðs	&ð )ð	s	&ð
 /õs	&ðlØ-ðà&ôô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 ði ð 7;ñi Ø ði àði ð ði ð
 ði ð $4ði ð +öi ð^ ØØ#'Ø#Ø"&ð'Ø ð'àð'ð ð'ð ð	'ð
 !ð'ð ð'ð  ð'ð 
ö'rM   