Ë
    P/æjø ã                   ód
  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ d dlmZmZmZmZmZmZmZmZ d dlZd dlZd dlmZ d dlmc mZ d dlmZ d dl m!Z!m"Z" d dl#m$Z$m%Z% d dl&m'Z'm(Z(m)Z)m*Z* d d	l+m,Z, d d
l-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 erd dl8Z8e0jr                  Z: ejv                  e<«      Z=ej|                  j~                  Z?ej|                  j€                  Z@e G d„ d«      «       ZAe G d„ d«      «       ZBe G d„ d«      «       ZCdejˆ                  deEfd„ZFdejŽ                  deEfd„ZHdejŽ                  deEfd„ZIdejˆ                  deJfd„ZK G d„ d«      ZL eL«       ZM	 d^dejœ                  d eejˆ                     d!eejˆ                     d"eeO   dejœ                  f
d#„ZPdejˆ                  deEfd$„ZQdejˆ                  deEfd%„ZRdejˆ                  deEfd&„ZSdejˆ                  deEfd'„ZTdejˆ                  deEfd(„ZUdejˆ                  deEfd)„ZVdejˆ                  deEfd*„ZWdejˆ                  deEfd+„ZXd,ejŽ                  deeejˆ                     eejˆ                     f   fd-„ZYd.eejˆ                     d/eOfd0„ZZd,ejŽ                  d.eejˆ                     d1eejˆ                     d2eJdeejŽ                  ejŽ                  f   f
d3„Z[d,ejŽ                  deejŽ                  ejŽ                  f   fd4„Z\ eJd5«      Z]d6eJdeJfd7„Z^dejˆ                  deJfd8„Z_d9ejœ                  fd:„Z` ejÂ                  d«      d;„ «       Zbd<eejˆ                  eJf   deeejˆ                  eJf      fd=„Zcd>ejŽ                  dejŽ                  fd?„Zdd,ejŽ                  d@ejŽ                  dAejŽ                  dBeJdeejŽ                  ejŽ                  f   f
dC„Zed,ejŽ                  dejŽ                  fdD„Zf	 d^dejœ                  dEeBdFeCfdG„ZgdH„ ZhdeAfdI„Zid9ejœ                  fdJ„ZjdKeek   dLeek   dMekdeekeeJ   eeJ   f   fdN„ZldKeek   dLeek   dMekdeekeeJ   eeJ   f   fdO„ZmdKeek   dLeek   dMekdeekeeJ   eeJ   f   fdP„ZndKeek   dLeek   dMekdeekeeJ   eeJ   f   fdQ„Zod dRlpmqZq dS„ Zr	 d_dejœ                  dEeBdeejˆ                     fdT„Zs	 d`d,ejŽ                  deejŽ                  ejŽ                  f   fdU„Zt	 	 	 	 	 dadVej2                  jŽ                  dWeOdXeOdYeEdZeeeOeeO   f      d[eEd\eeO   ddfd]„Zuy)bé    N©Údefaultdict)Ú	dataclassÚreplace)ÚCallableÚDictÚListÚOptionalÚSetÚTupleÚTYPE_CHECKINGÚUnion)ÚBackwardState)Úis_sym_nodeÚpy_sym_types)Úmagic_methodsÚmethod_to_operator)Úfind_symbol_binding_fx_nodesÚfree_symbolsÚhint_intÚis_symbol_binding_fx_node)Úgraph_drawer)ÚCheckpointPolicyé   )Úconfig)Úget_aot_graph_name)Úis_with_effects)Úfx_graph_cseÚget_aten_targetc                   ó  — e Zd ZU dZee   ed<   ee   ed<   ee   ed<   ee   ed<   ee   ed<   dej                  fd„Z	dej                  fd	„Z
dej                  fd
„Zdej                  fd„Zdej                  fd„Zy)ÚOpTypesz8Class for keeping track of different operator categoriesÚfusible_opsÚcompute_intensive_opsÚ
random_opsÚview_opsÚrecomputable_opsÚnodec                 ó0   — t        |«      | j                  v S ©N)r   r"   ©Úselfr'   s     ú`/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torch/_functorch/partitioners.pyÚ
is_fusiblezOpTypes.is_fusible9   s   € Ü˜tÓ$¨×(8Ñ(8Ð8Ð8ó    c                 ó0   — t        |«      | j                  v S r)   )r   r#   r*   s     r,   Úis_compute_intensivezOpTypes.is_compute_intensive<   s   € Ü˜tÓ$¨×(BÑ(BÐBÐBr.   c                 ó0   — t        |«      | j                  v S r)   )r   r$   r*   s     r,   Ú	is_randomzOpTypes.is_random?   s   € Ü˜tÓ$¨¯©Ð7Ð7r.   c                 ó0   — t        |«      | j                  v S r)   )r   r%   r*   s     r,   Úis_viewzOpTypes.is_viewB   s   € Ü˜tÓ$¨¯©Ð5Ð5r.   c                 ó0   — t        |«      | j                  v S r)   )r   r&   r*   s     r,   Úis_recomputablezOpTypes.is_recomputableE   s   € Ü˜tÓ$¨×(=Ñ(=Ð=Ð=r.   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__ÚfxÚNoder-   r0   r2   r4   r6   © r.   r,   r!   r!   /   s‰   … áBà�X‘ÓØ˜x™=Ó(Ø�H‘ÓØ�(‰mÓØ˜(‘mÓ#ð9˜rŸw™wó 9ðC¨¯©ó Cð8˜bŸg™gó 8ð6˜BŸG™Gó 6ð> B§G¡Gô >r.   r!   c                   óš  — e Zd ZU eej
                     ed<   eej
                     ed<   eej
                     ed<   eej
                     ed<   eej
                  e	f   ed<   e
j                  deej
                     fd„«       Zdej
                  defd	„Zdej
                  defd
„Zdej
                  defd„Zdej
                  de	fd„Zy)ÚNodeInfoÚinputsÚ_required_fw_nodesÚrequired_bw_nodesÚunclaimed_nodesÚfw_orderÚreturnc                 óF   ‡ — t        d„ ‰ j                  D «       ˆ fd„¬«      S )Nc              3   ó    K  — | ]  }|–— Œ y ­wr)   r>   ©Ú.0Úns     r,   ú	<genexpr>z-NodeInfo.required_fw_nodes.<locals>.<genexpr>V   s   è ø€ Ò0�1ŒQÑ0ùs   ‚c                 ó"   •— ‰j                   |    S r)   )rE   )rK   r+   s    €r,   ú<lambda>z,NodeInfo.required_fw_nodes.<locals>.<lambda>V   s   ø€ ÀÇÁÈaÑ@P€ r.   ©Úkey)ÚsortedrB   ©r+   s   `r,   Úrequired_fw_nodeszNodeInfo.required_fw_nodesS   s!   ø€ äÙ0˜×/Ñ/Ô0Ó6Pô
ð 	
r.   rK   c                 ó   — || j                   v S r)   )rB   ©r+   rK   s     r,   Úis_required_fwzNodeInfo.is_required_fwY   s   € Ø�D×+Ñ+Ð+Ð+r.   c                 ó   — || j                   v S r)   )rC   rU   s     r,   Úis_required_bwzNodeInfo.is_required_bw\   s   € Ø�D×*Ñ*Ð*Ð*r.   c                 ó   — || j                   v S r)   )rD   rU   s     r,   Úis_unclaimedzNodeInfo.is_unclaimed_   s   € Ø�D×(Ñ(Ð(Ð(r.   c                 óR   — || j                   v sJ d|› d�«       ‚| j                  |   S )NúNode z not in fw nodes!)rB   rE   rU   s     r,   Úget_fw_orderzNodeInfo.get_fw_orderb   s4   € Ø�D×+Ñ+Ñ+ÐI¨u°Q°CÐ7HÐ-IÓIÐ+Ø�}‰}˜QÑÐr.   N)r7   r8   r9   r	   r<   r=   r;   r   r   ÚintÚ	functoolsÚcached_propertyrS   ÚboolrV   rX   rZ   r]   r>   r.   r,   r@   r@   I   sÒ   … ð �—‘‰MÓØ˜BŸG™G™Ó$Ø˜2Ÿ7™7‘|Ó#Ø˜Ÿ™‘\Ó!Ø�2—7‘7˜C�<Ñ Ó à×Ñð
 4¨¯©¡=ò 
ó ð
ð
, §¡ð ,¨Dó ,ð+ §¡ð +¨Dó +ð)˜bŸg™gð )¨$ó )ð ˜bŸg™gð  ¨#ô  r.   r@   c                   ó@   — e Zd ZU eed<   eed<   eed<   eed<   eed<   y)ÚMinCutOptionsÚban_if_used_far_apartÚban_if_long_fusible_chainsÚban_if_materialized_backwardÚban_if_not_in_allowlistÚban_if_reductionN)r7   r8   r9   ra   r;   r>   r.   r,   rc   rc   g   s    … àÓØ $Ó$Ø"&Ó&Ø!Ó!ØÔr.   rc   r'   rF   c                 óz   — | j                   j                  dd «      t        j                  t        j                  fv S )NÚ	recompute)ÚmetaÚgetr   ÚMUST_RECOMPUTEÚPREFER_RECOMPUTE©r'   s    r,   Úmust_recomputerp   p   s5   € Ø�9‰9�=‰=˜ dÓ+Ü×'Ñ'Ü×)Ñ)ð0ð ð r.   Úfx_gc                 óX   — d}| j                   j                  D ]  }t        |«      sŒ y y)NFT)ÚgraphÚnodesrp   )rq   Úfoundr'   s      r,   Úhas_recomputable_opsrv   w   s0   € Ø€EØ—
‘
× Ñ ò ˆÜ˜$ÕÙðð r.   c                 óä   — | j                   j                  D ]W  }t        |«      sŒt        |j                  d«      sŒ&t
        j                  j                  |j                  j                  v sŒW y y)NÚtagsTF)	rs   rt   rp   ÚhasattrÚtargetÚtorchÚTagÚnondeterministic_seededrx   )rq   r'   s     r,   Úhas_recomputable_rng_opsr~      sU   € Ø—
‘
× Ñ ò ˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEáðð r.   c                 óÆ   — t        | j                  d   t        j                  t        j                  f«      ryt        | j                  d   t        j
                  «      sJ ‚y)NÚvalr   é   )Ú
isinstancerk   r{   ÚSymIntÚSymBoolÚSymFloatro   s    r,   Úsym_node_sizer†   Š   sE   € Ü�$—)‘)˜EÑ"¤U§\¡\´5·=±=Ð$AÔBØÜ�d—i‘i Ñ&¬¯©Ô7Ð7Ð7Ør.   c                   ó   — e Zd Zd„ Zy)ÚInvalidNodeBasec                  ó   — y)NzInvalid Noder>   rR   s    r,   Ú__repr__zInvalidNodeBase.__repr__’   s   € Ør.   N)r7   r8   r9   rŠ   r>   r.   r,   rˆ   rˆ   ‘   s   „ ór.   rˆ   Újoint_graphrA   ÚoutputsÚsubgraphc                 ó`  ‡
— t        j                  «       }i Š
|D ]3  }|j                  |j                  «      }|j                  |_        |‰
|<   Œ5 | j
                  D �]  }t        |«      r|dk7  r
t        ‰
|<   Œ|‰
v rŒ#|j                  dk(  r
t        ‰
|<   Œ<|j                  dk(  r‘t        j                  |j                  i |j                  ¤Ž}|D �cg c]/  }t        |t         j                  «      rt        ‰
|   t        «      ‘Œ1 }}t!        |«      r
t        ‰
|<   ŒÃ|j#                  |ˆ
fd„«      ‰
|<   ŒÜ|j                  dk(  r|j#                  |ˆ
fd„«      ‰
|<   �Œ|j                  dk(  s�Œ�Œ g }	|D ]s  }t        |t         j                  «      rF|‰
vrt%        d|› d	�«      ‚t        ‰
|   t        «      rJ d|› d
�«       ‚|	j'                  ‰
|   «       Œc|	j'                  |«       Œu |j)                  t+        |	«      «       |j-                  «        |j/                  «        |S c c}w )a‘  
    Given a graph, extracts out a subgraph that takes the specified nodes as
    inputs and returns the specified outputs.

    This includes specifying non-placeholder nodes as inputs.

    The general strategy is to initialize all inputs with proxies as we
    encounter them, and trace through the graph, only keeping values which take
    in valid proxies. Then, all dead code is eliminated.
    ÚbackwardÚplaceholderÚcall_functionc                 ó   •— ‰|    S r)   r>   ©ÚxÚenvs    €r,   rN   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>É   ó   ø€ ¸CÀ¹F€ r.   Úget_attrc                 ó   •— ‰|    S r)   r>   r“   s    €r,   rN   z4_extract_graph_with_inputs_outputs.<locals>.<lambda>Ë   r–   r.   Úoutputr\   z couldn't be found in envz was invalid, but is output)r<   ÚGraphr�   Únamerk   rt   Ú_must_be_in_backwardÚInvalidNodeÚopÚpytreeÚarg_tree_leavesÚargsÚkwargsr‚   r=   rˆ   ÚanyÚ	node_copyÚRuntimeErrorÚappendr™   ÚtupleÚeliminate_dead_codeÚlint)r‹   rA   rŒ   r�   Ú	new_graphr'   Únew_nodeÚall_argsr”   Úoutput_valuesr•   s             @r,   Ú"_extract_graph_with_inputs_outputsr®   ™   s%  ø€ ô  —‘“
€IØ
€Cð ò ˆØ×(Ñ(¨¯©Ó3ˆàŸ	™	ˆŒØˆˆDŠ	ð	ð ×!Ñ!ó ˆÜ Ô%¨(°jÒ*@Ü#ˆC�‰IØà�3‰;ð Ø�W‰W˜Ò%Ü#ˆC�ŠIØ�W‰W˜Ò'Ü×-Ñ-¨t¯y©yÐH¸D¿K¹KÑHˆHð "öàÜ˜a¤§¡Ô)ô ˜3˜q™6¤?Õ3ðˆHð ô
 �8Œ}Ü'��D‘	ØØ!×+Ñ+¨DÓ2BÓCˆC�ŠIØ�W‰W˜
Ò"Ø!×+Ñ+¨DÓ2BÓCˆC�‹IØ�W‰W˜Ô Ùð5ð6 €MØò 	$ˆÜ�aœŸ™Ô!Ø˜‰|Ü" U¨1¨#Ð-FÐ#GÓHÐHÜ!Ø�A‘œôð 6à�q�cÐ4Ð5ó6ð ð × Ñ   Q¡Õ(à× Ñ  Õ#ð	$ð ×Ñ”U˜=Ó)Ô*à×!Ñ!Ô#Ø‡N�NÔØÐùò9s   Ã4H+c                 óŠ   — | j                   dk(  xr3 dt        | j                  «      vxr t        | «       xr t	        | «       S ©Nr�   Útangents)rž   Ústrrz   Ú_is_bwd_seed_offsetÚ_is_fwd_seed_offsetro   s    r,   Ú
_is_primalrµ   à   sK   € à�‰�=Ñ ò 	*Øœc $§+¡+Ó.Ð.ò	*ä# DÓ)Ð)ò	*ô $ DÓ)Ð)ð	r.   c                 óR   — | j                   dk(  xr dt        | j                  «      v S r°   ©rž   r²   rz   ro   s    r,   Ú_is_tangentr¸   é   s$   € Ø�7‰7�mÑ#ÒF¨
´c¸$¿+¹+Ó6FÐ(FÐFr.   c                 ó„   — | j                   dk(  xr0 dt        | j                  «      v xs dt        | j                  «      v S )Nr�   Úbwd_seedÚbwd_base_offsetr·   ro   s    r,   r³   r³   í   ó=   € Ø�7‰7�mÑ#ò Ø”c˜$Ÿ+™+Ó&Ð&ÒOÐ*;¼sÀ4Ç;Á;Ó?OÐ*Oðr.   c                 ó„   — | j                   dk(  xr0 dt        | j                  «      v xs dt        | j                  «      v S )Nr�   Úfwd_seedÚfwd_base_offsetr·   ro   s    r,   r´   r´   ó   r¼   r.   c                 óv   — | j                   dk(  xr) t        | j                  j                  d«      t        «      S )Nr�   r€   )rž   r‚   rk   rl   r   ro   s    r,   Ú_is_backward_staterÁ   ù   s*   € Ø�7‰7�mÑ#ÒW¬
°4·9±9·=±=ÀÓ3GÌÓ(WÐWr.   c                 ó@   — | j                   j                  dd «      dk(  S )NÚpartitioner_tagÚis_backward©rk   rl   ro   s    r,   Ú_has_tag_is_backwardrÆ   ý   s   € Ø�9‰9�=‰=Ð*¨DÓ1°]ÑBÐBr.   c                 ó@   — | j                   j                  dd «      dk(  S )NrÃ   Úmust_be_in_backwardrÅ   ro   s    r,   Ú_has_tag_must_be_in_backwardrÉ     s   € Ø�9‰9�=‰=Ð*¨DÓ1Ð5JÑJÐJr.   c                 óL   — t        | «      xs t        | «      xr t        | «      S r)   )rÉ   rÆ   r   ro   s    r,   rœ   rœ     s&   € Ü'¨Ó-ò Ü˜TÓ"Ò<¤°tÓ'<ðr.   Újoint_modulec                ó„   — t        j                  d„ | j                  j                  d¬«      D «       Ž }|d | }||d  }||fS )Nc              3   ó4   K  — | ]  }|j                   –— Œ y ­wr)   )r¡   )rJ   r'   s     r,   rL   z+_extract_fwd_bwd_outputs.<locals>.<genexpr>  s   è ø€ Ò	K˜ˆ$�)�)Ñ	Kùs   ‚r™   ©rž   )rŸ   r    rs   Ú
find_nodes)rË   Únum_fwd_outputsrŒ   Úfwd_outputsÚbwd_outputss        r,   Ú_extract_fwd_bwd_outputsrÓ     sW   € ô ×$Ñ$Ù	K × 2Ñ 2× =Ñ =ÀÐ =Ó JÔ	Kð€Gð Ð*˜?Ð+€KØ˜/Ð*Ð+€KØ˜Ð#Ð#r.   Úsaved_valuesr›   c                 óV   — | D ]$  }|j                   |k(  sŒ| j                  |«        y  y r)   )r›   Úremove)rÔ   r›   Úsaved_values      r,   Ú_remove_by_namerØ     s0   € Ø#ò ˆØ×Ñ˜tÓ#Ø×Ñ Ô,Ùñr.   Úsaved_sym_nodesrÐ   c                óZ  — t        | |¬«      \  }}| j                  j                  d¬«      }g t        t        |«      ¢}g t        t
        |«      ¢}g t        t        |«      ¢}	g t        t        |«      ¢}
g t        t        |«      ¢}t        | j                  ||z   |z   |
z   |d«      }|j                  d¬«      D ]a  }|j                  s-t        ||j                  «       t        ||j                  «       Œ<t        |«      sŒHt        ||j                  «       |rŒaJ ‚ t        «       }g }g }|D ]C  }t        |«      }|r#|j                  |«       |j!                  |«       Œ3|j!                  |«       ŒE t#        | j                  «      }t%        j&                  |||«      D ]]  }d|j(                  vrŒt+        |j(                  d   «      |z
  }t-        |d„ ¬«      D ]  }||vrŒ|j!                  ||   «       Œ ||z  }Œ_ |j/                  «        |j1                  ||z   «       t        | j                  ||	z   ||z   |z   d«      }t        | j                  ||z   |z   |
z   |z   |d«      }t2        j4                  j7                  | |«      }t2        j4                  j7                  | |«      }||fS )	N©rÐ   r�   rÎ   r�   r€   c                 ó   — | j                   S r)   )r›   )Úss    r,   rN   z*_extract_fwd_bwd_modules.<locals>.<lambda>Y  s
   € °1·6±6€ r.   rO   Úforward)rÓ   rs   rÏ   Úfilterrµ   r¸   r´   r³   rÁ   r®   ÚusersrØ   r›   Úsetr   Úaddr¦   r   Ú	itertoolsÚchainrk   r   rQ   ÚclearÚextendr<   Ú_lazy_graph_moduleÚ_make_graph_module)rË   rÔ   rÙ   rÐ   rÑ   rÒ   ÚplaceholdersÚprimal_inputsÚtangent_inputsÚfwd_seed_offset_inputsÚbwd_seed_offset_inputsÚbackward_state_inputsÚ	bwd_graphr'   Úsaved_symbolsÚsaved_sym_nodes_bindingÚsaved_sym_nodes_derivedÚsymbolÚsymbol_bindingsÚnew_symbolsrÝ   Ú	fwd_graphÚ
fwd_moduleÚ
bwd_modules                           r,   Ú_extract_fwd_bwd_modulesrù     sã  € ô  8Ø oô Ñ€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ð ×$Ñ$¨Ð$Ó6ò )ˆà�zŠzÜ˜L¨$¯)©)Ô4Ü˜O¨T¯Y©YÕ7Ü Õ%ä˜L¨$¯)©)Ô4Ú(Ð(Ð(ð)ô (+£u€MØ ÐØ Ðð  ò 1ˆÜ*¨4Ó0ˆÙØ×Ñ˜fÔ%Ø#×*Ñ*¨4Õ0à#×*Ñ*¨4Õ0ð1ô 3°<×3EÑ3EÓF€OÜ—‘Ð 7¸À~ÓVò %ˆØ˜Ÿ	™	Ñ!ØÜ" 4§9¡9¨UÑ#3Ó4°}ÑDˆä˜Ñ)9Ô:ò 	?ˆAð ˜Ñ'ØØ#×*Ñ*¨?¸1Ñ+=Õ>ð	?ð 	˜Ñ$‰ð%ð" ×ÑÔØ×ÑÐ2Ð5LÑLÔMô 3Ø×ÑØÐ.Ñ.Ø�lÑ" _Ñ4Øó	€Iô 3Ø×ÑØØ
ñ	à
ñ	ð !ñ	!ð  ñ		 ð
 	Øó	€Iô ×&Ñ&×9Ñ9¸,È	ÓR€JÜ×&Ñ&×9Ñ9¸,È	ÓR€JØ�zÐ!Ð!r.   c                ó”  — t        | «      rt        | ||¬«      S t        t        t        | j
                  j                  «      «      }t        t        t        | j
                  j                  «      «      }||z   }t        | |¬«      \  }}t        | j
                  ||d«      }|j                  D �	ch c]  }	|	j                  dk7  sŒ|	j                  ’Œ  }
}	g }g }| j
                  j                  D ]è  }	|	j                  |
vrŒt        |	«      r|j                  |	«       Œ/d|	j                  vrA|	j                  dk(  r2|	j                  }t!        d„ |D «       «      sJ ‚|j#                  |«       Œ~|	j                  D �cg c]  }|j                  |
vsŒ|‘Œ }}d|	j                  v r$t!        d„ |D «       «      r|j#                  |«       ŒØ|j                  |	«       Œê t        t$        j'                  |«      j)                  «       «      }t        t$        j'                  |«      j)                  «       «      }t+        | |||¬«      S c c}	w c c}w )	aÔ  
    Partitions the :attr:`joint_module` in a manner that closely resembles the
    behavior observed in the original ``.forward()`` and ``.backward()`` of the
    callable, i.e., the resulting forward graph contains those operators that
    are executed in the original ``.forward()`` callable passed to
    :func:`aot_function`.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    rÛ   rÞ   r™   Útensor_metar‘   c              3   óV   K  — | ]!  }|j                   t        j                  k(  –— Œ# y ­wr)   )rz   ÚoperatorÚgetitem)rJ   Úusers     r,   rL   z$default_partition.<locals>.<genexpr>·  s   è ø€ ÒI¸4�t—{‘{¤h×&6Ñ&6Õ6ÑIùs   ‚')c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr)   ©r   rI   s     r,   rL   z$default_partition.<locals>.<genexpr>½  s   è ø€ ò 2Ø#$”˜A—ñ2ùó   ‚©rÙ   rÐ   )rv   Ú#min_cut_rematerialization_partitionÚlistrß   rµ   rs   rt   r´   rÓ   r®   rž   r›   r   r¦   rk   rà   Úallræ   ÚdictÚfromkeysÚkeysrù   )rË   Ú_joint_inputsrÐ   rê   rì   rA   rÑ   rÒ   Úforward_only_graphr'   Úforward_node_namesrÔ   rÙ   rà   rK   Úbackward_usagess                   r,   Údefault_partitionr  €  s&  € ô4 ˜LÔ)Ü2Ø˜-¸ô
ð 	
ô œ¤
¨L×,>Ñ,>×,DÑ,DÓEÓF€MÜ!¤&Ô)<¸l×>PÑ>P×>VÑ>VÓ"WÓXÐØÐ3Ñ3€FÜ7Ø oô Ñ€K�ô <Ø×Ñ˜F K°óÐð 1×6Ñ6öØ¸$¿'¹'ÀXÓ:Mˆ�	‹	ðÐð ð €LØ€Oà×"Ñ"×(Ñ(ò *ˆØ�9‰9Ð.Ñ.ØÜ�tÔð ×"Ñ" 4Õ(Ø $§)¡)Ñ+°·±¸?Ò0Jà—J‘JˆEÜÑIÀ5ÔIÔIÐIÐIØ×Ñ Õ&ð  Ÿ:™:öØ¨¯©Ð7IÒ)I’ðˆOð ð  §	¡	Ñ)¬cñ 2Ø(7ô2ô /ð  ×&Ñ& Õ7à×#Ñ# DÕ)ð;*ô< œŸ™ lÓ3×8Ñ8Ó:Ó;€LÜœ4Ÿ=™=¨Ó9×>Ñ>Ó@ÓA€Oä#ØØØ'Ø'ô	ð ùòOùò&s   Â/I ÃI Å:IÆIg    €„.AÚnumelc                 ó    — | |j                   z  S r)   )Úitemsize)r  Údtypes     r,   Ú_tensor_nbytesr  Ù  s   € Ø�5—>‘>Ñ!Ð!r.   c                 óâ  ‡— dt         fd„Šd| j                  v r¸| j                  d   }t        |t        «      ryt        |t        t
        f«      rt        ˆfd„|D «       «      S t        |t        «      r"t        ˆfd„|j                  «       D «       «      S t        |t        j                  «      r ‰|«      S t        dt        |«      › d| › �«      ‚| j                  d	k(  ry
t        d| › d�«      ‚)NrF   c                 ó–   — t        | t        j                  «      syt        t	        | j                  «       d¬«      | j                  «      S )Nr   é   ©Úfallback)r‚   r{   ÚTensorr  r   r  r  ©r”   s    r,   Úobject_nbytesz_size_of.<locals>.object_nbytesÞ  s1   € Ü˜!œUŸ\™\Ô*ØÜœh q§w¡w£y¸4Ô@À!Ç'Á'ÓJÐJr.   r€   r   c              3   ó.   •K  — | ]  } ‰|«      –— Œ y ­wr)   r>   )rJ   rK   r  s     €r,   rL   z_size_of.<locals>.<genexpr>ë  s   øè ø€ Ò5¨A‘} Q×'Ñ5ùs   ƒc              3   ó4   •K  — | ]  \  }} ‰|«      –— Œ y ­wr)   r>   )rJ   Ú_rK   r  s      €r,   rL   z_size_of.<locals>.<genexpr>í  s   øè ø€ Ò@©D¨A¨q‘} Q×'Ñ@ù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^   rk   r‚   r   r  r§   Úsumr  Úitemsr{   r  r¥   Útyperž   )r'   r€   r  s     @r,   Ú_size_ofr"  Ý  sÛ   ø€ ðKœCó Kð
 �—	‘	ÑØ�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�*ÒØÜ
Ø
�ˆvÐdÐeóð r.   rs   c                 óø   — ddl m}  |t        «      }| j                  D ]3  }|j                  dk(  sŒ||j
                  j                  xx   dz  cc<   Œ5 t        t        |j                  «       d„ d¬«      «       y )Nr   r   r‘   r   c                 ó   — | d   S ©Nr   r>   r  s    r,   rN   z_count_ops.<locals>.<lambda>  s
   € ¨A¨a©D€ r.   T©rP   Úreverse)
Úcollectionsr   r^   rt   rž   rz   r7   ÚprintrQ   r   )rs   r   Úcntr'   s       r,   Ú
_count_opsr+  ú  sa   € Ý'á%¤cÓ*€CØ—‘ò +ˆØ�7‰7�oÓ%Ø�—‘×$Ñ$Ó%¨Ñ*Ô%ð+ô 
Œ&�—‘“¡.¸$Ô
?Õ@r.   c                  ó   — g } t        t        j                  j                  «      D ]¥  }t	        t        j                  j                  |«      }t        |t        j                  j                  «      sŒL|j                  «       D ]G  }t	        ||«      }t        j                  j                  |j                  v sŒ6| j                  |«        Œ¥ Œ§ | S r)   )Údirr{   ÚopsÚatenÚgetattrr‚   Ú_opsÚOpOverloadPacketÚ	overloadsr|   Ú	pointwiserx   r¦   )r.  Ú	attr_nameÚopoverloadpacketÚoverloadÚop_overloads        r,   Úpointwise_opsr9    s¤   € à
€CÜœŸ™Ÿ™Ó(ò 
ˆ	Ü"¤5§9¡9§>¡>°9Ó=ÐÜÐ*¬E¯J©J×,GÑ,GÔHØà(×2Ñ2Ó4ò 	ˆHÜ!Ð"2°HÓ=ˆKÜ�y‰y×"Ñ" k×&6Ñ&6Ò6à—
‘
Ð+Ô,Ùñ	ð
ð €Jr.   Ú	depth_mapc                 óÊ   — | D �ci c]7  }t        |t        j                  j                  j                  «      sŒ2|||   “Œ9 }}t        |j                  «       d„ d¬«      S c c}w )Nc                 ó   — | d   S r%  r>   r  s    r,   rN   zsort_depths.<locals>.<lambda>  s
   € °A°a±D€ r.   Tr&  )r‚   r{   r<   r'   r=   rQ   r   )r¡   r:  ÚargÚ
arg_depthss       r,   Úsort_depthsr?    s[   € à'+öØ #¬z¸#¼u¿x¹x¿}¹}×?QÑ?QÕ/RˆˆY�s‰^Ñð€Jð ô �*×"Ñ"Ó$©.À$ÔGÐGùòs
   …3A ¹A Úgmc                 óŽ  ‡
‡‡— t        j                  «       Ši Š
| j                  j                  d¬«      D ]  }‰j	                  |ˆ
fd„«      ‰
|<   Œ i Št        | j                  j                  «      D ]
  \  }}|‰|<   Œ ˆ
ˆˆfd„}t        t        t        | j                  j                  «      «      }d}t        j                  }|D ]#  }|j                  D ]  }‰|   |k  sŒ‰|   }|}Œ Œ% |€| S t        | j                  j                  «      ‰|   d D ]
  } ||«       Œ t        j                   j                  | ‰«      }	|	S )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 traveral, we insert this op
    in a new graph and try to bring only the relevant subgraph from the other
    non-bwd edges relevant for this op. This closely mimics the behavior of
    autograd engine.

    Why is this pass required in the first place?

    This is an artifact of how partitioners work today. The starting point of
    partitioner is a joint graph, which is fwd and then bwd graph. In the case
    of checkpointing, we keep portions of fwd graph in their original place in
    the joint graph, while obtaining a bwd graph. As a result, the resulting bwd
    graph has copies of recomputed fwd subgraphs followed by the original bwd
    graph. If we run this naively, this leads to bad memory footprint, because
    the fwd subgraphs are live for way longer duration than necessary. This pass
    reorders the operations such that we prioritize the ops for the original bwd
    graph while only realizing those ops from the fwd graph that are necessary
    at any given point in the graph.
    r�   rÎ   c                 ó   •— ‰|    S r)   r>   r“   s    €r,   rN   z5reordering_to_mimic_autograd_engine.<locals>.<lambda>9  s   ø€ ¸¸A¹€ r.   c                 ó*  •— | g}t        «       }t        |«      dkD  rH|j                  «       } | |v s| ‰v rŒ'|j                  | «       || j                  z  }t        |«      dkD  rŒHt        |ˆfd„¬«      }|D ]  } ‰j                  | ˆfd„«      ‰| <   Œ y )Nr   c                 ó   •— ‰|    S r)   r>   )rK   Úorders    €r,   rN   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>L  s   ø€ À%ÈÁ(€ r.   rO   c                 ó   •— ‰|    S r)   r>   r“   s    €r,   rN   zSreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph.<locals>.<lambda>N  r–   r.   )rá   ÚlenÚpoprâ   Úall_input_nodesrQ   r¤   )r'   Ú	cur_nodesÚinsertable_nodesr•   rª   rE  s      €€€r,   Úinsert_node_in_graphzAreordering_to_mimic_autograd_engine.<locals>.insert_node_in_graph?  s¢   ø€ Ø�Fˆ	Ü›5ÐÜ�)‹n˜qÒ Ø—=‘=“?ˆDØÐ'Ñ'¨4°3©;ØØ× Ñ  Ô&ð ˜×-Ñ-Ñ-ˆIô �)‹n˜qÓ ô "Ð"2Ó8JÔKÐØ$ò 	DˆDØ!×+Ñ+¨DÓ2BÓCˆC�ŠIñ	Dr.   N)r<   rš   rs   rÏ   r¤   Ú	enumeratert   r  rß   r¸   ÚmathÚinfrà   r{   ÚGraphModule)r@  r'   ÚidxrL  rë   Úfirst_node_in_bwdÚminimum_orderÚtangentrÿ   Únew_gmr•   rª   rE  s             @@@r,   Ú#reordering_to_mimic_autograd_enginerV    sL  ú€ ô. —‘“
€IØ"$€Cð —‘×#Ñ# }Ð#Ó5ò @ˆØ×'Ñ'¨Ó.>Ó?ˆˆDŠ	ð@ð €EÜ˜rŸx™xŸ~™~Ó.ò ‰	ˆˆTØˆˆdŠðöDô$ œ&¤¨b¯h©h¯n©nÓ=Ó>€NØÐÜ—H‘H€MØ!ò )ˆØ—M‘Mò 	)ˆDØ�T‰{˜]Ó*Ø % d¡�Ø$(Ñ!ñ	)ð)ð Ð Øˆ	ô �R—X‘X—^‘^Ó$ UÐ+<Ñ%=Ð%?Ð@ò #ˆÙ˜TÕ"ð#ô �X‰X×!Ñ! " iÓ0€FØ€Mr.   Ú	fw_moduleÚ	bw_moduleÚnum_sym_nodesc                 ó:  — t        j                  «       }d„ }d„ }d„ } || «      } ||«      }	 ||«      }
i }| j                  j                  D ]‹  }t	        |«      sŒt        |j                  d«      sŒ&t        j                  j                  |j                  j                  v sŒW||j                     }|	|j                     }|
|j                     }||dœ||<   Œ� t        j                  j                  j                  }t        j                  j                  j                  }d }|j                  j!                  d¬«      D ]  }d|j                  v sŒ|} n |€t#        d	«      ‚g }|j%                  «       D �]¾  \  }}|d
   }|d   }|j                  }|j'                  |«      5  |j)                  d||j                  g|j*                  ¢­|j,                  ¬«      }|j)                  dt.        j0                  |dfi ¬«      }|j)                  dt.        j0                  |dfi ¬«      }|j3                  |«       |j5                  |«       |j7                  |«       d d d «       |j                  }|j'                  |«      5  dt9        |«      › �}|j;                  |«      } | ||«      «      |j<                  d<   d d d «       |j'                  |«      5  |j)                  d||j                  g|j*                  ¢­|j,                  ¬«      }|j3                  |«       |j5                  |«       d d d «       �ŒÁ t9        t?        |j                  j!                  d¬«      «      «      }|j*                  d   }tA        |«      |z
  }|d | tC        |«      z   ||d  z   }|j                  jE                  |«       |j                  j5                  |«       |jG                  «        |jG                  «        ||fS # 1 sw Y   �Œ�xY w# 1 sw Y   �ŒJxY w# 1 sw Y   �Œ¢xY w)Nc                 ó  — i }| j                   j                  D ]i  }|j                  dk(  sŒt        |j                  d«      sŒ*t
        j                  j                  |j                  j                  v sŒ[|||j                  <   Œk |S )Nr‘   rx   )
rs   rt   rž   ry   rz   r{   r|   r}   rx   r›   )ÚgmodÚrandom_nodesr'   s      r,   Úget_rng_opsz*functionalize_rng_ops.<locals>.get_rng_ops‚  sl   € ØˆØ—J‘J×$Ñ$ò 	/ˆDà—‘˜?Ó*Ü˜DŸK™K¨Õ0Ü—I‘I×5Ñ5¸¿¹×9IÑ9IÒIà*.�˜TŸY™YÒ'ð	/ð Ðr.   c                 óà   — d| j                   vry| j                   d   }t        |t        «      s|f}|D ]8  }t        |t        j                  «      sŒ|j
                  j                  dk(  sŒ8 y y)zV
        Check the example value of the node outputs to find the device type.
        r€   NÚcudaÚcpu)rk   r‚   r§   r{   r  Údevicer!  )r'   Ú
candidatesÚ	candidates      r,   Ú
get_devicez)functionalize_rng_ops.<locals>.get_device�  sk   € ð ˜Ÿ	™	Ñ!Øà—Y‘Y˜uÑ%ˆ
Ü˜*¤eÔ,Ø$˜ˆJà#ò 	"ˆIÜ˜)¤U§\¡\Õ2Ø×#Ñ#×(Ñ(¨FÓ2Ù!ð	"ð
 r.   c                 óp   — | dk(  rt         j                  j                  «       S t        j                  «       S )Nr`  )r{   r`  Úget_rng_state)rb  s    r,   Úget_sample_rng_statez3functionalize_rng_ops.<locals>.get_sample_rng_stateŸ  s,   € Ø�VÒÜ—:‘:×+Ñ+Ó-Ð-Ü×"Ñ"Ó$Ð$r.   rx   )ÚfwdÚbwdr�   rÎ   rT  zaCouldn't find tangent node in graph inputs. This is unexpected, please file a bug if you see thisri  rj  r‘   )r¡   r¢   r   r   Úrng_state_output_r€   r™   )$rã   Úcountrs   rt   rp   ry   rz   r{   r|   r}   rx   r›   Ú_primsÚ	rng_primsÚrun_and_save_rng_stateÚrun_with_rng_staterÏ   r¥   r   Úinserting_beforeÚcreate_noder¡   r¢   rý   rþ   Úreplace_all_uses_withÚ
erase_noder¦   Únextr�   rk   ÚiterrG  r§   r™   Ú	recompile) rË   rW  rX  rY  Úuidr^  re  rh  Újoint_graph_rng_opsÚfw_graph_rng_opsÚbw_graph_rng_opsÚrecomputable_rng_ops_mapr'   Ú	base_nodeÚfw_nodeÚbw_nodeÚrun_and_save_rngrp  Úbw_tangent_start_nodeÚfw_rng_state_outputsÚ	node_pairÚfw_graphÚfunctional_fw_nodeÚstateÚ
rng_outputÚbw_graphÚ
state_nameÚbw_rng_state_nodeÚfw_output_nodeÚ
fw_outputsÚsym_node_start_idxrŒ   s                                    r,   Úfunctionalize_rng_opsrŽ  g  s'  € ô2 �/‰/Ó
€Cò	òò$%ñ & lÓ3ÐÙ" 9Ó-ÐÙ" 9Ó-ÐØ!ÐØ×"Ñ"×(Ñ(ò 	Sˆä˜4Õ Ü˜Ÿ™ VÕ,Ü—	‘	×1Ñ1°T·[±[×5EÑ5EÒEà+¨D¯I©IÑ6ˆIØ& t§y¡yÑ1ˆGØ& t§y¡yÑ1ˆGØ:AÈ'Ñ2RÐ$ YÒ/ð	Sô —|‘|×-Ñ-×DÑDÐÜŸ™×/Ñ/×BÑBÐØ ÐØ—‘×*Ñ*¨mÐ*Ó<ò ˆØ˜Ÿ	™	Ò!Ø$(Ð!Ùðð Ð$ÜØoó
ð 	
ð ÐØ 8× >Ñ >Ó @ó /)Ñˆ	�9à˜EÑ"ˆØ˜EÑ"ˆØ—?‘?ˆØ×&Ñ& wÓ/ñ 	/Ø!)×!5Ñ!5ØØ Ø—n‘nÐ4 w§|¡|Ñ4Ø—~‘~ð	 "6ó "Ðð ×(Ñ(ØÜ× Ñ Ø(¨!Ð,Øð	 )ó ˆEð "×-Ñ-ØÜ× Ñ à&Øðð ð .ó ˆJð ×)Ñ)¨*Ô5Ø×Ñ Ô(Ø ×'Ñ'¨Ô.÷1	/ð6 —?‘?ˆØ×&Ñ&Ð'<Ó=ñ 	VØ,¬T°#«Y¨KÐ8ˆJØ (× 4Ñ 4°ZÓ @ÐÙ,@ÁÈGÓATÓ,UÐ×"Ñ" 5Ñ)÷	Vð
 ×&Ñ& wÓ/ñ 		)Ø!×-Ñ-ØØ"Ø'¨¯©ÐG¸'¿,¹,ÑGØ—~‘~ð	 .ó ˆJð ×)Ñ)¨*Ô5Ø×Ñ Ô(÷		)ñ 		)ðM/)ôh œ$˜yŸ™×9Ñ9¸XÐ9ÓFÓGÓH€NØ×$Ñ$ QÑ'€JÜ˜Z›¨=Ñ8ÐàÐ&Ð&Ð'Ü
Ð$Ó
%ñ	&à
Ð'Ð(Ð
)ñ	*ð ð
 ‡O�O×Ñ˜7Ô#Ø‡O�O×Ñ˜~Ô.Ø×ÑÔØ×ÑÔØ�iÐÐ÷w	/ñ 	/ú÷8	Vñ 	Vú÷
		)ñ 		)ús&   Æ&B5O6Ê ;PËAPÏ6P 	ÐP	ÐP	c                 ó  — | j                   j                  D ]h  }t        |«      sŒ|j                  D ]K  }t        |«      sŒ|j                  d   |j                  d   kD  sŒ/t
        j                  |j                  d<   ŒM Œj | S )a  
    If there are two consecutive checkpointed blocks with no operator in
    between, we would still want to stash the tensor at the boundary of
    checkpointed blocks. The following pass makes the last output node
    non-recomputable to allow for that.
    Úac_graph_idrj   )rs   rt   rp   rà   rk   r   Ú	MUST_SAVE)rË   r'   rÿ   s      r,   Úcleanup_recompute_tagsr’    s|   € ð ×"Ñ"×(Ñ(ò HˆÜ˜$ÕØŸ
™
ò H�ä" 4Õ(ØŸ	™	 -Ñ0°4·9±9¸]Ñ3KÓKä-=×-GÑ-G�D—I‘I˜kÒ*ñHðHð Ðr.   Ú	node_infoÚmin_cut_optionsc                 óL  ‡‡‡‡&‡'‡(‡)‡*‡+‡,‡-‡.‡/‡0‡1— ‰€
t        «       Št        «       Š0t        r—| j                  D �ch c]F  }|j                  dk(  r5t        |j                  d«      rt        |j                  j                  «      ’ŒH }}|‰0j                  D �ch c]  }t        |«      ’Œ c}z
  }t        d|«       t        «        d„ Š'd„ Š(ˆ'ˆ(ˆ0fd„Š)	 dd l}ˆ)ˆˆ0fd	„Š+ˆ+ˆˆ0fd
„}
ˆ)fd„Š*dt        fˆ*ˆ0fd„}|j                  «       Š/t        «       Š&ˆ&ˆˆ/ˆ0fd„}| j                  D �]A  }|j                  dk(  rŒ|‰j                   v rm|‰j"                  vr0‰/j%                  |j&                  dz   dt(        j*                  ¬«       Œ`‰/j%                  |j&                  dz   dt(        j*                  ¬«       t-        |«      r0‰/j%                  |j&                  dz   dt(        j*                  ¬«       ŒÊt/        |«      st1        |«      r ||«       ‰j3                  |«      r |
|«      r ||«       d|j4                  vxr d|j4                  vxs8 d|j4                  v xr( t7        |j4                  d   t8        j:                  «       }t=        |«      rt        t?        |«      «      }nF|r<t7        |j4                  jA                  d«      tB        «      rdnt(        j*                  }n ||«      }‰/j%                  |j&                  dz   |j&                  dz   |¬«       |jD                  D ]>  }‰/j%                  |j&                  dz   |j&                  dz   t(        j*                  ¬«       Œ@ �ŒD dtF        tH        jJ                     dtL        dtL        fˆ)ˆfd„}‰jN                  �r(‰jP                  D �]  }|jD                  D �cg c]$  }‰j3                  |«      r‰jS                  |«      ‘Œ& }}|jD                  D �cg c]  }‰j3                  |«      sŒ|‘Œ }}tU        |«      dkD  sŒw ||tW        |«      «      }tY        |jD                  «      D ]x  }‰j3                  |«      sŒ‰jS                  |«      |kD  sŒ* ‰)||«      sŒ4|‰&v rŒ9tZ        j]                  d|‰jS                  |«      ||‰jS                  |«      «        ||«       Œz �Œ ‰j^                  �r^t        «       }| j                  D �]D  }‰j3                  |«      sŒ‰jS                  |«      |fg}‰jS                  |«      }tU        |«      dkD  sŒJta        jb                  |«      \  }}||v rŒ,|je                  |«       ‰jS                  |«      |dz   kD  rNtU        |«      dk(  r@tZ        j]                  d||‰jS                  |«      ‰jS                  |«      «        ||«       ŒÝ|jD                  D ]J  }‰j3                  |«      sŒ ‰)||«      sŒ|‰&vsŒ$ta        jf                  |‰jS                  |«      |f«       ŒL tU        |«      dkD  rŒû�ŒG 	 |ji                  ‰/dd«      \  }}|\  }Š.t        «       }ˆ/fd „|D «       D ]   \  Š1}|jw                  ˆ.ˆ1fd!„|D «       «       Œ" t        «       } |D ](  \  }!}"|!d d" |"d d# k(  sJ ‚|!d d" }#| je                  |#«       Œ* ty        | «      Š,t{        | j                  «      D �$�ci c]  \  }$}||$“Œ
 c}}$Š-t}        ˆ,fd$„| D «       ˆ-fd%„¬&«      }%|%‰&fS c c}w c c}w # t        $ r}	t        d«      |	‚d }	~	ww xY wc c}w c c}w # tj        $ rU t        d«       t        djm                  |jn                  jp                  js                  ‰/«      «      «       tu        ‰/«       ‚ w xY wc c}}$w )'Nr‘   Ú_overloadpacketz$Ops banned from re-materialization: c                 óD  — |j                   t        j                  j                  j                  k7  ry|j
                  d   }t        j                  j                  j                  |«      \  }}|D ].  }|j                  |   }| |u r yt        |t        «      sŒ)| |v sŒ. y y©NFr   T)rz   r{   r.  Úhigher_orderÚauto_functionalizedr¡   Ú_higher_order_opsÚauto_functionalizeÚget_mutable_argsr¢   r‚   r  )ÚaÚbÚ
mutable_opÚmutable_arg_namesr  r›   r=  s          r,   Ú!can_fuse_into_auto_functionalizedz8solve_min_cut.<locals>.can_fuse_into_auto_functionalized*  s”   € Ø�8‰8”u—y‘y×-Ñ-×AÑAÒAØØ—V‘V˜A‘Yˆ
ô ×#Ñ#×6Ñ6×GÑGÈ
ÓSñ	
ØØà%ò 	 ˆDØ—(‘(˜4‘.ˆCØ�C‰xÙÜ˜#œtÕ$Ø˜’8Ùð	 ð r.   c                 óÄ   — |j                   t        j                  j                  j                  k7  ry|j
                  d   }|D ]  }|j
                  d   |   }| |u sŒ y y)NFÚtensors_to_cloner¢   T)rz   r{   r.  r™  Ú triton_kernel_wrapper_functionalr¢   )rž  rŸ  r¡  r›   r=  s        r,   Ú.can_fuse_into_triton_kernel_wrapper_functionalzEsolve_min_cut.<locals>.can_fuse_into_triton_kernel_wrapper_functional;  sb   € Ø�8‰8”u—y‘y×-Ñ-×NÑNÒNØØŸH™HÐ%7Ñ8ÐØ%ò 	ˆDØ—(‘(˜8Ñ$ TÑ*ˆCØ�CŠxÙð	ð r.   c                 ó®   •— t        |«      t        j                  k(  ry ‰| |«      ry ‰| |«      ry‰j                  | «      xr ‰j                  |«      S )NT)r   r/  Úcatr-   )rž  rŸ  r¢  r¦  Úop_typess     €€€r,   r-   z!solve_min_cut.<locals>.is_fusibleE  sT   ø€ ô ˜1Ó¤§¡Ò)ØÙ,¨Q°Ô2ØÙ9¸!¸QÔ?ØØ×"Ñ" 1Ó%Ò@¨(×*=Ñ*=¸aÓ*@Ð@r.   r   zANeed networkx installed to perform smart recomputation heuristicsc                 ó*  •— ‰j                  | «      ry| h}t        |«      dkD  ro|j                  «       }|j                  D ]A  }‰j	                  |«      s ‰||«      s y‰j                  |«      sŒ1|j                  |«       ŒC t        |«      dkD  rŒoyr˜  )r4   rG  rH  rà   rV   râ   )r'   rJ  Úcurrÿ   r-   r“  r©  s       €€€r,   Úis_materialized_backwardsz0solve_min_cut.<locals>.is_materialized_backwardsW  sŒ   ø€ Ø×Ñ˜DÔ!ØØ�Fˆ	Ü�)‹n˜qÒ Ø—-‘-“/ˆCØŸ	™	ò (�Ø ×/Ñ/°Ô5¹jÈÈdÔ>SÙØ×#Ñ# DÕ)Ø—M‘M $Õ'ð	(ô �)‹n˜qÓ ð r.   c                 óT  •— | j                   dk7  ry| j                  t        j                  k(  ry| j                  j                  dd «      t        j                  k(  ryt        j                  r‰j                  | «      ry| j                  t        j                  j                  t        j                  j                  fv ry‰j                  r‰j!                  | «      s$y‰j#                  | «      s‰j%                  | «      ry‰j&                  r3 ‰| «      r+t(        j+                  d| t-        | j.                  «      «       y| j0                  dk  r| j0                  t        j2                  kD  ry‰j4                  r/t7        d„ | j8                  D «       «      }t;        | «      }|dz  |k  S y)	Nr‘   Frj   Tzmaterialized backwards: %s %siè  c              3   óh   K  — | ]*  }t        |t        j                  «      sŒt        |«      –— Œ, y ­wr)   )r‚   r<   r=   r"  ©rJ   Úis     r,   rL   zBsolve_min_cut.<locals>.should_ban_recomputation.<locals>.<genexpr>�  s&   è ø€ ò %Ø !´*¸QÄÇÁÕ2H”˜—ñ%ùs   ‚2¢2r�   )rž   rz   rý   rþ   rk   rl   r   r‘  r   Úrecompute_viewsr4   r/  Úlift_fresh_copyÚdefaultÚ
lift_freshrg   r6   r2   r0   rf   ÚlogÚinfor§   rà   Údist_from_bwÚmax_dist_from_bwrh   r  r¡   r"  )r'   Úinput_tensors_sizeÚoutput_sizer¬  r”  r©  s      €€€r,   Úshould_ban_recomputationz/solve_min_cut.<locals>.should_ban_recomputatione  sc  ø€ Ø�7‰7�oÒ%ØØ�;‰;œ(×*Ñ*Ò*ØØ�9‰9�=‰=˜ dÓ+Ô/?×/IÑ/IÒIØÜ×!Ò! h×&6Ñ&6°tÔ&<ØØ�;‰;œ4×/Ñ/×7Ñ7¼¿¹×9PÑ9PÐQÑQØà×2Ò2Ø×+Ñ+¨DÔ1Øà×!Ñ! $Ô'¨8×+HÑ+HÈÔ+NØð ×7Ò7Ñ<UØô=
ô �H‰HÐ4°d¼EÀ$Ç*Á*Ó<MÔNØð ×Ñ˜tÒ#¨×(9Ñ(9¼F×<SÑ<SÒ(SØð ×+Ò+Ü!$ñ %Ø%)§Y¡Yô%ó "Ðô # 4›.ˆKØ ‘?Ð%7Ñ7Ð7Ør.   c                 óf   •‡ — ‰ j                   dk(  ryt        ˆˆ fd„‰ j                  D «       «       S )Nr�   Tc              3   ó0   •K  — | ]  } ‰‰|«      –— Œ y ­wr)   r>   )rJ   rÿ   r-   r'   s     €€r,   rL   z9solve_min_cut.<locals>.is_materialized.<locals>.<genexpr>›  s   øè ø€ ÒE°$‘z $¨×-ÑEùs   ƒ)rž   r  rà   )r'   r-   s   `€r,   Úis_materializedz&solve_min_cut.<locals>.is_materialized—  s*   ù€ Ø�7‰7�mÒ#ØäÔE¸$¿*¹*ÔEÓEÐEÐEr.   rF   c           
      óŒ  •— t        | «      }t        j                  r!‰j                  | «      rt        j
                  S t        | j                  d   t        «      r-t        | j                  d   t        j                  «      st        S t        |dt        t        | j                  d«      d«      z  z  «      } ‰| «      r|S |dz  S )Nr€   gš™™™™™ñ?éd   r   é   )r"  r   r±  r4   rN  rO  r‚   rk   r   r{   rƒ   ÚINT_INFr^   ÚmaxÚminr·  )r'   Úmem_szr¾  r©  s     €€r,   Úget_node_weightz&solve_min_cut.<locals>.get_node_weight�  s�   ø€ Ü˜$“ˆÜ×!Ò! h×&6Ñ&6°tÔ&<ô —8‘8ˆOä�d—i‘i Ñ&¬Ô5ä˜dŸi™i¨Ñ.´·±Ô=Ü�ô �V˜s¤c¬#¨d×.?Ñ.?ÀÓ*EÀqÓ&IÑIÑJÓKˆÙ˜4Ô ØˆMà˜A‘:Ðr.   c                 ó8  •— ‰j                  | «      ry| ‰v ryt        | «      ryd| j                  v r(t        | j                  d   t        j
                  «      ry‰j                  | «       ‰j                  d| j                  dz   t        j                  ¬«       y)NFr€   ÚsourceÚ_in©ÚcapacityT)r4   rp   rk   r‚   r{   r…   râ   Úadd_edger›   rN  rO  )r'   Úbanned_nodesÚdont_banÚnx_graphr©  s    €€€€r,   Úban_recomputation_if_allowedz3solve_min_cut.<locals>.ban_recomputation_if_allowed¹  s†   ø€ Ø×Ñ˜DÔ!ØØ�8ÑØô ˜$ÔØà�D—I‘IÑ¤*¨T¯Y©Y°uÑ-=¼u¿~¹~Ô"NØà×Ñ˜Ôð
 	×Ñ˜( D§I¡I°Ñ$5ÄÇÁÐÔIØr.   r™   rÉ  ÚsinkrÊ  Ú_outr€   rû   ç        Ústart_nodesÚ	max_rangec           
      óÊ  •— g }| D ]*  }t        j                  |‰	j                  |«      |df«       Œ, t        |«      dkD  r¢t        j                  |«      \  }}}|s‰	j                  |«      S |j
                  D ]X  }‰	j                  |«      sŒ‰	j                  |«      |kD  rŒ*t        j                  |‰	j                  |«      | ‰||«      f«       ŒZ t        |«      dkD  rŒ¢|S )z„
        Finds the first unfusible node in the chain of nodes starting from
        `start_nodes` and returns its position.
        Tr   )ÚheapqÚheappushr]   rG  Úheappoprà   rV   )
rÔ  rÕ  Úsorted_nodesrK   r  r'   Únode_is_fusiblerÿ   r-   r“  s
           €€r,   Úfind_first_unfusiblez+solve_min_cut.<locals>.find_first_unfusible  sì   ø€ ð
 9;ˆØò 	OˆAÜ�N‰N˜<¨)×*@Ñ*@ÀÓ*CÀQÈÐ)MÕNð	Oô �,Ó !Ò#Ü',§}¡}°\Ó'BÑ$ˆAˆt�_Ù"Ø ×-Ñ-¨dÓ3Ð3ØŸ
™
ò �Ø×+Ñ+¨DÕ1Ø ×-Ñ-¨dÓ3°iÒ?Ø Ü—N‘NØ$Ø"×/Ñ/°Ó5°t¹ZÈÈdÓ=SÐTõð	ô	 �,Ó !Ó#ð Ðr.   z1used above/below fusible %s:(%s) -> %s -> %s:(%s)rÀ  ztoo long %s %s %s %srÈ  z-Failed to compute min-cut on following graph:ú
c              3   ó,   •K  — | ]  }|‰|   f–— Œ y ­wr)   r>   )rJ   rK   rÏ  s     €r,   rL   z solve_min_cut.<locals>.<genexpr>�  s   øè ø€ Ò8¨�Q˜ ™Ô$Ñ8ùs   ƒc              3   ó0   •K  — | ]  }|‰v sŒ‰|f–— Œ y ­wr)   r>   )rJ   ÚvÚnon_reachableÚus     €€r,   rL   z solve_min_cut.<locals>.<genexpr>‚  s   øè ø€ ÒA ¨a°=Ò.@�q˜!”fÑAùs   ƒ	�	éýÿÿÿéüÿÿÿc              3   ó(   •K  — | ]	  }‰|   –— Œ y ­wr)   r>   )rJ   r'   Úname_to_nodes     €r,   rL   z solve_min_cut.<locals>.<genexpr>Ž  s   øè ø€ Ò2 ˆ�dÕ	Ñ2ùs   ƒc                 ó   •— ‰|    S r)   r>   )r”   Únode_idxs    €r,   rN   zsolve_min_cut.<locals>.<lambda>Ž  s   ø€ À(È1Á+€ r.   rO   )?rá   Úget_default_op_listÚAOT_PARTITIONER_DEBUGrt   rž   ry   rz   r²   r–  r&   r)  ÚnetworkxÚImportErrorr¥   ÚfloatÚDiGraphrC   rA   rÌ  r›   rN  rO  rp   rµ   r´   rV   rk   r‚   r{   r  r   r†   rl   r   rà   r	   r<   r=   r^   rd   rS   r]   rG  rÃ  r§   rµ  r¶  re   r×  rÙ  râ   rØ  Úminimum_cutÚ	ExceptionÚjoinÚ	readwriteÚedgelistÚgenerate_edgelistÚvisualize_min_cut_graphÚupdateÚget_name_to_noderM  rQ   )2r‹   r“  r”  rÎ  r'   Újoint_module_opsr°  Úops_ignoredÚnxÚer»  rÆ  rÐ  Úis_non_tensor_nodeÚweightrÿ   rÜ  Ú	used_nodeÚordersÚfw_usersÚfirst_unfusible_useÚvisitedÚ
start_nodeÚfusibleÚstart_orderr  r«  Ú	cut_valueÚ	partitionÚ	reachableÚcutsetÚnbrsÚ	cut_nodesÚnode_inÚnode_outÚ	node_namerQ  rÔ   rÍ  r¢  r¦  r-   r¾  r¬  ræ  rè  rá  rÏ  r©  râ  s2    ```                                  @@@@@@@@@@@@r,   Úsolve_min_cutr    s  ÿþ€ ð ÐÜ“5ˆÜ"Ó$€Håð $×)Ñ)ö
àØ�w‰w˜/Ò)¬g°d·k±kÐCTÔ.Uô �—‘×+Ñ+Õ,ð
Ðð 
ð
 '¸(×:SÑ:SÖ)T°Q¬#¨a­&Ò)TÑTˆÜÐ4°kÔBÜŒòò"ö	AðÛöö0ôdFð¤ö ð2 �z‰z‹|€HÜ“5€L÷ð* ×!Ñ!ó 3XˆØ�7‰7�hÒØà�9×.Ñ.Ñ.Ø˜9×+Ñ+Ñ+Ø×!Ñ! $§)¡)¨eÑ"3°VÄdÇhÁhÐ!ÔOØð ×Ñ˜dŸi™i¨&Ñ0°&Ä4Ç8Á8ÐÔLä˜$Ôð
 ×Ñ˜dŸi™i¨%Ñ/°Ä$Ç(Á(ÐÔKØä�dÔÔ2°4Ô8Ù(¨Ô.ð
 ×#Ñ# DÔ)Ñ.FÀtÔ.LÙ(¨Ô.ð ˜Ÿ™Ð"ÒE }¸D¿I¹IÐ'EòUà�t—y‘yÐ ÒS¬°D·I±I¸eÑ4DÄeÇlÁlÓ)SÐ%Sð 	ô �tÔÜœ=¨Ó.Ó/‰FÙä! $§)¡)§-¡-°Ó"6¼ÔF‘ÌDÏHÉHñ ñ % TÓ*ˆFà×Ñ˜$Ÿ)™) eÑ+¨T¯Y©Y¸Ñ-?È&ÐÔQØ—J‘Jò 	XˆDØ×Ñ˜dŸi™i¨&Ñ0°$·)±)¸eÑ2CÌdÏhÉhÐÕWò	Xðe3XðL¬$¬r¯w©w©-ð ÄCð ÌCö ð. ×,Ó,Ø"×4Ñ4ó 	;ˆIð &ŸO™OöàØ×+Ñ+¨DÔ1ð ×&Ñ& tÕ,ðˆFð ð "+§¡öØ°I×4LÑ4LÈTÕ4R’ðˆHð ô �6‹{˜Q‹Ù&:¸8ÄSÈÃ[Ó&QÐ#Ü! )§/¡/Ó2ò ;�Dà!×0Ñ0°Õ6Ø%×2Ñ2°4Ó8Ð;NÓNÙ& y°$Õ7à <Ñ/Ø$ÜŸ™ØOØ%Ø%×2Ñ2°9Ó=Ø/Ø Ø%×2Ñ2°4Ó8ôñ 5°TÕ:ò!;ð	;ðP ×1Ó1Ü“%ˆØ%×+Ñ+ó 	VˆJØ×+Ñ+¨JÔ7ØØ!×.Ñ.¨zÓ:¸JÐGÐHˆGØ#×0Ñ0°Ó<ˆKÜ�g“, Ó"ÜŸ™ wÓ/‘��3Ø˜'‘>ØØ—‘˜CÔ ð ×*Ñ*¨3Ó/°+ÀÑ2CÒCÜ˜G›¨Ò)ä—H‘HØ.ØØ"Ø!×.Ñ.¨sÓ3Ø!×.Ñ.¨zÓ:ôñ 1°Ô5ØàŸI™Iò V�Dà!×0Ñ0°Õ6Ù& s¨DÕ1Ø ¨Ò4äŸ™ w°×1GÑ1GÈÓ1MÈtÐ0TÕUðVô) �g“, Õ"ð	VðBØ!Ÿ~™~¨h¸À&ÓIÑˆ	�9ð  )Ñ€Iˆ}Ü#&£5€FÛ8¨iÔ8ò B‰ˆˆ4Ø�‰ÔA dÔAÕAðBô “€IØ#ò !Ñˆ�Ø�s˜ˆ|˜x¨¨˜}Ò,Ð,Ð,Ø˜C˜R�Lˆ	Ø�‰�iÕ ð!ô
 $ KÓ0€Lä+4°[×5FÑ5FÓ+G×H™i˜c 4��c‘	ÓH€HÜÛ2¨	Ô2Ó8Mô€Lð ˜Ð%Ð%ùò_
ùò
 *UøôX ò ÜØRó
àð	ûðüòvùò
øôN ò ÜÐ=Ô>Üˆd�i‰i˜Ÿ™×-Ñ-×?Ñ?ÀÓIÓJÔKÜ Ô)Øð	üó& IsI   ºA\Â\Ã\ Î=)\5Ï6\:Ð\:Ø3\? Û ^ Ü	\2Ü!\-Ü-\2Ü?A^c                 ó²  — dd l }dd l}|j                  j                  | «      j	                  «       }|j                  |«      d   }|j                  «       D ]c  }| |j                  «          |j                  «          d   }|j                  t        |«      «       |t        d«      k(  sŒS|j                  d«       Œe t        d«       |j                  d«       y )Nr   rË  rO  Úredz2Visualizing the failed graph to min_cut_failed.svgzmin_cut_failed.svg)rë  ÚpydotÚnx_pydotÚto_pydotÚ	to_stringÚgraph_from_dot_dataÚ	get_edgesÚ
get_sourceÚget_destinationÚ	set_labelr²   rí  Ú	set_colorr)  Ú	write_svg)rÏ  rú  r  Ú
dot_formatÚ	dot_graphÚedgerý  s          r,   rõ  rõ  “  s¸   € ÛÛà—‘×%Ñ% hÓ/×9Ñ9Ó;€JØ×)Ñ)¨*Ó5°aÑ8€IØ×#Ñ#Ó%ò "ˆØ˜$Ÿ/™/Ó+Ñ,¨T×-AÑ-AÓ-CÑDÀZÑPˆà�‰”s˜6“{Ô#à”U˜5“\Ó!Ø�N‰N˜5Õ!ð"ô 
Ð
>Ô?Ø×ÑÐ,Õ-r.   c                  óL  — g t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j
                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                  ‘t         j                   ‘t         j"                  ‘t         j$                  ‘t         j&                  ‘t         j(                  ‘t         j*                  ‘t         j,                  ‘t         j.                  ‘t         j0                  ‘t         j2                  ‘t         j4                  ‘t         j6                  ‘t         j8                  ‘t         j:                  ‘t         j<                  ‘t         j>                  ‘t         j@                  ‘t         jB                  ‘t         jD                  ‘t         jF                  ‘t         jH                  ‘t         jJ                  ‘t         jL                  ‘t         jN                  ‘t         jP                  ‘t         jR                  ‘t         jT                  ‘t         jV                  ‘t         jX                  ‘t         jZ                  ‘t         j\                  ‘t         j^                  ‘t         j`                  ‘t         jb                  ‘t         jd                  ‘t         jf                  ‘t         jh                  ‘t         jj                  ‘t         jl                  ‘t         jn                  ‘t         jp                  ‘t         jr                  ‘t         jt                  ‘t         jv                  ‘t         jx                  ‘t         jz                  ‘t         j|                  ‘t         j~                  ‘t         j€                  ‘t         j‚                  ‘t         j„                  ‘t         j†                  ‘t         jˆ                  ‘t         jŠ                  ‘t         jŒ                  ‘tŽ        j�                  ‘t         j’                  ‘t         j”                  ‘t         j–                  ‘t         j˜                  ‘} t         j’                  t         j”                  t         jš                  g}|t         jœ                  t         jž                  t         j                   t¢        j¤                  t         j¦                  t         j¨                  t         jª                  gz  }|}| g t¢        j                  ‘t¢        j¬                  ‘t         j®                  ‘t         j˜                  ‘t         j°                  ‘t¢        j²                  ‘t¢        j€                  ‘t         j²                  ‘t         j´                  ‘t¢        j¤                  ‘t         j¶                  ‘t         j¸                  ‘t         jœ                  ‘t         j¦                  ‘t         jž                  ‘t         jº                  ‘t         j¼                  ‘t         j¾                  ‘t         jÀ                  ‘t         jÂ                  ‘t         jÄ                  ‘t         jÆ                  ‘t         jÈ                  ‘t         jÊ                  ‘t         jÌ                  ‘t         jÎ                  ‘t         jÐ                  ‘t         j¨                  ‘t         jÒ                  ‘t         jÔ                  ‘t         jÖ                  ‘t         jØ                  ‘t         jÚ                  ‘t¢        jÜ                  ‘t¢        jÞ                  ‘z  } | t         jà                  t         jâ                  gz  } | |z  } | tå        «       z  } | t         jæ                  gz  } | tè        D �cg c]  }të        |«      ‘Œ c}z  } tí        | «      }t         jî                  t         jð                  t         jò                  g}t         jô                  t         jö                  t         jø                  t         jú                  t         jü                  t         jþ                  t         �j                   t         �j                  t         �j                  t         �j                  t         �j                  g}|tí        |«      z  }�t        tí        |«      tí        |«      tí        |«      tí        |«      tí        |«      «      S c c}w r)   )†r/  râ   ÚsubÚdivÚatan2ÚmulrÃ  rÄ  ÚpowÚ	remainderÚfmodÚ__and__Ú__or__Ú__xor__Ú
__lshift__Ú
__rshift__ÚeqÚneÚgeÚgtÚleÚltÚabsÚ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ÚrsqrtÚ
reciprocalÚsigmoidÚsoftplusÚ	thresholdÚthreshold_backwardÚclampÚwhereÚlerpÚaddcmulÚgeluÚgelu_backwardr  ÚmeanÚ_grad_sum_to_sizeÚsum_to_sizeÚamaxÚtoÚtype_asrý   rþ   ÚsqueezeÚ	unsqueezeÚrsubÚ_to_copyÚaliasÚviewÚsliceÚtÚprimsÚbroadcast_in_dimÚexpandÚ
as_stridedÚpermuteÚconvert_element_typeÚcloneÚ	full_likeÚvarÚstdÚselectÚ_unsafe_viewÚreshapeÚbroadcast_tensorsÚscalar_tensorÚonesÚ	new_zerosr²  ÚarangeÚtriuÚvar_meanÚisinfr£   ÚfullÚzerosÚemptyÚ
empty_likeÚargmaxÚmaximumÚiotaÚ)_low_memory_max_pool2d_offsets_to_indicesÚindexÚgatherr9  Ú
zeros_liker   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_opsr%   Úmr&   r$   r#   r"   s           r,   ré  ré  ¤  s~  € ðL0Ü�‰ðL0ä�‰ðL0ô 	�‰ðL0ô 	�
‰
ð	L0ô
 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�	‰	ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô 	�‰ðL0ô  	�‰ð!L0ô" 	�‰ð#L0ô$ 	�‰ð%L0ô& 	�‰ð'L0ô( 	�‰ð)L0ô* 	�‰ð+L0ô, 	�‰ð-L0ô. 	×Ñð/L0ô0 	�	‰	ð1L0ô2 	�
‰
ð3L0ô4 	�	‰	ð5L0ô6 	�‰ð7L0ô8 	�	‰	ð9L0ô: 	�
‰
ð;L0ô< 	�	‰	ð=L0ô> 	�
‰
ð?L0ô@ 	�‰ðAL0ôB 	�
‰
ðCL0ôD 	�
‰
ðEL0ôF 	�	‰	ðGL0ôH 	�‰ðIL0ôJ 	�‰ðKL0ôL 	�
‰
ðML0ôN 	�‰ðOL0ôP 	�	‰	ðQL0ôR 	�‰ðSL0ôT 	�	‰	ðUL0ôV 	�	‰	ðWL0ôX 	�‰ðYL0ôZ 	�	‰	ð[L0ô\ 	�	‰	ð]L0ô^ 	�‰ð_L0ô` 	�	‰	ðaL0ôb 	�	‰	ðcL0ôd 	�
‰
ðeL0ôf 	�	‰	ðgL0ôh 	�
‰
ðiL0ôj 	�‰ðkL0ôl 	�‰ðmL0ôn 	�‰ðoL0ôp 	�‰ðqL0ôr 	×ÑðsL0ôt 	�
‰
ðuL0ôv 	�
‰
ðwL0ôx 	�	‰	ðyL0ôz 	�‰ð{L0ô| 	�	‰	ð}L0ô~ 	×ÑðL0ô@ 	�‰ðAL0ôB 	�	‰	ðCL0ôD 	×ÑðEL0ôF 	×ÑðGL0ôH 	�	‰	ðIL0ôJ 	�‰ðKL0ôL 	�‰ðML0ôN 	×ÑðOL0ôP 	�‰ðQL0ôR 	�‰ðSL0ôT 	�	‰	ðUL0ôV 	�‰ðWL0ÐôZ "Ÿ\™\¬4¯>©>¼4¿:¹:ÐFÐØÜ�	‰	Ü�
‰
Ü�‰Ü×ÑÜ�‰Ü�‰Ü�‰ðñ Ðð %€HØð $!Ü�	‰	ð$!ä×"Ñ"ð$!ô 	�
‰
ð$!ô 	�‰ð	$!ô
 	�‰ð$!ô 	�	‰	ð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�‰ð$!ô 	×Ñð$!ô 	�	‰	ð$!ô 	�‰ð$!ô 	�
‰
ð$!ô  	�‰ð!$!ô" 	×Ñð#$!ô$ 	×Ñð%$!ô& 	�	‰	ð'$!ô( 	�‰ð)$!ô* 	×Ñð+$!ô, 	�‰ð-$!ô. 	�	‰	ð/$!ô0 	�‰ð1$!ô2 	�
‰
ð3$!ô4 	�‰ð5$!ô6 	�	‰	ð7$!ô8 	�‰ð9$!ô: 	�
‰
ð;$!ô< 	�
‰
ð=$!ô> 	�‰ð?$!ô@ 	�‰ðA$!ôB 	�‰ðC$!ôD 	�
‰
ðE$!ôF 	×7Ñ7ðG$!ñ $ÐðL ¤§¡¬T¯[©[Ð 9Ñ9ÐØ Ñ(Ðà¤£Ñ/ÐàÜ�‰ð!ñ Ðð ÄÖ N¸1Ô!3°AÕ!6Ò NÑNÐÜÐ3Ó4Ðä×%Ñ%¤t§~¡~´t·±ÐG€Jä�‰Ü×ÑÜ×!Ñ!Ü�‰Ü�
‰
Ü×0Ñ0Ü×4Ò4Ü×%Ò%Ü×)Ò)Ü× Ò Ü�ŠðÐð #¤S¨£_Ñ4€KÝÜˆKÓÜÐ!Ó"ÜˆJ‹ÜˆH‹ÜÐÓóð ùò' !Os   ßd!c                 óJ   — i }| j                   D ]  }|||j                  <   Œ |S r)   )rt   r›   )rs   ræ  r'   s      r,   r÷  r÷  H  s.   € Ø€LØ—‘ò 'ˆØ"&ˆ�T—Y‘YÒð'àÐr.   ÚmemoryÚruntimesÚ
max_memoryc                 ó  ‡ ‡— t        ‰«      }t        t        |«      «      }t        |ˆ ˆfd„d¬«      }d}d}g }g }|D ]@  }	|‰ |	   z   |k  r"|‰ |	   z  }|‰|	   z  }|j	                  |	«       Œ0|j	                  |	«       ŒB |||fS )Nc                 ó   •— ‰|    ‰|    z  S r)   r>   )r°  rœ  r�  s    €€r,   rN   z!greedy_knapsack.<locals>.<lambda>V  s   ø€ ¨°©°f¸Q±iÑ(?€ r.   Tr&  rÓ  )rG  r  ÚrangerQ   r¦   )
rœ  r�  rž  rK   r   Útotal_memoryÚtotal_runtimeÚitems_to_saveÚitems_to_allow_recomputingr°  s
   ``        r,   Úgreedy_knapsackr¦  O  s©   ù€ ô 	ˆH‹€AÜ”�q“‹N€Eô �5Ô?ÈÔN€Eà€LØ€MØ€MØ!#Ðàò 1ˆØ˜& ™)Ñ# zÒ1Ø˜F 1™IÑ%ˆLØ˜X a™[Ñ(ˆMØ× Ñ  Õ#à&×-Ñ-¨aÕ0ð1ð ˜-Ð)CÐCÐCr.   c           	      óü  — dd l }	 ddlm}m}m} |j                  | «      }|j                  |«      }| }	 |||j                  |«      ¬«      }
|
g}|j                  |	«      } ||	|| |dd«      ¬«      }|j                  st        d«      ‚g }g }t        |j                  «      D ]-  \  }}|dk(  r|j                  |«       Œ|j                  |«       Œ/ |j                   ||fS # t
        $ r t        d«      d ‚w xY w)Nr   )ÚBoundsÚLinearConstraintÚmilpzHTo use the ILP for memory budget checkpointing you need to install scipy)ÚAÚubr   )ÚcÚconstraintsÚintegralityÚboundszSomehow scipy solving failed)ÚnumpyÚscipy.optimizer¨  r©  rª  rì  r¥   ÚarrayÚ	ones_likeÚsuccessrM  r”   r¦   Úfun)rœ  r�  rž  Únpr¨  r©  rª  Ú	np_memoryÚnp_runtimesr­  Úmemory_constraintr®  r¯  Úresr¤  r¥  rQ  r°  s                     r,   Úilp_knapsackr¼  g  s  € ó ðßAÑAð —‘˜Ó €IØ—(‘(˜8Ó$€KØ	ˆ€Aá(¨9¸¿¹À*Ó9MÔNÐØ$Ð%€Kà—,‘,˜q“/€KÙ
Ø
˜°+ÁfÈQÐPQÃlô€Cð �;Š;ÜÐ9Ó:Ð:à€MØ!#ÐÜ˜CŸE™EÓ"ò 3‰ˆˆQØ�Š6Ø× Ñ  Õ%à&×-Ñ-¨cÕ2ð	3ð
 �G‰Gˆ8�]Ð$>Ð>Ð>øô5 ò ÜØVó
àð	ðús   †
C% Ã%C;c                 óâ  — d}t        j                  | D �cg c]  }t        t        ||z  «      «      ‘Œ c}t         j                  d¬«      }t        j                  |t         j
                  d¬«      }t        t        ||z  «      «      }t        | «      }t        j                  |dz   |dz   ft         j
                  d¬«      }t        d|dz   «      D ]v  }	||	dz
     }
||	dz
     }||	dz
  d d …f   ||	d d …f<   |
dk(  r||	dz
  d d …f   |z   ||	d d …f<   ŒBt        j                  ||	dz
  |
d …f   ||	dz
  d |
 …f   |z   «      ||	|
d …f<   Œx g }g }|}t        |dd«      D ]a  }	||	   |   ||	dz
     |   k7  r7|j                  |	dz
  «       |t        ||	dz
     j                  «       «      z  }ŒN|j                  |	dz
  «       Œc |j                  «        ||   |   j                  «       }|||fS c c}w )Ni'  ra  )r  rb  r   r   éÿÿÿÿ)r{   Útensorr^   r:  ÚlongÚfloat32rG  r€  r¡  r„  r¦   Úitemr'  )rœ  r�  rž  ÚSrš  Úquantized_memoryÚquantized_max_memoryrK   Údpr°  Úcurrent_memoryÚcurrent_runtimeÚsaved_itemsÚrecomputable_itemsÚjÚmax_runtimes                   r,   Údp_knapsackrÍ  ‹  s)  € ð 	€Aô —|‘|Ø$*Ö+˜qŒŒU�1�q‘5‹\Õ	Ò+´5·:±:ÀeôÐô �|‰|˜H¬E¯M©MÀ%ÔH€Hô œu Z°!¡^Ó4Ó5ÐäˆF‹€Aô 
�‰Ø	
ˆQ‰Ð$ qÑ(Ð)´·±Àuô
€Bô �1�a˜!‘e‹_ò ˆØ)¨!¨a©%Ñ0ˆØ" 1 q¡5™/ˆð �a˜!‘ešQ�h‘<ˆˆ1Šaˆ4‰ð ˜QÒØ˜!˜a™%¢˜(‘| oÑ5ˆBˆq’!ˆtŠHä%*§]¡]Ø�1�q‘5˜.™/Ð)Ñ*Ø�1�q‘5Ð*˜N˜?Ð*Ð*Ñ+¨oÑ=ó&ˆBˆq�.‘/Ð!Ò"ðð" €KØÐØ!€AÜ�1�a˜‹_ò -ˆØˆa‰5�‰8�r˜!˜a™%‘y ‘|Ò#Ø×Ñ˜q 1™uÔ%Ø”Ð% a¨!¡eÑ,×1Ñ1Ó3Ó4Ñ4‰Aà×%Ñ% a¨!¡eÕ,ð-ð ×ÑÔð �Q‘%Ð,Ñ-×2Ñ2Ó4€Kà˜Ð%7Ð7Ð7ùòc 	,s   –G,c                 óª   — t         j                  }|dk(  rt        | ||«      S |dk(  rt        | ||«      S |dk(  rt	        | ||«      S t        d|› �«      ‚)NÚgreedyÚilprÆ  z,Not aware of memory budget knapsack solver: )r   Úactivation_memory_budget_solverr¦  r¼  rÍ  r¥   )rœ  r�  rž  ÚSOLVERs       r,   Ú#_optimize_runtime_with_given_memoryrÓ  Ç  se   € ô
 ×3Ñ3€FØ�ÒÜ˜v x°Ó<Ð<Ø	�5ŠÜ˜F H¨jÓ9Ð9Ø	�4ŠÜ˜6 8¨ZÓ8Ð8äÐIÈ&ÈÐRÓSÐSr.   ©Úno_dispatchc                 óF  ‡ ‡‡	— t         j                  }d„ }|dk(  ry|dk(  rat        «       5  ddlm} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	|j                  ˆˆ	ˆ fd„«      }|cd d d «       S |dk(  rudd	l
m} t        j                  |‰ j                  ‰ j                  f«      \  ŠŠ	 |d
¬«      5 } ‰ j                  ‰i ‰	¤Ž d d d «       j                  «       }t        |d«      S t        d|› �«      ‚# 1 sw Y   y xY w# 1 sw Y   Œ?xY w)Nc                 ó2  — t        | t        j                  «      r˜t        | j                  d   t        j
                  «      rqt        | j                  d   j                  «      }d„ }|D �cg c]
  } ||«      ‘Œ }}| j                  d   j                  || j                  d   j                  ¬«      S t        | t        j                  «      rAt        | j                  d   t        j                  «      rt        | j                  d   d¬«      S t        | t        j                  «      r(t        | j                  d   t        j                  «      ryt        | t        j                  «      r(t        | j                  d   t        j                  «      ry| S c c}w )	Nr€   c                 ó   — t        | d¬«      S )Nr  r  )r   )Úds    r,   Úrealize_symbolzAestimate_runtime.<locals>.materialize_arg.<locals>.realize_symbolá  s   € Ü ¨DÔ1Ð1r.   rû   )Ústrider  r  g      ð?T)r‚   r<   r=   rk   r{   r  r  ÚshapeÚnew_empty_stridedrÛ  rƒ   r   r…   r„   )r”   rÜ  rÚ  rÝ   s       r,   Úmaterialize_argz)estimate_runtime.<locals>.materialize_argÝ  s   € Ü�aœŸ™Ô!¤j°·±¸±ÄÇÁÔ&MÜ˜Ÿ™ ™×,Ñ,Ó-ˆEò2ð 16Ö6¨1‘^ AÕ&Ð6ˆEÐ6Ø—6‘6˜%‘=×2Ñ2Ø˜aŸf™f ]Ñ3×:Ñ:ð 3ó ð ô ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç,Á,Ô(OÜ˜AŸF™F 5™M°DÔ9Ð9Ü˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç.Á.Ô(QØÜ˜œ2Ÿ7™7Ô#¬
°1·6±6¸%±=Ä%Ç-Á-Ô(PØàˆHùò 7s   Á+FÚtestingr   Úprofiler   )Úbenchmarkerc                  ó(   •—  ‰j                   ‰ i ‰¤ŽS r)   )rz   )r¡   r¢   r'   s   €€€r,   rN   z"estimate_runtime.<locals>.<lambda>ù  s   ø€ °;°4·;±;ÀÐ3OÈÑ3O€ r.   Úflops)ÚFlopCounterModeF)Údisplayz Not aware of runtime estimator: )r   Ú*activation_memory_budget_runtime_estimatorrÕ  Ú$torch._inductor.runtime.benchmarkingrá  rŸ   Útree_mapr¡   r¢   Úbenchmark_gpuÚtorch.utils.flop_counterrä  rz   Úget_total_flopsrÃ  r¥   )
r'   ÚRUNTIME_MODErÞ  rá  Úmsrä  ÚmodeÚcounted_flopsr¡   r¢   s
   `       @@r,   Úestimate_runtimerð  Ú  s  ú€ Ü×DÑD€Lòð( �yÒ Øà	˜Ò	"Ü‹]ñ 	ÝHä!Ÿ?™?¨?¸T¿Y¹YÈÏÉÐ<TÓU‰LˆD�&Ø×*Ñ*Õ+OÓPˆBØ÷	ñ 	ð 
˜Ò	 å<ä—‘ ¸¿¹ÀDÇKÁKÐ8PÓQ‰ˆˆfÙ UÔ+ð 	)¨tØˆD�K‰K˜Ð( Ò(÷	)à×,Ñ,Ó.ˆÜ�= !Ó$Ð$äÐ=¸l¸^ÐLÓMÐM÷#	ð 	ú÷	)ð 	)ús   ¬ADÃDÄDÄD c                 óÞ  ‡ ‡‡‡‡‡‡ ‡!‡"‡#‡$‡%— |dkD  s|dk  rt        d|› �«      ‚t        t        j                  t        j                  t        j
                  t        j                  t        j                  ¬«      }t        j                  rt        |dddd¬«      }|dk(  r‰j                  S t        ‰ ‰|«      \  }}|dk(  r|S dt        t        j                     dt        fd	„Š ‰‰j                  «      Š# ‰|«      Š!‰!‰#k  r|S ˆ!ˆ#fd
„}dt        t        j                     fˆˆ!ˆ#fd„}t        |ddd¬«      }t        ‰ ‰|«      \  }	} ||	«      |k  r|	S t        |d¬«      Št        ‰ ‰‰«      \  }
} ||
«      |k  r|
S ddlmŠ ‰j                  D �ch c]
  } ‰|«      ’Œ c}Š dt        t        j                     dt        t        j                     fˆˆ fd„} ||«      }t%        |t&        d¬«      Št)        ‰«      dk(  r‰j                  S ‰D �cg c]  } |t'        |«      «      ‘Œ c}Š"‰D �cg c]  }t+        |«      ‘Œ c}Š%ddlmŠ$ ˆˆˆ ˆ"ˆ$ˆˆ%fd„}t        j0                  �rag }t3        ddd«      D ]6  } ||dz  «      \  }}|j5                  |t7        ‰%«      |z
   ||«      f«       Œ8 dd lm} |D �cg c]  }|d   ‘Œ	 }}|D �cg c]  }|d   ‘Œ	 }}|j=                  d¬«       |j?                  ||d¬«       tA        |«      D ]"  \  }}|jC                  |d›|||   fdd d!¬"«       Œ$ |jE                  d#«       |jG                  d$«       |jI                  d%«       |jK                  d«       |jM                  «       }|jO                  «        d&tQ        «       › d'�}|jS                  |«       tT        jW                  d(|«        ||¬)«      d   S c c}w c c}w c c}w c c}w c c}w )*Nr   r   zJThe valid ranges for memory budget are 0 <= m <= 1. The provided value is )rd   re   rf   rg   rh   F)rd   re   rf   rg   rÔ   rF   c                 ó:   — t        t        t        | «      «      dz  S ©Nç    eÍÍA)r  Úmapr"  )rÔ   s    r,   Úestimate_activations_sizez:choose_saved_values_set.<locals>.estimate_activations_size,  s   € Ü”3”x Ó.Ó/°#Ñ5Ð5r.   c                 ó   •— | dz  ‰‰z
  z  S ró  r>   )ÚszÚmax_act_sizeÚmin_act_sizes    €€r,   Úget_normalized_sizez4choose_saved_values_set.<locals>.get_normalized_size5  s   ø€ Ø�S‘˜\¨LÑ8Ñ9Ð9r.   Úactivationsc                 ó&   •—  ‰| «      ‰z
  ‰‰z
  z  S r)   r>   )rü  rö  rù  rú  s    €€€r,   Úget_mem_ratioz.choose_saved_values_set.<locals>.get_mem_ratio8  s"   ø€ Ù)¨+Ó6¸ÑEØ˜<Ñ'ñ
ð 	
r.   )rd   re   rf   )rg   ©Úget_node_storagerÍ  c                 ór   •— | D �cg c]&  }|j                   t        d«      k  r ‰|«      ‰vr|‘Œ( c}S c c}w ró  )r·  r^   )rÍ  r°  r   Úinput_storagess     €€r,   Úget_recomputable_banned_nodesz>choose_saved_values_set.<locals>.get_recomputable_banned_nodesX  sD   ø€ ð "ö
àð —‘¤ S£Ò)Ù$ QÓ'¨~Ñ=ò ò
ð 	
ùò 
s   †+4Tr&  rÔ  c           	      ó  •—  ‰«       5  t        ‰‰t        | d«      «      \  }}}d d d «       t        «       }D ]  }|j                  ‰	|   «       Œ |j	                  ‰	«      sJ ‚t        ‰
‰‰|«      \  }}|fS # 1 sw Y   ŒVxY w)Nr   )rÓ  rÃ  rá   râ   Úissubsetr  )Úmemory_budgetÚexpected_runtimeÚsaved_node_idxsÚrecomputable_node_idxsrÎ  rQ  rÔ   r  Úaggressive_optionsÚall_recomputable_banned_nodesr‹   Úmemories_banned_nodesrÕ  r“  Úruntimes_banned_nodess           €€€€€€€r,   Úget_saved_values_knapsackz:choose_saved_values_set.<locals>.get_saved_values_knapsackv  s¬   ø€ Ù‹]ñ 	ô
 4Ø%Ð'<¼cÀ-ÐQRÓ>Sóñ	Ø ØØ&÷		ô “5ˆØ)ò 	=ˆCØ�L‰LÐ6°sÑ;Õ<ð	=à× Ñ Ð!>Ô?Ð?Ð?ä'ØØØØó	
‰ˆ�að Ð-Ð-Ð-÷'	ð 	ús   ‰A:Á:BrÀ  r¾  éûÿÿÿrÁ  )é
   é   )ÚfigsizeÚo)Úmarkerz.2fzoffset points)r   r  Úcenter)Ú
textcoordsÚxytextÚhazMemory Budgetz Runtime of Recomputed Componentsz:Pareto Frontier of Memory Budget vs. Recomputation RuntimeÚmemory_budget_pareto_z.pngz%Generated Pareto frontier curve at %s©r  ),r¥   rc   r   Úban_recompute_used_far_apartÚ!ban_recompute_long_fusible_chainsÚ#ban_recompute_materialized_backwardÚban_recompute_not_in_allowlistÚban_recompute_reductionsÚaggressive_recomputationr   rA   r  r	   r<   r=   rí  Útorch._inductor.fx_utilsr   rQ   r"  rG  rð  Útorch.utils._mode_utilsrÕ  Úvisualize_memory_budget_paretor¡  r¦   r  Úmatplotlib.pyplotÚpyplotÚfigureÚplotrM  ÚannotateÚxlabelÚylabelÚtitleÚgridÚgcfÚshowr   Úsavefigrµ  Úwarning)&r‹   r“  r  r”  Úruntime_optimized_saved_valuesr  rû  rþ  Úmore_aggressive_optionsÚmore_aggressive_saved_valuesÚ%aggressive_recomputation_saved_valuesrÍ  r'   r  Úrecomputable_banned_nodesr°  r  ÚoptionsÚsweep_memory_budgetrÔ   r  ÚpltrÂ  Úx_valuesÚy_valuesÚtxtÚfigÚfig_namer
  r  rö  r   r  rù  r  rú  rÕ  r  s&   ``                          @@@@@@@@@@r,   Úchoose_saved_values_setr>  	  s,  ÿû€ ð �qÒ˜M¨AÒ-ÜØXÐYfÐXgÐhó
ð 	
ô $Ü$×AÑAÜ#)×#KÑ#KÜ%+×%OÑ%OÜ &× EÑ EÜ×8Ñ8ô€Oô ×&Ò&Ü!ØØ"'Ø',Ø).Ø$)ô
ˆð ˜ÒØ×ÑÐä(5ØØØó)Ñ%Ð" Að ˜ÒØ-Ð-ð6´´R·W±W±ð 6Ä%ó 6ñ -¨Y×-=Ñ-=Ó>€LÙ,Ð-KÓL€Là�|Ò#Ø-Ð-õ:ð
¤4¬¯©¡=÷ 
ô
 &ØØ#Ø#(Ø%*ô	Ðô '4Ø�YÐ 7ó'Ñ#Ð  !ñ Ð1Ó2°]ÒBØ+Ð+ä ØØ %ôÐô ;HØ�YÐ 2ó;Ñ7Ð)¨<ñ Ð:Ó;¸mÒKØ4Ð4å9à9B×9IÑ9IÖJ°Ñ& tÕ,ÒJ€Nð	
´D¼¿¹±Mð 	
ÄdÌ2Ï7É7Ámö 	
ñ !>¸lÓ KÐô %+Ø!¤x¸ô%Ð!ô Ð(Ó)¨QÒ.Ø×ÑÐà2OöØ-.ÑœH Q›KÕ(òÐð ,IöØ#'Ô˜ÕòÐõ 4÷.ò .ô, ×,Ó,ØˆÜ#(¨¨b°"Ó#5ò 
	ÐÙ-FØ# cÑ)ó.Ñ*ˆLÐ*ð �N‰Nà'ÜÐ-Ó.Ð1AÑAÙ! ,Ó/ðõð	
	õ 	(à(/Ö0 �D˜“GÐ0ˆÐ0Ø(/Ö0 �D˜“GÐ0ˆÐ0ð 	�
‰
˜7ˆ
Ô#Ø�‰�˜8¨CˆÔ0ô   Ó)ò 	‰FˆAˆsØ�L‰LØ�s�)Ø�h˜q‘kÐ"Ø*ØØð õ ð	ð 	�
‰
�?Ô#Ø�
‰
Ð5Ô6Ø�	‰	ÐNÔOØ�‰�ŒØ�g‰g‹iˆØ�‰Œ
Ø*Ô+=Ó+?Ð*@ÀÐEˆØ�‰�HÔÜ�‰Ð;¸XÔFñ %°=ÔAÀ!ÑDÐDùòO Kùò0ùòùòV 1ùÚ0s   ÆOÈOÈ2O Ê;O%ËO*c          
      ó  ‡— | j                   j                  «        | j                  «        | j                   }t        j                  rt        |«      }|| _         | j                   }t        | «      }t        | «      }|rt        | «      } ˆfd„}	 |	| «      }
t        |
j                  «      dk(  rt        | |‰¬«      S t        | j                   j                  «      D ]„  }|j                  dk(  rt        d«      |_        Œ#|
j#                  |«      sd|_        Œ<t        d«      |_        |j$                  D ]*  }t'        |j                   |j                   dz   «      |_        Œ, Œ† t        j(                  }|j                  D ]=  }t+        |j,                  j/                  dd«      t0        «      sŒ.|j,                  d   } n t3        ||
|¬	«      }t5        t7        t8        |«      «      }t5        t7        d
„ |«      «      }t;        | ||‰¬«      \  }}|r|rt=        | ||t        |«      «      \  }}t?        |«      }t@        �r¶ddl!m"} |D �ch c]
  } ||«      ’Œ }}tG        dtI        d„ |D «       «      dz  «       tK        |D �cg c]  }tM        |«      tO        |«      f‘Œ c}«      }|j                   j                  D �ch c]  }|j                  dk(  sŒ|jP                  ’Œ  }}|j                   j                  D �ch c]  }|j                  dk(  sŒ|jP                  ’Œ  }}||z  }tS        t        «      }|j                   j                  D ]R  }|jP                  |v sŒtU        |jV                  d«      sŒ)|tO        |jV                  jX                  «      xx   dz  cc<   ŒT tG        dt        |«      › dt        |«      › dt        |«      › �«       tG        dtK        |j[                  «       d„ d¬«      «       ||fS c c}w c c}w c c}w c c}w )ax  
    Partitions the joint graph such that the backward recomputes the forward.
    Recomputing helps in trading off memory bandwidth with computation.

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

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

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

    Returns:
        Returns the generated forward and backward Fx graph modules.
    c                 óè  •— t        | j                  «      }t        «       }| j                  j                  D ]t  }|j                  dk(  r d|j
                  v r|j                  |«       nt        |«      r|j                  |«       ||v sŒS|j                  D ]  }|j                  |«       Œ Œv t        t        t        | j                  j                  «      «      }t        t        t        | j                  j                  «      «      }||z   }t        | ‰¬«      \  }}	|j                  d„ |	D «       «       t        | j                  ||d«      }
|
j                  D �ch c]   }|j                  dk7  r||j                      ’Œ" }}| j                  j                  D �ch c]  }||vr||vr|’Œ }}d}i }| j                  j                  D ]  }||v sŒ|||<   |dz  }Œ t#        |||||«      S c c}w c c}w )	Nr�   r±   rÛ   c              3   óF   K  — | ]  }|€Œ|j                   dk7  sŒ|–— Œ y ­w)Nr™   rÎ   )rJ   r  s     r,   rL   zNmin_cut_rematerialization_partition.<locals>.classify_nodes.<locals>.<genexpr>  s$   è ø€ ò !
Ø a¡m¸¿¹ÀÓ8HŒAñ!
ùs   ‚!Š!š!rÞ   r™   r   r   )r÷  rs   rá   rt   rž   rz   râ   rœ   rà   r  rß   rµ   r´   rÓ   rö  r®   r›   r@   )rË   ræ  rC   r'   rÿ   rê   rì   rA   rÑ   rÒ   r  rS   rD   Úfw_cntrE   rÐ   s                  €r,   Úclassify_nodesz;min_cut_rematerialization_partition.<locals>.classify_nodesñ  s  ø€ Ü'¨×(:Ñ(:Ó;ˆÜ›EÐØ ×&Ñ&×,Ñ,ò 	0ˆDØ�w‰w˜-Ò'¨J¸$¿+¹+Ñ,EØ!×%Ñ% dÕ+Ü% dÔ+Ø!×%Ñ% dÔ+àÐ(Ò(Ø ŸJ™Jò 0�DØ%×)Ñ)¨$Õ/ñ0ð	0ô œV¤J°×0BÑ0B×0HÑ0HÓIÓJˆÜ!%ÜÔ&¨×(:Ñ(:×(@Ñ(@ÓAó"
Ðð Ð!7Ñ7ˆÜ#;Ø¨/ô$
Ñ ˆ�[ð 	× Ñ ñ !
Ø"ô!
ô 	
ô @Ø×Ñ ¨°Yó
Ðð
 +×0Ñ0ö+
àØ�w‰w˜(Ò"ð ˜Ÿ™Ó#ð+
Ðð +
ð %×*Ñ*×0Ñ0ö
àØÐ,Ñ,°Ð=NÑ1Nò ð
ˆð 
ð
 ˆØˆØ ×&Ñ&×,Ñ,ò 	ˆDØÐ(Ò(Ø!'�˜‘Ø˜!‘‘ð	ô ØÐ%Ð'8¸/È8ó
ð 	
ùò!+
ùò

s   Å%G*ÆG/r   rÛ   r™   rô  r   r  Nr  c                 ó   — t        | «       S r)   r  )rK   s    r,   rN   z5min_cut_rematerialization_partition.<locals>.<lambda>?  s   € ¬[¸«^Ð);€ r.   r  rÿ  z Theoretical Activations Stored: c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr)   )r"  r¯  s     r,   rL   z6min_cut_rematerialization_partition.<locals>.<genexpr>V  s   è ø€ Ò2 ”˜—Ñ2ùr  r‘   r–  z# remat/fw/bw: ú/zCount of Ops Rematerialized: c                 ó   — | d   S r%  r>   r  s    r,   rN   z5min_cut_rematerialization_partition.<locals>.<lambda>j  s
   € °°1±€ r.   Tr&  ).rs   r¨   rw  r   Úcser   rv   r~   r’  rG  rC   r  Úreversedrt   rž   r^   r·  rV   rà   rÄ  Úactivation_memory_budgetr‚   rk   rl   rí  r>  r  rß   r   rù   rŽ  rV  rê  r!  r   r)  r  rQ   r"  r²   r›   r   ry   rz   r–  r   )rË   r
  ÚcompilerrÐ   rq   Ú	cse_graphr‹   Úgraph_has_recomputable_opsÚgraph_has_recomputable_rng_opsrC  r“  r'   rÿ   r  rÔ   rÙ   rW  rX  r   Ústoragesr°  Úsorted_sizesÚfw_module_nodesÚbw_module_nodesÚremat_nodesÚcountss      `                      r,   r  r  À  s½  ø€ ðB ×Ñ×*Ñ*Ô,Ø×ÑÔà×Ñ€Dô ‡z‚zÜ  Ó&ˆ	Ø&ˆÔØ×$Ñ$€Kä!5°lÓ!CÐÜ%=¸lÓ%KÐ"Ù!Ü-¨lÓ;ˆô-
ñ^ ˜|Ó,€Iô
 ˆ9×&Ñ&Ó'¨1Ò,Ü Ø˜-¸ô
ð 	
ô ˜×+Ñ+×1Ñ1Ó2ò RˆØ�7‰7�hÒÜ # C£ˆDÕØ×)Ñ)¨$Ô/Ø !ˆDÕä # C£ˆDÔØŸ
™
ò R�Ü$'¨×(9Ñ(9¸4×;LÑ;LÈqÑ;PÓ$Q�Õ!ñRðRô ×3Ñ3€MØ×!Ñ!ò ˆÜ�d—i‘i—m‘m O°TÓ:¼EÕBØ ŸI™I oÑ6ˆMÙðô
 +Ø�Y¨mô€Lô œ6¤+¨|Ó<Ó=€OÜœÑ;¸\ÓJÓK€Lô 4ØØØ'Ø'ô	Ñ€Iˆyñ "Ù)Ü#8Ø˜i¨´C¸Ó4Hó$Ñ ˆI�yô 4°IÓ>€IæÝ=à7CÖD¨tÑ$ TÕ*ÐDˆÐDÜØ.ÜÑ2 \Ô2Ó2°SÑ8ô	
ô ¸lÖK¸¤¨£¬S°«VÒ4ÒKÓLˆà"+§/¡/×"7Ñ"7ö
Ø¸4¿7¹7ÀoÓ;UˆD�I‹Ið
ˆð 
ð #,§/¡/×"7Ñ"7ö
Ø¸4¿7¹7ÀoÓ;UˆD�I‹Ið
ˆð 
ð &¨Ñ7ˆä!,¬SÓ!1ˆØ—O‘O×)Ñ)ò 	>ˆDØ�y‰y˜KÒ'¬G°D·K±KÐARÕ,SØ”s˜4Ÿ;™;×6Ñ6Ó7Ó8¸AÑ=Ô8ð	>ô 	Øœc +Ó.Ð/¨q´°_Ó1EÐ0FÀaÌÈOÓH\ÐG]Ð^ô	
ô 	Ø+Ü�6—<‘<“>¡~¸tÔDô	
ð �iÐÐùò3 Eùò
 Lùò
ùò
s$   ÉO7Ê O<Ê<PËPË9PÌPÚtracedÚfnameÚfignameÚ
clear_metaÚprogÚparse_stack_traceÚdot_graph_shapec                 ó  — |rWt        j                  | j                  «      }t        j                  | |«      } | j                  j
                  D ]	  }i |_        Œ t        j                  j                  |«      \  }	}
|
sdt        j                  z   }
t        d|	› |
› �«       t        j                  | |||¬«      }|j                  «       }t!        |d|
j#                  d«      z   «      }|	› |
› �}|€	 ||«       y  |||¬«       y )Nú.zWriting FX graph to file: )rZ  r[  Úwrite_)rY  )ÚcopyÚdeepcopyrs   r<   rP  rt   rk   ÚosÚpathÚsplitextr   Útorch_compile_graph_formatr)  r   ÚFxGraphDrawerÚget_main_dot_graphr0  Úlstrip)rU  rV  rW  rX  rY  rZ  r[  rª   r'   ÚbaseÚextÚgr”   Úwrite_methods                 r,   Ú
draw_graphrl  o  sñ   € ñ Ü—M‘M &§,¡,Ó/ˆ	Ü—‘ ¨	Ó2ˆØ—L‘L×&Ñ&ò 	ˆDØˆD�Ið	ä—‘× Ñ  Ó'�I€Dˆ#ÙØ”F×5Ñ5Ñ5ˆÜ	Ð& t f¨S¨EÐ
2Ô3Ü×"Ñ"ØØØ+Ø'ô		€Að 	
×ÑÓ€AÜ˜1˜h¨¯©°C«Ñ8Ó9€LØˆf�S�EˆN€EØ€|Ù�UÕá�U Ö&r.   r)   )r   )Úinductor)Úfx_graphTNFN)vr_  r_   r×  rã   ÚloggingrN  rý   ra  r(  r   Údataclassesr   r   Útypingr   r   r	   r
   r   r   r   r   r{   Útorch._inductor.inductor_primsÚtorch.fxr<   Útorch.utils._pytreeÚutilsÚ_pytreerŸ   Ú%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   Útorch.fx.passesr   Útorch.utils.checkpointr   Ú r   Ú_aot_autograd.logging_utilsr   Ú_aot_autograd.utilsr   Úcompile_utilsr   r   ÚsympyÚdebug_partitionerrê  Ú	getLoggerr7   rµ  r.  r/  rj  r!   r@   rc   r=   ra   rp   rP  rv   r~   r^   r†   rˆ   r�   rš   r²   r®   rµ   r¸   r³   r´   rÁ   rÆ   rÉ   rœ   rÓ   rØ   rù   r  rÂ  r  r"  r+  Ú	lru_cacher9  r?  rV  rŽ  r’  r  rõ  ré  r÷  rí  r¦  r¼  rÍ  rÓ  r"  rÕ  rð  r>  r  rl  r>   r.   r,   ú<module>r…     së  ðã Û Û Û Û Û Û Û 	Ý #ß *ß S× SÓ Sã Û %Ý ß $Ð $Ý ?ß Hß L÷ó õ )Ý 3å Ý ;Ý 0ß 8ñ Ûð ×0Ñ0Ð Ø€g×Ñ˜Ó!€à‡y�y‡~�~€Ø�	‰	�‰€ð ÷>ð >ó ð>ð2 ÷ ð  ó ð ð: ÷ð ó ðð˜Ÿ™ð  Tó ð˜rŸ~™~ð °$ó ð 2§>¡>ð °dó ð˜Ÿ™ð  Có ÷ñ ñ
 Ó€ð #ñ	DØ—‘ðDà�—‘‰MðDð �"—'‘'‰]ðDð �s‰mð	Dð
 ‡X�XóDðN�R—W‘Wð  ó ðG�b—g‘gð G $ó Gð˜bŸg™gð ¨$ó ð˜bŸg™gð ¨$ó ðX˜RŸW™Wð X¨ó XðC˜rŸw™wð C¨4ó CðK r§w¡wð K°4ó Kð˜rŸw™wð ¨4ó ð$Ø—.‘.ð$à
ˆ4�—‘‰=˜$˜rŸw™w™-Ð'Ñ(ó$ð $ r§w¡w¡-ð °só ð`"Ø—.‘.ð`"à�r—w‘w‘-ð`"ð ˜"Ÿ'™'‘]ð`"ð
 ð`"ð ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*ó`"ðFSØ—.‘.ðSà
ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*óSñl ˆc‹(€ð"˜#ð "¨ó "ð�2—7‘7ð ˜só ð:A�b—h‘hó Að €×Ñ�TÓñó ðð"H  b§g¡g¨s lÑ!3ð H¸¸UÀ2Ç7Á7ÈCÀ<Ñ=PÑ8Qó HðG¨B¯N©Nð G¸r¿~¹~ó GðTZ Ø—.‘.ðZ à�~‰~ðZ ð �~‰~ðZ ð ð	Z ð
 ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*óZ ðz¨¯©ð ¸B¿N¹Nó ð, ñ	z&Ø—‘ðz&àðz&ð #óz&òz.ð"a˜Wó aðH˜BŸH™Hó ðDØ�‰KðDØ#'¨¡;ðDØ<AðDà
ˆ5�$�s‘)˜T #™YÐ&Ñ'óDð0!?Ø�‰Kð!?Ø#'¨¡;ð!?Ø<Að!?à
ˆ5�$�s‘)˜T #™YÐ&Ñ'ó!?ðH98Ø�‰Kð98Ø#'¨¡;ð98Ø<Að98à
ˆ5�$�s‘)˜T #™YÐ&Ñ'ó98ðxTØ�‰KðTà�5‰kðTð ðTð ˆ5�$�s‘)˜T #™YÐ&Ñ'ó	Tõ  0ò,Nð` ?@ñtEØ—‘ðtEØ&.ðtEà	ˆ"�'‰'�]ótEðt ñl Ø—.‘.ðl ð ˆ2�>‰>˜2Ÿ>™>Ð)Ñ*ól ðd ØØ,0Ø#Ø%)ñ'Ø�H‰H× Ñ ð'àð'ð ð'ð ð	'ð
 �5˜˜d 3™i˜Ñ(Ñ
)ð'ð ð'ð ˜c‘]ð'ð 
ô'r.   