Ë
    •\;jÉ  ã                   óP  — 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	e«      Zd
efd„Zd„ Zd„ Zedd„«       Zedd„«       Zy)é    N)ÚContextDecoratorÚcontextmanager)ÚAny)Úwarn)Úcore)ÚTracerEventTypeÚ_RecordEventFc                   ó^   — e Zd ZdZej
                  fdedefd„Zd„ Zde	de	de	fd	„Z
d
„ Zd„ Zy)Ú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                 ó.   — || _         || _        d | _        y ©N)r   r   Úevent)Úselfr   r   s      ú^G:\00. PROJECTS\API\Inventory\templateJSON\kerjaOCR\Lib\site-packages\paddle/profiler/utils.pyÚ__init__zRecordEvent.__init__H   s   € ð
 ˆŒ	Ø$ˆŒØˆ�
ó    c                 ó&   — | j                  «        | S r   )Úbegin©r   s    r   Ú	__enter__zRecordEvent.__enter__Q   s   € Ø�
‰
ŒØˆr   Úexc_typeÚ	exc_valueÚ	tracebackc                 ó$   — | j                  «        y r   )Úend)r   r   r   r   s       r   Ú__exit__zRecordEvent.__exit__U   s   € Ø�‰�
r   c                 óÈ   — t         sy| j                  t        vr$t         dj                  t        Ž «       d| _        yt        | j                  | j                  «      | _        y)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.beginX   sU   € õ& !ØØ�?‰?Ô"7Ñ7Üð+ð $ß$*¡FÜ*ðôð ˆD�Jä% d§i¡i°·±ÓAˆD�Jr   c                 óR   — | j                   r| j                   j                  «        yy)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.endx   s   € ð& �:Š:Ø�J‰J�N‰NÕð r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚPythonUserDefinedÚstrr   r   r   r   r   r   © r   r   r   r   &   sU   „ ñðH '6×&GÑ&Gñàðð $óòð ð °ð Àó òBó@r   r   Úfilenamec                 ó,   — 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)r+   s    r   r-   r-   �   s   € ô4 ×$Ñ$ XÓ.Ð.r   c                  ó   — t         S r   )r    r*   r   r   Úin_profiler_moder/   ¬   s   € ÜÐr   c                  ó¸   — d„ } t         ry ddlm} |j                  D ]9  }|dk7  sŒ	t	        ||«      }t	        |dd «      €Œ# | |j
                  «      |_        Œ; da y )Nc                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )Nc                  óš   •— t        «       r-t        dt        j                  ¬«      5   ‰| i |¤Žcd d d «       S  ‰| i |¤ŽS # 1 sw Y   y xY w)NzOptimization Step)r   )r/   r   r   ÚOptimization)ÚargsÚkwargsÚfuncs     €r   Úwarpperz;wrap_optimizers.<locals>.optimizer_warpper.<locals>.warpper²   sR   ø€ äÔ!Ü Ø'´O×4PÑ4Pöñ   Ð0¨Ñ0÷ñ ñ
 ˜TÐ, VÑ,Ð,÷ð ús   §AÁA
)Ú	functoolsÚwraps)r6   r7   s   ` r   Úoptimizer_warpperz*wrap_optimizers.<locals>.optimizer_warpper±   s%   ø€ Ü	�‰˜Ó	ó	-ó 
ð	-ð ˆr   r   )Ú	optimizerÚ	OptimizerÚstepT)Ú_has_optimizer_wrappedÚpaddler;   Ú__all__Úgetattrr=   )r:   r;   Ú	classnameÚclassobjects       r   Úwrap_optimizersrD   °   s`   € òõ ØÝ à×&Ô&ˆ	Ø˜Ó#Ü! )¨YÓ7ˆKÜ�{ F¨DÓ1Ñ=Ù#4°[×5EÑ5EÓ#F�Õ ð	 'ð
 "Ñr   c              #   ó  K  — ||k\  rd–— y	 | |k(  r(t        j                  «        t        j                  «        | |k\  rt        j                  t	        | «      «       d–— | |k  rt        j
                  «        | |dz
  k(  r,t        j                  «        |rt        j                  «        yyy# | |k  rt        j
                  «        | |dz
  k(  r,t        j                  «        |rt        j                  «        w w w xY 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   Únvprof_startÚnvprof_enable_record_eventÚnvprof_nvtx_pushr)   Únvprof_nvtx_popÚnvprof_stopÚsysÚexit©Úiter_idÚstartr   Úexit_after_profs       r   Ú_nvprof_rangerR   Ë   sÜ   è ø€ ð �‚|ÛØðØ�eÒÜ×ÑÔÜ×+Ñ+Ô-Ø�eÒÜ×!Ñ!¤# g£,Ô/Ûà�SŠ=Ü× Ñ Ô"Ø�c˜A‘gÒÜ×ÑÔÙÜ—‘•
ð ð øð �SŠ=Ü× Ñ Ô"Ø�c˜A‘gÒÜ×ÑÔÙÜ—‘•
ð ð üs   ‚DŽAB0 Á"ADÂ0AC?Ã?Dc              #   óÒ   K  — ||k\  rd–— y 	 | |k\  r
| |k  rd–— nd–— | |dz
  k(  r|rt        j                  «        y y y # | |dz
  k(  r|rt        j                  «        w w w xY w­w)NFTrF   )rL   rM   rN   s       r   Újob_schedule_profiler_rangerT   ì   sv   è ø€ à�‚|ØŠØðØ�eÒ ¨#¢Ø‹JàŠKà�c˜A‘gÒÙÜ—‘•
ð ð øˆ7�c˜A‘gÒÙÜ—‘•
ð ð üs   ‚A'ŽA ¡!A'Á"A$Á$A')T)r8   rL   Ú
contextlibr   r   Útypingr   Úwarningsr   Úpaddle.baser   Úpaddle.base.corer   r	   r    r>   Ú
DataloaderÚProfileStepÚForwardÚBackwardr3   ÚPythonOpr(   r!   r   r)   r-   r/   rD   rR   rT   r*   r   r   Ú<module>r_      sÀ   ðó Û 
ß 7Ý Ý å ß :àÐ ØÐ ð ×ÑØ×ÑØ×ÑØ×ÑØ× Ñ Ø×ÑØ×%Ñ%ðÐ ôfÐ"ô fðR/ 3ó /ò:ò"ð6 òó ðð@ òó ñr   