o
    i                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ eeZG d	d
 d
ejZG dd dejZG dd deZdddZdS )    )annotationsN)Any)ddup)config)
_threading)	collector)Tracerc                   @  s   e Zd Zd
ddZd	S )_WrappedTorchProfilerwrappedr   tracerTracer | NonereturnNonec                 C  s   t j| | t| _|| _d S N)wraptObjectProxy__init___handle_torch_traceon_trace_ready_self_tracer)selfr
   r    r   W/home/ubuntu/.local/lib/python3.10/site-packages/ddtrace/profiling/collector/pytorch.pyr      s   
z_WrappedTorchProfiler.__init__N)r
   r   r   r   r   r   )__name__
__module____qualname__r   r   r   r   r   r	      s    r	   c                      s|   e Zd ZU dZded< d fddZejdd	d
ZejdddZ	d fddZ
d fddZdddZdddZ  ZS )MLProfilerCollectorz2Record ML framework (i.e. pytorch) profiler usage.typePROFILED_TORCH_CLASSr   r   c                   s   t    d | _d | _d S r   )superr   r   	_originalr   	__class__r   r   r   $   s   

zMLProfilerCollector.__init__r   c                 C     d S r   r   r!   r   r   r   _get_patch_target*      z%MLProfilerCollector._get_patch_targetvaluec                 C  r$   r   r   r   r'   r   r   r   _set_patch_target.   r&   z%MLProfilerCollector._set_patch_targetc              
     sL   zddl }W n ty } zt|d}~ww || _|   t   dS )z*Start collecting framework profiler usage.r   N)torchImportErrorr   CollectorUnavailable_torch_modulepatchr   _start_service)r   r*   er"   r   r   r/   2   s   
z"MLProfilerCollector._start_servicec                   s   t    |   dS )z)Stop collecting framework profiler usage.N)r   _stop_serviceunpatchr!   r"   r   r   r1   <   s   
z!MLProfilerCollector._stop_servicec                   s.       _ fdd} t j| dS )z-Patch the module for tracking profiling data.c                   s   | |i |}  | jS r   )r   r   )r
   instanceargskwargsprofilerr!   r   r   profiler_initF   s
   z0MLProfilerCollector.patch.<locals>.profiler_initN)r%   r    r)   r   FunctionWrapper)r   r7   r   r!   r   r.   A   s   
zMLProfilerCollector.patchc                 C  s   |  | j dS )z>Unpatch the torch.profiler module for tracking profiling data.N)r)   r    r!   r   r   r   r2   O   s   zMLProfilerCollector.unpatchr   r   r   r   r'   r   r   r   )r   r   r   __doc____annotations__r   abcabstractmethodr%   r)   r/   r1   r.   r2   __classcell__r   r   r"   r   r      s   
 

r   c                      s:   e Zd ZdZeZd fddZdddZdd
dZ  Z	S )TorchProfilerCollectorz*Monkey patch torch.profiler.profile usage.r   r   c                   s   t    d S r   )r   r   r!   r"   r   r   r   Y      zTorchProfilerCollector.__init__r   c                 C  s
   | j jjS r   r-   r6   profiler!   r   r   r   r%   \   s   
z(TorchProfilerCollector._get_patch_targetr'   c                 C  s   || j j_d S r   rC   r(   r   r   r   r)   _   rB   z(TorchProfilerCollector._set_patch_targetr9   r:   r;   )
r   r   r   r<   r	   r   r   r%   r)   r@   r   r   r"   r   rA   T   s    
rA   profr   r   r   c                 C  s  d}t d |  }t|dkrd S d}tt|tjjpd}|t|k r5t d|t| |t| }d}| jj	}t
|drE| }nt
|drQ| | }ntd	|D ] }|t k raqWt }	d
}
|jdkrzd}
|	t|j| |j t|dd pt|dd }|d ur|dkrd}
|	t|| |j |jd ur|jdkrd}
|	|j|j t|dd pt|dd }|d ur|dkrd}
|	||j |
rF|	|jddd |	dt|j ddd |	dt|j  t|j dr|	!|j"t#$|j"t#%|j"pdt|j"  n#t|j dr,|	!|j"t#$|j"dt|j  ntd|j |	&t||j'j(|   |	)  qW|d dkrTt d|| |d7 }qWd S )Ng     @@z_handle_torch_trace calledr   g      ?i@B z9Dropped events.  num_events_to_report %d. len(events): %dtrace_start_nstrace_start_usz0Neither trace_start_ns nor trace_start_us existsFTdevice_time	cuda_timedevice_memory_usagecuda_memory_usagezunknown-filePYTORCH_zcuda zDeviceType.CPUzPYTORCH-CPU-THREAD-zDeviceType.CUDAzPYTORCH-CUDA-zUnexpected device_type i  z$%d events with no data to record: %s   )*LOGdebugeventslenminr   pytorchevents_limitr6   kineto_resultshasattrrF   rG   AttributeErrorrandomr   SampleHandlecpu_timepush_cputimeintcountgetattrpush_gpu_gputimeflopspush_gpu_flopspush_gpu_memory
push_framenamestrdevice_typepush_gpu_device_namedevice_index
startswithpush_threadinfothreadr   get_thread_native_idget_thread_namepush_absolute_ns
time_rangeendflush_sample)rE   NANOS_PER_MICROSECONDrP   collection_fractionnum_events_to_reportempty_events_countrU   rF   r0   handle
data_addedgpu_time
gpu_memoryr   r   r   r   c   sr   








r   )rE   r   r   r   )
__future__r   r>   loggingrX   typingr   r   "ddtrace.internal.datadog.profilingr   #ddtrace.internal.settings.profilingr   ddtrace.profilingr   r   ddtrace.tracer   	getLoggerr   rN   r   r	   CaptureSamplerCollectorr   rA   r   r   r   r   r   <module>   s     
5