§
    Ÿ²ÅjÄ  ã                   ót  — 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	m
Z
 d dl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mZ d dlmZ d dl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&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.  ej/        e0¦  «        Z1d„ Z2dej3        j4        dej5        fd„Z6dej5        dej7        dej7        fd„Z8 G d„ dej3        j9        ¦  «        Z: G d„ dej3        j4        ¦  «        Z; G d„ de;¦  «        Z<ej=         >                    dd¦  «         ej=         ?                    dd ¦  «        d!„ ¦   «         Z@ej=         A                    d¦  «        d"„ ¦   «         Z@ejB        jC        j@        jD        ZEejF        jG         H                    eE¦  «         d#„ ZI G d$„ d%e¦  «        ZJeeJeeKeJf         f         ZL G d&„ d'ejM        ¦  «        ZN G d(„ d)¦  «        ZO G d*„ d+¦  «        ZPd,„ ZQd-„ ZRd.ej        jS        d/ejT        fd0„ZU G d1„ d2ej3        j4        ¦  «        ZV G d3„ d4e¦  «        ZW G d5„ d6¦  «        ZXd7„ ZYd8„ ZZdej3        j4        d9eeKeWf         fd:„Z[	 	 	 dCd;ej3        j4        d<eed=f         d>eeeKef                  d?eeeKeWf                  d@eeejS        gejS        f                  dAeVfdB„Z\dS )Dé    N)Údefaultdict)ÚEnum)Ú	ParameterÚ	SignatureÚ	signature)Ú
MethodType)ÚAnyÚCallableÚDictÚListÚOptionalÚSetÚTupleÚUnion)ÚProcessGroup)ÚExportedProgram)Ú_assign_attrÚ	_AttrKindÚ_sink_paramsÚInterpreterModule)Úmap_aggregate)Úsplit_moduleé   )Ú_null_coalesce_accumulateÚstage_backward)Ú_outline_submodules)ÚPipeInfo)Ú_PipelineStagec                 óÔ  — |du rd S |du r.t          | t          j        ¦  «        st          d| › �¦  «        ‚| S t          |t          t
          f¦  «        r¤t          | t          t
          f¦  «        st          d| › d|› �¦  «        ‚t          | ¦  «        t          |¦  «        k    rt          d| › d|› �¦  «        ‚t          | |¦  «        D ]\  }}t          ||¦  «        }|�|c S Œt          d|› �¦  «        ‚t          |t          ¦  «        r¼t          | t          ¦  «        st          d| › d|› �¦  «        ‚t          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        k    rt          d| › d|› �¦  «        ‚|D ]$}t          | |         ||         ¦  «        }|�|c S Œ%t          d|› �¦  «        ‚t          d	t          |¦  «        › d
�¦  «        ‚)NFTz/Loss spec must specify a dynamic value but got zOutput value z' must match type of loss specification z) must match length of loss specification z)Did not find loss value in specification z' must match keys of loss specification zUnsupported type z in loss specification)Ú
isinstanceÚfxÚNodeÚRuntimeErrorÚtupleÚlistÚlenÚzipÚ_find_loss_from_output_and_specÚdictÚsetÚkeysÚtype)Ú
output_valÚspec_valÚoutÚspecÚloss_valÚks         úQC:\Projects\Historical\venv\Lib\site-packages\torch/distributed/pipelining/_IR.pyr(   r(   &   s|  € Ø�5ÐÐØˆtØ�4ÐÐÝ˜*¥b¤gÑ.Ô.ð 	ÝØNÀ*ÐNÐNñô ð ð Ðå�(�U¥D˜MÑ*Ô*ð SÝ˜*¥u­d mÑ4Ô4ð 	Ýð 
ð ð Øðð ñô ð õ ˆz‰?Œ?�c (™mœmÒ+Ð+Ýð 
ð ð Øðð ñô ð õ ˜Z¨Ñ2Ô2ð 	 ð 	 ‰IˆC�Ý6°s¸DÑAÔAˆHØÐ#Ø���ð $åÐQÀxÐQÐQÑRÔRÐRå�(�DÑ!Ô!ð SÝ˜*¥dÑ+Ô+ð 	Ýð 
ð ð Øðð ñô ð õ ˆz�ŠÑ Ô Ñ!Ô!¥S¨¯ª©¬Ñ%9Ô%9Ò9Ð9Ýð 
ð ð Øðð ñô ð ð ð 	 ð 	 ˆAÝ6°zÀ!´}ÀhÈqÄkÑRÔRˆHØÐ#Ø���ð $åÐQÀxÐQÐQÑRÔRÐRå
ÐQ­4°©>¬>ÐQÐQÐQÑ
RÔ
RÐRó    ÚmodÚgc                 ó´  — d„ |j         D ¦   «         }t          |¦  «        dk    sJ ‚|d         }|j        d         }d }t          | t          ¦  «        r)t          |j        ¦  «        dk    sJ ‚|}t          j        }nY|€Et          |t          ¦  «        r+d|                     ¦   «         v r|d         }d„ |D ¦   «         }nd }d }nt          ||¦  «        }|}|||fS )Nc                 ó(   — g | ]}|j         d k    ¯|‘ŒS )Úoutput©Úop)Ú.0Úns     r3   ú
<listcomp>z%_find_loss_output.<locals>.<listcomp>V   s$   € Ð;Ð;Ð;˜!¨!¬$°(Ò*:Ð*:�AÐ*:Ð*:Ð*:r4   r   r   Úlossc                 ó   — i | ]	}||d k    “Œ
S )r?   © )r<   r2   s     r3   ú
<dictcomp>z%_find_loss_output.<locals>.<dictcomp>f   s   € ÐAÐAÐA°˜a  f¢ÐAÐAÐAr4   )	Únodesr&   Úargsr    ÚTrivialLossWrapperÚ	loss_specr)   r+   r(   )r5   r6   Úoutput_loss_value_specÚoutput_nodesÚoutput_noder-   Úgenerated_specÚ	loss_nodes           r3   Ú_find_loss_outputrL   U   s  € Ø;Ð;˜qœwÐ;Ñ;Ô;€LÝˆ|ÑÔ Ò!Ð!Ð!Ð!Ø˜q”/€KØÔ! !Ô$€JØ€Nå�#Õ)Ñ*Ô*ð 0õ �;Ô#Ñ$Ô$¨Ò)Ð)Ð)Ð)Øˆ	Ý+Ô5ˆˆØ	Ð	'å�j¥$Ñ'Ô'ð 	"¨F°j·o²oÑ6GÔ6GÐ,GÐ,GØ" 6Ô*ˆIØAÐA°jÐAÑAÔAˆNˆNàˆIØ!ˆNˆNå3°JÐ@VÑWÔWˆ	Ø/ˆà�k >Ð1Ð1r4   rK   rI   c           
      óÚ  ‡ ‡‡— i }t          ‰ j        ¦  «        D ]ç}|j        dk    rÚ|j        t          j        k    s
J d¦   «         ‚t          |j        ¦  «        dk    s
J d¦   «         ‚t          |j        ¦  «        \  }}||v rt          ||         ¦  «        nd}t          |dz   |¦  «        }d„ t          |¦  «        D ¦   «         }	||v r t          ||         ¦  «        D ]
\  }
}||	|
<   Œ||	|<   t          |	¦  «        ||<   Œè|d iŠ|d iŠˆ ˆfd„}‰                      |¦  «        5  t          ‰ j        ¦  «        D �]—}|‰vrŒˆfd	„}t          j                             |j        |¦  «         t          j                             |j        |¦  «         |j        d
k    �r4||v rK||         }t          ˆfd„||         D ¦   «         ¦  «        }ˆfd„t          ||         ¦  «        D ¦   «         }n|f}‰|         }dg}t#          |t          ¦  «        s|fn|}‰                      t&          ||t)          |j        ¦  «        |dœ¬¦  «        }t-          |j        ¦  «        }||_        t          j        |¦  «        }|j        }t)          |j        ¦  «        }t          j        |¦  «        }t          |¦  «        D ]\  }
} ||||
         j        ¦  «         Œ�Œ™	 d d d ¦  «         n# 1 swxY w Y   ‰ S )NÚcall_functionzDFound non-getitem call in forward pass. Please report a bug to PiPPyé   z:Found malformed getitem call. Please report a bug to PiPPyéÿÿÿÿr   c                 ó   — g | ]}d ‘ŒS ©NrA   )r<   Ú_s     r3   r>   z3_insert_stage_symbolic_backward.<locals>.<listcomp>Ž   s   € Ð!EÐ!EÐ!E¨1 $Ð!EÐ!EÐ!Er4   c                 óv   •— | ‰v r.| j         dk    r#‰                     t          ‰|          |f¦  «        }|‰| <   d S )NÚplaceholder)r;   rN   r   )Úforward_nodeÚ
grad_valuer6   Úval_to_grads     €€r3   Úassign_or_accumulate_gradzB_insert_stage_symbolic_backward.<locals>.assign_or_accumulate_grad    sO   ø€ Ø˜;Ð&Ð&¨<¬?¸mÒ+KÐ+KØŸšÝ)Ø˜\Ô*¨JÐ7ñô ˆJð %/ˆ�LÑ!Ð!Ð!r4   c                 ó4   •— ‰                      | d ¦  «         d S rR   )Ú
setdefault)r=   Ú
live_nodess    €r3   Úadd_to_live_nodesz:_insert_stage_symbolic_backward.<locals>.add_to_live_nodes­   s   ø€ Ø×%Ò% a¨Ñ.Ô.Ð.Ð.Ð.r4   Úcall_modulec              3   óD   •K  — | ]}‰                      |d ¦  «        V — Œd S rR   )Úget)r<   r=   rX   s     €r3   ú	<genexpr>z2_insert_stage_symbolic_backward.<locals>.<genexpr>¶   s1   øè è € Ð(XÐ(XÀa¨¯ª¸¸DÑ)AÔ)AÐ(XÐ(XÐ(XÐ(XÐ(XÐ(Xr4   c                 ó"   •— g | ]\  }}|‰v ¯	|‘ŒS rA   rA   )r<   Úir=   r\   s      €r3   r>   z3_insert_stage_symbolic_backward.<locals>.<listcomp>·   s)   ø€ ð /ð /ð /Ù"˜a ÀÀjÀÀ˜ÀÀÀr4   r   )Ústage_outputÚoutput_gradsÚinput_valuesÚoutputs_with_grads_idxs)Úkwargs)ÚreversedrC   r;   ÚtargetÚoperatorÚgetitemr&   rD   r$   ÚmaxÚrangeÚ	enumerateÚinserting_beforer!   ÚnodeÚmap_argrh   r    rN   r   r%   Úall_input_nodesr)   ÚProxy)r6   rK   rI   Útuplesrq   Úindexed_valueÚnode_idxÚexisting_list_sizeÚnew_list_sizeÚreconstructed_listrc   ÚvalrY   r]   rd   re   rg   Ú	grad_callÚkwargs_copyÚgrad_call_proxyÚgradsÚinput_nodesÚgrads_proxyÚ
input_noder\   rX   s   `                       @@r3   Ú_insert_stage_symbolic_backwardrƒ   q   sü  øøø€ ð $&€FÝ˜œÑ!Ô!ð  >ð  >ˆØŒ7�oÒ%Ð%ð ”;¥(Ô"2Ò2Ð2Ð2ð/ñ 3Ô2Ð2õ
 �D”I‘” !Ò#Ð#Ð#ØKñ $Ô#Ð#å&+¨D¬IÑ&6Ô&6Ñ#ˆM˜8ð /<¸vÐ.EÐ.E•�F˜=Ô)Ñ*Ô*Ð*È2ð õ   ¨1¡Ð.@ÑAÔAˆMà!EÐ!Eµ°mÑ0DÔ0DÐ!EÑ!EÔ!EÐð  Ð&Ð&Ý'¨¨}Ô(=Ñ>Ô>ð 0ð 0‘F�A�sØ,/Ð& qÑ)Ð)ð ,0Ð˜xÑ(å$)Ð*<Ñ$=Ô$=ˆF�=Ñ!øð
 ˜TÐ"€JØ5>ÀÐ4E€Kð/ð /ð /ð /ð /ð /ð 
×	Ò	˜KÑ	(Ô	(ð 0Oð 0OÝ˜QœWÑ%Ô%ð /	Oñ /	OˆDØ˜:Ð%Ð%Øð/ð /ð /ð /ð /õ ŒG�OŠO˜DœIÐ'8Ñ9Ô9Ð9ÝŒG�OŠO˜DœKÐ):Ñ;Ô;Ð;ØŒw˜-Ò'Ñ'à˜6�>�>Ø#)¨$¤<�LÝ#(Ð(XÐ(XÐ(XÐ(XÈ6ÐRVÌ<Ð(XÑ(XÔ(XÑ#XÔ#X�Lð/ð /ð /ð /Ý&/°°t´Ñ&=Ô&=ð/ñ /ô /Ð+Ð+ð %) 7�LØ#.¨tÔ#4�LØ/0¨cÐ+õ & lµEÑ:Ô:ð&�\�O�Oà%ð ð ŸOšOÝ"à(4Ø(4Ý(,¨TÔ-AÑ(BÔ(BØ3Jð	ð ð ,ñ ô �	õ # 9Ô#3Ñ4Ô4�Ø#.�	Ô å"$¤(¨9Ñ"5Ô"5�Ø'Ô,�å" 4Ô#7Ñ8Ô8�Ý œh u™oœo�Ý%.¨{Ñ%;Ô%;ð Oð O‘M�A�zØ-Ð-¨j¸+Àa¼.Ô:MÑNÔNÐNÐNùð_/	Oð0Oð 0Oð 0Oñ 0Oô 0Oð 0Oð 0Oð 0Oð 0Oð 0Oð 0Oøøøð 0Oð 0Oð 0Oð 0Oðd €Hs   Ä%F.K Ë K$Ë'K$c                   óD   — e Zd Zedej        j        fd„¦   «         Zd„ ZdS )ÚPipeSequentialÚsequential_instancec                 ó(   — t          d„ | D ¦   «         Ž S )Nc                 ó6   — g | ]}t          j         |¦  «        ‘ŒS rA   )Úcopy)r<   Úms     r3   r>   z2PipeSequential.from_sequential.<locals>.<listcomp>à   s    € ÐJÐJÐJ°¥¤	¨!¡¤ÐJÐJÐJr4   )r…   )r†   s    r3   Úfrom_sequentialzPipeSequential.from_sequentialÞ   s   € åÐJÐJÐ6IÐJÑJÔJÐKÐKr4   c                 óŽ   — t          | ¦  «        D ]4\  }} ||¦  «        }|t          | ¦  «        dz
  k    rt          ¦   «          Œ5|S )Nr   )ro   r&   Ú
pipe_split)ÚselfÚinputrc   Úmodules       r3   ÚforwardzPipeSequential.forwardâ   sL   € Ý" 4™œð 	ð 	‰IˆAˆvØ�F˜5‘M”MˆEØ•C˜‘I”I ‘MÒ!Ð!Ý‘”�øØˆr4   N)	Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚtorchÚnnÚ
Sequentialr‹   r‘   rA   r4   r3   r…   r…   Ý   sR   € € € € € ØðL¨U¬XÔ-@ð Lð Lð Lñ „\ðLðð ð ð ð r4   r…   c                   ó(   ‡ — e Zd ZdZˆ fd„Zd„ Zˆ xZS )ÚLossWrapperaH  
    LossWrapper is a convenient abstract class that allows you to wrap up both
    your model as well as its loss function and specify the connectivity between
    the inputs, model, loss function, and output value. Example::

        class MyModelWrapper(LossWrapper):
            def forward(self, x, targets):
                model_out = self.module(x)
                loss_value = self.loss_fn(model_out, targets)
                return loss_value

    The above example defines a connectivity where we expect the forward/loss/backward
    training procedure to take two arguments (x and targets), pass x into the module
    to get the output of the feedforward computation, pass the model output and the
    targets value into the loss function, and get and return the loss value, which will
    be backpropagated by PiPPy. The above class would then be instantiated like::

        model = ... # instantiate the model
        loss_fn = torch.nn.MSELoss() # for the sake of demonstration

        wrapper = MyModelWrapper(model, loss_fn)
        pipe = Pipe.from_tracing(wrapper, ...)

    c                 ód   •— t          ¦   «                              ¦   «          || _        || _        d S rR   )ÚsuperÚ__init__r�   Úloss_fn)rŽ   r�   rž   Ú	__class__s      €r3   r�   zLossWrapper.__init__  s+   ø€ Ý‰Œ×ÒÑÔÐØˆŒØˆŒˆˆr4   c                 ó    — t          d¦  «        ‚)Nz¶This instance of LossWrapper does not have an overriddenforward(). Please implement forward() to specify the arguments, connection between the module and loss, and loss output value.)ÚNotImplementedError©rŽ   rD   rh   s      r3   r‘   zLossWrapper.forward	  s   € Ý!ðñ
ô 
ð 	
r4   )r’   r“   r”   Ú__doc__r�   r‘   Ú__classcell__©rŸ   s   @r3   rš   rš   ê   sQ   ø€ € € € € ðð ð2ð ð ð ð ð

ð 
ð 
ð 
ð 
ð 
ð 
r4   rš   c                   ó   — e Zd Zd„ ZdZdS )rE   c                 óX   — |                       |¦  «        }|                      ||¦  «        S rR   )r�   rž   )rŽ   ÚxÚtargetsÚ	model_outs       r3   r‘   zTrivialLossWrapper.forward  s%   € Ø—K’K ‘N”Nˆ	Ø�|Š|˜I wÑ/Ô/Ð/r4   TN)r’   r“   r”   r‘   rF   rA   r4   r3   rE   rE     s$   € € € € € ð0ð 0ð 0ð €I€I€Ir4   rE   zpippy::_pipe_splitz() -> ()ÚBackendSelectc                  ó   — d S rR   rA   rA   r4   r3   Ú_pipe_splitr­   4  ó   € àˆ4r4   c                  ó   — d S rR   rA   rA   r4   r3   r­   r­   9  r®   r4   c                  óH   — t           j        j                             ¦   «         S )aþ  
    pipe_split is a special operator that is used to mark the boundary between
    stages in a module. It is used to split the module into stages. It is a
    no-op if your annotated module is run eagerly.

    Example:
        >>> # xdoctest: +SKIP
        >>> def forward(self, x):
        >>>     x = torch.mm(x, self.mm_param)
        >>>     x = torch.relu(x)
        >>>     pipe_split()
        >>>     x = self.lin(x)
        >>>     return x

    The above example will be split into two stages.
    )r–   ÚopsÚpippyr­   rA   r4   r3   r�   r�   G  s   € õ" Œ9Œ?×&Ò&Ñ(Ô(Ð(r4   c                   ó   — e Zd ZdZdZdS )ÚMultiUseParameterConfigr   rO   N)r’   r“   r”   ÚTRANSMITÚ	REPLICATErA   r4   r3   r´   r´   [  s   € € € € € Ø€HØ€I€I€Ir4   r´   c                   óH   ‡ — e Zd ZdZd	ˆ fd„	Zddœˆ fd„
Zˆ fd„Zˆ fd„Zˆ xZS )
ÚDetachExecutorzÏ
    Special interpreter to run the split_gm in testing that detaches all inputs to
    a module invocation. This is needed so that the values at the boundary are
    leaf modules in autograd execution.
    Tc                 ó^   •— d}t          ¦   «                              ||¦  «         i | _        d S )NF)rœ   r�   Úvalue_remap)rŽ   r�   Úgarbage_collect_valuesrŸ   s      €r3   r�   zDetachExecutor.__init__j  s2   ø€ Ø!&ÐÝ‰Œ×Ò˜Ð!7Ñ8Ô8Ð8ØˆÔÐÐr4   N)Úinitial_envc                óD   •— i | _          t          ¦   «         j        |d|iŽS )Nr¼   )rº   rœ   Úrun)rŽ   r¼   rD   rŸ   s      €r3   r¾   zDetachExecutor.runo  s&   ø€ ØˆÔØ�u‰wŒwŒ{˜DÐ:¨kÐ:Ð:Ð:r4   c                 ó˜   •‡ — ˆ fd„}	 t          ||¦  «        }t          ||¦  «        }t          ¦   «                              |||¦  «        S )Nc                 óØ   •— t          | t          j        ¦  «        rN| j        rG| ‰j        vr1|                      ¦   «                              d¦  «        }|‰j        | <   ‰j        |          S | S )NT)r    r–   ÚTensorÚrequires_gradrº   ÚdetachÚrequires_grad_)ÚaÚnew_valrŽ   s     €r3   Údetach_tensorsz2DetachExecutor.call_module.<locals>.detach_tensorst  si   ø€ Ý˜!�Uœ\Ñ*Ô*ð ¨q¬ð Ø˜DÔ,Ð,Ð,ØŸhšh™jœj×7Ò7¸Ñ=Ô=�GØ*1�DÔ$ QÑ'ØÔ'¨Ô*Ð*à�r4   )r   rœ   r^   )rŽ   rj   rD   rh   rÇ   rŸ   s   `    €r3   r^   zDetachExecutor.call_modules  sn   øø€ ð	ð 	ð 	ð 	ð 	ð	õ
 ØØñ
ô 
ˆõ ØØñ
ô 
ˆõ
 ‰wŒw×"Ò" 6¨4°Ñ8Ô8Ð8r4   c                 ó®   •‡ — |t           k    r&t          |¦  «        }ˆ fd„|d         D ¦   «         |d<   t          ¦   «                              |||¦  «        S )Nc                 óF   •— g | ]}‰j                              ||¦  «        ‘ŒS rA   )rº   r`   )r<   ÚvrŽ   s     €r3   r>   z0DetachExecutor.call_function.<locals>.<listcomp>‘  s9   ø€ ð &ð &ð &Ø/0�Ô ×$Ò$ Q¨Ñ*Ô*ð&ð &ð &r4   rf   )r   r)   rœ   rN   )rŽ   rj   rD   rh   rŸ   s   `   €r3   rN   zDetachExecutor.call_function�  sj   øø€ à•^Ò#Ð#Ý˜&‘\”\ˆFð&ð &ð &ð &Ø4:¸>Ô4Jð&ñ &ô &ˆF�>Ñ"õ ‰wŒw×$Ò$ V¨T°6Ñ:Ô:Ð:r4   )T)	r’   r“   r”   r£   r�   r¾   r^   rN   r¤   r¥   s   @r3   r¸   r¸   c  s¡   ø€ € € € € ðð ðð ð ð ð ð ð
 &*ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð9ð 9ð 9ð 9ð 9ð4;ð ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;r4   r¸   c                   ó    — e Zd ZU d„ Zeed<   dS )Ú_NodeReferencec                 ó   — || _         d S rR   )Úname)rŽ   rÎ   s     r3   r�   z_NodeReference.__init__˜  s   € ØˆŒ	ˆ	ˆ	r4   rÎ   N)r’   r“   r”   r�   ÚstrÚ__annotations__rA   r4   r3   rÌ   rÌ   —  s*   € € € € € € ðð ð ð €I€I�I€I€Ir4   rÌ   c                   ó   — e Zd Zd„ Zd„ ZdS )Ú_LinearNodeListc           
      ó„  — g | _         |D ]µ}t          j                             |j        d„ ¦  «        }t          j                             |j        d„ ¦  «        }t          j        d |j        |j        |j	        |||j
        ¬¦  «        }t          j        |j        ¦  «        |_        | j                              |¦  «         Œ¶d S )Nc                 ó*   — t          | j        ¦  «        S rR   ©rÌ   rÎ   ©r=   s    r3   ú<lambda>z*_LinearNodeList.__init__.<locals>.<lambda>¢  s   € ½^ÈAÌFÑ=SÔ=S€ r4   c                 ó*   — t          | j        ¦  «        S rR   rÕ   rÖ   s    r3   r×   z*_LinearNodeList.__init__.<locals>.<lambda>£  s   € ÅÐPQÔPVÑAWÔAW€ r4   )ÚgraphrÎ   r;   rj   rD   rh   Úreturn_type)Úserialize_node_listr!   rq   rr   rD   rh   r"   rÎ   r;   rj   r,   r‰   ÚmetaÚappend)rŽ   Ú	node_listrq   Ú	node_argsÚnode_kwargsÚserialize_nodes         r3   r�   z_LinearNodeList.__init__Ÿ  s¼   € Ø#%ˆÔ Øð 	<ð 	<ˆDÝœŸš¨¬	Ð3SÐ3SÑTÔTˆIÝœ'Ÿ/š/¨$¬+Ð7WÐ7WÑXÔXˆKÝœWØØ”YØ”7Ø”{ØØ"Ø œIðñ ô ˆNõ #'¤)¨D¬IÑ"6Ô"6ˆNÔØÔ$×+Ò+¨NÑ;Ô;Ð;Ð;ð	<ð 	<r4   c           	      ó  ‡— t          j        ¦   «         }i Šˆfd„}| j        D ]e}t          |j        |¦  «        }t          |j        |¦  «        }|                     |j        |j        |||j	        |j
        ¬¦  «        }|‰|j	        <   Œf|S )Nc                 óL   •— t          | t          ¦  «        r‰| j                 S | S rR   )r    rÌ   rÎ   )ÚargÚref_str_to_nodes    €r3   Úref_to_nodez-_LinearNodeList.to_graph.<locals>.ref_to_nodeµ  s'   ø€ Ý˜#�~Ñ.Ô.ð Ø& s¤xÔ0Ð0à�
r4   )r;   rj   rD   rh   rÎ   Ú	type_expr)r!   ÚGraphrÛ   r   rD   rh   Úcreate_noder;   rj   rÎ   r,   )rŽ   rÙ   ræ   rq   rß   rà   Ú
deser_noderå   s          @r3   Úto_graphz_LinearNodeList.to_graph°  s¬   ø€ Ý”‘
”
ˆà.0ˆð	ð 	ð 	ð 	ð 	ð Ô,ð 	4ð 	4ˆDÝ% d¤i°Ñ=Ô=ˆIÝ'¨¬°[ÑAÔAˆKØ×*Ò*Ø”7Ø”{ØØ"Ø”YØœ)ð +ñ ô ˆJð *4ˆO˜DœIÑ&Ð&àˆr4   N)r’   r“   r”   r�   rë   rA   r4   r3   rÒ   rÒ   ž  s2   € € € € € ð<ð <ð <ð"ð ð ð ð r4   rÒ   c                 ó    —  G d„ dt           j        j        ¦  «        } || ¦  «        }t          j        ||                     ¦   «         ¦  «        S )aË  
    Custom `__reduce__` method for serialization.
    DO AS I SAY -- NOT AS I DO. This violates the principle that
    GraphModules serialize via code export & re-tracing. We allow
    for this here because **PIPE STAGES SHOULD NOT BE PERSISTED
    TO DISK -- THIS IS ONLY FOR TRANSMISSION VIA RPC**. Persisting
    these instances to disk will expose internal implementation
    details of `fx.Graph` and related data structures and is
    NOT advised.
    c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ú6_direct_serialization_deserialize.<locals>.DummyModulec                 ó|   •— t          ¦   «                              ¦   «          | j                             |¦  «         d S rR   )rœ   r�   Ú__dict__Úupdate)rŽ   ÚbodyrŸ   s     €r3   r�   z?_direct_serialization_deserialize.<locals>.DummyModule.__init__Ø  s5   ø€ Ý‰GŒG×ÒÑÔÐØŒM× Ò  Ñ&Ô&Ð&Ð&Ð&r4   )r’   r“   r”   r�   r¤   r¥   s   @r3   ÚDummyModulerî   ×  s8   ø€ € € € € ð	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'ð 	'r4   ró   )r–   r—   ÚModuler!   ÚGraphModulerë   )rò   rC   ró   Údummys       r3   Ú!_direct_serialization_deserializer÷   Ë  s]   € ð'ð 'ð 'ð 'ð '•e”h”oñ 'ô 'ð 'ð
 ˆK˜ÑÔ€EåŒ>˜% §¢Ñ!1Ô!1Ñ2Ô2Ð2r4   c                 ó˜   — t          | j        ¦  «        }|                     d¦  «         t          |t	          | j        j        ¦  «        ffS )NÚ_graph)r)   rð   Úpopr÷   rÒ   rÙ   rC   )rŽ   Úserialization_dicts     r3   Ú_direct_serialization_reducerü   á  sH   € Ý˜dœmÑ,Ô,ÐØ×Ò˜8Ñ$Ô$Ð$å)Ø	�_¨T¬ZÔ-=Ñ>Ô>Ð?ðð r4   ÚgmÚ
new_devicec           	      ó¢  — d}| j         j        D �]&}|j        dk    rfd|j        v r\|j        d         |k    rKt                               d|j        › d|j        d         › d|› �¦  «         |                     d|¦  «         d}Œt|j        dk    r§|                      |j	        ¦  «        }t          |t          j        j        ¦  «        rt          ||¦  «         ŒÉt          |t          ¦  «        rt          |j        |¦  «         Œôt                               d	|j	        › d
t%          |¦  «        › �¦  «         �Œ(|r|                      ¦   «          dS dS )zÅ
    Modify the device argument of all "call_function" nodes in the graph.  This
    is useful for moving the graph to a different device. In particular for
    generator ops, like torch.ones.
    FrN   ÚdevicezChanging device of Node z from ú to Tr^   z+Skipping device modification for submodule z because it is a N)rÙ   rC   r;   rh   ÚloggerÚdebugrÎ   Úupdate_kwargÚget_submodulerj   r    r–   r!   rõ   Ú_modify_graph_op_devicer   Úgraph_moduleÚwarningr,   Ú	recompile)rý   rþ   Úmodifiedrq   Úsubmods        r3   r  r  ê  sp  € ð €HØ””ð ñ ˆØŒ7�oÒ%Ð%Ø˜4œ;Ð&Ð&¨4¬;°xÔ+@ÀJÒ+NÐ+NÝ—’Øg¨t¬yÐgÐgÀÄÈHÔ@UÐgÐgÐ[eÐgÐgñô ð ð ×!Ò! (¨JÑ7Ô7Ð7Ø�øØŒW˜Ò%Ð%à×%Ò% d¤kÑ2Ô2ˆFÝ˜&¥%¤(Ô"6Ñ7Ô7ð Ý'¨°
Ñ;Ô;Ð;Ð;Ý˜FÕ$5Ñ6Ô6ð å'¨Ô(;¸ZÑHÔHÐHÐHå—’ØnÀ$Ä+ÐnÐnÕ`dÐekÑ`lÔ`lÐnÐnñô ð ùð ð Ø
�Š‰Œˆˆˆðð r4   c                   ón  — e Zd Zdej        dedefd„Zd„ Zdede	j
        j        fd„Zed	ej        fd
„¦   «         Ze	 	 	 dde	j
        j        dedee         deee	j        j        ge	j        j        f                  fd„¦   «         Zd„ Ze	 dde	j
        j        deedf         deeeef                  defd„¦   «         Ze	 	 d de	j
        j        deedf         deeeef                  deeej        gej        f                  fd„¦   «         Zd„ Zd„ Zdefd„Z	 ddede	j        dee          de!fd„Z"dS )!ÚPipeÚsplit_gmÚ
num_stagesÚhas_loss_and_backwardc                 ó¶  — t           j        j                             | ¦  «         || _        t          | j        ¦  «        | _        || _        || _        || _	        |j
        j        D ]w}|j        dv sl|j        |j        fdt          j        fk    sN|j        |j        fdk    s<|j        |j        fdt           fk    s#|j        |j        fdt"          fk    s
J |¦   «         ‚Œxi }| j                             ¦   «         D ]@\  }}|                     ¦   «         D ]&\  }	}
|                     |
i ¦  «         |	||
         |<   Œ'ŒAd„ |                     ¦   «         D ¦   «         | _        | j        D ] }|                     ¦   «         D ]‰\  }}t/          | j        |¦  «        }|                     d¦  «        }|d d…         D ]}t/          ||¦  «        }Œt3          ||d         t5          j        t/          ||d         ¦  «        ¦  «        ¦  «         ŒŠŒ¡d„ }|| j        _        d}	 	 d
|› �}t/          | j        |¦  «        }t:          |j        _        |dz  }n# t@          $ r Y d S w xY wŒD)N>   r9   r^   rU   rN   )Úcall_methodÚbackwardc                 ó>   — g | ]\  }}t          |¦  «        d k    ¯|‘ŒS )r   )r&   )r<   rS   Úuse_mappings      r3   r>   z!Pipe.__init__.<locals>.<listcomp>7  s9   € ð 8
ð 8
ð 8
á��;Ý�;ÑÔ !Ò#Ð#ð à#Ð#Ð#r4   ú.rP   c                 ó    — t          d¦  «        ‚)NzHTo run pipeline locally, invoke the Pipe object directly, not `split_gm`)r#   r¢   s      r3   ÚthrowzPipe.__init__.<locals>.throwJ  s   € ÝØZñô ð r4   r   TÚsubmod_r   )!r–   r—   rô   r�   r  r¸   Úexecutorr  r  rF   rÙ   rC   r;   rj   rk   rl   r   r   Únamed_childrenÚnamed_parametersr[   ÚitemsÚreplicated_paramsÚgetattrÚsplitÚsetattrr‰   Údeepcopyr‘   rü   rŸ   Ú
__reduce__ÚAttributeError)rŽ   r  r  r  rF   rq   Úparams_to_usersÚ
m_qualnamer5   Ú
p_qualnameÚparamÚparam_mappingÚsubmod_nameÚparam_qualnamer  ÚatomsÚatomr  rc   rÎ   s                       r3   r�   zPipe.__init__  sÜ  € õ 	ŒŒ× Ò  Ñ&Ô&Ð&Ø(0ˆŒÝ(6°t´}Ñ(EÔ(EˆŒØ)ˆŒØ%:ˆÔ"Ø"ˆŒà”NÔ(ð 	ð 	ˆDà”ÐCÐCÐCØ”G˜Tœ[Ð)¨o½xÔ?OÐ-PÒPÐPØ”G˜Tœ[Ð)Ð-HÒHÐHØ”G˜Tœ[Ð)¨o½~Ð-NÒNÐNØ”G˜Tœ[Ð)Ø#Õ%>Ð?ò@ð @ð @àñ@ô @ð	@øð" EGˆà#œ}×;Ò;Ñ=Ô=ð 	@ð 	@‰OˆJ˜Ø%(×%9Ò%9Ñ%;Ô%;ð @ð @Ñ!�
˜EØ×*Ò*¨5°"Ñ5Ô5Ð5Ø5?� Ô& zÑ2Ð2ð@ð8
ð 8
à"1×"7Ò"7Ñ"9Ô"9ð8
ñ 8
ô 8
ˆÔð "Ô3ð 	Vð 	VˆMØ/<×/BÒ/BÑ/DÔ/Dð Vð VÑ+�˜^Ý  ¤°Ñ<Ô<�Ø&×,Ò,¨SÑ1Ô1�Ø! # 2 #œJð 3ð 3�DÝ$ V¨TÑ2Ô2�F�FÝ˜  b¤	­4¬=½ÀÈÈrÌÑ9SÔ9SÑ+TÔ+TÑUÔUÐUÐUðVð	ð 	ð 	ð
 !&ˆŒÔð ˆð	ðØ$ �}�}�Ý  ¤°Ñ5Ô5�Ý.J�Ô Ô+Ø�Q‘��øÝ!ð ð ð Ø��ðøøøð	s   È0I	 É	
IÉIc           	      ó  — |}t          |¦  «        dk    �rbg }| j        j        j        D �]}|j        dk    rö|j        rXt          |j        ¦  «        dk    r@|                     t          |j        t          j	        |j        d         ¬¦  «        ¦  «         Œmt          j	        }|j        }|j         
                    d¦  «        rt          j        }|dd …         }n0|j         
                    d¦  «        rt          j        }|dd …         }|                     t          ||¦  «        ¦  «         �Œt          |¦  «        } |j        |i |¤Ž}	|	                     ¦   «          |	j                             ¦   «         } | j        j        |Ž }
|
S )Nr   rU   )Údefaultz**rO   Ú*r   )r&   r  rÙ   rC   r;   rD   rÝ   r   rj   ÚPOSITIONAL_OR_KEYWORDÚ
startswithÚVAR_KEYWORDÚVAR_POSITIONALr   ÚbindÚapply_defaultsÚ	argumentsÚvaluesr  r¾   )rŽ   rD   rh   Úexecutor_argsÚ
parametersrq   Úparameter_kindÚ
param_namer   ÚbaÚress              r3   r‘   zPipe.forward\  s‹  € ØˆÝˆv‰;Œ;˜Š?‰?ØˆJØœÔ+Ô1ð Qñ Q�Ø”7˜mÒ+Ð+Ø”yð Q¥S¨¬¡^¤^°aÒ%7Ð%7Ø"×)Ò)Ý%Ø $¤Ý )Ô ?Ø(,¬	°!¬ðñ ô ñô ð ð õ *3Ô)H˜Ø%)¤[˜
Øœ;×1Ò1°$Ñ7Ô7ð 8Ý-6Ô-B˜NØ)3°A°B°B¬˜J˜JØ!œ[×3Ò3°CÑ8Ô8ð 8Ý-6Ô-E˜NØ)3°A°B°B¬˜JØ"×)Ò)­)°JÀÑ*OÔ*OÑPÔPÐPùÝ! *Ñ-Ô-ˆIØ�” Ð0¨Ð0Ð0ˆBØ×ÒÑÔÐØœL×/Ò/Ñ1Ô1ˆMàˆdŒmÔ Ð/ˆàˆ
r4   Ú	stage_idxÚreturnc                 óz   — |dk     s|| j         k    rt          d|› d�¦  «        ‚t          | j        d|› �¦  «        S )zS
        Return a stage module corresponding to `stage_idx` of the `pipe`.
        r   zInvalid stage index ú!r  )r  Ú
ValueErrorr  r  )rŽ   r?  s     r3   Úget_stage_modulezPipe.get_stage_module}  sN   € ð �qŠ=ˆ=˜I¨¬Ò8Ð8ÝÐ@°IÐ@Ð@Ð@ÑAÔAÐAÝ�t”}Ð&;°	Ð&;Ð&;Ñ<Ô<Ð<r4   rý   c                 ó"  — d}i }| j         j        D ]}}|j        dk    rp|j                             d¦  «        rVt          |j        t          d¦  «        d …         ¦  «        |j        d<   |                     |j        d         ¦  «         |dz  }Œ~|S )Nr   r^   r  r?  r   )	rÙ   rC   r;   rj   r2  Úintr&   rÜ   r[   )rý   r  Ú
found_idxsrq   s       r3   Ú _number_and_count_forward_stagesz%Pipe._number_and_count_forward_stages…  s•   € àˆ
Ø&(ˆ
Ø”H”Nð 	 ð 	 ˆDØŒw˜-Ò'Ð'¨D¬K×,BÒ,BÀ9Ñ,MÔ,MÐ'Ý),¨T¬[½¸Y¹¼Ð9IÐ9IÔ-JÑ)KÔ)K�”	˜+Ñ&Ø×%Ò% d¤i°Ô&<Ñ=Ô=Ð=Ø˜a‘�
øð Ðr4   Nr5   Úexported_programÚmulti_use_param_specÚsplit_policyc                 ó,  ‡.‡/‡0‡1— |                      ¦   «         }|�%t                               d¦  «          ||¦  «        }t                               |                     d¬¦  «        ¦  «         i }|j        j        D ]s}|j        dk    rf|                     |j	        |¦  «         ||j	                 |k    r:| 
                    ||j	                 ¦  «         |j                             |¦  «         Œtd}t          ¦   «         }	t          |j        j        ¦  «        D ]>\  }
}|j        |j	        fdt          fk    r ||
dz
  k    r|	                     |¦  «         |
}Œ?|	D ]}|j                             |¦  «         Œ|                     ¦   «          d	Š/d
t"          j        fˆ/fd„}t'          || |¦  «        Š0‰0j                             ¦   «          ‰0                     ¦   «         D ]r}t-          |t"          j        ¦  «        rV|j        j        D ]5}|j        |j	        fdt0          fk    r|j                             |¦  «         Œ6|                     ¦   «          Œs‰0                     ¦   «         D ]I\  }}t-          |t"          j        ¦  «        r*t5          |j        ¦  «        }‰0                     ||¦  «         ŒJd„ }g Š1d„ Š.ˆ.ˆ0ˆ1fd„}t9          t;          d„ ‰0j        j        ¦  «        ¦  «        }|D ]s}t=          |j        ¦  «        dk    r+t                               d|j	        › d|j        › d�¦  «         |j        D ]&}|j        dk    sJ ‚ |‰0|j	        |j	        ¦  «         Œ'ŒttA          t          ¦  «        }|  !                    d¬¦  «         "                    ¦   «         D ]-\  }}|tG          |¦  «                                      |¦  «         Œ.|  $                    ¦   «         D ]-\  }}|tG          |¦  «                                      |¦  «         Œ.i }|D ]c} ‰.| |j	        ¦  «        \  }}t9          |tG          |¦  «                 ¦  «        }|r|||j%        <   ŒE|j	        |j&        v r|j	        g||j%        <   ŒdtA          t8          ¦  «        }|  !                    d¬¦  «         "                    ¦   «         D ]‘\  }}‰0                     ¦   «         D ]w\  }}t-          |t"          j        ¦  «        rX ‰.||¦  «        \  }}|rG|€E||          '                    |¦  «         tQ          || )                    d¦  «        d         |¦  «         ŒxŒ’‰1D ]&\  }}	 tU          ||¦  «         Œ# tV          $ r Y Œ#w xY w‰0                     ¦   «         D ]]\  }}t-          |t"          j        ¦  «        r>tY          ||g ¦  «         |j         -                    ¦   «          |                     ¦   «          Œ^| "                    ¦   «         D �]5\  }} t]          ‰0|¦  «        }t          | ¦  «        }!d|fg}"|"rº|" /                    ¦   «         \  }#}$t-          |$t"          j        t`          f¦  «        rE|$j        j        D ]8}|j        dk    r+|#r|#dz   |j	        z   n|j	        }|! 1                    |¦  «         Œ9|$                     ¦   «         D ]&\  }%}&|" '                    |#r|#dz   |%z   n|%|&f¦  «         Œ'|"°º|!D ]L}|| )                    d¦  «        }'}|'dd…         D ]}(t]          ||(¦  «        }ŒtU          ||'d         ¦  «         ŒM�Œ7|D ]Q}te          j2        |j        ¦  «        D ]}|j        dk    sJ ‚ |||¦  «         Œ‰0j                             |¦  «         ŒR‰0 3                    ¦   «          ‰0j         -                    ¦   «          ‰0                     ¦   «          th           5                    ‰0¦  «        })d}*|}+|�utm          | ‰0j        |¦  «        \  },}-}+|,�Gto          ‰0j        |,|-¦  «         ‰0                     ¦   «          d}*t                               d¦  «         n,tq          d|›�¦  «        ‚t                               d¦  «         t                               d‰0› �¦  «         ti          ‰0|)|*|+¦  «        S )a  
        Additionally, the ``output_loss_value_spec`` value can be specified to disambiguate
        which value in the output of `forward` is the loss value on which PiPPy should apply
        backpropagation. For example, if your ``forward`` returns a tuple ``(loss, model_out)``,
        you can specify ``output_loss_value_spec=(True, False)``. Or, if your ``forward`` returns
        a dict ``{'loss': loss_value, 'model_out': model_out}``, you can specify
        ``output_loss_value_spec={'loss': True, 'model_out': False}``
        NzAuto-splitting modelF)Úprint_outputÚget_attrrP   rN   r   r   r=   c                 ó~   •— | j         | j        fdt          fk    r"t                               d‰› �¦  «         ‰dz  Š‰S )NrN   zFound pipe_split r   )r;   rj   Úaten_pipe_split_aliasr  r  )r=   Úpart_idxs    €r3   Úsplit_callbackz)Pipe._from_traced.<locals>.split_callbackÑ  sO   ø€ à”�a”hÐØÝ%ð$ò ð õ —’Ð;°Ð;Ð;Ñ<Ô<Ð<Ø˜A‘�ØˆOr4   c           	      ó~  ‡ — t          |j        ¦  «        dk    sJ ‚ˆ fd„t          |j        ¦  «        D ¦   «         }t          |¦  «        dk    sJ ‚t	          |j        ¦  «        }|                     |d         ¦  «         t          |¦  «        |_        t                               d‰ › d|› d|d         › �¦  «         dS )zÌ
            Delete reference of `node` from `user`'s arg list.
            Args:
                - node: a `get_attr` node at root.
                - user: a submodule node that uses `node`.
            r   c                 ó&   •— g | ]\  }}|‰k    ¯|‘ŒS rA   rA   )r<   rc   rä   rq   s      €r3   r>   zDPipe._from_traced.<locals>.delete_user_reference.<locals>.<listcomp>û  s"   ø€ ÐLÐLÐL™f˜a ÀÀtÂÀ˜ÀÀÀr4   r   zDeleted z from user z, arg index = N)	r&   rh   ro   rD   r%   rú   r$   r  r  )rq   ÚuserÚuse_idxsÚ	args_copys   `   r3   Údelete_user_referencez0Pipe._from_traced.<locals>.delete_user_referenceó  sË   ø€ õ �t”{Ñ#Ô# qÒ(Ð(Ð(Ð(ØLÐLÐLÐL­	°$´)Ñ(<Ô(<ÐLÑLÔLˆHÝ�x‘=”= AÒ%Ð%Ð%Ð%Ý˜TœY™œˆIØ�MŠM˜( 1œ+Ñ&Ô&Ð&Ý˜iÑ(Ô(ˆDŒIÝ�LŠLØM˜4ÐMÐM¨DÐMÐMÀÈÄÐMÐMñô ð ð ð r4   c                 óô   — |                      d¦  «        }|d d…         D ]%}t          | |¦  «        s dS t          | |¦  «        } Œ&t          | |d         ¦  «        s| d fS t          | |d         ¦  «        }| |fS )Nr  rP   ©NN)r   Úhasattrr  )r5   Úfqnr,  r-  Úattrs        r3   Ú_recursive_getattr_with_parentz9Pipe._from_traced.<locals>._recursive_getattr_with_parent  s�   € à—I’I˜c‘N”NˆEØ˜c˜r˜cœ
ð )ð )�Ý˜s DÑ)Ô)ð &Ø%˜:˜:Ý˜c 4Ñ(Ô(��Ý˜3  b¤	Ñ*Ô*ð !Ø˜D�yÐ Ý˜3  b¤	Ñ*Ô*ˆDØ˜�9Ðr4   c           	      ó®  •— |                      d¦  «        } ‰‰	|¦  «        \  }}|d         |j        v }t          |t          j        ¦  «        sVJ d|› dt          j        › dt          |¦  «        › d�t          |t          j        j        ¦  «        r	d|› d|› d�nd	z   ¦   «         ‚|                      |¦  «        }t          ||¦  «        rJ d
|› d|› �¦   «         ‚|rt          |||t          j        d¬¦  «         nt          |||t          j        ¬¦  «         t                               d|› d|› �¦  «         ‰
                     ||d         f¦  «         dS )a'  
            Move a parameter from the root module to a submodule.
            Args:
                root: The root module.
                callee_name: The name of the submodule to move the parameter to.
                param_fqn: The fully qualified name of the parameter to move.
            r  rP   z
Expected 'z' to be z	 but got z It might happen if module 'zu' was passed to some 'leaf function'(see https://pytorch.org/docs/stable/fx.html#fx.wrap). Please inspect usages of 'z' in the traced graph.Ú zModule z already has a parameter named T)Ú	attr_kindÚ
persistent)ra  zMoved parameter r  N)r   Ú_buffersr    r–   rÁ   r,   r—   rô   r  r[  r   r   ÚBUFFERÚ	PARAMETERr  r  rÝ   )ÚrootÚcallee_nameÚ	param_fqnr,  Úmod_itrÚ	param_valÚ	is_bufferÚcalleer^  r   Ú	to_deletes           €€€r3   Úmove_param_to_calleez/Pipe._from_traced.<locals>.move_param_to_callee  sÞ  ø€ ð —O’O CÑ(Ô(ˆEØ!?Ð!?ÀÀyÑ!QÔ!QÑˆG�Yà˜bœ	 WÔ%5Ð5ˆIõ ˜i­¬Ñ6Ô6ð 	ð 	ØY˜YÐYÐYµ´ÐYÐYÅtÈIÁÄÐYÐYÐYõ
 " )­U¬X¬_Ñ=Ô=ðð D°9ð Dð Dà"+ðDð Dð Dð Dð ññ	ô 	Ð6ð ×'Ò'¨Ñ4Ô4ˆFÝØ˜	ñô ð Qð QàP˜ÐPÐPÀYÐPÐPñQô Qð ð
 ð ÝØØØÝ'Ô.Ø#ðñ ô ð ð õ ØØØÝ'Ô1ð	ñ ô ð õ �LŠLÐH¨IÐHÐH¸;ÐHÐHÑIÔIÐIð ×Ò˜g u¨R¤yÐ1Ñ2Ô2Ð2Ð2Ð2r4   c                 ó   — | j         dk    S )NrN  r:   rÖ   s    r3   r×   z#Pipe._from_traced.<locals>.<lambda>U  s   € ¨1¬4°:Ò+=€ r4   z
Parameter z used in multiple stages: r  r^   T)Ú	keep_varsr`  z5Pipeline is in training mode, backward pass generatedz@Did not find any loss value according to output_loss_value_spec=z:Pipeline is in inference mode, backward pass not generatedzFull pipe model:
)9r�   r  Úinfor  Úprint_readablerÙ   rC   r;   r[   rj   Úreplace_all_uses_withÚ
erase_noder*   ro   r�   Úaddr	  r!   r"   r   Úeliminate_dead_codeÚmodulesr    rõ   rP  r  r   Úregister_moduler%   Úfilterr&   Úusersr   Ú
state_dictr  ÚidÚnamed_buffersrÎ   Ú	constantsrÝ   r!  r   Údelattrr$  r   Úlintr  rú   r   Údiscardr‰   Údelete_all_unused_submodulesr  rH  rL   rƒ   r#   )2r5   rI  rJ  rG   rK  ÚtracedÚget_attr_nodesrq   Úprev_pipe_split_idxÚpipe_split_nodes_to_eraserc   rR  Ú	submodulerÎ   Ú
new_submodrX  rn  Ú
attr_nodesrU  Ú
id_to_fqnsr\  ÚtensorÚinputs_to_stater]  rS   ÚfqnsÚadded_attributesr  ÚparentÚchildri  Ú	last_atomÚ
attributesÚunused_attributesÚstackÚscopeÚ_modÚ_nameÚ_submodr,  r-  r  r  Úgenerated_loss_specrK   rI   r^  rQ  r   rm  s2                                                 @@@@r3   Ú_from_tracedzPipe._from_tracedš  sÌ	  øøøø€ ð& "×(Ò(Ñ*Ô*ˆàÐ#Ý�KŠKÐ.Ñ/Ô/Ð/Ø!�\ &Ñ)Ô)ˆFå�Š�V×*Ò*¸Ð*Ñ>Ô>Ñ?Ô?Ð?ð
 .0ˆØ”LÔ&ð 	2ð 	2ˆDØŒw˜*Ò$Ð$Ø×)Ò)¨$¬+°tÑ<Ô<Ð<à! $¤+Ô.°$Ò6Ð6Ø×.Ò.¨~¸d¼kÔ/JÑKÔKÐKØ”L×+Ò+¨DÑ1Ô1Ð1øð !ÐÝ$'¡E¤EÐ!Ý  ¤Ô!3Ñ4Ô4ð 	(ð 	(‰GˆAˆtØ”˜œÐ%¨/½:Ð)FÒFÐFØ&¨!¨a©%Ò/Ð/Ø-×1Ò1°$Ñ7Ô7Ð7Ø&'Ð#øà-ð 	*ð 	*ˆDØŒL×#Ò# DÑ)Ô)Ð)Ð)à×ÒÑÔÐàˆð	�bœgð 	ð 	ð 	ð 	ð 	ð 	õ ˜V S¨.Ñ9Ô9ˆàŒ×'Ò'Ñ)Ô)Ð)ð Ÿš™œð 	&ð 	&ˆIÝ˜)¥R¤^Ñ4Ô4ð &Ø%œOÔ1ð 9ð 9�DØœ ¤Ð-Ø'Ý-ð2ò ð ð "œ×2Ò2°4Ñ8Ô8Ð8øØ×#Ò#Ñ%Ô%Ð%øà$×3Ò3Ñ5Ô5ð 	8ð 	8‰OˆD�)Ý˜)¥R¤^Ñ4Ô4ð 8Ý0°´ÑAÔA�
à×%Ò% d¨JÑ7Ô7Ð7øð	ð 	ð 	ð& ˆ	ð
	ð 
	ð 
	ð>	3ð >	3ð >	3ð >	3ð >	3ð >	3ð >	3õB �&Ð!=Ð!=¸u¼{Ô?PÑQÔQÑRÔRˆ
Øð 	ð 	ˆDå�4”:‰Œ Ò"Ð"Ý—’ØU ¤ÐUÐUÈÌ
ÐUÐUÐUñô ð ð œ
ð ð �Ø”w -Ò/Ð/Ð/Ð/à$Ð$ØØ”KØ”Kñô ð ð ðõ +6µcÑ*:Ô*:ˆ
ØŸ>š>°D˜>Ñ9Ô9×?Ò?ÑAÔAð 	,ð 	,‰KˆC�Ø•r˜&‘z”zÔ"×&Ò& sÑ+Ô+Ð+Ð+Ø×,Ò,Ñ.Ô.ð 	,ð 	,‰KˆC�Ø•r˜&‘z”zÔ"×&Ò& sÑ+Ô+Ð+Ð+ð 13ˆØð 	;ð 	;ˆDØ6Ð6°s¸D¼KÑHÔH‰IˆAˆvÝ˜
¥2 f¡:¤:Ô.Ñ/Ô/ˆDØð ;Ø-1� ¤	Ñ*Ð*Ø”Ð 0Ô :Ð:Ð:Ø.2¬k¨]� ¤	Ñ*øõ
 2=½TÑ1BÔ1BÐØŸ>š>°D˜>Ñ9Ô9×?Ò?ÑAÔAð 	Dð 	D‰KˆC�Ø %× 4Ò 4Ñ 6Ô 6ð Dð D‘��fÝ˜f¥b¤nÑ5Ô5ð DØ$BÐ$BÀ6È3Ñ$OÔ$O‘M�F˜EàðDØ#( =à(¨Ô.×5Ò5°cÑ:Ô:Ð:Ý ¨¯	ª	°#©¬°rÔ(:¸FÑCÔCÐCøðDð #,ð 	ð 	ÑˆG�YðÝ˜ Ñ+Ô+Ð+Ð+øÝ!ð ð ð à�ðøøøð
 "×0Ò0Ñ2Ô2ð 	#ð 	#‰LˆD�&Ý˜&¥"¤.Ñ1Ô1ð #Ý˜V _°bÑ9Ô9Ð9Ø”×!Ò!Ñ#Ô#Ð#Ø× Ò Ñ"Ô"Ð"øð
 !1× 6Ò 6Ñ 8Ô 8ð 	,ñ 	,ÑˆD�*Ý˜U DÑ)Ô)ˆFÝ # J¡¤Ðà˜&�\�NˆEØð 	UØ#Ÿiši™kœk‘��tÝ˜d¥R¤^Õ5FÐ$GÑHÔHð ;Ø $¤
Ô 0ð ;ð ;˜Øœ7 jÒ0Ð0à?DÐ"U %¨#¡+°´Ñ";Ð";È$Ì+˜CØ-×5Ò5°cÑ:Ô:Ð:øØ&*×&9Ò&9Ñ&;Ô&;ð Uð U‘N�E˜7Ø—L’L¸Ð"I %¨#¡+°Ñ"5Ð"5ÀEÈ7Ð!SÑTÔTÐTÐTð ð 	Uð *ð ,ð ,�Ø!'¨¯ª°C©¬˜�Ø! # 2 #œJð 5ð 5�DÝ% g¨tÑ4Ô4�G�GÝ˜  r¤Ñ+Ô+Ð+Ð+ñ	,ð ð 	)ð 	)ˆDåœ	 $¤*Ñ-Ô-ð 2ð 2�Ø”w -Ò/Ð/Ð/Ð/Ø%Ð% d¨DÑ1Ô1Ð1Ð1àŒK×"Ò" 4Ñ(Ô(Ð(Ð(à×*Ò*Ñ,Ô,Ð,ØŒ×ÒÑÔÐØ�ŠÑÔÐå×:Ò:¸5ÑAÔAˆ
à %ÐØ4Ðà!Ð-Ý:KØ�U”[Ð"8ñ;ô ;Ñ7ˆI�{Ð$7ð Ð$Ý/Ø”KØØñô ð ð
 —’Ñ!Ô!Ð!Ø(,Ð%Ý—’ÐTÑUÔUÐUÐUå"ØYÐ@VÐYÐYñô ð õ �LŠLÐUÑVÔVÐVå�ŠÐ4¨UÐ4Ð4Ñ5Ô5Ð5åØØØ!Øñ	
ô 
ð 	
s   ÕUÕ
U#Õ"U#c                 ó8   — | j                              ¦   «          dS )z~
        Print the pipe in a human-readable format.
        This will print both the root pipe and each stage module.
        N)r  rr  ©rŽ   s    r3   rr  zPipe.print_readableß  s   € ð
 	Œ×$Ò$Ñ&Ô&Ð&Ð&Ð&r4   Úexample_args.Úexample_kwargsc                 óÄ   — t                                d¦  «         	 t          j                             | ||¦  «        }n"# t
          $ r}t          d¦  «        |‚d }~ww xY w|S )NzTracing model ...a.  It seems that we cannot capture your model as a full graph. Typical reasons include graph breaks, data/shape-dependent control flow, or missing meta kernels for custom operators. You can use our manual pipeline interfaces, or try to fix the graph breaks, see https://pytorch.org/docs/stable/export.html)r  rq  r–   ÚexportÚexport_for_trainingÚ	Exceptionr#   )r5   r�  rž  ÚepÚes        r3   Ú_trace_with_exportzPipe._trace_with_exportæ  sƒ   € õ 	�ŠÐ'Ñ(Ô(Ð(ð	Ý”×1Ò1ØØØñô ˆBˆBøõ
 ð 	ð 	ð 	ÝðPñô ð ðøøøøð	øøøð ˆ	s   œ!> ¾
AÁAÁAc                 ó<  — t           j        }d }	 t                               | ||¦  «        }t                               | ||||¬¦  «        }|j        }|                     ¦   «         }	t          t          | 	                    ¦   «         ¦  «        ¦  «        }
t          |
j        ¦  «        }t          |	j        ¦  «        }t          |j        ¦  «        t          |j        ¦  «        k    rFt                               dt          |j        ¦  «        › dt          |j        ¦  «        › d�¦  «         npt!          j        |	j        j        ¦  «        |
j        _        |
j        j        j                             d ¬¦  «        |
j        j        _        |
                     ¦   «          |S )N)rG   rK  zOriginal model takes z) args but the first pipeline stage takes z4. Please provide args to respective pipeline stages.)Úout_spec)r´   r¶   r  r¥  rš  r  r�   ÚnextÚiterÚchildrenr   r‘   r&   r:  r  rq  r‰   r"  rÙ   Ú_codegenÚpytree_infoÚ_replacer	  )r5   r�  rž  rK  rJ  rG   rI  Úpiper   rƒ  Úsubmod0Úsubmod0_signÚ
model_signs                r3   Úfrom_tracingzPipe.from_tracingþ  s™  € õ  7Ô@Ðð '+Ðð	õ  ×2Ò2ØØØñ
ô 
Ðõ × Ò ØØØ Ø#9Ø%ð !ñ 
ô 
ˆð ”ˆØ!×(Ò(Ñ*Ô*ˆÝ•t˜EŸNšNÑ,Ô,Ñ-Ô-Ñ.Ô.ˆÝ  ¤Ñ1Ô1ˆÝ˜vœ~Ñ.Ô.ˆ
ÝˆzÔ$Ñ%Ô%­¨\Ô-DÑ)EÔ)EÒEÐEõ �KŠKðE­¨JÔ,AÑ(BÔ(Bð Eð EÝ.1°,Ô2IÑ.JÔ.JðEð Eð Eñô ð ð õ &*¤]°6´<Ô3HÑ%IÔ%IˆGŒMÔ"ð
 ”Ô&Ô2×;Ò;ÀTÐ;ÑJÔJð ŒMÔ"Ô.ð ×ÒÑÔÐàˆr4   c                 ó4   — | j                              ¦   «         S rR   )r  Ú__str__rœ  s    r3   r´  zPipe.__str__A  s   € ØŒ}×$Ò$Ñ&Ô&Ð&r4   c                 ó4   — | j                              ¦   «         S rR   )r  Ú__repr__rœ  s    r3   r¶  zPipe.__repr__D  s   € ØŒ}×%Ò%Ñ'Ô'Ð'r4   c                 óN   — t          | j        j        | j        | j        ¬¦  «        S )z¢
        Get information about the pipe.

        Returns
        -------
        PipeInfo
            A dataclass containing information about the pipe.
        )rÙ   r  r  )r   r  rÙ   r  r  rœ  s    r3   rq  z	Pipe.infoG  s.   € õ Ø”-Ô%Ø”Ø"&Ô"<ð
ñ 
ô 
ð 	
r4   Ústage_indexr   Úgroupc                 ó.  — |                       |¦  «        }t          |t          j        j        ¦  «        rt          ||¦  «         n*t                               dt          |¦  «        › �¦  «         |  	                    ¦   «         }t          |||||¦  «        S )z“
        Create a `PipelineStage` given a stage index and distributed group.
        The `PipelineStage` can run with `PipelineSchedule`s.
        z*Expected a `torch.fx.GraphModule` but got )rD  r    r–   r!   rõ   r  r  r  r,   rq  r   )rŽ   r¸  r   r¹  Ústage_moduleÚ	pipe_infos         r3   Úbuild_stagezPipe.build_stageV  s‘   € ð ×,Ò,¨[Ñ9Ô9ˆõ �l¥E¤HÔ$8Ñ9Ô9ð 	Ý# L°&Ñ9Ô9Ð9Ð9å�NŠNØQ½TÀ,Ñ=OÔ=OÐQÐQñô ð ð —I’I‘K”Kˆ	Ý˜l¨K¸ÀFÈEÑRÔRÐRr4   ©NNNrR   rZ  )#r’   r“   r”   r!   rõ   rF  Úboolr�   r‘   r–   r—   rô   rD  r•   rH  r   r   ÚMultiUseParamSpecr
   rš  rr  r   r	   r   rÏ   r¥  r²  r´  r¶  r   rq  r   r   r   r½  rA   r4   r3   r  r    sÆ  € € € € € ðLà”.ðLð ðLð  $ð	Lð Lð Lð Lð\ð ð ðB=¨#ð =°%´(´/ð =ð =ð =ð =ð ð¨R¬^ð ð ð ñ „\ðð( ð =AØ#ð ðB
ð B
ØŒXŒ_ðB
à)ðB
ð 'Ð'8Ô9ðB
ð
 Ø�e”hÔ*Ð+¨U¬XÔ-AÐAÔBô
ðB
ð B
ð B
ñ „\ðB
ðH
'ð 'ð 'ð ð 48ðð ØŒXŒ_ðà˜C ˜H”oðð !  c¨3 h¤Ô0ðð 
ð	ð ð ñ „\ðð. ð 48ØMQð	@ð @ØŒXŒ_ð@à˜C ˜H”oð@ð !  c¨3 h¤Ô0ð@ð ˜x¨¬Ð(8¸"¼.Ð(HÔIÔJð	@ð @ð @ñ „\ð@ðD'ð 'ð 'ð(ð (ð (ð
�hð 
ð 
ð 
ð 
ð& )-ð	 Sð  Sàð Sð ”ð Sð ˜Ô%ð	 Sð
 
ð Sð  Sð  Sð  Sð  Sð  Sr4   r  c                   ó   — e Zd ZdZdZdS )Ú
SplitPointr   rO   N)r’   r“   r”   Ú	BEGINNINGÚENDrA   r4   r3   rÂ  rÂ  y  s   € € € € € Ø€IØ
€C€C€Cr4   rÂ  c                   ó   — e Zd ZeZdS )ÚPipeSplitWrapperN)r’   r“   r”   rÂ  rA   r4   r3   rÆ  rÆ  €  s   € € € € € à€J€J€Jr4   rÆ  c                 ó8   — t          ¦   «           | j        |i |¤ŽS rR   )r�   Ú_orig_forwardr¢   s      r3   Ú_split_before_forwardrÉ  …  s#   € Ý�L„L€LØˆ4Ô˜tÐ. vÐ.Ð.Ð.r4   c                 ó`   — 	  | j         |i |¤Žt          ¦   «          S # t          ¦   «          w xY wrR   )rÈ  r�   r¢   s      r3   Ú_split_after_forwardrË  Š  s5   € ðØ!ˆtÔ! 4Ð2¨6Ð2Ð2å‰Œˆˆø�
‰Œˆˆøøøs   ‚ �-r0   c                 ó`  — |                      ¦   «         D �]\  }}|                     d¦  «        }| }t          |d d…         ¦  «        D ]\\  }}	 t          ||¦  «        }Œ# t          $ r9}t	          d|› dd                     |d |dz   …         ¦  «        › �¦  «        |‚d }~ww xY wt          ||d         ¦  «        }	|	j        |	_        |t          j	        k    rt          t          |	¦  «        |	_        ŒÞ|t          j        k    rt          t          |	¦  «        |	_        �Œ
t          d¦  «        ‚d S )Nr  rP   zSpecified target z referenced nonexistent module r   zUnknown split point type.)r  r   ro   r  r$  Újoinr‘   rÈ  rÂ  rÃ  r   rÉ  rÄ  rË  rC  )
r5   r0   ÚqualnameÚ
split_typer,  Úpredecessor_modulerc   r-  r¤  Úmod_to_wraps
             r3   Úannotate_split_pointsrÒ  ‘  sc  € à $§
¢
¡¤ð :ñ :Ñˆ�*Ø—’˜sÑ#Ô#ˆØ ÐÝ   s¨ s¤Ñ,Ô,ð 	ð 	‰GˆAˆtðÝ%,Ð-?ÀÑ%FÔ%FÐ"Ð"øÝ!ð ð ð Ý$ðE¨ð Eð EØ*-¯(ª(°5¸¸1¸q¹5¸´>Ñ*BÔ*BðEð Eñô ð ðøøøøðøøøõ Ð0°%¸´)Ñ<Ô<ˆØ$/Ô$7ˆÔ!Ø�Ô-Ò-Ð-Ý",Õ-BÀKÑ"PÔ"PˆKÔÐØ�:œ>Ò)Ð)Ý",Õ-AÀ;Ñ"OÔ"OˆKÔÑåÐ8Ñ9Ô9Ð9ð':ð :s   ÁA Á 
B#Á*4BÂB#r�   Úmb_args.Ú	mb_kwargsÚ
split_specrK  r@  c                 óÂ   — |�|�t          d¦  «        ‚|�-t          | |¦  «         t                               | ||¬¦  «        S t                               | |||¬¦  «        S )a9  
    Split a module based on a specification.

    See `Pipe` for more details.

    Arguments
    ---------
    module:
        The module to be splitted.
    mb_args:
        Example positional inputs, in micro-batch form.
    mb_kwargs:
        Example keyword inputs, in micro-batch form. (default: `None`)
    split_spec:
        A dictionary using submodule names as split marker. (default: `None`)
    split_policy:
        The policy to use for splitting the module. (default: `None`)

    Returns
    -------
    A pipeline representation of class `Pipe`.
    NzQCannot specify both `split_spec` and `split_policy`. Please use only one of them.)r5   r�  rž  )r5   r�  rž  rK  )rC  rÒ  r  r²  )r�   rÓ  rÔ  rÕ  rK  s        r3   Úpipeliner×  ©  s�   € ð: Ð ,Ð":ÝØ_ñ
ô 
ð 	
ð Ðå˜f jÑ1Ô1Ð1Ý× Ò ØØ Ø$ð !ñ 
ô 
ð 	
õ × Ò ØØ Ø$Ø%ð	 !ñ 
ô 
ð 	
r4   r¾  )]r‰   Úloggingrk   Úcollectionsr   Úenumr   Úinspectr   r   r   Útypesr   Útypingr	   r
   r   r   r   r   r   r   r–   Útorch.fxr!   Útorch.distributedr   Útorch.exportr   Útorch.export.unflattenr   r   r   r   Útorch.fx.noder   Útorch.fx.passes.split_moduler   Ú	_backwardr   r   Ú
_unflattenr   Ú_utilsr   Ústager   Ú	getLoggerr’   r  r(   r—   rô   rè   rL   r"   rƒ   r˜   r…   rš   rE   ÚlibraryÚdefineÚimplr­   Úregister_faker±   r²   r/  rP  rq   Ú_side_effectful_functionsru  r�   r´   rÏ   rÀ  ÚInterpreterr¸   rÌ   rÒ   r÷   rü   rõ   r   r  r  rÂ  rÆ  rÉ  rË  rÒ  r×  rA   r4   r3   ú<module>rï     sù  ðð €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ Ià €€€Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ø (Ð (Ð (Ð (Ð (Ð (ðð ð ð ð ð ð ð ð ð ð ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5à @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !ð 
ˆÔ	˜8Ñ	$Ô	$€ð,Sð ,Sð ,Sð^2˜5œ8œ?ð 2¨r¬xð 2ð 2ð 2ð 2ð8iØ	„xðiàŒwðið ”ðið ið ið iðX
ð 
ð 
ð 
ð 
�U”XÔ(ñ 
ô 
ð 
ð%
ð %
ð %
ð %
ð %
�%”(”/ñ %
ô %
ð %
ðPð ð ð ð ˜ñ ô ð ð> „× Ò Ð)¨:Ñ 6Ô 6Ð 6ð „×ÒÐ(¨/Ñ:Ô:ðð ñ ;Ô:ðð „×ÒÐ1Ñ2Ô2ðð ñ 3Ô2ðð
 œ	œÔ3Ô;Ð ð „Ô !× %Ò %Ð&;Ñ <Ô <Ð <ð)ð )ð )ð(ð ð ð ð ˜dñ ô ð ð
 Ð1°4¸Ð=TÐ8TÔ3UÐUÔVÐ ð1;ð 1;ð 1;ð 1;ð 1;�R”^ñ 1;ô 1;ð 1;ðhð ð ð ð ñ ô ð ð*ð *ð *ð *ð *ñ *ô *ð *ðZ3ð 3ð 3ð,ð ð ð ØŒÔð à”ð ð  ð  ð  ðFi	Sð i	Sð i	Sð i	Sð i	Sˆ5Œ8Œ?ñ i	Sô i	Sð i	SðXð ð ð ð �ñ ô ð ðð ð ð ð ñ ô ð ð
/ð /ð /ð
ð ð ð:˜uœxœð :°d¸3À
¸?Ô6Kð :ð :ð :ð :ð6 +/Ø26ØIMð1
ð 1
ØŒHŒOð1
à�3˜�8Œ_ð1
ð ˜˜S #˜XœÔ'ð1
ð ˜˜c :˜oÔ.Ô/ð	1
ð
 ˜8 R¤^Ð$4°b´nÐ$DÔEÔFð1
ð 
ð1
ð 1
ð 1
ð 1
ð 1
ð 1
r4   