o
    Zh *                     @   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
 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
NamedTupleOptionalc                   @   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   dictstrr    r   r   R/var/www/auris/lib/python3.10/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   listtupler   	Parameterr   r   r   r   r   #   s   
 
r   c                   @   s$   e Zd ZdZdejddf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``.
    root_modulereturnNc                 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Zedejjdej	fddZ
d	ed
edej	dedeedf deeef defddZ			dded
edeeejf dedejjjdeedf deeef dee dee deeejjgejjf  dejjfddZdS )_ExecOrderTracerr#   Nc                 C   s
   d | _ d S r$   )	exec_info)r+   r   r   r   r,   [   s   
z_ExecOrderTracer.__init__r   r"   c                 c   sv    t || _|j}|j}t| j|| j|_t| }t| j	|| j||_zd V  W ||_||_d S ||_||_w r$   )
r!   r.   call_modulecreate_proxy	functoolspartial_patched_call_moduler   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_tracerr/   r.   r   forwardargs.kwargsc                 C   sx   |j | t| }|j}|r&||jv sJ 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&   appendr   r4   r%   r'   r   )r+   r/   r.   r   r8   r9   r:   r   r%   Zprev_curr_moduleoutputr   r   r   r3   s   s    
z%_ExecOrderTracer._patched_call_moduler0   r6   kindtargetname	type_exprproxy_factory_fnc                 C   s  |||||||	|
}|j }|dv rX|durVg }|D ]/}t|tjjrH|jj|v rH||jj }||jj|f ||jvrH|j	| |j
| q|rV|j| t|| |S |dkrt| }|ro|j| t|| |D ]\}}||jvr|j	| |j
| qq|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_methodNr/   )r%   
isinstancer   r   Proxynoder>   r;   r*   addr(   r'   r   r   r4   )r+   r0   r.   r6   r=   r>   r9   r:   r?   r@   rA   proxyr%   r   argparam_r   r   r   r5      sD   0



z&_ExecOrderTracer._patched_create_proxy)r#   N)NNN)r   r   r   r,   r   r   r   r   r   r   r7   r   r!   r   r   r   r   r3   r    rD   ZTargetr   NoderC   r5   r   r   r   r   r-   Z   sZ    


	
6

	
r-   )r1   
contextlibr   dataclassesr   r   typingr   r   r   r   r   Ztorch.nnr   r	   r   r!   r-   r   r   r   r   <module>   s    