U
    yhk)                     @   s   d dl Z d dlmZ d dlmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ d dlZd dlmZ eG dd dZG dd deZG d	d
 d
ZG dd dZdS )    N)contextmanager)	dataclassfield)AnyCallableDictList
NamedTupleOptionalSetTuplec                   @   sD   e Zd ZU dZeejjdZejje	d< dZ
eeeef  e	d< dS )TracingConfiga  
    This represents a symbolic tracing configuration.

    Args:
        tracer (torch.fx.Tracer): An instance of :class:`torch.fx.Tracer` to
            use for symbolic tracing. The default value is the native
            :class:`torch.fx.Tracer` constructed with default arguments.
            However, the user may want to pass a different value such as the
            ``HFTracer`` for models in the HuggingFace Transformers_ library.
            .. _Transformers: https://huggingface.co/docs/transformers/index
        concrete_args (Optional[Dict[str, Any]]): Concrete arguments that
            should not be treated as ``torch.fx.Proxy`` when tracing the
            module ``forward()``. Passing ``concrete_args`` allows partially
            specializing the forward, e.g. to remove control flow or data
            structures. This ``concrete_args`` here is the same argument used
            in :meth:`~torch.fx.Tracer.trace`.
    )default_factorytracerNconcrete_args)__name__
__module____qualname____doc__r   torchfxTracerr   __annotations__r   r
   r   strr    r   r   U/var/www/html/venv/lib/python3.8/site-packages/torch/distributed/fsdp/_trace_utils.pyr      s   
r   c                   @   s2   e Zd ZU dZejed< eee	ej
f  ed< dS )_ParamUsageInfoa6  
    This is used for ``_ExecutionInfo.module_to_param_usage_infos`` to record
    execution information. The ``dict`` maps modules to a list of these
    ``_ParamUsageInfo`` instances, where each instance represents a group of
    parameters used together.

    Specifically, for each module key in the ``dict``, each instance of this
    class represents either:
    (1) the module and some sublist of its ``named_parameters()`` used
    together in execution (see ``_patched_create_proxy()``), or
    (2) a submodule and all of ``submodule.named_parameters()`` (see
    ``_patched_call_module()``).

    Type (1) corresponds to directly using parameters in ops without calling
    ``forward()``, and type (2) corresponds to calling ``forward()``. The
    mapped-to lists in the ``dict`` follow the execution order.
    modulenamed_paramsN)r   r   r   r   nnModuler   r   r   r   	Parameterr   r   r   r   r   #   s   

r   c                   @   s"   e Zd ZdZejddddZdS )_ExecutionInfoa1  
    This represents the execution order information from the forward pass.

    Attributes:
        curr_module (nn.Module): Current module being traced.
        module_forward_order (List[nn.Module]): The modules in (pre-)forward
            order, i.e. the order in which their ``forward()`` methods are
            called. Each call to a module's ``forward()`` corresponds to one
            element in the list.
        module_to_param_usage_infos (Dict[nn.Module, List[_ParamUsageInfo]]):
            Maps a module to a list of module execution infos. See
            :class:`_ParamUsageInfo` for details.
        param_forward_order (List[nn.Parameter]): The parameters in forward
            execution order, where only a parameter's first participation is
            included.
        visited_params (Set[nn.Parameter]): The parameters visited so far
            during the trace. This is only used during tracing for fast
            membership check. Invariant: The parameters in
            ``param_forward_order`` are exactly those in ``visited_params``.
    N)root_modulereturnc                 C   s*   || _ |g| _|g i| _g | _t | _d S N)curr_modulemodule_forward_ordermodule_to_param_usage_infosparam_forward_ordersetvisited_params)selfr#   r   r   r   __init__P   s     z_ExecutionInfo.__init__)r   r   r   r   r   r    r-   r   r   r   r   r"   :   s   r"   c                   @   s   e Zd ZddddZeejjej	dddZ
eeej	eeedf eeef ed	d
dZdeeeeejf eejjjeedf eeef ee ee eeejjgejjf  ejjdddZdS )_ExecOrderTracerN)r$   c                 C   s
   d | _ d S r%   )	exec_info)r,   r   r   r   r-   [   s    z_ExecOrderTracer.__init__)r   r#   c                 c   sj   t || _|j}|j}t| j|| j|_t| }t| j	|| j||_z
d V  W 5 ||_||_X d S r%   )
r"   r/   call_modulecreate_proxy	functoolspartial_patched_call_moduledictnamed_parameters_patched_create_proxy)r,   r   r#   Zorig_call_moduleZorig_create_proxyfqn_to_paramr   r   r   patch_tracer^   s&    
  
z_ExecOrderTracer.patch_tracer.)r0   r/   r   forwardargskwargsr$   c                 C   sx   |j | t| }|j}|rL||jks4td|j|j t|| |}	||_g |j|< |||||}
|	|_|
S )a  
        Overrides ``call_module`` to save execution information to
        ``exec_info``. Note that ``call_module`` is called during symbolic
        tracing for each non-root module.

        Args:
            call_module (Callable): Original ``call_module`` to override.
            exec_info (_ExecutionInfo): Used to record execution information.
            module (nn.Module): Module corresponding to this ``call_module``.
            forward (Callable): ``forward()`` method of ``module`` to be called
                for this ``call_module``.
            args (Tuple[Any, ...]): Positional arguments for ``forward``.
            kwargs (Dict[str, Any]): Keyword arguments for ``forward``.

        Returns:
            Same return value as ``call_module``.
        zPThe current module should have already been processed by a patched `call_module`)r'   appendlistr6   r&   r(   AssertionErrorr   )r,   r0   r/   r   r:   r;   r<   r   r&   Zprev_curr_moduleoutputr   r   r   r4   s   s"    
z%_ExecOrderTracer._patched_call_module)r1   r/   r8   kindtargetr;   r<   name	type_exprproxy_factory_fnr$   c                 C   s  |||||||	|
}|j }|dkr|dk	rg }|D ]^}t|tjjr2|jj|kr2||jj }||jj|f ||jkr2|j	| |j
| q2|r|j| t|| n`|dkrt| }|r|j| t|| |D ]*\}}||jkr|j	| |j
| q|S )a  
        Overrides ``create_proxy`` to save execution information to
        ``exec_info``. Note that ``create_proxy`` is called during symbolic
        tracing for each leaf function/method/module.

        Args:
            create_proxy (Callable): Original ``create_proxy`` to override.
            exec_info (_ExecutionInfo): Used to record execution information.
            fqn_to_param (Dict[str, nn.Parameter]): ``dict`` version of the
                root module's ``named_parameters()`` with FQN as key and
                parameter as value.
            kind (str): Kind of the target method ('call_function',
                'call_method', 'get_attr', 'call_module', 'placeholder', or
                'output'). See :class:`torch.fx.Graph` for details. This is
                passed to ``create_proxy``.
            target (torch.fx.node.Target): Contains the string name of the
                function/method/module. This is passed to ``create_proxy``.
            args (Tuple[Any, ...]): Positional arguments for the function/
                method/module. This is passed to ``create_proxy``.
            kwargs (Dict[str, Any]): Keyword arguments for the function/method/
                module. This is passed to ``create_proxy``
            name (Optional[str]): An optional string name for the ``Node``
                created in ``create_proxy``. This is passed to
                ``create_proxy``.
            type_expr (Optional[Any]): An optional type annotation representing
                the Python type that the output of the node has. This is passed
                to ``create_proxy``.
            proxy_factory_fn (Callable[[torch.fx.Node], torch.fx.Proxy]):
                An alternative proxy constructor used in ``create_proxy``. This
                is passed to ``create_proxy``.

        Returns:
            torch.fx.Proxy: Created ``Node`` wrapped in a ``Proxy`` object.
        )Zcall_functionZcall_methodNr0   )r&   
isinstancer   r   ProxynoderB   r=   r+   addr)   r(   r   r>   r6   )r,   r1   r/   r8   rA   rB   r;   r<   rC   rD   rE   proxyr&   r   argparam_r   r   r   r7      sL    0      





z&_ExecOrderTracer._patched_create_proxy)NNN)r   r   r   r-   r   r   r   r   r   r    r9   r   r"   r   r   r   r   r4   r!   rH   ZTargetr
   NoderG   r7   r   r   r   r   r.   Z   s6   

6   

r.   )r2   
contextlibr   dataclassesr   r   typingr   r   r   r   r	   r
   r   r   r   Ztorch.nnr   r   r   r"   r.   r   r   r   r   <module>   s   ( 