o
    h+                     @   s   d dl Z d dlmZ d dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlmZmZmZmZmZmZ dgZG dd dZdd ZdS )	    N)warn)_disable_profiler_legacy_enable_profiler_legacy
DeviceTypeProfilerConfigProfilerState)_filter_name_filter_stack_entry_rewrite_name	EventListFunctionEventMEMORY_EVENT_NAMEprofilec                   @   s   e Zd ZdZ	d*dddddddddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Z							d+ddZejje_dd Zejje_d,ded efd!d"Zd-d$d%Zejje_d&d' Zejje_ed(d) ZdS ).r   z&DEPRECATED: use torch.profiler insteadTF)use_cudarecord_shapes
with_flopsprofile_memory
with_stackwith_modulesc                C   s   || _ | j sd S || _d | _d| _|| _|| _|  j| jO  _|| _|| _|| _| jr7t	j
 s7td d| _| jr@tj| _d S tj| _d S )NFz/CUDA is not available, disabling CUDA profiling)enabledr   function_eventsenteredr   r   r   r   r   torchcudais_availabler   r   CUDAprofiler_kindCPU)selfr   r   r   r   r   r   r    r   T/var/www/html/ai/venv/lib/python3.10/site-packages/torch/autograd/profiler_legacy.py__init__   s$   zprofile.__init__c              	   C   s(   t | j| j| j| j| j| jtjj	
 S N)r   r   r   r   r   r   r   r   _C	_profiler_ExperimentalConfigr   r   r   r    config>   s   
zprofile.configc                 C   s*   | j sd S | jrtdd| _|   | S )Nz)Profiler context manager is not reentrantT)r   r   RuntimeError_start_tracer&   r   r   r    	__enter__J   s   zprofile.__enter__c                 C   s   t |   d S r"   )r   r'   r&   r   r   r    r)   S   s   zprofile._start_tracec                 C   sN   | j sd S | jrtj  t }t|}t|| j| j| j	d| _
| j
  dS )N)r   r   r   F)r   r   r   r   synchronizer   _parse_legacy_recordsr   r   r   r   _build_tree)r   exc_typeexc_valexc_tbrecordsparsed_resultsr   r   r    __exit__V   s   

zprofile.__exit__c                 C      | j d u rdS t| j S )Nz$<unfinished profiler_legacy.profile>)r   reprr&   r   r   r    __repr__g      

zprofile.__repr__c                 C   r4   )Nz,<unfinished profile.profiler_legacy.profile>)r   strr&   r   r   r    __str__l   r7   zprofile.__str__c                 C   s   | j d u r	tdd S )NzProfiler didn't finish running)r   r(   r&   r   r   r    _check_finishq   s   
zprofile._check_finishNd   K   7   P   c              	   C   s0   |    | jd usJ | jj|||||||dS )N)sort_by	row_limitmax_src_column_widthmax_name_column_widthmax_shapes_column_widthheadertop_level_events_only)r:   r   table)r   r?   r@   rA   rB   rC   rD   rE   r   r   r    rF   u   s   
zprofile.tablec                 C   s"   |    | jd usJ | j|S r"   )r:   r   export_chrome_trace)r   pathr   r   r    rG      s   zprofile.export_chrome_traceself_cpu_time_totalrH   metricc                 C   s6   |    | jd usJ d| jsJ d| j||S )NExpected profiling resultsz(export_stacks() requires with_stack=True)r:   r   r   export_stacks)r   rH   rJ   r   r   r    rL      s   zprofile.export_stacksr   c                 C   s(   |    | jd usJ d| j||S NrK   )r:   r   key_averages)r   group_by_input_shapegroup_by_stack_nr   r   r    rN      s   zprofile.key_averagesc                 C   s$   |    | jd usJ d| j S rM   )r:   r   total_averager&   r   r   r    rQ      s   
zprofile.total_averagec                 C   s   |    | jdusJ | jjS )zkReturns total time spent on CPU obtained as a sum of
        all self times across all the events.
        N)r:   r   rI   r&   r   r   r    rI      s   zprofile.self_cpu_time_total)T)Nr;   r<   r=   r>   NF)rI   )Fr   )__name__
__module____qualname____doc__r!   r'   r*   r)   r3   r6   r9   r:   rF   r   rG   r8   rL   rN   rQ   propertyrI   r   r   r   r    r      sH    !	





c                 C   sl  dd }d}d }g }g }t j|  D ]}| }|d u r!|dkr!|}q|d ur*| r,J | D ]|}i }	i }
i }t }d }|D ]k}||}t| sO||v rU|| q>| dkr|d ur| | kov| | kov| | k}|r|| q>|||< d|	|< d|
|< n| dkrR||v sJ d| d|| }|	| }|
| }|	 p|
 |
 k}| }| }td&i d	| d
| dt| dddt| ddd|
 d||d||d| d| ddd | D d| d|d|d|d|d| dtjddd |}|sC| rC||}|dkrC|| | | || ||= |	|= |
|= nV| d!krt|	}t|
}||kshJ |	 D ]}|	|  | 7  < ql|
 D ]}|
|  | 7  < q~|dkrtdt d dddg | | dd"
}|| |}q>q.|j!d#d$ d% |S )'Nc                 S   s   |   |  fS )zt
        Returns a tuple to be used by _parse_legacy_records for correlating start and
        end records.
        )handlenode_id)recordr   r   r    _get_record_key   s   z._parse_legacy_records.<locals>._get_record_keyr   __start_profilepushpopzExpected record with key zo to exist in range_starts.
                    This means that the pop event did not have a corresponding push.idrX   nameT)r_   with_wildcard
trace_nameFthreadstart_usend_us
fwd_threadinput_shapesstackc                 S   s   g | ]}t |r|qS r   )r	   ).0entryr   r   r    
<listcomp>   s
    z)_parse_legacy_records.<locals>.<listcomp>scopecpu_memory_usagecuda_memory_usageis_async	is_remotesequence_nrdevice_type	is_legacyflopsmemory_alloc)
r^   r_   ra   rb   rc   rd   rg   rl   rm   rr   c                 S   s   | j j| j j gS r"   )
time_rangestartend)evtr   r   r    <lambda>3  s    z'_parse_legacy_records.<locals>.<lambda>)keyr   )"	itertoolschainr_   ro   setr   addkindrX   rn   	thread_idrs   r   rW   r
   cpu_elapsed_usfwd_thread_idshapesrg   rk   rp   r   r   has_cudacuda_elapsed_usappend_kerneldeviceappendlenkeysrl   rm   r   sort)thread_recordsrZ   next_idstart_record	functionsrecord_stackrY   r_   thread_record_listcpu_memory_allocscuda_memory_allocsrange_startsfiltered_handlesprev_record
record_key	duplicaterv   rl   rm   rn   is_remote_eventstart_flopsfedurationnum_open_handles_cpunum_open_handles_cudarW   r   r   r    r,      s   







	





cr,   )r{   warningsr   r   
torch.cudatorch.autogradr   r   r   r   r   torch.autograd.profiler_utilr   r	   r
   r   r   r   __all__r   r,   r   r   r   r    <module>   s     	 