o
    #j                     @   s   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 dZdaejejejejejejejgZG dd	 d	eZd
efddZdd Zdd ZedddZedddZdS )    N)ContextDecoratorcontextmanager)Any)warn)core)TracerEventType_RecordEventFc                   @   sV   e Zd ZdZejfdedefddZdd Zde	d	e	d
e	f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`.
    name
event_typec                 C   s   || _ || _d | _d S N)r
   r   event)selfr
   r    r   V/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddle/profiler/utils.py__init__H   s   
zRecordEvent.__init__c                 C   s   |    | S r   )beginr   r   r   r   	__enter__Q   s   zRecordEvent.__enter__exc_type	exc_value	tracebackc                 C   s   |    d S r   )end)r   r   r   r   r   r   r   __exit__U   s   zRecordEvent.__exit__c                 C   s>   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   r   r   r   r   X   s   

zRecordEvent.beginc                 C   s   | 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   r   r   r   r   x   s   zRecordEvent.endN)__name__
__module____qualname____doc__r   PythonUserDefinedstrr   r   r   r   r   r   r   r   r   r   r	   &   s    $
	 r	   filenamec                 C   s
   t | 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)r#   r   r   r   r$      s   
r$   c                   C   s   t S r   )r   r   r   r   r   in_profiler_mode   s   r%   c                  C   s^   dd } t rd S ddlm} |jD ]}|dkr*t||}t|dd d ur*| |j|_qda d S )Nc                    s   t   fdd}|S )Nc                     sT   t  r#tdtjd  | i |W  d    S 1 sw   Y  d S  | i |S )NzOptimization Step)r   )r%   r	   r   Optimization)argskwargsfuncr   r   warpper   s   $z;wrap_optimizers.<locals>.optimizer_warpper.<locals>.warpper)	functoolswraps)r*   r+   r   r)   r   optimizer_warpper   s   	z*wrap_optimizers.<locals>.optimizer_warpperr   )	optimizerZ	OptimizerstepT)_has_optimizer_wrappedZpaddler/   __all__getattrr0   )r.   r/   	classnameZclassobjectr   r   r   wrap_optimizers   s   

r5   Tc              	   c   s    ||kr
dV  dS z9| |krt   t   | |kr"t t|  dV  W | |k r.t   | |d kr@t   |rBt  dS dS dS | |k rLt   | |d kr]t   |r^t  w w 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   Znvprof_startZnvprof_enable_record_eventZnvprof_nvtx_pushr"   Znvprof_nvtx_popZnvprof_stopsysexitZiter_idstartr   Zexit_after_profr   r   r   _nvprof_range   s6   
r;   c              	   c   sx    ||kr
dV  d S z"| |kr| |k rdV  ndV  W | |d kr)|r+t   d S d S d S | |d kr:|r;t   w w w )NFTr6   )r7   r8   r9   r   r   r   job_schedule_profiler_range   s&   
r<   )T)r,   r7   
contextlibr   r   typingr   warningsr   Zpaddle.baser   Zpaddle.base.corer   r   r   r1   Z
DataloaderZProfileStepZForwardZBackwardr&   ZPythonOpr!   r   r	   r"   r$   r%   r5   r;   r<   r   r   r   r   <module>   s2   i 