o
    pi                      @  s
  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	rFd 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 deZdddZ dd Z!dd Z"edddZ#edddZ$	dddZ%dS )     )annotationsN)ContextDecoratorcontextmanager)TYPE_CHECKING)warn)core)TracerEventType_RecordEvent)Self)_ProfilerResultFc                   @  sb   e Zd ZU dZded< ded< ded< ejfdd
dZdddZdddZ	dddZ
d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                 C  s   || _ || _d | _d S N)r   r   r   )selfr   r    r   \/home/app/PaddleOCR-VL/.venv_paddleocr/lib/python3.10/site-packages/paddle/profiler/utils.py__init__V   s   
zRecordEvent.__init__r
   c                 C  s   |    | S r   )beginr   r   r   r   	__enter___   s   zRecordEvent.__enter__exc_typetype[BaseException] | None	exc_valueBaseException | None	tracebacktypes.TracebackType | Nonec                 C  s   |    d S r   )end)r   r   r   r   r   r   r   __exit__c   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   k   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!      s   zRecordEvent.endN)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   r   0   s   
 !
	

r   filenamer   r   r   c                 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   wrapper   s   $z;wrap_optimizers.<locals>.optimizer_wrapper.<locals>.wrapper)	functoolswraps)r3   r4   r   r2   r   optimizer_wrapper   s   	z*wrap_optimizers.<locals>.optimizer_wrapperr   )	optimizerZ	OptimizerstepT)_has_optimizer_wrappedZpaddler8   __all__getattrr9   )r7   r8   	classnameZclassobjectr   r   r   wrap_optimizers   s   

r>   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iter_idstartr!   exit_after_profr   r   r   _nvprof_range   s6   
rF   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 )NFTr?   )r@   rA   rB   r   r   r   job_schedule_profiler_range   s&   
rG   c                 C  sR   t d| d|  t||||}|| j_W d    d S 1 s"w   Y  d S )Nz Schedule Profiler start at step z and end at step )logginginforG   Z_engineZenable_job_schedule_profiler)modelrC   rD   r!   rE   statusr   r   r   switch_job_schedule_profiler  s   
"rL   )r,   r   r   r   )T)&
__future__r   r5   rH   r@   
contextlibr   r   typingr   warningsr   Zpaddle.baser   Zpaddle.base.corer   r	   typesZtyping_extensionsr
   r   r#   r:   Z
DataloaderZProfileStepForwardZBackwardr/   ZPythonOpr+   r$   r   r-   r.   r>   rF   rG   rL   r   r   r   r   <module>   sB   
p 