§
    ŠŠtj5§  ã                   ó”  — d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	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 g d
¢Z ej        e¦  «        xZZ ed¬¦  «         G d„ d¦  «        ¦   «         Zde	j        j        dedefd„Z ed¬¦  «        	 	 	 	 d-dddœdede	j        j        deegef         de eef         dz  de!dz  de!dz  de!dedz  de!defd„¦   «         Z"deddfd„Z#	 d.d e	j$        j%        j&        d!e eef         dz  defd"„Z'ded#e eef         de(e ee	j$        j%        j&        f         e ee eef         f         e ee eef         f         e)e         f         fd$„Z*ded%e ee	j$        j%        j&        f         d&e ee eef         f         d'e ee eef         f         d(e)e         de ee eef         f         fd)„Z+	 d.ded%e ee	j$        j%        j&        f         d&e ee eef         f         d'e ee eef         f         d(e)e         dedz  defd*„Z, ed¬¦  «        dd+œded#e eef         dedz  defd,„¦   «         Z-dS )/é    N)ÚdefaultdictÚOrderedDict)ÚCallable)ÚAny)Úcompatibility)Ú_LazyGraphModuleÚ_make_graph_module)Úlazy_format_graph_code)ÚGraphModule)ÚNode)Ú	PartitionÚsplit_moduleÚsplit_module_simpleT)Úis_backward_compatiblec                   ó*   — e Zd Zdeddfd„Zdefd„ZdS )r   ÚnameÚreturnNc                 óÚ   — || _         d|› �| _        g | _        i | _        i | _        i | _        i | _        t          j        j	         
                    ¦   «         | _	        i | _        i | _        d S )NÚsubmod_)r   Úsubmod_nameÚ
node_namesÚinputsÚoutputsÚdependenciesÚ
dependentsÚtorchÚfxÚgraphÚGraphÚenvironmentÚtargets)Úselfr   s     úZ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/torch/fx/passes/split_module.pyÚ__init__zPartition.__init__   sg   € ØˆŒ	Ø+ TÐ+Ð+ˆÔØ%'ˆŒØ')ˆŒØ(*ˆŒØ-/ˆÔØ+-ˆŒÝ+0¬8¬>×+?Ò+?Ñ+AÔ+AˆŒ
Ø-/ˆÔØ')ˆŒˆˆó    c                 óf   — d| j         › d| j        › d| j        › d| j        › d| j        › d| j        › �S )Nzname: z
,
 nodes: z,
 inputs: z,
 outputs: z,
 partitions depended on: z,
 partition dependents: )r   r   r   r   r   r   )r"   s    r#   Ú__repr__zPartition.__repr__!   sl   € ð8�T”Yð 8ð 8Ø”ð8ð 8àœð8ð 8ð œð8ð 8ð )-Ô(9ð	8ð 8ð
 '+¤oð8ð 8ð	
r%   )Ú__name__Ú
__module__Ú__qualname__Ústrr$   r'   © r%   r#   r   r      sQ   € € € € € ð
*˜Sð 
* Tð 
*ð 
*ð 
*ð 
*ð
˜#ð 
ð 
ð 
ð 
ð 
ð 
r%   r   ÚmodÚqualnamer   c                 ó    — | }|                      d¦  «        D ]5}t          ||¦  «        st          d|› d�¦  «        ‚t          ||¦  «        }Œ6|S )Nú.zNode target z not found!)ÚsplitÚhasattrÚAttributeErrorÚgetattr)r-   r.   Úattr_valÚatoms       r#   Ú_get_attr_from_qualnamer7   ,   se   € Ø€HØ—’˜sÑ#Ô#ð +ð +ˆÝ�x Ñ&Ô&ð 	GÝ Ð!E°Ð!EÐ!EÐ!EÑFÔFÐFÝ˜8 TÑ*Ô*ˆˆØ€Or%   F)Úpartition_affixÚtuple_returnÚmÚroot_mÚsplit_callbackÚqualname_mapÚkeep_original_orderÚkeep_original_node_nameÚkeep_original_input_namer8   r9   c                ó   ‡ ‡‡‡‡‡;‡<‡=‡>‡?‡@‡A‡B‡C‡D‡E‡F‡G‡H— t                                dt          d‰ d¬¦  «        ¦  «         dt          dt          t
          t          f         dt          t
          t          j        j        j	        f         dt          t          t
          t          f         t          t
          t          j        j        j	        f         f         fˆ<ˆˆ fd	„}	d
dl}
i ŠFi ŠCi ŠHdt          dt          dz  ddfˆFˆHfd„ŠGdt          ddfˆˆFˆfd„}t          j        j        t          j        j        t          j        j        g}t#          ¦   «         }t#          ¦   «         }i }d}t%          ¦   «         }‰ j        j        D �]àŠA‰Aj                             d¦  «        x}�Zt/          |t          j        t          j        f¦  «        r4t/          |j        j        x}|
j        ¦  «        r|‰Hvr‰A‰H|j        j        <   ‰Aj        dv rŒƒ |‰A¦  «         ‰Aj        dk    �r÷‰Aj        |v �rí‰Aj        t          j        j        u r¦t?          ‰Aj         ¦  «        dk    r$tC          dt?          ‰Aj         ¦  «        › �¦  «        ‚t/          ‰Aj         d
         tD          ¦  «        s*tC          dtG          ‰Aj         d
         ¦  «        › �¦  «        ‚‰A}t%           ‰‰A¦  «        h¦  «        ||<   �n/‰Aj        t          j        j        u rdtI          d„ ‰Aj         D ¦   «         ¦  «        stC          d¦  «        ‚| %                    ‰A¦  «         t%           ‰‰A¦  «        h¦  «        |‰A<   d|‰A<   n³‰Aj        t          j        j        u r›t?          ‰Aj         ¦  «        dk    r$tC          dt?          ‰Aj         ¦  «        › �¦  «        ‚|‰Aj         d
                   %                     ‰‰A¦  «        ¦  «         | &                    ‰Aj         d
         ¦  «         ‰A|‰Aj         d
         <   |�$||          %                     ‰‰A¦  «        ¦  «         |D ]&}||          %                     ‰‰A¦  «        ¦  «         Œ'�ŒâtI          d„ | '                    ¦   «         D ¦   «         ¦  «        stC          d¦  «        ‚d„ | (                    ¦   «         D ¦   «         }d„ | (                    ¦   «         D ¦   «         }tR           *                    tV          j,        ¦  «        r6tR                               d|¦  «         tR                               d|¦  «         tE          |¦  «        ptE          |¦  «        }d}‰ j        j        D ]äŠA‰A‰C‰Aj-        <   ‰Aj        d v rŒ‰Aj        d!k    r4t          j        j         .                    ‰Aj         d
         ˆGfd"„¦  «         ŒU|r( ‰‰A¦  «        }||k    rtC          d#|› d$|› �¦  «        ‚|}‰Aj        |vr\t          j        j         .                    ‰Aj         ˆAˆGfd%„¦  «         t          j        j         .                    ‰Aj/        ˆAˆGfd&„¦  «         Œåta          ‰F 1                    ¦   «         ¦  «        }g }‰F (                    ¦   «         D ].\  }ŠEt?          ‰Ej2        ¦  «        s| 3                    |¦  «         Œ/g }|r}| 4                    ¦   «         }| 3                    |¦  «         ‰F|         j5        D ]D}‰F|         j2         4                    |¦  «         ‰F|         j2        s| 3                    |¦  «         ŒE|°}t?          |¦  «        t?          ‰F¦  «        k    rtm          d'¦  «        ‚||fD ]õ}| (                    ¦   «         D ]Þ\  ŠA}t?          |¦  «        d
k    rtC          d(¦  «        ‚‰A‰Ft          |d
         ¦  «                 j7        ‰A<   |dd…         D ]‰} ‰Ft          | ¦  «                 ŠE‰Ej         8                    ‰Aj        ‰Aj        t          d)„ ‰Aj         D ¦   «         ¦  «        i ‰Aj#        ¬*¦  «        }!‰Aj         9                    ¦   «         |!_        |!‰Ej7        ‰A<   ŒŠŒßŒö|D �]Ç}‰F|         ŠEi Š@d
Š=g }"g }#‰Ej:        D ]ŒŠ?‰C‰?         }$|$j        d+k    rbt/          |$j        t
          ¦  «        rHt/          tw          ‰ |$j        ¦  «        t          j<        j=        ¦  «        r|# 3                    ‰?¦  «         Œw|" 3                    ‰?¦  «         Œ�|"|#z   D �]Š?‰C‰?         }$dt          fˆ=ˆ?ˆˆ@ˆCˆEfd,„}%|$j        d+k    r¬t/          |$j        t
          ¦  «        s$tC          d-tG          |$j        ¦  «        › �¦  «        ‚tw          ‰ |$j        ¦  «        }&t/          |&t          j<        j=        ¦  «        r/‰Ej         >                    |$j        ¦  «        }'|&‰Ej?        |$j        <   n |%¦   «         }'n
 |%¦   «         }'‰C‰?         j         9                    ¦   «         |'_        |'‰Ej7        ‰C‰?         <   �Œ‰@‰E_:        �ŒÉ‰ j        j        D �]ªŠAt�          ‰Ad.¦  «        �r–‰F‰AjA                 ŠE‰Ej7        Š>t          j        j         .                    ‰Aj         ˆ>fd/„¦  «        }(t          j        j         .                    ‰Aj/        ˆ>fd0„¦  «        })‰Aj        d1vr‰Aj        }*nRtw          ‰ ‰Aj        ¦  «        }+‰Aj         B                    d2d3¦  «        }*|+‰Ej?        |*<   |�‰EjC        › d2|*› �},‰Aj        ||,<   t/          |(t          ¦  «        stC          d4tG          |(¦  «        › �¦  «        ‚t/          |)t          ¦  «        stC          d5tG          |)¦  «        › �¦  «        ‚‰r‰Aj-        nd}-‰Ej         8                    ‰Aj        |*|(|)‰Aj#        |-¬6¦  «        }!‰Aj         9                    ¦   «         |!_        |!‰Ej7        ‰A<   �Œ¬|fD ]Ñ}t‰          |¦  «        D ]¿ŠA|‰A         }t?          |¦  «        d
k    rtC          d7¦  «        ‚|dd…         D ]ˆ} ‰Ft          | ¦  «                 ŠE|‰A         }.|.€tC          d8¦  «        ‚‰Ej         8                    |.j        |.j        ‰Ej7        ‰A         fi |.j#        ¬*¦  «        }!|.j         9                    ¦   «         |!_        Œ‰ŒÀŒÒi ŠBi Š;t          j        j         E                    ¦   «         Š<i }/|s ‰ j        j        D ]ŠA |	‰A‰;|/¦  «        \  Š;}/Œn‰ j        j        D ]ŠA‰A‰B‰Aj-        <   Œ|s|n|}0t%          ¦   «         }1d9„ ‰ j        j        D ¦   «         ŠD|0D �]ç}‰F|         ŠEt          ˆCˆEfd:„‰EjF        D ¦   «         ¦  «        }2t?          |2¦  «        dk    r#|s!‰Ej         G                    |2d
         ¦  «         n‰Ej         G                    |2¦  «         |rrˆBˆDfd;„‰Ej:        D ¦   «         }3‰DD ],ŠA‰A|1v rŒ |	‰A‰;|/¦  «        \  Š;}4|1 %                    ‰A¦  «         Œ-|3D ],ŠA‰A|1v rŒ |	‰A‰;|/¦  «        \  Š;}/|1 %                    ‰A¦  «         Œ-t‘          ‰Ej?        ‰Ej        ¦  «        |/‰EjC        <   ‰< I                    ‰EjC        t          ˆ;fd<„‰Ej:        D ¦   «         ¦  «        ¦  «        }5t?          ‰EjF        ¦  «        }6|6dk    s|6dk    rR|rPt          j        jJ         K                    |5¦  «        }7t™          ‰EjF        ¦  «        D ]\  }8}9|7|8         j        ‰;|9<   Œ�Œ½|6dk    r$|5‰;t›          t�          ‰EjF        ¦  «        ¦  «        <   �Œé|r!‰;s‰ j        j        D ]ŠA |	‰A‰;|/¦  «        \  Š;}/Œ‰ j        j        D ]SŠA‰Aj        d!k    rF‰< G                    t          j        j         .                    ‰Aj         d
         ˆ;fd=„¦  «        ¦  «         ŒTt‘          |/‰<¦  «        }:d>„ ‰F '                    ¦   «         D ¦   «         |:j        d?<   t                                dt          d@|:d¬¦  «        ¦  «         |:S )Aa’  
    Creates subgraphs out of main graph

    Args:
        m (GraphModule): Graph module to split
        root_m (torch.nn.Module): root nn module. Not currently used. Included
            because the root nn module is usually transformed via
            torch.fx._symbolic_trace.symbolic_trace (see example below)
        split_callback (Callable[[Node], int]): Callable function
            that maps a given Node instance to a numeric partition identifier.
            split_module will use this function as the policy for which operations
            appear in which partitions in the output Module.
        qualname_map: Optional[Dict[str, str]]: optional output parameter that returns a
            mapping from new target names in the module after split to old target
            names in the original module.
        keep_original_order: Optional[bool]: keep the original order of the GraphModule
            or use the Topological order of the new constructed GraphModule
        keep_original_node_name: Optional[bool]: If the partitioned graphs should
            have the same node names as the original graph.
        keep_original_input_name: bool: If the partitioned graphs should
            have the same input names as the original graph.
        partition_affix: Optional[str]: If specified, the submodules' names will contain
            the affix, e.g. "submod_<affix>_<idx>".
        tuple_return: bool: If True, submodule outputs are always wrapped in a tuple,
            even when there is only a single output value.  This makes all subgraphs
            conform to the convention expected by ``torch._inductor.compile_fx``.

    Returns:
        GraphModule: the module after split.

    Example:

        This is a sample setup:

            import torch
            from torch.fx._symbolic_trace import symbolic_trace
            from torch.fx.graph_module import GraphModule
            from torch.fx.node import Node
            from torch.fx.passes.split_module import split_module

            class MyModule(torch.nn.Module):
                def __init__(self) -> None:
                    super().__init__()
                    self.param = torch.nn.Parameter(torch.rand(3, 4))
                    self.linear = torch.nn.Linear(4, 5)

                def forward(self, x, y):
                    z = self.linear(x + self.param).clamp(min=0.0, max=1.0)
                    w = self.linear(y).clamp(min=0.0, max=1.0)
                    return z + w

            # symbolically trace model
            my_module = MyModule()
            my_module_traced = symbolic_trace(my_module)

            # random mod partitioning
            partition_counter = 0
            NPARTITIONS = 3

            def mod_partition(node: Node):
                global partition_counter
                partition = partition_counter % NPARTITIONS
                partition_counter = (partition_counter + 1) % NPARTITIONS
                return partition

            # split module in module with submodules
            module_with_submodules = split_module(
                my_module_traced, my_module, mod_partition
            )

        Output looks like this. Original graph is broken into partitions

            > print(module_with_submodules)
            GraphModule(
                (submod_0): GraphModule(
                    (linear): Linear(in_features=4, out_features=5, bias=True)
                )
                (submod_1): GraphModule(
                    (linear): Linear(in_features=4, out_features=5, bias=True)
                )
                (submod_2): GraphModule()
            )

            def forward(self, x, y):
                param = self.param
                submod_0 = self.submod_0(x, param, y);  x = param = y = None
                getitem = submod_0[0]
                getitem_1 = submod_0[1];  submod_0 = None
                submod_1 = self.submod_1(getitem, getitem_1);  getitem = getitem_1 = None
                getitem_2 = submod_1[0]
                getitem_3 = submod_1[1];  submod_1 = None
                submod_2 = self.submod_2(getitem_2, getitem_3);  getitem_2 = getitem_3 = None
                return submod_2

        Output of split module is the same as output of input traced module.
        This is an example within a test setting:

            > orig_out = my_module_traced(x, y)
            > submodules_out = module_with_submodules(x, y)
            > self.assertEqual(orig_out, submodules_out)
            True
    z%szpre split_moduleT)ÚcoloredÚnodeÚbase_mod_envÚbase_mod_attrsr   c                 ó(  •— | j         dk    rÐt          | j        ¦  «        dk    r| j        d         nt          j        j        }‰rD|t          j        j        u rdn|f}‰                     d| j        || j        ¬¦  «        || j        <   n*‰ 	                    | j
        | j        |¬¦  «        || j        <   | j                             ¦   «         || j                 _        n³| j         dk    r¨‰                     | j
        ¦  «        || j        <   | j                             ¦   «         || j                 _        t          | j
        t          ¦  «        s$t!          dt          | j
        ¦  «        › �¦  «        ‚t#          ‰| j
        ¦  «        }||| j
        <   ||fS )NÚplaceholderr   r,   )ÚargsÚ	type_expr)rI   Údefault_valueÚget_attrúExpected str target, got )ÚopÚlenrH   ÚinspectÚ	SignatureÚemptyÚcreate_noder   ÚtyperG   ÚtargetÚmetaÚcopyrK   Ú
isinstancer+   ÚAssertionErrorr7   )	rC   rD   rE   rJ   rH   r5   Úbase_mod_graphr?   r:   s	         €€€r#   Úconstruct_graphz%split_module.<locals>.construct_graph¯   s�  ø€ ð
 Œ7�mÒ#Ð#å # D¤I¡¤°Ò 2Ð 2�”	˜!”�½Ô8IÔ8Oð ð 'ð à'­7Ô+<Ô+BÐBÐB�B�BÈÐHXð ð +9×*DÒ*DØ!Ø”IØØ"œið	 +Eñ +ô +�˜TœYÑ'Ð'ð +9×*DÒ*DØ”KØ"œiØ"/ð +Eñ +ô +�˜TœYÑ'ð
 ,0¬9¯>ª>Ñ+;Ô+;ˆL˜œÔ#Ô(Ð(ØŒW˜
Ò"Ð"Ø&4×&=Ò&=¸d¼kÑ&JÔ&JˆL˜œÑ#Ø+/¬9¯>ª>Ñ+;Ô+;ˆL˜œÔ#Ô(Ý˜dœk­3Ñ/Ô/ð VÝ$Ð%TÅÀdÄkÑARÔARÐ%TÐ%TÑUÔUÐUÝ.¨q°$´+Ñ>Ô>ˆHØ*2ˆN˜4œ;Ñ'Ø˜^Ð+Ð+r%   r   NÚdef_nodeÚuse_nodec                 ó¨  •— ddl m} t          | dd ¦  «        }t          |dd ¦  «        }t                               d| j        ||�|j        nd|¦  «         ||k    �rq|�C‰|         }|j                             | j        ¦  «         |�|j                             |¦  «         |��+‰|         }|j	                             | j        ¦  «         | j
                             d¦  «        x}�Èt           ||¦  «        t          ¬¦  «        D ]¨}‰|         }	|j	                             |	j        ¦  «         ‰|         j        dk    rnt          |	dd ¦  «        }
|
�[‰|
         }|j                             |	j        ¦  «         |j                             |¦  «         |j                             |
¦  «         Œ©|� |j                             |¦  «         d S d S d S d S )	Nr   ©Úfree_symbolsÚ_fx_partitionz*record_cross_partition_use %s (%s) %s (%s)ú-Úexample_value©ÚkeyrG   )Ú%torch.fx.experimental.symbolic_shapesr_   r4   ÚlogÚdebugr   r   Ú
setdefaultr   r   rU   ÚgetÚsortedr+   rM   r   )r[   r\   r_   ÚdefinedÚusedÚdef_partitionÚuse_partitionÚdef_valÚsÚs_nodeÚ	s_definedÚs_def_partitionÚ
partitionsÚsymbol_to_nodes               €€r#   Úrecord_cross_partition_usez0split_module.<locals>.record_cross_partition_useØ   s  ø€ ØFÐFÐFÐFÐFÐFå˜( O°TÑ:Ô:ˆÝ�x °$Ñ7Ô7ˆå�	Š	Ø8ØŒMØØ%Ð1ˆHŒMˆM°sØñ	
ô 	
ð 	
ð �dŠ?‰?ØÐ"Ø *¨7Ô 3�ØÔ%×0Ò0°´Ñ?Ô?Ð?ØÐ#Ø!Ô,×7Ò7¸Ñ=Ô=Ð=àÑØ *¨4Ô 0�ØÔ$×/Ò/°´Ñ>Ô>Ð>ð  (œ}×0Ò0°ÑAÔAÐA�GÐNÝ# L L°Ñ$9Ô$9½sÐCÑCÔCð Qð Q˜Ø!/°Ô!2˜Ø%Ô,×7Ò7¸¼ÑDÔDÐDØ)¨!Ô,Ô/°=Ò@Ð@õ )0°¸ÈÑ(NÔ(N˜IØ(Ð4Ø2<¸YÔ2G Ø /Ô 7× BÒ BÀ6Ä;Ñ OÔ OÐ OØ /Ô :× EÒ EÀdÑ KÔ KÐ KØ -Ô :× EÒ EÀiÑ PÔ PÐ PøØÐ&Ø!Ô.×9Ò9¸'ÑBÔBÐBÐBÐBðC ˆ?ð  Ðð2 'Ð&r%   c                 óR  •—  ‰| ¦  «        }t          |¦  «        }‰�d                     ‰|g¦  «        }t                               d| j        |¦  «         ‰                     |¦  «        }|€t          |¦  «        x‰|<   }|j                             | j        ¦  «         || _	        d S )NÚ_z*instantiate_node_partition_mapping %s (%s))
r+   Újoinrf   rg   r   ri   r   r   Úappendr`   )rC   Úpartition_idxÚpartition_nameÚ	partitionr8   rt   r<   s       €€€r#   Ú"instantiate_node_partition_mappingz8split_module.<locals>.instantiate_node_partition_mapping	  s³   ø€ Ø&˜ tÑ,Ô,ˆÝ˜]Ñ+Ô+ˆØÐ&ð !ŸXšX ¸Ð&GÑHÔHˆNå�	Š	Ø8¸$¼)À^ñ	
ô 	
ð 	
ð
 —N’N >Ñ2Ô2ˆ	ØÐÝ5>¸~Ñ5NÔ5NÐNˆJ�~Ñ&¨àÔ×#Ò# D¤IÑ.Ô.Ð.Ø+ˆÔÐÐr%   rb   )rG   rK   ÚoutputÚcall_functioné   z*Expected 1 arg for _set_grad_enabled, got zExpected bool arg, got c              3   óB   K  — | ]}t          |t          ¦  «         V — Œd S ©N)rW   r   ©Ú.0Úargs     r#   ú	<genexpr>zsplit_module.<locals>.<genexpr>Y  s/   è è € ÐJÐJ¸�z¨#­tÑ4Ô4Ð4ÐJÐJÐJÐJÐJÐJr%   z3Expected all args to be python constants, not Nodesz'Expected 1 arg for _exit_autocast, got c              3   ó   K  — | ]}|d uV — Œ	d S rƒ   r,   )r…   Úvs     r#   r‡   zsplit_module.<locals>.<genexpr>o  s&   è è € Ð>Ð> ˆq˜ˆ}Ð>Ð>Ð>Ð>Ð>Ð>r%   zautocast must exitc                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r,   ©rj   ©r…   Úkr‰   s      r#   ú
<dictcomp>z split_module.<locals>.<dictcomp>s  s$   € ÐJÐJÐJ©¨¨A˜�6 !™9œ9ÐJÐJÐJr%   c                 ó4   — i | ]\  }}|t          |¦  «        “ŒS r,   r‹   rŒ   s      r#   rŽ   z split_module.<locals>.<dictcomp>u  s$   € ÐBÐBÐB¡T Q¨�A•v˜a‘y”yÐBÐBÐBr%   zautocast_regions: %szgrad_regions: %séÿÿÿÿ)rG   rK   r   c                 ó   •—  ‰| d ¦  «        S rƒ   r,   )Únrv   s    €r#   ú<lambda>zsplit_module.<locals>.<lambda>ˆ  s   ø€ Ð(BÐ(BÀ1ÀdÑ(KÔ(K€ r%   zSautocast or set_grad_enabled require monotonically increasing partitions: highest: z, this node's: c                 ó   •—  ‰| ‰¦  «        S rƒ   r,   ©r[   rC   rv   s    €€r#   r“   zsplit_module.<locals>.<lambda>™  s   ø€ Ð,FÐ,FÀxÐQUÑ,VÔ,V€ r%   c                 ó   •—  ‰| ‰¦  «        S rƒ   r,   r•   s    €€r#   r“   zsplit_module.<locals>.<lambda>œ  s   ø€ Ð.HÐ.HÈÐSWÑ.XÔ.X€ r%   z cycle exists between partitions!z%Expected at least one region for nodec              3   ó   K  — | ]}|V — Œd S rƒ   r,   r„   s     r#   r‡   zsplit_module.<locals>.<genexpr>À  s"   è è € Ð8Ð8 s˜sÐ8Ð8Ð8Ð8Ð8Ð8r%   ©rM   rT   rH   ÚkwargsrI   rK   c                  ó~   •— ‰r‰} n
d‰› �} ‰dz  Š‰j                              | ‰‰         j        ¬¦  «        }d ‰‰<   |S )NÚarg_r�   ©rI   )r   rG   rS   )r   rG   ÚcounterÚinpr@   Ú
new_inputsÚ
orig_nodesr}   s     €€€€€€r#   Úadd_placeholderz%split_module.<locals>.add_placeholderç  sd   ø€ Ø+ð !Ø�D�Dð , 'Ð+Ð+�DØ˜q‘L�GØ'œo×9Ò9ØØ(¨œoÔ2ð :ñ ô �ð #'�
˜3‘Ø"Ð"r%   rL   r`   c                 ó   •— ‰|          S rƒ   r,   ©r’   r    s    €r#   r“   zsplit_module.<locals>.<lambda>  s   ø€ ÈÐTUÌ€ r%   c                 ó   •— ‰|          S rƒ   r,   r£   s    €r#   r“   zsplit_module.<locals>.<lambda>  s   ø€  {°1¤~€ r%   )Úcall_modulerK   r0   rx   z&Expected tuple for gathered_args, got z'Expected dict for gathered_kwargs, got )rM   rT   rH   r™   rI   r   zExpected at least one regionzMissing exit nodec                 ó(   — g | ]}|j         d k    ¯|‘ŒS )rG   )rM   )r…   rC   s     r#   ú
<listcomp>z split_module.<locals>.<listcomp>j  s$   € ÐQÐQÐQ˜t¸¼À=Ò8PÐ8P�dÐ8PÐ8PÐ8Pr%   c              3   ó>   •K  — | ]}‰j         ‰|                  V — Œd S rƒ   )r    )r…   r   r    r}   s     €€r#   r‡   zsplit_module.<locals>.<genexpr>p  sA   øè è € ð 
ð 
Ø8<ˆIÔ! *¨TÔ"2Ô3ð
ð 
ð 
ð 
ð 
ð 
r%   c                 ó(   •— g | ]}|‰v¯‰|         ‘ŒS r,   r,   )r…   rd   Úorig_mod_envÚoriginal_orders     €€r#   r§   z split_module.<locals>.<listcomp>{  s3   ø€ ð /ð /ð /àØ˜nÐ,Ð,ð ˜SÔ!à,Ð,Ð,r%   c              3   ó(   •K  — | ]}‰|         V — Œd S rƒ   r,   )r…   r   rD   s     €r#   r‡   zsplit_module.<locals>.<genexpr>™  s(   øè è € ÐBÐB¨�,˜tÔ$ÐBÐBÐBÐBÐBÐBr%   c                 ó   •— ‰| j                  S rƒ   ©r   )r’   rD   s    €r#   r“   zsplit_module.<locals>.<lambda>³  s   ø€ ¸|ÈAÌFÔ?S€ r%   c                 ó   — h | ]	}|j         ’Œ
S r,   )r   )r…   Úps     r#   ú	<setcomp>zsplit_module.<locals>.<setcomp>¹  s   € Ð"NÐ"NÐ"N°Q 1¤=Ð"NÐ"NÐ"Nr%   Úpartition_nameszpost split_module)Orf   rg   r
   r   Údictr+   r   r   Úgraph_moduler   ÚtupleÚsympyÚampÚ_enter_autocastÚ_exit_autocastÚ_CÚ_set_grad_enabledr   Úsetr   ÚnodesrU   ri   rW   ÚSymIntÚSymFloatrC   ÚexprÚSymbolrM   rT   rN   rH   rX   ÚboolrS   ÚallÚaddÚremoveÚvaluesÚitemsÚ_LOGGERÚisEnabledForÚloggingÚDEBUGr   Úmap_argr™   ÚlistÚkeysr   rz   Úpopr   ÚRuntimeErrorr    rR   rV   r   r7   ÚnnÚModulerK   r!   r2   r`   Úreplacer   Úreversedr   r   r   r	   r¥   ÚproxyÚProxyÚ	enumerateÚnextÚiter)Ir:   r;   r<   r=   r>   r?   r@   r8   r9   rZ   r¶   r~   ÚGLOBAL_STATE_NODESÚgrad_regionsÚautocast_regionsÚautocast_exitsÚactive_gradÚactive_autocastsÚvalÚs0ÚaÚassert_monotonically_increasingÚhighest_partitionÚpidÚoriginal_partition_orderÚroot_partitionsr|   Úsorted_partitionsÚroot_partitionÚ	dependentÚregions_mappingÚregionsÚrÚnew_nodeÚplaceholder_inputsÚget_attr_inputsÚ	orig_noder¡   Ú	orig_attrrG   Úgathered_argsÚgathered_kwargsrT   Útarget_attrr.   r   Ú	exit_noderE   Úconstruct_order_partitionsÚalready_constructed_attr_nodesÚoutput_valsÚorig_mod_attr_nodesÚ_based_mod_attrsÚ
output_valÚnum_outputsÚoutput_val_proxyÚiÚoutput_nameÚretrD   rY   r�   r    rž   rŸ   rC   rª   r    r«   r}   rt   rv   ru   sI   ` `  ```                                                   @@@@@@@@@@@@@@r#   r   r   6   s‚  øøøøøøøøøøøøøøøøøøø€ õh ‡I‚IØÝÐ1°1¸dÐCÑCÔCñô ð ð
!,Ýð!,å�3¥˜9”oð!,õ �S¥%¤(Ô"7Ô"CÐCÔDð!,õ 
�t•C��IŒ¥¥S­%¬(Ô*?Ô*KÐ%KÔ LÐLÔ	Mð	!,ð !,ð !,ð !,ð !,ð !,ð !,ð !,ðF €L€L€Là')€JØ"$€JØ/1€Nð/C­Tð /C½TÀD¹[ð /CÈTð /Cð /Cð /Cð /Cð /Cð /Cð /Cðb,µð ,¸$ð ,ð ,ð ,ð ,ð ,ð ,ð ,ð ,õ. 	Œ	Ô!ÝŒ	Ô ÝŒÔ"ðÐõ 1<±´€Lõ 5@±M´MÐØ.0€Nà€KÝ‘u”uÐà””ð 5:ñ 5:ˆð ”I—M’M /Ñ2Ô2Ð2ˆSÐ?Ý˜3¥¤­u¬~Ð >Ñ?Ô?ð @å ¤¤Ð.˜2°´Ñ=Ô=ð @ð ˜.Ð(Ð(à,0ˆN˜3œ8œ=Ñ)àŒ7Ð;Ð;Ð;Øà*Ð*¨4Ñ0Ô0Ð0àŒ7�oÒ%Ñ%¨$¬+Ð9KÐ*KÑ*KØŒ{�eœhÔ8Ð8Ð8Ý�t”y‘>”> QÒ&Ð&Ý(ØUÅSÈÌÁ^Ä^ÐUÐUñô ð õ " $¤)¨A¤,µÑ5Ô5ð YÝ(Ð)WÅ4ÈÌ	ÐRSÌÑCUÔCUÐ)WÐ)WÑXÔXÐXØ"�Ý,/°°ÀÑ1EÔ1EÐ0FÑ,GÔ,G�˜[Ñ)Ñ)Ø”¥¤	Ô 9Ð9Ð9åÐJÐJÀÄ	ÐJÑJÔJÑJÔJð Ý(ØMñô ð ð !×$Ò$ TÑ*Ô*Ð*Ý),¨n¨n¸TÑ.BÔ.BÐ-CÑ)DÔ)DÐ  Ñ&Ø'+�˜tÑ$Ð$Ø”¥¤	Ô 8Ð8Ð8Ý�t”y‘>”> QÒ&Ð&Ý(ØRÅ#ÀdÄiÁ.Ä.ÐRÐRñô ð ð ! ¤¨1¤Ô.×2Ò2°>°>À$Ñ3GÔ3GÑHÔHÐHØ ×'Ò'¨¬	°!¬Ñ5Ô5Ð5Ø/3�˜tœy¨œ|Ñ,àÐ"Ø˜Ô%×)Ò)¨.¨.¸Ñ*>Ô*>Ñ?Ô?Ð?à!ð 	:ð 	:ˆAØ˜QÔ×#Ò# N N°4Ñ$8Ô$8Ñ9Ô9Ð9Ð9ñ	:õ Ð>Ð> n×&;Ò&;Ñ&=Ô&=Ð>Ñ>Ô>Ñ>Ô>ð 3ÝÐ1Ñ2Ô2Ð2ð KÐJÐ1A×1GÒ1GÑ1IÔ1IÐJÑJÔJÐàBÐB¨\×-?Ò-?Ñ-AÔ-AÐBÑBÔB€Lå×Ò�GœMÑ*Ô*ð 8Ý�ŠÐ,Ð.>Ñ?Ô?Ð?Ý�ŠÐ(¨,Ñ7Ô7Ð7å&*Ð+;Ñ&<Ô&<Ð&RÅÀ\Ñ@RÔ@RÐ#ð ÐØ””ð ð ˆØ $ˆ
�4”9Ñð Œ7Ð1Ð1Ð1ØØŒ7�hÒÐÝŒHŒN×"Ò"Ø”	˜!”ÐKÐKÐKÐKñô ð ð à*ð 	$Ø �. Ñ&Ô&ˆCØ  3Ò&Ð&Ý$ðTØ,=ðTð TØNQðTð Tñô ð ð !$Ðð Œ;Ð0Ð0Ð0ÝŒHŒN×"Ò"Ø”	ÐVÐVÐVÐVÐVñô ð õ ŒHŒN×"Ò"Ø”ÐXÐXÐXÐXÐXñô ð øõ  $ J§O¢OÑ$5Ô$5Ñ6Ô6Ðà!#€OØ%/×%5Ò%5Ñ%7Ô%7ð 3ð 3Ñ!ˆ˜	Ý�9Ô)Ñ*Ô*ð 	3Ø×"Ò" >Ñ2Ô2Ð2øð $&ÐØ
ð 2Ø(×,Ò,Ñ.Ô.ˆØ× Ò  Ñ0Ô0Ð0Ø# NÔ3Ô>ð 	2ð 	2ˆIØ�yÔ!Ô.×2Ò2°>ÑBÔBÐBØ˜iÔ(Ô5ð 2Ø×&Ò& yÑ1Ô1Ð1øð ð 2õ ÐÑÔ¥ Z¡¤Ò0Ð0ÝÐ=Ñ>Ô>Ð>ð -¨lÐ;ð 7ð 7ˆØ,×2Ò2Ñ4Ô4ð 	7ð 	7‰MˆD�'Ý�7‰|Œ|˜qÒ Ð Ý$Ð%LÑMÔMÐMà<@ˆJ•s˜7 1œ:‘”Ô'Ô3°DÑ9ð ˜Q˜R˜R”[ð 7ð 7�Ø&¥s¨1¡v¤vÔ.�	Ø$œ?×6Ò6Ø”wØœ;ÝÐ8Ð8¨d¬iÐ8Ñ8Ô8Ñ8Ô8ØØ"œið 7ñ ô �ð ”I—N’NÑ$Ô$ð ”ð /7�	Ô% dÑ+Ð+ð7ð	7ð, ,ð ;&ñ ;&ˆØ˜~Ô.ˆ	Ø&(ˆ
àˆð
 )+ÐØ%'ˆØÔ#ð 	/ð 	/ˆCØ" 3œˆIà” 
Ò*Ð*Ý˜yÔ/µÑ5Ô5ð +åÝ+¨A¨yÔ/?Ñ@Ô@Å%Ä(Ä/ñô ð +ð  ×&Ò& sÑ+Ô+Ð+Ð+à"×)Ò)¨#Ñ.Ô.Ð.Ð.à%¨Ñ7ð "	Añ "	AˆCØ" 3œˆIð#¥Tð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð #ð Œ|˜zÒ)Ð)Ý! )Ô"2µCÑ8Ô8ð Ý(ØLµD¸Ô9IÑ4JÔ4JÐLÐLñô ð õ 4°A°yÔ7GÑHÔH�	Ý˜i­¬¬Ñ9Ô9ð 4Ø"+¤/×":Ò":¸9Ô;KÑ"LÔ"L�KØ:C�IÔ% iÔ&6Ñ7Ð7à"1 /Ñ"3Ô"3�K�Kà-˜oÑ/Ô/�Ø)¨#œÔ3×8Ò8Ñ:Ô:ˆKÔØ5@ˆIÔ! *¨S¤/Ñ2Ñ2Ø%ˆ	ÔÑð ””ð *3ñ *3ˆÝ�4˜Ñ)Ô)ñ )	3Ø" 4Ô#5Ô6ˆIð $Ô/ˆKÝ!œHœN×2Ò2°4´9Ð>VÐ>VÐ>VÐ>VÑWÔWˆMÝ#œhœn×4Ò4Ø”Ð5Ð5Ð5Ð5ñô ˆOð ŒwÐ9Ð9Ð9Øœ��å5°a¸¼ÑEÔE�Øœ×,Ò,¨S°#Ñ6Ô6�Ø,7�	Ô! &Ñ)àÐ+ð #,Ô"7ÐBÐB¸&ÐBÐB�HØ-1¬[�L Ñ*å˜m­UÑ3Ô3ð Ý$ØR½TÀ-Ñ=PÔ=PÐRÐRñô ð õ ˜o­tÑ4Ô4ð Ý$ØU½dÀ?Ñ>SÔ>SÐUÐUñô ð ð !8ÐA�4”9�9¸TˆDØ ”×2Ò2Ø”7ØØ"Ø&Øœ)Øð 3ñ ô ˆHð !œIŸNšNÑ,Ô,ˆHŒMØ*2ˆIÔ! $Ñ'ùð -Ð-ð ð ˆÝ˜_Ñ-Ô-ð 	ð 	ˆDØ% dÔ+ˆGÝ�7‰|Œ|˜qÒ Ð Ý$Ð%CÑDÔDÐDà˜S˜b˜S”\ð ð �Ø&¥s¨1¡v¤vÔ.�	Ø*¨4Ô0�	ØÐ$Ý(Ð)<Ñ=Ô=Ð=Ø$œ?×6Ò6Ø ”|Ø$Ô+Ø#Ô/°Ô5Ð7ØØ'œnð 7ñ ô �ð ”N×'Ò'Ñ)Ô)ð ”�ðð	ð, %'€Là$&€LÝ+0¬8¬>×+?Ò+?Ñ+AÔ+A€NØCE€NØð 	+Ø”G”Mð 	ð 	ˆDØ+:¨?Ø�l Nñ,ô ,Ñ(ˆL˜.˜.ð	ð ”G”Mð 	+ð 	+ˆDØ&*ˆL˜œÑ#Ð#ð "5ÐRÐÐÐ:Rð õ &)¡U¤UÐ"ð RÐQ q¤w¤}ÐQÑQÔQ€Nà4ð 7Eñ 7EˆØ˜~Ô.ˆ	õ ð 
ð 
ð 
ð 
ð 
Ø@IÔ@Qð
ñ 
ô 
ñ 
ô 
ˆõ ˆ{ÑÔ˜qÒ Ð ¨Ð ØŒO×"Ò" ;¨q¤>Ñ2Ô2Ð2Ð2àŒO×"Ò" ;Ñ/Ô/Ð/àð 	9ð/ð /ð /ð /ð /à$Ô+ð/ñ /ô /Ðð 'ð 9ð 9�ØÐ9Ð9Ð9ØØ1@°Ø˜,¨ñ2ô 2Ñ.�Ð.ð /×2Ò2°4Ñ8Ô8Ð8Ð8ð ,ð 9ð 9�ØÐ9Ð9Ð9ØØ/>¨Ø˜,¨ñ0ô 0Ñ,�˜nð /×2Ò2°4Ñ8Ô8Ð8Ð8å0BØÔ˜yœñ1
ô 1
ˆ�yÔ,Ñ-ð
 $×/Ò/ØÔ!ÝÐBÐBÐBÐB°Ô1AÐBÑBÔBÑBÔBñ
ô 
ˆ
õ
 ˜)Ô+Ñ,Ô,ˆØ˜Š?ˆ?˜{¨aÒ/Ð/°LÐ/å$œxœ~×3Ò3°JÑ?Ô?ÐÝ"+¨IÔ,=Ñ">Ô">ð Eð E‘��;Ø,<¸QÔ,?Ô,D�˜[Ñ)Ð)ñEà˜AÒÐØ:DˆL��d 9Ô#4Ñ5Ô5Ñ6Ô6Ñ7ùð ð  <ð Ø”G”Mð 	ð 	ˆDØ+:¨?Ø�l Nñ,ô ,Ñ(ˆL˜.˜.ð
 ””ð ð ˆØŒ7�hÒÐØ×!Ò!Ý””×&Ò& t¤y°¤|Ð5SÐ5SÐ5SÐ5SÑTÔTñô ð øõ ˜^¨^Ñ
<Ô
<€Cð #OÐ"N¸*×:KÒ:KÑ:MÔ:MÐ"NÑ"NÔ"N€C„HÐÑÝ‡I‚IØÝÐ2°CÀÐFÑFÔFñô ð ð €Jr%   c                 óÎ  — t          | j                             dd¬¦  «        ¦  «        }|D �]·}t          |j        ¦  «        dk    s|j        rŒ#|j        d         }|j                             d¦  «        }|€ŒMg }| j                             |¦  «        5  t          |j
        ¦  «        D ] \  }}t          |t          j        ¦  «        rW| j                             t          j        j        j        j        ||f¬¦  «        }||j        d<   |                     |¦  «         Œvt          |t$          ¦  «        r|                     |¦  «         Œ¡	 ddd¦  «         n# 1 swxY w Y   t          |j        ¦  «        D ]Q}	g }
|	j        D ]1}||u r|
                     |¦  «         Œ|
                     |¦  «         Œ2t-          |
¦  «        |	_        ŒR| j                             |¦  «         �Œ¹dS )	au  Decompose x.size() into per-dim sym_size.int calls.

    torch.Size objects cannot cross split boundaries because aot_autograd
    cannot handle them as submodule outputs. This replaces each size() call
    with individual sym_size.int(x, dim) nodes:
      - Dynamic dims (SymInt) -> new sym_size.int node
      - Static dims (plain int) -> inlined as literal constant
    Úcall_methodÚsize)rM   rT   r�   r   rb   N)rH   )rÍ   r   Ú
find_nodesrN   rH   r™   rU   ri   Úinserting_afterr×   ÚshaperW   r   r¾   r€   ÚopsÚatenÚsym_sizeÚintrz   ÚusersÚextendrµ   Ú
erase_node)r:   Ú
size_nodesrC   Útensor_nodeÚevÚdimsrÿ   Údim_valÚdnÚuserÚnew_argsr†   s               r#   Ú_decompose_size_nodesr  Á  s+  € õ �a”g×(Ò(¨MÀ&Ð(ÑIÔIÑJÔJ€Jàð !ñ !ˆåˆtŒy‰>Œ>˜AÒÐ ¤ÐØØ”i ”lˆØÔ×!Ò! /Ñ2Ô2ˆØˆ:Øà!#ˆØŒW×$Ò$ [Ñ1Ô1ð 		)ð 		)Ý'¨¬Ñ1Ô1ð )ð )‘
��7Ý˜g¥u¤|Ñ4Ô4ð )Øœ×.Ò.Ýœ	œÔ/Ô3¸;ÈÐ:Jð /ñ ô �Bð 07�B”G˜OÑ,Ø—K’K ‘O”O�O�OÝ ­Ñ-Ô-ð )Ø—K’K Ñ(Ô(Ð(øð)ð		)ð 		)ð 		)ñ 		)ô 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)øøøð 		)ð 		)ð 		)ð 		)õ ˜œÑ$Ô$ð 	(ð 	(ˆDØˆHØ”yð )ð )�Ø˜$�;�;Ø—O’O DÑ)Ô)Ð)Ð)à—O’O CÑ(Ô(Ð(Ð(Ý˜h™œˆDŒIˆIØ	Œ×Ò˜4Ñ Ô Ð Ñ ð;!ð !s   ÂB6EÅE	ÅE	r   Úmodulesc                 ó’  — t          dt          fi ¦  «        }t                               |¦  «        }|j        }d|d<   t          t          t          f         ¦   «         |d<   t          t          t          f         ¦   «         |d<   |�|nt          t          t          f         ¦   «         |d<   t          t                   ¦   «         |d<   t          ¦   «         |d	<   t          ¦   «         |d
<   d|d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   t          ¦   «         |d<   | |d<   t          t          t          f         ¦   «         |d<   || _
        t          j        |_        |S )aÜ  Construct a lightweight GraphModule that bypasses expensive init overhead.

    Creates a ``_LazyGraphModule`` instance without going through
    ``GraphModule.__new__`` (MRO traversal + per-instance class creation),
    ``nn.Module.__init__`` (17+ container allocations), or
    ``GraphModule.__init__`` (node iteration + ``recompile()`` codegen).
    Per-instance classes are still created for lazy forward dispatch.

    Only suitable for parameterless graph containers (no parameters, buffers,
    or ``get_attr``/``call_module`` targets to copy from a root module).

    The dict entries below mirror nn.Module.__init__ (torch/nn/modules/module.py).
    Update in lockstep if nn.Module adds or removes instance attributes.
    ÚGraphModuleImplFÚtrainingÚ_parametersÚ_buffersNÚ_modulesÚ_non_persistent_buffers_setÚ_backward_pre_hooksÚ_backward_hooksÚ_is_full_backward_hookÚ_forward_hooksÚ_forward_hooks_with_kwargsÚ_forward_hooks_always_calledÚ_forward_pre_hooksÚ_forward_pre_hooks_with_kwargsÚ_state_dict_hooksÚ_state_dict_pre_hooksÚ_load_state_dict_pre_hooksÚ_load_state_dict_post_hooksÚ_graphrU   )rS   r   ÚobjectÚ__new__Ú__dict__r³   r+   r   r¼   r   Úowning_moduleÚ_lazy_forwardÚforward)r   r  ÚclsÚinstÚds        r#   Ú_make_lite_graph_moduler6  í  s„  € õ$ Ð Õ#3Ð"5°rÑ
:Ô
:€CÝ�>Š>˜#ÑÔ€DØŒ€AØ€A€j�MÝ�C¥˜H”~Ñ'Ô'€A€mÑÝ��c˜”NÑ$Ô$€A€j�MØ&Ð2�G�G½½SÅ#¸X¼Ñ8HÔ8H€A€j�MÝ'*­3¤x¡z¤z€AÐ#Ñ$Ý*™}œ}€AÐÑÝ&™=œ=€AÐÑØ"&€AÐÑÝ%™-œ-€AÐÑÝ&1¡m¤m€AÐ"Ñ#Ý(3©¬€AÐ$Ñ%Ý)™mœm€AÐÑÝ*5©-¬-€AÐ&Ñ'Ý(™]œ]€AÐÑÝ!,¡¤€AÐÑÝ&1¡m¤m€AÐ"Ñ#Ý'2¡}¤}€AÐ#Ñ$Ø€A€h�KÝ•S�#�X”Ñ Ô €A€f�IØ€EÔÝ"Ô0€C„KØ€Kr%   Únode_to_partitionc                 ó.  ‡— ddl }ddlmŠ i }t          t          ¦  «        }t          t          ¦  «        }i }g }t          ¦   «         }|fdt          dt          t          t          t          t          f         f         dt          fd„}	| j	        j
        D �]ü}
|
j                             d¦  «        }|�Ot          |d	¦  «        r?t          |j        d
¦  «        r*|j        j        }t!          ||j        ¦  «        r	||vr|
||<   |
j        dk    rŒz|
j        dk    r1t&          j        j	                             |
j        d         |	¦  «         Œ¶||
         }||
_        ||vrP|                     |¦  «         |                     |¦  «         t&          j        j	                             ¦   «         ||<   ||||fdt          dt          dt          t          t          t          t          f         f         dt          t          t          t          t          f         f         dt          |j        t          f         dt          fˆfd„}t&          j        j	                             |
j        |¦  «         t&          j        j	                             |
j        |¦  «         �Œþ||||fS )a�  Assign nodes to partitions and detect cross-partition dependencies.

    Returns:
        partition_graphs: Maps partition ID to its Graph.
        partition_inputs: Maps partition ID to ordered dict of input names -> source nodes.
        partition_outputs: Maps partition ID to ordered dict of output names -> source nodes.
        seen_partitions: Partition IDs in order of first appearance.
    r   Nr^   r’   Ú_outputsr   c                 ór   — t          | d¦  «        r&|| j                                      | j        | ¦  «         | S )Nr`   )r2   r`   rh   r   )r’   r9  s     r#   Ú_record_output_depz0_detect_dependencies.<locals>._record_output_dep6  s:   € õ �1�oÑ&Ô&ð 	<Ø�Q”_Ô%×0Ò0°´¸Ñ;Ô;Ð;Øˆr%   rb   rC   rÀ   rG   r   r[   Úuse_pidÚ_inputsÚ_symc                 ó.  •— t          | dd ¦  «        }||k    rü|�!||                              | j        | ¦  «         ||                              | j        | ¦  «         | j                             d¦  «        }|�œ|ršt           ‰
|¦  «        t          ¬¦  «        D ]z}|                     |¦  «        }|€Œ||                              |j        |¦  «         |j        dk    r4t          |dd ¦  «        }	|	�!||	                              |j        |¦  «         Œ{| S )Nr`   rb   rc   rG   )r4   rh   r   rU   ri   rj   r+   rM   )r[   r<  r=  r9  r>  Údef_pidro   rp   rq   Ús_pidr_   s             €r#   Ú_record_cross_depz/_detect_dependencies.<locals>._record_cross_depU  s#  ø€ õ ˜h¨¸Ñ>Ô>ˆGØ˜'Ò!Ð!ØÐ&Ø˜WÔ%×0Ò0°´ÀÑIÔIÐIØ˜Ô ×+Ò+¨H¬M¸8ÑDÔDÐDà"œ-×+Ò+¨OÑ<Ô<�ØÐ&¨4Ð&Ý# L L°Ñ$9Ô$9½sÐCÑCÔCð Pð P˜Ø!%§¢¨!¡¤˜Ø!˜>Ø$Ø Ô(×3Ò3°F´KÀÑHÔHÐHØ!œ9¨Ò5Ð5Ý$+¨F°OÀTÑ$JÔ$J˜EØ$Ð0Ø (¨¤× :Ò :¸6¼;ÈÑ OÔ OÐ OøØˆOr%   )r¶   re   r_   r   r³   r¼   r   r  r+   r   r½   rU   ri   r2   rC   rÀ   rW   rÁ   rM   r   r   rÌ   rH   r`   rz   rÄ   r   r™   )r:   r7  r¶   Úpartition_graphsÚpartition_inputsÚpartition_outputsru   Úseen_partitionsÚseen_partitions_setr;  rC   rà   rá   rå   rB  r_   s                  @r#   Ú_detect_dependenciesrH    s¨  ø€ ð" €L€L€LàBÐBÐBÐBÐBÐBà8:ÐÝ3>½tÑ3DÔ3DÐÝ4?ÅÑ4EÔ4EÐØ/1€NØ!#€OÝ$'¡E¤EÐð 0Aðð Ýðå•s�D¥¥d œOÐ+Ô,ðõ 
ðð ð ð ð ””ð 2?ñ 2?ˆàŒi�mŠm˜OÑ,Ô,ˆØˆ?�w s¨FÑ3Ô3ˆ?½ÀÄÈ&Ñ8QÔ8Qˆ?Ø””ˆBÝ˜"˜eœlÑ+Ô+ð *°¸.Ð0HÐ0HØ%)�˜rÑ"àŒ7�mÒ#Ð#ØàŒ7�hÒÐÝŒHŒN×"Ò" 4¤9¨Q¤<Ð1CÑDÔDÐDØà Ô%ˆØ ˆÔàÐ)Ð)Ð)Ø×"Ò" 3Ñ'Ô'Ð'Ø×#Ò# CÑ(Ô(Ð(Ý$)¤H¤N×$8Ò$8Ñ$:Ô$:Ð˜SÑ!ð Ø2BØ3DØ-;ð	ð 	Ýð	åð	õ �#�t¥C­ IœÐ.Ô/ð	õ �3¥¥S­$ Y¤Ð/Ô0ð		õ
 �u”|¥TÐ)Ô*ð	õ ð	ð 	ð 	ð 	ð 	ð 	õ4 	ŒŒ×Ò˜tœyÐ*;Ñ<Ô<Ð<ÝŒŒ×Ò˜tœ{Ð,=Ñ>Ô>Ð>Ñ>àÐ-Ð/@À/ÐQÐQr%   rC  rD  rE  rF  c                 óH  ‡— t          t          ¦  «        }|D ]q}||         }||         Š||                              ¦   «         D ]D\  }}	|                     ||	j        ¬¦  «        }
|	j                             ¦   «         |
_        |
‰|	<   ŒEŒr| j        j        D ]Ô}t          |d¦  «        sŒ|j
        }||         }||         Št          j        j                             |j        ‰j        ¦  «        }t          j        j                             |j        ‰j        ¦  «        }|                     |j        |j        |||j        ¬¦  «        }|j                             ¦   «         |_        |‰|<   ŒÕ|D ]´}||         }||         Š||         }t)          ˆfd„|                     ¦   «         D ¦   «         ¦  «        }t-          |¦  «        dk    r|                     |d         ¦  «         Œvt-          |¦  «        dk    r|                     |¦  «         ŒŸ|                     d¦  «         Œµ|S )z§Create placeholders, clone nodes, and set outputs for each partition.

    Returns:
        partition_env: Maps partition ID to {original_node: cloned_node} dict.
    rœ   r`   r˜   c              3   ó(   •K  — | ]}‰|         V — Œd S rƒ   r,   )r…   rñ   Úenvs     €r#   r‡   z/_clone_nodes_into_partitions.<locals>.<genexpr>¦  s'   øè è € ÐOÐO¨y˜C 	œNÐOÐOÐOÐOÐOÐOr%   r�   r   r,   )r   r³   rÇ   rG   rS   rU   rV   r   r½   r2   r`   r   r   rÌ   rH   Ú__getitem__r™   rR   rM   rT   rµ   rÆ   rN   r   )r:   rC  rD  rE  rF  Úpartition_envrå   ÚgÚinp_namerñ   rG   rC   ró   rô   rî   Ú	out_nodesrù   rK  s                    @r#   Ú_clone_nodes_into_partitionsrQ  u  s.  ø€ õ 2=½TÑ1BÔ1B€Mð ð )ð )ˆØ˜SÔ!ˆØ˜CÔ ˆØ#3°CÔ#8×#>Ò#>Ñ#@Ô#@ð 	)ð 	)ÑˆH�iØŸ-š-¨¸I¼N˜-ÑKÔKˆKØ(œ~×2Ò2Ñ4Ô4ˆKÔØ(ˆC�	‰NˆNð	)ð ””ð ð ˆÝ�t˜_Ñ-Ô-ð 	ØØÔ ˆØ˜SÔ!ˆØ˜CÔ ˆåœœ×.Ò.¨t¬y¸#¼/ÑJÔJˆÝœ(œ.×0Ò0°´¸c¼oÑNÔNˆà—=’=ØŒwØ”;ØØ"Ø”ið !ñ 
ô 
ˆð œ	ŸšÑ(Ô(ˆŒØˆˆD‰	ˆ	ð ð 
ð 
ˆØ˜SÔ!ˆØ˜CÔ ˆØ% cÔ*ˆ	ÝÐOÐOÐOÐO¸I×<LÒ<LÑ<NÔ<NÐOÑOÔOÑOÔOˆÝˆ{ÑÔ˜qÒ Ð Ø�HŠH�[ ”^Ñ$Ô$Ð$Ð$Ý�ÑÔ Ò!Ð!Ø�HŠH�[Ñ!Ô!Ð!Ð!à�HŠH�R‰LŒLˆLˆLàÐr%   c                 ó
  ‡— t           j        j                             ¦   «         }i Ši }| j        j        D ]V}|j        dk    rI|                     |j        |j        ¬¦  «        }	|j	         
                    ¦   «         |	_	        |	‰|j        <   ŒW|D �]}
|�	d|› d|
› �}nd|
› �}t          ||
         ¦  «        ||<   t          ˆfd„||
         D ¦   «         ¦  «        }|                     ||¦  «        }t          ||
                              ¦   «         ¦  «        }t#          |¦  «        dk    rJt           j        j                             |¦  «        }t)          |¦  «        D ]\  }}||         j        ‰|<   ŒŒæt#          |¦  «        dk    r|‰|d         <   �Œ| j        j        D ]S}|j        d	k    rF|                     t           j        j                             |j        d         ˆfd
„¦  «        ¦  «         ŒTt          ||¬¦  «        S )zDBuild the outer stitching graph that calls each partition submodule.rG   rœ   Nr   rx   c              3   ó(   •K  — | ]}‰|         V — Œd S rƒ   r,   )r…   r   Úbase_envs     €r#   r‡   z)_build_stitching_graph.<locals>.<genexpr>Î  s'   øè è € ÐMÐM¨t˜H TœNÐMÐMÐMÐMÐMÐMr%   r�   r   r   c                 ó   •— ‰| j                  S rƒ   r®   )r’   rT  s    €r#   r“   z(_build_stitching_graph.<locals>.<lambda>Ü  s   ø€ ¸xÈÌÔ?O€ r%   )r  )r   r   r   r   r½   rM   rG   rT   rS   rU   rV   r   r6  rµ   r¥   rÍ   rÎ   rN   rÕ   rÖ   r×   rC   r   rÌ   rH   )r:   rC  rD  rE  rF  r8   Ú
base_graphÚbase_modulesrC   r°   rå   r   Úinput_nodesrü   Ú	out_namesrþ   rÿ   r   rT  s                     @r#   Ú_build_stitching_graphrZ  ±  s&  ø€ õ ””×%Ò%Ñ'Ô'€JØ "€HØ+-€Là””ð $ð $ˆØŒ7�mÒ#Ð#Ø×&Ò&Ø”Øœ)ð 'ñ ô ˆAð ”Y—^’^Ñ%Ô%ˆAŒFØ"#ˆH�T”YÑøàð 0ñ 0ˆØÐ&Ø; OÐ;Ð;°cÐ;Ð;ˆKˆKà) C˜/˜/ˆKÝ$;Ð<LÈSÔ<QÑ$RÔ$Rˆ�[Ñ!åÐMÐMÐMÐMÐ7GÈÔ7LÐMÑMÔMÑMÔMˆØ×+Ò+¨K¸ÑEÔEˆ
åÐ*¨3Ô/×4Ò4Ñ6Ô6Ñ7Ô7ˆ	Ýˆy‰>Œ>˜AÒÐÝ$œxœ~×3Ò3°JÑ?Ô?ÐÝ$ YÑ/Ô/ð :ð :‘��4Ø!1°!Ô!4Ô!9�˜‘�ð:å�‰^Œ^˜qÒ Ð Ø%/ˆH�Y˜q”\Ñ"ùà””ð ð ˆØŒ7�hÒÐØ×ÒÝ””×&Ò& t¤y°¤|Ð5OÐ5OÐ5OÐ5OÑPÔPñô ð øõ # :°|ÐDÑDÔDÐDr%   )r8   c                óz   — t          | |¦  «        \  }}}}t          | ||||¦  «         t          | |||||¦  «        S )uú  Lightweight graph splitter for simple partition patterns.

    A faster alternative to :func:`split_module` for inference-only graphs
    from ``torch.compile``/Dynamo. Because these graphs have no autocast/grad
    regions, no ``get_attr`` nodes, and no non-linear partition dependencies,
    we can skip the topological sort, autocast tracking, and ``get_attr``
    special-casing that ``split_module`` performs. More importantly, we
    construct partition submodules as lightweight ``_LazyGraphModule``
    instances that bypass ``nn.Module.__init__`` and defer ``recompile()``
    codegen â€” this eliminates the dominant cost when creating 70-100+
    partition submodules for large models.

    Args:
        m: Graph module to split.
        node_to_partition: Maps each operational node to a partition ID.
            Placeholders, get_attr, and output nodes should NOT be included.
        partition_affix: If set, submodule names become
            ``submod_{affix}_{idx}`` instead of ``submod_{idx}``.
    )rH  rQ  rZ  )r:   r7  r8   rC  rD  rE  rF  s          r#   r   r   â  sk   € õ6 	˜QÐ 1Ñ2Ô2ñ KÐÐ&Ð(9¸?õ !Ø	ÐÐ-Ð/@À/ñô ð õ "Ø	ØØØØØñô ð r%   )NFFTrƒ   ).rO   rÊ   Úcollectionsr   r   Úcollections.abcr   Útypingr   r   Útorch.fx._compatibilityr   Útorch.fx._lazy_graph_moduler   r	   Útorch.fx._utilsr
   Útorch.fx.graph_moduler   Útorch.fx.noder   Ú__all__Ú	getLoggerr(   rf   rÈ   r   rÑ   rÒ   r+   r7   r  r³   rÂ   r   r  r   r   r   r6  rµ   rÍ   rH  rQ  rZ  r   r,   r%   r#   ú<module>rf     sü  ðØ €€€Ø €€€Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð à €€€Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø LÐ LÐ LÐ LÐ LÐ LÐ LÐ LØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø -Ð -Ð -Ð -Ð -Ð -Ø Ð Ð Ð Ð Ð ð ?Ð
>Ð
>€Ø!�Ô! (Ñ+Ô+Ð +€€gð € dÐ+Ñ+Ô+ð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ ,Ô+ð
ð0 ¤¤ð ¸Cð ÀCð ð ð ð ð € dÐ+Ñ+Ô+ð
 +/Ø',Ø+0Ø%)ðG
ð #'ØðG
ð G
ð G
ØðG
àŒHŒOðG
ð ˜d˜V S˜[Ô)ðG
ð �s˜C�x”. 4Ñ'ð	G
ð
  ™ðG
ð " D™[ðG
ð #ðG
ð ˜4‘ZðG
ð ðG
ð ðG
ð G
ð G
ñ ,Ô+ðG
ðT)!˜[ð )!¨Tð )!ð )!ð )!ð )!ð\ .2ð*ð *ØŒ8Œ>Ôð*à�#�{Ð"Ô# dÑ*ð*ð ð*ð *ð *ð *ðZXRØðXRà˜D #˜I”ðXRð ØˆˆeŒhŒnÔ"Ð	"Ô#Øˆˆd�3˜�9ŒoÐ	ÔØˆˆd�3˜�9ŒoÐ	ÔØˆ„IðôðXRð XRð XRð XRðv9Øð9à˜3 ¤¤Ô 4Ð4Ô5ð9ð ˜3  S¨$ Y¤Ð/Ô0ð9ð ˜C  c¨4 i¤Ð0Ô1ð	9ð
 ˜#”Yð9ð 
ˆ#ˆt�D˜$�JÔÐ
Ô ð9ð 9ð 9ð 9ðD #'ð.Eð .EØð.Eà˜3 ¤¤Ô 4Ð4Ô5ð.Eð ˜3  S¨$ Y¤Ð/Ô0ð.Eð ˜C  c¨4 i¤Ð0Ô1ð	.Eð
 ˜#”Yð.Eð ˜4‘Zð.Eð ð.Eð .Eð .Eð .Eðb € eÐ,Ñ,Ô,ð
 #'ð	(ð (ð (Øð(à˜D #˜I”ð(ð ˜4‘Zð	(ð
 ð(ð (ð (ñ -Ô,ð(ð (ð (r%   