§
    ŠŠtjÖ@  ã                  óä  — U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZ d dlmZmZ d dlZd dlZd dlmZ d dlmZ d dlmc mZ d dlmZ d dlmZ d d	lmZ d
dl m!Z!m"Z"m#Z# d
dl$m%Z% d
dl&m'Z'm(Z(m)Z) erd dl*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1  ed¦  «        Z2 ed¦  «        Z3 ej4        e5¦  «        Z6dGd„Z7edHd„¦   «         Z8e#dId„¦   «         Z9	 dJdKd$„Z:dLd&„Z;e#dMd'„¦   «         Z< G d(„ d)ej=        ¦  «        Z>e#dNd+„¦   «         Z?e#dOd,„¦   «         Z@dPd/„ZAejB        jC        ZCeCjD        eCjE        eCjF        eCjG        eCjH        eCjI        eCjJ        eCjK        eCjL        eCjM        eCjN        eCjO        eCjP        eCjQ        jR        eCjQ        jS        eCjT        eCjU        eCjV        eCjW        eCjX        eCjY        eCjZ        hZ[ ee[¦  «        Z[e#dMd0„¦   «         Z\dQd4„Z]dRd6„Z^d a_d7e`d8<   dSd;„ZadTdC„Zb	 dUdVdF„ZcdS )Wé    )ÚannotationsN)Úcontextmanager)Úpartial)ÚAnyÚTYPE_CHECKING)Ú	ParamSpecÚTypeVar)ÚSymInt)Úget_decompositions)Úbind_symbolsé   )Úaot_functionÚ
aot_moduleÚmake_boxed_compiler)Ústrip_overloads)Údefault_partitionÚ
draw_graphÚ#min_cut_rematerialization_partition)ÚCallableÚ	GeneratorÚSequence)ÚNode)ÚIntLikeTypeÚ_PÚ_RÚfx_gúfx.GraphModuleÚreturnc                óÊ   — | j                              dt          j        j        j        ¬¦  «        D ]}t          j        j        j        |_        Œ|                      ¦   «          | S )NÚcall_function©ÚopÚtarget)	ÚgraphÚ
find_nodesÚtorchÚopsÚatenÚ_to_copyÚtor#   Ú	recompile)r   Únodes     úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/_functorch/compilers.pyÚ_canonicalizer.   /   s[   € Ø”
×%Ò%Ø¥5¤9¤>Ô#:ð &ñ ô ð (ð (ˆõ ”i”nÔ'ˆŒˆØ‡N‚NÑÔÐØ€Kó    úGenerator[None, None, None]c               #  óØ   K  — t           j                             d¦  «        } 	 d V — t           j                             | ¦  «         d S # t           j                             | ¦  «         w xY w)NF)r&   Ú_CÚ_jit_set_autocast_mode)Úold_jit_autocast_flags    r-   Ú_disable_jit_autocastr5   8   sh   è è € õ "œH×;Ò;¸EÑBÔBÐð?Øˆˆˆõ 	Œ×'Ò'Ð(=Ñ>Ô>Ð>Ð>Ð>ø�Œ×'Ò'Ð(=Ñ>Ô>Ð>Ð>øøøs   £A Á!A)ÚinpsúSequence[Any]útorch.jit.ScriptModulec                óô  — t          ¦   «         5  t          | ¦  «         | j                             dt          j        j        j        ¬¦  «        D ]V}t          |j	        ¦  «        dk    r<t          |j
        ¦  «        dk    r$d|j
        v rt          j        j        j        |_        ŒW| j        j        D ]P}i }|j
                             ¦   «         D ]+\  }}t          |t          j        ¦  «        r|j        }|||<   Œ,||_
        ŒQ| j                             ¦   «          |                      ¦   «          t          j                             | ¦  «        }t          j                             |j        ¦  «         t          j                             |                     ¦   «         ¦  «        }t          j                             |¦  «        }t7          d„ |D ¦   «         ¦  «        s ||Ž  ddd¦  «         n# 1 swxY w Y   |S )a  
    Compiles the :attr:`fx_g` with Torchscript compiler.

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

    Args:
        fx_g(fx.GraphModule): The input Fx graph module to be compiled.

    Returns:
        Torch scripted model.
    r    r!   r   Údtypec              3  óT   K  — | ]#}t          |t          j        j        ¦  «        V — Œ$d S ©N)Ú
isinstancer&   Ú_subclassesÚ
FakeTensor)Ú.0Úts     r-   ú	<genexpr>zts_compile.<locals>.<genexpr>n   s2   è è € ÐMÐMÀ1•:˜a¥Ô!2Ô!=Ñ>Ô>ÐMÐMÐMÐMÐMÐMr/   N)r5   r   r$   r%   r&   r'   r(   r)   ÚlenÚargsÚkwargsr*   r#   ÚnodesÚitemsr=   ÚdeviceÚtypeÚlintr+   ÚjitÚscriptr2   Ú_jit_pass_remove_mutationÚfreezeÚevalÚoptimize_for_inferenceÚany)r   r6   r,   Ú
new_kwargsÚkÚvÚfs          r-   Ú
ts_compilerV   C   s  € õ 
Ñ	 Ô	 ð ð Ý˜ÑÔÐà”J×)Ò)Ø¥u¤y¤~Ô'>ð *ñ 
ô 
ð 	0ð 	0ˆDõ �4”9‰~Œ~ Ò"Ð"¥s¨4¬;Ñ'7Ô'7¸1Ò'<Ð'<ÀÈDÌKÐAWÐAWÝ#œiœnÔ/�”øà”JÔ$ð 	%ð 	%ˆDØˆJØœ×)Ò)Ñ+Ô+ð "ð "‘��1Ý˜a¥¤Ñ.Ô.ð Øœ�AØ !�
˜1‘�Ø$ˆDŒKˆKàŒ
�ŠÑÔÐà�ŠÑÔÐåŒI×Ò˜TÑ"Ô"ˆõ 	Œ×*Ò*¨1¬7Ñ3Ô3Ð3åŒI×Ò˜QŸVšV™XœXÑ&Ô&ˆÝŒI×,Ò,¨QÑ/Ô/ˆÝÐMÐMÈÐMÑMÔMÑMÔMð 	ØˆAˆtˆHˆHð;ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð< €Hs   �GG-Ç-G1Ç4G1TÚ_r   ÚnameÚstrÚ
clear_metaÚboolc                óR   — t          | j        ¦  «         t          | ||¬¦  «         | S )N)rZ   )ÚprintÚcoder   )r   rW   rX   rZ   s       r-   Ú_draw_graph_compiler_   s   s.   € õ 
ˆ$Œ)ÑÔÐÝˆt�T jÐ1Ñ1Ô1Ð1Ø€Kr/   ú5Callable[[fx.GraphModule, list[Any]], fx.GraphModule]c                óH   — t          t          t          | ¬¦  «        ¦  «        S )N©rX   )r   r   r_   rb   s    r-   Údraw_graph_compilerc   {   s    € õ �wÕ':ÀÐFÑFÔFÑGÔGÐGr/   c                ó   — | S )zÆ
    Returns the :attr:`fx_g` Fx graph module as it is. This is a no-op compiler
    and can be used to check accuracy.

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

    © ©r   rW   s     r-   Únoprg   �   s	   € ð €Kr/   c                  ó4   ‡ — e Zd Zdddœdˆ fd„Zdˆ fd„Zˆ xZS )ÚDebugInterpreterNT©Úinitial_envÚenable_io_processingrD   r   rk   údict[Node, Any] | Nonerl   r[   r   c               óf   •— t          | j        g|¢R Ž | _         t          ¦   «         j        |||dœŽS )Nrj   )r   ÚmoduleÚsymbol_mappingÚsuperÚrun)Úselfrk   rl   rD   Ú	__class__s       €r-   rr   zDebugInterpreter.run�   sT   ø€ õ +àŒKð
ð ð
ð 
ð 
ˆÔð
 �u‰wŒwŒ{Ø˜{ÐAUð
ð 
ð 
ð 	
r/   Únr   c                ób  •‡ ‡
‡‡‡— dˆ fd„Šdˆfd	„Šdˆfd„Š
dˆ
ˆfd„}t          ¦   «                              |¦  «        }d|j        v råt          j        |j        d         ¦  «        \  }}t          j        |¦  «        \  }}t          |¦  «        t          |¦  «        k    r.t          t          |¦  «        › dt          |¦  «        › �¦  «        ‚t          t          t          |¦  «        ¦  «        ||¦  «        D ]2\  Š}}	t          |	t          j        ¦  «        sŒ! |||	ˆˆ fd„¦  «         Œ3|S )NÚnir   r   Úintc                óî   •— t          | t          ¦  «        s| S t          j        | j        j                             ‰j        ¦  «        ¦  «        }|j        st          d|› �¦  «        ‚t          |¦  «        S )Nzexpected r to be a number, got )r=   r
   ÚsympyÚexpandr,   ÚexprÚxreplacerp   Ú	is_numberÚAssertionErrorrx   )rw   Úrrs   s     €r-   Úsubst_symintz/DebugInterpreter.run_node.<locals>.subst_symintŸ   sk   ø€ Ý˜b¥&Ñ)Ô)ð Ø�	Ý”˜RœWœ\×2Ò2°4Ô3FÑGÔGÑHÔHˆAØ”;ð LÝ$Ð%JÀqÐ%JÐ%JÑKÔKÐKÝ�q‘6”6ˆMr/   Únisútuple[IntLikeType, ...]útuple[int, ...]c                ó:   •— t          ˆfd„| D ¦   «         ¦  «        S )Nc              3  ó.   •K  — | ]} ‰|¦  «        V — Œd S r<   re   )r@   rw   r�   s     €r-   rB   zHDebugInterpreter.run_node.<locals>.subst_symint_tuple.<locals>.<genexpr>¨   s-   øè è € Ð8Ð8¨b˜˜ bÑ)Ô)Ð8Ð8Ð8Ð8Ð8Ð8r/   )Útuple)r‚   r�   s    €r-   Úsubst_symint_tuplez5DebugInterpreter.run_node.<locals>.subst_symint_tuple§   s&   ø€ ÝÐ8Ð8Ð8Ð8°CÐ8Ñ8Ô8Ñ8Ô8Ð8r/   Úaútorch.TensorÚbr[   c                ó,  •—  ‰|                       ¦   «         ¦  «        dk    rqt          | j        ¦  «        D ]\} ‰|                      |¦  «        ¦  «        |                     |¦  «        k    r% ‰|                      |¦  «        ¦  «        dk    r dS Œ]dS )Nr   r   FT)ÚnumelÚrangeÚndimÚstrideÚsize)r‰   r‹   Úidxr�   s      €r-   Úcheck_significant_stridesz<DebugInterpreter.run_node.<locals>.check_significant_stridesª   sŒ   ø€ Øˆ|˜AŸGšG™IœIÑ&Ô&¨Ò*Ð*Ý  ¤™=œ=ð %ð %�Cà$˜ Q§X¢X¨c¡]¤]Ñ3Ô3°q·x²xÀ±}´}ÒDÐDØ(˜L¨¯ª°©¬Ñ5Ô5¸Ò9Ð9à$˜u˜uøØ�4r/   ÚnvÚrvÚdescúCallable[[], str]ÚNonec           
     óÜ  •— t          |¦  «        st          dt          |¦  «        › �¦  «        ‚| j        |j        k    r)t           |¦   «         › d| j        › d|j        › �¦  «        ‚ ‰|                      ¦   «         ¦  «        |                     ¦   «         k    rat           |¦   «         › d|                      ¦   «         › d ‰|                      ¦   «         ¦  «        › d|                     ¦   «         › �¦  «        ‚ ‰| |¦  «        }|sat           |¦   «         › d|                      ¦   «         › d ‰|                      ¦   «         ¦  «        › d|                     ¦   «         › �¦  «        ‚d S )Nz"expected desc to be callable, got z: ú != z aka )Úcallabler   rI   r:   r‘   r�   )r”   r•   r–   Úsame_stridesr“   rˆ   s       €€r-   Úcheckz(DebugInterpreter.run_node.<locals>.check´   s|  ø€ Ý˜D‘>”>ð XÝ$Ð%VÍ$ÈtÉ*Ì*Ð%VÐ%VÑWÔWÐWØŒx˜2œ8Ò#Ð#Ý$¨¨©¬Ð%JÐ%J°"´(Ð%JÐ%JÀÄÐ%JÐ%JÑKÔKÐKØ!Ð! "§'¢'¡)¤)Ñ,Ô,°·²±	´	Ò9Ð9Ý$Ø�t‘v”vÐ_Ð_ §¢¡¤Ð_Ð_Ð1CÐ1CÀBÇGÂGÁIÄIÑ1NÔ1NÐ_Ð_ÐTV×T[ÒT[ÑT]ÔT]Ð_Ð_ñô ð ð 5Ð4°R¸Ñ<Ô<ˆLØð Ý$Ø�t‘v”vÐeÐe §¢¡¤ÐeÐeÐ3EÐ3EÀbÇiÂiÁkÄkÑ3RÔ3RÐeÐeÐXZ×XaÒXaÑXcÔXcÐeÐeñô ð ðð r/   Úvalrš   c                 ó   •— d‰ › d‰j         › �S )Nzoutput z where )rp   )Úirs   s   €€r-   ú<lambda>z+DebugInterpreter.run_node.<locals>.<lambda>Ò   s   ø€ Ð&O°Ð&OÐ&O¸$Ô:MÐ&OÐ&O€ r/   )rw   r   r   rx   )r‚   rƒ   r   r„   )r‰   rŠ   r‹   rŠ   r   r[   )r”   rŠ   r•   rŠ   r–   r—   r   r˜   )rq   Úrun_nodeÚmetaÚpytreeÚtree_flattenrC   r   ÚziprŽ   r=   r&   ÚTensor)rs   ru   r�   r€   Ún_valsÚ_n_specÚr_valsÚ_r_specr”   r•   r“   r    r�   rˆ   rt   s   `         @@@@€r-   r¢   zDebugInterpreter.run_nodež   s‰  øøøøøø€ ð	ð 	ð 	ð 	ð 	ð 	ð	9ð 	9ð 	9ð 	9ð 	9ð 	9ð	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð 	õ ‰GŒG×Ò˜QÑÔˆØ�A”Fˆ?ˆ?Ý$Ô1°!´&¸´-Ñ@Ô@‰OˆF�GÝ$Ô1°!Ñ4Ô4‰OˆF�Gõ �6‰{Œ{�c &™kœkÒ)Ð)Ý$­¨F©¬Ð%FÐ%F½¸V¹¼Ð%FÐ%FÑGÔGÐGÝ ¥¥s¨6¡{¤{Ñ!3Ô!3°V¸VÑDÔDð Qð Q‘	��2�rÝ! "¥e¤lÑ3Ô3ð ØØ��b˜"ÐOÐOÐOÐOÐOÑPÔPÐPÐPØˆr/   )rD   r   rk   rm   rl   r[   r   r   )ru   r   r   r   )Ú__name__Ú
__module__Ú__qualname__rr   r¢   Ú__classcell__)rt   s   @r-   ri   ri   Ž   sm   ø€ € € € € ð /3Ø%)ð	
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5r/   ri   úDCallable[[DebugInterpreter, Any, dict[Node, Any] | None, bool], Any]c                ó*   — t          | ¦  «        j        S )z¨
    Returns a (slow) interpreter over the FX graph module that also checks
    various debugging properties (e.g., that tracing strides matched real
    strides.)
    )ri   rr   rf   s     r-   Ú	debug_nopr²   Ö   s   € õ ˜DÑ!Ô!Ô%Ð%r/   c                óÄ   — t          | ¦  «         t          j                             | ¦  «        }t          j                             |                     ¦   «         ¦  «        }|S r<   )r   r&   rK   rL   rN   rO   )r   rW   rU   s      r-   Úsimple_ts_compiler´   â   sG   € å�DÑÔÐÝŒ	×Ò˜ÑÔ€AÝŒ	×Ò˜Ÿš™œÑ"Ô"€AØ€Hr/   rU   úCallable[..., Any]c                ó,   — t          | t          ¦  «        S r<   )r   r´   )rU   s    r-   Únnc_jitr·   ê   s   € Ý˜Õ,Ñ-Ô-Ð-r/   c                ó.   — t          | j        ¦  «         | S r<   )r]   r^   rf   s     r-   Úprint_compiler¹     s   € å	ˆ$Œ)ÑÔÐØ€Kr/   ÚfnúCallable[_P, _R] | nn.ModulerE   c                óÔ   — t           t           t          t          dœ}|                     |¦  «         t	          | t
          j        j        ¦  «        rt          | fi |¤ŽS t          | fi |¤ŽS )a~  
    Wrapper function over :func:`aot_function` and :func:`aot_module` to perform
    memory efficient fusion. It uses the
    :func:`min_cut_rematerialization_partition` partitioner to perform efficient
    recomputation. It uses NVFuser to compile the generated forward and backward
    graphs.

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

    Args:
        fn (Union[Callable, nn.Module]): A Python function or a ``nn.Module``
            that takes one or more arguments. Must return one or more Tensors.
        **kwargs: Any other overrides you want to make to the settings

    Returns:
        Returns a ``Callable``  or ``nn.Module`` that retains the eager behavior
        of the original :attr:`fn`, but whose forward and backward graphs have
        gone through recomputation optimizations, and the graphs have been
        compiled with nvfuser.

    ©Úfw_compilerÚbw_compilerÚpartition_fnÚdecompositions)
rV   r   Údefault_decompositionsÚupdater=   r&   ÚnnÚModuler   r   )rº   rE   Úconfigs      r-   Úmemory_efficient_fusionrÇ     sr   € õ6 "Ý!Ý;Ý0ð	ð €Fð ‡M‚M�&ÑÔÐÝ�"•e”h”oÑ&Ô&ð *Ý˜"Ð'Ð' Ð'Ð'Ð'å˜BÐ)Ð) &Ð)Ð)Ð)r/   úSequence[torch.Tensor]c                óÐ   — |                       d¦  «         t          dd„ |D ¦   «         › d�¦  «         ddlm}   |¦   «                              ¦   «         |Ž  t          | |¦  «        S )NÚfooaQ  
##############################################################
# To minimize FX graph, copy and paste the below and run it  #
##############################################################

import torch
import torch.fx as fx
from functorch.compile import minifier, check_nvfuser_subprocess, check_nvfuser_correctness_subprocess

inps = c                ó*   — g | ]}|j         |j        f‘ŒS re   )Úshaper:   )r@   r    s     r-   ú
<listcomp>z!debug_compile.<locals>.<listcomp>G  s!   € Ð*Ð*Ð* ˆ!Œ'�1”7Ð	Ð*Ð*Ð*r/   a?  
inps = [torch.ones(shape, dtype=dtype, device='cuda') for (shape, dtype) in inps]
from foo import FxModule
mod = FxModule().cuda()

with torch.jit.fuser("fuser2"):
  # check_nvfuser_subprocess can be replaced with check_nvfuser_correctness_subprocess
  minifier(fx.symbolic_trace(mod), inps, check_nvfuser_subprocess)
r   )ÚFxModule)Ú	to_folderr]   rÊ   rÎ   ÚcudarV   )r   r6   rÎ   s      r-   Údebug_compilerÑ   9  s�   € ð 	‡N‚N�5ÑÔÐÝ	ð	ð 	+Ð* TÐ*Ñ*Ô*ð	ð 	ð 	ñô ð ð* ÐÐÐÐÐà€H€H�J„J‡O‚OÑÔ�tÐÐå�d˜DÑ!Ô!Ð!r/   rx   Úgraph_indexÚinput_data_pathúlist[torch.Tensor]c                ó6  — g }t          | d¦  «        5 }t          j        |¦  «        }g }|D ]Ô}t          |¦  «        dk    r|} |t	          j        ¦   «         ¦  «        }n‹|\  }}}}	}
|	t
          j        t
          j        t
          j        t
          j	        t
          j        t
          j
        t          t          hv rt          j        dd||	|
¬¦  «        }nt          j        ||	|
¬¦  «        }|                     |¦  «         ŒÕ	 ddd¦  «         n# 1 swxY w Y   |S )zZ
    Return a random input for the given inputs meta generated from _save_fx_default.
    Úrbr   r   )r:   rH   N)ÚopenÚpickleÚloadrC   Úrandomr&   rx   Úint32Úint64r[   Úuint8ÚfloatÚrandintÚrandÚappend)rÓ   ÚinputsrU   Úinputs_metar£   rI   Úinput_rÌ   Ú_strider:   rH   s              r-   Ú
get_inputsræ   \  sR  € ð "$€FÝ	ˆo˜tÑ	$Ô	$ð "¨Ý”k !‘n”nˆØˆØð 	"ð 	"ˆDÝ�4‰yŒy˜AŠ~ˆ~Ø�Ø˜�fœm™oœoÑ.Ô.��à6:Ñ3��e˜W e¨VØÝ”IÝ”KÝ”KÝ”JÝ”IÝ”KÝÝð	ð 	ð 	õ #œ]¨1¨a°¸eÈFÐSÑSÔS�F�Få"œZ¨°UÀ6ÐJÑJÔJ�FØ�MŠM˜&Ñ!Ô!Ð!Ð!ð'	"ð"ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð. €Ms   “C.DÄDÄDÚcurrent_nameÚfolder_nameÚdump_example_inputÚgmútorch.fx.GraphModuleÚexample_inputsú	nn.Modulec                ó†   ‡ ‡‡‡	‡
— ddl m} dˆ	fd„Š	dˆ ˆˆˆ	fd„Š
dˆ
fd„}dˆ
fd„}dˆ
fd„} ||||||t          ¬¦  «        S )aN  
    The forward, backward, and joint computation graph will be stored in
    {folder_name}/{current_name}/{current_name}_forward_{graph_index},
    {folder_name}/{current_name}/{current_name}_backward_{graph_index}, and
    {folder_name}/{current_name}/{current_name}_joint_{graph_index} respectively.
    The input shape of the graphs will be stored in the .input files.
    These files can be loaded with pickle,
    and is a list of format (type, shape, stride, dtype, device).
    In the case of type = int or float, it is just (type,).
    For joint graph input, it is a nested list [[],[]]
    where the two inner lists have the same format.
    If dump_example_input is True, example_inputs will be stored in .pt file.
    Since each function might produce multiple graphs,
    the graph_index is used to distinguish different graphs
    r   )Úaot_module_simplifiedrD   r   r   ú	list[Any]c                óö  •— g }t          | ¦  «        dk    rEt          | d         t          ¦  «        r*| ‰| d         ¦  «        z  }| ‰| d         ¦  «        z  }|S | D ]š}t          |¦  «        t          u st          |¦  «        t
          u r$|                     t          |¦  «        f¦  «         ŒR|                     t          |¦  «        |j        |                     ¦   «         |j	        |j
        f¦  «         Œ›|S )Nr   r   )rC   r=   r‡   rI   rx   rÞ   rá   rÌ   r�   r:   rH   )rD   Ú
input_metaÚargÚget_input_metas      €r-   rô   z(_save_fx_default.<locals>.get_input_meta“  sõ   ø€ Øˆ
Ýˆt‰9Œ9�qŠ=ˆ=�Z¨¨Q¬µÑ7Ô7ˆ=Ø˜.˜.¨¨a¬Ñ1Ô1Ñ1ˆJØ˜.˜.¨¨a¬Ñ1Ô1Ñ1ˆJØÐØð 	ð 	ˆCÝ�C‰yŒy�CÐÐ¥4¨¡9¤9µÐ#5Ð#5Ø×!Ò!¥4¨¡9¤9 ,Ñ/Ô/Ð/Ð/à×!Ò!Ý˜#‘Y”Y ¤	¨3¯:ª:©<¬<¸¼ÀCÄJÐOñô ð ð ð Ðr/   Ú
gm_to_saver   Ú	type_namerY   r˜   c                ó6  •— t          | j        j        ¦  «        dk    r/t                               t          j        d‰|t          ¦  «         d S t          j        | ¦  «        }|j         	                    t          j        j                             ¦   «         ¦  «         |                     ¦   «           ‰	|¦  «        }t          j        ‰› d‰› �d¬¦  «         |                     ‰› d‰› d‰› d|› dt          › �	¦  «         t#          ‰› d‰› d‰› d|› dt          › d‰› d|› dt          › d�d¦  «        5 }t%          j        ||¦  «         d d d ¦  «         n# 1 swxY w Y   ‰r9t          j        |‰› d‰› d‰› d|› dt          › d‰› d|› dt          › d	�¦  «         d S d S )
Nr   z!No nodes in graph {%s}_{%s}_{%s}.ú/T)Úexist_okrW   z.inputÚwbz.pt)rC   r$   rF   ÚlogÚloggingÚWARNINGrÒ   ÚcopyÚdeepcopyÚset_codegenr&   ÚfxÚCodeGenr+   ÚosÚmakedirsrÏ   r×   rØ   ÚdumpÚsave)
rõ   rD   rö   rê   rò   rU   rç   ré   rè   rô   s
         €€€€r-   Úgraph_saver_helperz,_save_fx_default.<locals>.graph_saver_helper¢  s¤  ø€ õ ˆzÔÔ%Ñ&Ô&¨!Ò+Ð+Ý�GŠGÝ”Ø3ØØÝñô ð ð ˆFåŒ]˜:Ñ&Ô&ˆØ
Œ×Ò�UœXœ^×3Ò3Ñ5Ô5Ñ6Ô6Ð6Ø
�Š‰Œˆà#�^ DÑ)Ô)ˆ
å
Œ�{Ð3Ð3 \Ð3Ð3¸dÐCÑCÔCÐCØ
�ŠØÐTÐT˜\ÐTÐT¨LÐTÐT¸9ÐTÐTÅ{ÐTÐTñ	
ô 	
ð 	
õ Øð  Dð  D˜\ð  Dð  D¨Lð  Dð  D¸9ð  Dð  DÅ{ð  Dð  DÐUað  Dð  DÐdmð  Dð  DÕp{ð  Dð  Dð  DØñ
ô 
ð 	'ð ÝŒK˜
 AÑ&Ô&Ð&ð		'ð 	'ð 	'ñ 	'ô 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'øøøð 	'ð 	'ð 	'ð 	'ð
 ð 	ÝŒJØØð  Eð  E ð  Eð  E°ð  Eð  E¸yð  Eð  EÍ;ð  Eð  EÐYeð  Eð  EÐhqð  Eð  EÕtð  Eð  Eð  Eñô ð ð ð ð	ð 	s   Ä1EÅEÅErê   rì   rÔ   c                ó"   •—  ‰| |d¦  «         | S )NÚforwardre   ©rê   rì   r  s     €r-   Úgraph_saver_forwardz-_save_fx_default.<locals>.graph_saver_forwardÅ  s   ø€ ð 	Ð˜2˜~¨yÑ9Ô9Ð9Øˆ	r/   c                ó6   •—  ‰| |d¦  «         t           dz  a | S )NÚbackwardr   )rÒ   r
  s     €r-   Úgraph_saver_backwardz._save_fx_default.<locals>.graph_saver_backwardË  s)   ø€ ð 	Ð˜2˜~¨zÑ:Ô:Ð:å�qÑˆØˆ	r/   Ú
joint_argsú%tuple[fx.GraphModule, fx.GraphModule]c                ó>   •—  ‰| |d¦  «         t          | |¦  «        S )NÚjoint)r   )rê   r  r  s     €r-   Úgraph_saver_jointz+_save_fx_default.<locals>.graph_saver_jointÓ  s*   ø€ ð 	Ð˜2˜z¨7Ñ3Ô3Ð3Ý   ZÑ0Ô0Ð0r/   r½   )rD   r   r   rð   )rõ   r   rD   r   rö   rY   r   r˜   )rê   r   rì   rÔ   r   r   )rê   r   r  rÔ   r   r  )Úfunctorch.compilerï   rÂ   )rç   rè   ré   rê   rì   rï   r  r  r  rô   r  s   ```      @@r-   Ú_save_fx_defaultr  {  sï   øøøøø€ ð, 8Ð7Ð7Ð7Ð7Ð7ðð ð ð ð ð ð!ð !ð !ð !ð !ð !ð !ð !ð !ðFð ð ð ð ð ðð ð ð ð ð ð1ð 1ð 1ð 1ð 1ð 1ð !Ð Ø
ØØ'Ø(Ø&Ý-ðñ ô ð r/   Fú Callable[[bool, nn.Module], Any]c                ó4   — da t          t          | ||¦  «        S )as  
    Dump the forward, backward, and joint computation graph.
    Example Usage:
    save_fx_func = graph_dumper_aot(current_name, folder_name, dump_example_input = False)
    optimize_ctx = torchdynamo.optimize(
        save_fx_func
    )
    with torch.enable_grad():
        with optimize_ctx:
            result = forward_and_backward_pass(model, example_inputs)
    r   )rÒ   r   r  )rç   rè   ré   s      r-   Úgraph_dumper_aotr  å  s   € ð €KÝÕ# \°;Ð@RÑSÔSÐSr/   )r   r   r   r   )r   r0   )r   r   r6   r7   r   r8   )T)
r   r   rW   r   rX   rY   rZ   r[   r   r   )rX   rY   r   r`   )r   r   rW   r   r   r   )r   r   rW   r   r   r°   )r   r   rW   r   r   r8   )rU   rµ   r   rµ   )rº   r»   rE   r   r   r»   )r   r   r6   rÈ   r   r8   )rÓ   rY   r   rÔ   )rç   rY   rè   rY   ré   r[   rê   rë   rì   rÔ   r   rí   )F)rç   rY   rè   rY   ré   r[   r   r  )dÚ
__future__r   rþ   rü   r  rØ   rÚ   Ú
contextlibr   Ú	functoolsr   Útypingr   r   Útyping_extensionsr   r	   rz   r&   Útorch.fxr  Útorch.nnrÄ   Útorch.utils._pytreeÚutilsÚ_pytreer¤   r
   Útorch._decompr   Ú%torch.fx.experimental.symbolic_shapesr   Úaot_autogradr   r   r   Úcompile_utilsr   Úpartitionersr   r   r   Úcollections.abcr   r   r   Útorch.fx.noder   Útorch.typesr   r   r   Ú	getLoggerr¬   rû   r.   r5   rV   r_   rc   rg   ÚInterpreterri   r²   r´   r·   r'   r(   ÚdetachÚgelu_backwardÚleaky_relu_backwardÚsigmoid_backwardÚthreshold_backwardÚhardtanh_backwardÚhardsigmoid_backwardÚhardswish_backwardÚtanh_backwardÚsilu_backwardÚelu_backwardÚcudnn_batch_normÚcudnn_batch_norm_backwardÚmasked_fillÚScalarr§   ÚeluÚ
leaky_reluÚhardtanhÚ	hardswishÚhardsigmoidÚconj_physicalÚis_same_sizerÂ   r¹   rÇ   rÑ   rÒ   Ú__annotations__ræ   r  r  re   r/   r-   ú<module>rD     s   ðØ "Ð "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0à €€€à €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø >Ð >Ð >Ð >Ð >Ð >à GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GÐ GØ *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð (Ø=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=à"Ð"Ð"Ð"Ð"Ð"Ø'Ð'Ð'Ð'Ð'Ð'ð €Yˆt�_„_€Ø€WˆT�]„]€à€gÔ˜Ñ!Ô!€ð
ð ð ð ð ð?ð ?ð ?ñ „ð?ð ð,ð ,ð ,ñ Ôð,ð` AEðð ð ð ð ðHð Hð Hð Hð ð	ð 	ð 	ñ Ôð	ðEð Eð Eð Eð E�r”~ñ Eô Eð EðP ð&ð &ð &ñ Ôð&ð ðð ð ñ Ôðð.ð .ð .ð .ð „y„~€à„KØÔØÔØÔØÔØÔØÔØÔØÔØÔØÔØÔØÔ"ØÔÔØÔÔØ„HØ„OØ„MØ„NØÔØÔØÔð-Ð ð4 ,Ð+Ð,BÑCÔCÐ ð ðð ð ñ Ôðð
$*ð $*ð $*ð $*ðN"ð "ð "ð "ð@ €Ð Ð Ð Ñ ðð ð ð ð>fð fð fð fðV EJðTð Tð Tð Tð Tð Tð Tr/   