
    |j                     \   d dl mZ d dlZ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mZ d dlmZmZ e	rd dlZd dlmZ d d	lmZ d
Zd
aej        ej        ej        ej        ej        ej        ej        gZ G d de          ZddZ d Z!d Z"edd            Z#edd            Z$	 ddZ%dS )    )annotationsN)ContextDecoratorcontextmanager)TYPE_CHECKING)warn)core)TracerEventType_RecordEvent)Self)_ProfilerResultFc                  h    e Zd ZU dZded<   ded<   ded<   ej        fdd
ZddZddZ	ddZ
ddZdS )RecordEventa  
    Interface for recording a time range by user defined.

    Args:
        name (str): Name of the record event.
        event_type (TracerEventType, optional): Optional, default value is
            `TracerEventType.PythonUserDefined`. It is reserved for internal
            purpose, and it is better not to specify this parameter.

    Examples:
        .. code-block:: python
            :name: code-example1

            >>> import paddle
            >>> import paddle.profiler as profiler
            >>> # method1: using context manager
            >>> paddle.seed(2023)
            >>> with profiler.RecordEvent("record_add"):
            ...     data1 = paddle.randn(shape=[3])
            ...     data2 = paddle.randn(shape=[3])
            ...     result = data1 + data2
            >>> # method2: call begin() and end()
            >>> record_event = profiler.RecordEvent("record_add")
            >>> record_event.begin()
            >>> data1 = paddle.randn(shape=[3])
            >>> data2 = paddle.randn(shape=[3])
            >>> result = data1 + data2
            >>> record_event.end()

    Note:
        RecordEvent will take effect only when :ref:`Profiler <api_paddle_profiler_Profiler>` is on and at the state of `RECORD`.
    strnamer	   
event_typez_RecordEvent | NoneeventreturnNonec                0    || _         || _        d | _        d S N)r   r   r   )selfr   r   s      e/lsinfo/ai/hellotax_ai/data_center/backend/venv/lib/python3.11/site-packages/paddle/profiler/utils.py__init__zRecordEvent.__init__V   s    
 	$


    r   c                .    |                                   | S r   )beginr   s    r   	__enter__zRecordEvent.__enter___   s    

r   exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonec                .    |                                   d S r   )end)r   r   r!   r#   s       r   __exit__zRecordEvent.__exit__c   s     	




r   c                    t           sdS | j        t          vr%t           dj        t                      d| _        dS t          | j        | j                  | _        dS )a4  
        Record the time of beginning.

        Examples:

            .. code-block:: python
                :name: code-example2

                >>> import paddle
                >>> import paddle.profiler as profiler
                >>> record_event = profiler.RecordEvent("record_sub")
                >>> record_event.begin()
                >>> paddle.seed(2023)
                >>> data1 = paddle.randn(shape=[3])
                >>> data2 = paddle.randn(shape=[3])
                >>> result = data1 - data2
                >>> record_event.end()
        NzVOnly TracerEvent Type in [{}, {}, {}, {}, {}, {},{}]                  can be recorded.)_is_profiler_usedr   _AllowedEventTypeListr   formatr   r
   r   r   s    r   r   zRecordEvent.begink   sm    & ! 	F?"777+ $$*,AC   DJJJ%diAADJJJr   c                J    | j         r| j                                          dS dS )a1  
        Record the time of ending.

        Examples:

            .. code-block:: python
                :name: code-example3

                >>> import paddle
                >>> import paddle.profiler as profiler
                >>> record_event = profiler.RecordEvent("record_mul")
                >>> record_event.begin()
                >>> paddle.seed(2023)
                >>> data1 = paddle.randn(shape=[3])
                >>> data2 = paddle.randn(shape=[3])
                >>> result = data1 * data2
                >>> record_event.end()
        N)r   r&   r   s    r   r&   zRecordEvent.end   s0    & : 	JNN	 	r   N)r   r   r   r	   r   r   )r   r   )r   r    r!   r"   r#   r$   r   r   )r   r   )__name__
__module____qualname____doc____annotations__r	   PythonUserDefinedr   r   r'   r   r&    r   r   r   r   0   s          B III
 '6&G          B B B B<     r   r   filenamer   r   r   c                *    t          j        |           S )av  
    Load dumped profiler data back to memory.

    Args:
        filename(str): Name of the exported protobuf file of profiler data.

    Returns:
        ``ProfilerResult`` object, which stores profiling data.

    Examples:
        .. code-block:: python

            >>> # doctest: +REQUIRES(env:GPU)
            >>> import paddle.profiler as profiler
            >>> import paddle
            >>> paddle.device.set_device('gpu')
            >>> with profiler.Profiler(
            ...         targets=[profiler.ProfilerTarget.CPU, profiler.ProfilerTarget.GPU],
            ...         scheduler = (3, 10)) as p:
            ...     for iter in range(10):
            ...         #train()
            ...         p.step()
            >>> p.export('test_export_protobuf.pb', format='pb')
            >>> profiler_result = profiler.load_profiler_result('test_export_protobuf.pb')
    )r   load_profiler_result)r4   s    r   r6   r6      s    4 $X...r   c                     t           S r   )r)   r3   r   r   in_profiler_moder8      s    r   c                     d } t           rd S ddlm} |j        D ]>}|dk    r6t	          ||          }t	          |dd            | |j                  |_        ?da d S )Nc                F     t          j                    fd            }|S )Nc                     t                      r=t          dt          j                  5   | i |cd d d            S # 1 swxY w Y   d S  | i |S )NzOptimization Step)r   )r8   r   r	   Optimization)argskwargsfuncs     r   wrapperz;wrap_optimizers.<locals>.optimizer_wrapper.<locals>.wrapper   s    !! - 'O4P   1 1  40001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 tT,V,,,s   A  AA)	functoolswraps)r?   r@   s   ` r   optimizer_wrapperz*wrap_optimizers.<locals>.optimizer_wrapper   s8    				- 	- 	- 	- 
		- r   r   )	optimizer	OptimizerstepT)_has_optimizer_wrappedpaddlerD   __all__getattrrF   )rC   rD   	classnameclassobjects       r   wrap_optimizersrM      s              & G G	##!)Y77K{FD11=#4#4[5E#F#F !r   Tc              #    K   ||k    rdV  dS 	 | |k    r&t          j                     t          j                     | |k    r!t          j        t	          |                      dV  | |k     rt          j                     | |dz
  k    r*t          j                     |rt          j                     dS dS dS # | |k     rt          j                     | |dz
  k    r)t          j                     |rt          j                     w w w xY w)a=  
    A range profiler interface (not public yet).
    Examples:
        .. code-block:: python

            >>> import paddle
            >>> model = Model()
            >>> for i in range(max_iter):
            ...     with paddle.profiler.utils._nvprof_range(i, 10, 20):
            ...         out = model(in)
    N   )	r   nvprof_startnvprof_enable_record_eventnvprof_nvtx_pushr   nvprof_nvtx_popnvprof_stopsysexititer_idstartr&   exit_after_profs       r   _nvprof_ranger[      s2      ||e+---e!#g,,///S== """cAg 




  	 S== """cAg 



 s   AB7 7ADc              #     K   ||k    rdV  d S 	 | |k    r| |k     rdV  ndV  | |dz
  k    r|rt          j                     d S d S d S # | |dz
  k    r|rt          j                     w w w xY w)NFTrO   )rU   rV   rW   s       r   job_schedule_profiler_ranger]      s      ||e#JJJJKKKcAg 




   cAg 



 s   A	 	"A+c                    t          j        d| d|            t          ||||          5 }|| j        _        d d d            d S # 1 swxY w Y   d S )Nz Schedule Profiler start at step z and end at step )logginginfor]   _engineenable_job_schedule_profiler)modelrX   rY   r&   rZ   statuss         r   switch_job_schedule_profilerre     s     LH5HH3HH   
%_
 
 <	5;2< < < < < < < < < < < < < < < < < <s   AAA)r4   r   r   r   )T)&
__future__r   rA   r_   rU   
contextlibr   r   typingr   warningsr   paddle.baser   paddle.base.corer	   r
   typestyping_extensionsr   r   r)   rG   
DataloaderProfileStepForwardBackwardr<   PythonOpr2   r*   r   r6   r8   rM   r[   r]   re   r3   r   r   <module>rs      s   # " " " " "      



 7 7 7 7 7 7 7 7                         : : : : : : : : 1LLL&&&&&&000000    % m m m m m" m m m`/ / / /:  " " "6    @    " 15	< 	< 	< 	< 	< 	<r   