Ë
    ÌÓ^j”,  ã                  óò   — U d Z 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m	Z	 e	rddl
mZ ej                   G d„ d«      «       Zdd	„Zdd
„Zdd„Zdd„Zh d£Zdd„Zh d£Zdd„Zdd„ZeeeeeegZded<   dd„Zy)a  
Validates Chrome traces emitted by ``torch.profiler`` against rules derived
from production issues.

Usage::

    from torch.profiler._trace_validator import validate_trace

    passed, violations = validate_trace("trace.pt.trace.json")
    for v in violations:
        print(v)
é    )ÚannotationsN)Údefaultdict)ÚTYPE_CHECKING)ÚCallablec                  ó.   — e Zd ZU dZded<   ded<   dd„Zy)Ú	Violationz)A single rule violation found in a trace.ÚstrÚ	rule_nameÚmessagec                ó8   — | j                   › d| j                  › �S )Nz: ©r
   r   )Úselfs    új/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/profiler/_trace_validator.pyÚ__str__zViolation.__str__#   s   € Ø—.‘.Ð!  D§L¡L >Ð2Ð2ó    N)Úreturnr	   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   © r   r   r   r      s   … á3àƒNØƒLô3r   r   c                óN  — | j                  d«      rt        j                  nt        } || dd¬«      5 }t        j                  |«      }d d d «       t        t        «      r|n|j                  dg «      }|D �cg c]  }t        |t        «      sŒ|‘Œ c}S # 1 sw Y   ŒNxY wc c}w )Nz.gzÚrtzutf-8)ÚencodingÚtraceEvents)	ÚendswithÚgzipÚopenÚjsonÚloadÚ
isinstanceÚlistÚgetÚdict)ÚpathÚopenerÚfhÚdataÚeventsÚes         r   Ú_load_eventsr,   '   s�   € ØŸ-™-¨Ô.ŒT�YŠY´D€FÙ	��d WÔ	-ð °Ü�y‰y˜‹}ˆ÷ä ¤dÔ+‰T°·±¸-ÈÓ1L€FØÖ5�!¤¨A¬tÕ!4ŠAÒ5Ð5÷ð üò 6s   ³BÁ9B"ÂB"ÂBc                óä  — i }i }| D ]Û  }|j                  d«      dk7  rŒ|j                  di «      }|j                  d«      }|€Œ>t        |«      }|j                  dd«      |j                  dd«      t        |j                  dd	«      «      }}}|j                  d
«      }	|dk(  r|dk(  r||vs|||   d   k  sŒ³|||	dœ||<   Œ½|dk(  sŒÃ||vs|||   d   k  sŒÓ|||	dœ||<   ŒÝ g }
|j                  «       D ]v  \  }}|j                  |«      }|€Œ|d   |d   k  sŒ&|d   |d   z
  }|
j	                  t        dd|d   › d|› d|d   › d|d›d|› d|d   › d|d   d›d|d   d›�¬«      «       Œx |
S )z„For each (cudaLaunchKernel, GPU kernel) pair matched by External id,
    the GPU kernel must start at or after its cudaLaunchKernel.ÚphÚXÚargsúExternal idÚcatÚ ÚnameÚtsr   ÚcorrelationÚcuda_runtimeÚcudaLaunchKernel)r5   r4   ÚcorrÚkernelÚ_check_gpu_kernel_causalityzGPU kernel 'z' (External id=z, correlation=r9   z	) starts ú.1fz,us before its cudaLaunchKernel (External id=z
), gpu_ts=z	, cpu_ts=r   )r$   ÚintÚfloatÚitemsÚappendr   )r*   Úcpu_launchesÚgpu_kernelsÚevr0   Úext_idr2   r4   r5   r9   Ú
violationsÚgpuÚlaunchÚskews                 r   r;   r;   /   sñ  € ð %'€LØ#%€Kàò MˆØ�6‰6�$‹<˜3ÒØØ�v‰v�f˜bÓ!ˆØ—‘˜-Ó(ˆØˆ>ØÜ�V“ˆØŸ™˜u bÓ)¨2¯6©6°&¸"Ó+=¼uÀRÇVÁVÈDÐRSÃ_Ó?U�2ˆTˆØ�x‰x˜Ó&ˆà�.Ò  TÐ-?Ò%?Ø˜\Ñ)¨R°,¸vÑ2FÀtÑ2LÓ-LØ.0¸$ÈÑ'M�˜VÒ$Ø�H‹_Ø˜[Ñ(¨B°¸VÑ1DÀTÑ1JÓ,JØ-/¸ÀtÑ&L�˜FÒ#ð!Mð$ €JØ"×(Ñ(Ó*ò ‰ˆ�Ø×!Ñ! &Ó)ˆØˆ>ØØˆt‰9�v˜d‘|Ó#Ø˜$‘< # d¡)Ñ+ˆDØ×ÑÜØ;à& s¨6¡{ m°?À6À(ð K'Ø'*¨6¡{ m°9¸TÀ#¸Jð G=Ø=C¸Hð E'Ø'-¨f¡~Ð&6ð 7"Ø"% d¡)¨C °	¸&À¹,ÀsÐ9Kð	Mô	õðð$ Ðr   c                ó¨  — ddh}g }| D ]Æ  }|j                  d«      dk7  rŒ|j                  di «      }|j                  d«      }||vrŒ@|j                  d«      }|�t        |«      dk  sŒbt        |j                  d	d«      «      }|j                  t	        d
d|› d|d›d|j                  d«      › d|j                  d«      › d|›�
¬«      «       ŒÈ |S )z^Stream Wait Events and Event Synchronize must have
    wait_on_cuda_event_record_corr_id >= 0.úStream Wait Eventz
Event Syncr.   r/   r0   Úcuda_sync_kindÚ!wait_on_cuda_event_record_corr_idr   r5   Ú$_check_stream_wait_corr_id_populatedú'z' event at ts=r<   zus on device=Údeviceú stream=Ústreamz/ has invalid wait_on_cuda_event_record_corr_id=r   )r$   r=   r>   r@   r   )r*   ÚTARGET_KINDSrE   rC   r0   Ú	sync_kindÚraw_corrr5   s           r   rM   rM   ]   sù   € ð (¨Ð6€Là€JØò ˆØ�6‰6�$‹<˜3ÒØØ�v‰v�f˜bÓ!ˆØ—H‘HÐ-Ó.ˆ	Ø˜LÑ(ØØ—8‘8Ð?Ó@ˆØÐœs 8›}¨qÓ0Ü�r—v‘v˜d A“Ó'ˆBØ×ÑÜØDà˜I˜; n°R¸°Hð ="Ø"&§(¡(¨8Ó"4Ð!5°X¸d¿h¹hÀxÓ>PÐ=Qð RIØIQÈðVôõ	ðð( Ðr   c                óp  — g }| D ]É  }|j                  d«      dk(  sŒ|j                  d«      dk(  sŒ-|j                  di «      j                  d«      dk(  sŒR|j                  di «      }|j                  t        |j                  dd	«      «      t        |j                  d
d	«      «      |j                  d«      |j                  d«      dœ«       ŒË |sg S t        t        «      }| D ]¿  }|j                  d«      dk(  sŒ|j                  d«      dk(  sŒ-|j                  di «      }|j                  d«      |j                  d«      f}t        |j                  dd	«      «      }||   j                  ||t        |j                  d
d	«      «      z   |j                  dd«      dœ«       ŒÁ g }|D ]‡  }|d   |d   f}|j                  |g «      D ]f  }	|	d   |d   cxk  r	|	d   k  sŒn Œ|	d   |d   z
  }
|j                  t        dd|d   › d|d   › d|d   d›d|	d   › d|	d   d›d|
d›d�¬«      «       Œh Œ‰ |S )z{For each Stream Synchronize on (device, stream), no kernel on that
    stream should still be running when the sync starts.r.   r/   r2   Ú	cuda_syncr0   rK   zStream Syncr5   r   ÚdurrQ   rO   )r5   rW   rQ   rO   r:   r4   r3   )r5   Úendr4   rX   Ú_check_stream_sync_overlapzStreamSynchronize on device=rP   z at ts=r<   zus but kernel 'z' (ends zus) is still running (zus overlap)r   )r$   r@   r>   r   r#   r   )r*   Ústream_syncsrC   r0   Úkernels_by_streamÚkeyr5   rE   ÚsyncÚkÚoverlaps              r   rY   rY   z   sd  € ð €LØò ˆà�F‰F�4‹L˜CÓØ—‘�u“ Ó,Ø—‘�v˜rÓ"×&Ñ&Ð'7Ó8¸MÓIà—6‘6˜& "Ó%ˆDØ×Ñä §¡ t¨Q£Ó0Ü  §¡¨¨qÓ!1Ó2Ø"Ÿh™h xÓ0Ø"Ÿh™h xÓ0ñ	õðñ Øˆ	ä1<¼TÓ1BÐØò ˆØ�6‰6�$‹<˜3Ó 2§6¡6¨%£=°HÓ#<Ø—6‘6˜& "Ó%ˆDØ—8‘8˜HÓ% t§x¡x°Ó'9Ð:ˆCÜ�r—v‘v˜d A“Ó'ˆBØ˜cÑ"×)Ñ)àØ¤ b§f¡f¨U°AÓ&6Ó 7Ñ7ØŸF™F 6¨2Ó.ñõðð €JØò ˆØ�H‰~˜t H™~Ð.ˆØ"×&Ñ& s¨BÓ/ò 	ˆAØ�‰w˜˜d™Ô. a¨¡hÖ.Ø˜E™( T¨$¡ZÑ/�Ø×!Ñ!ÜØ">à:¸4À¹>Ð:Jð K&Ø&*¨8¡nÐ%5°W¸TÀ$¹ZÈÐ<Lð M+Ø+,¨V©9¨+°X¸aÀ¹hÀs¸^ð L1Ø18¸°¸[ðJôõ
ñ	ðð  Ðr   >   ÚcudaEventRecordÚcudaEventRecord_ptszÚcudaEventRecordWithFlagsÚcudaEventRecordWithFlags_ptszc                ó\  — i }| D ]¨  }|j                  d«      dk(  sŒ|j                  d«      dv sŒ,|j                  d«      t        v sŒD|j                  di «      }t        |j                  dd«      «      }d	D ]3  }|j                  |«      }|€Œt        |«      }||vs	|||   k  sŒ/|||<   Œ5 Œª g }| D ]õ  }|j                  d«      dk7  rŒ|j                  di «      }|j                  d
«      dk7  rŒ?|j                  d«      }|�t        |«      dk  rŒat        |«      }t        |j                  dd«      «      }	|j                  |«      }
|
€%|j	                  t        dd|	d›d|› d�¬«      «       Œ¿|
|	kD  sŒÅ|
|	z
  }|j	                  t        dd|	d›d|› d|d›d|
d›d�	¬«      «       Œ÷ |S )zpwait_on_cuda_event_record_corr_id must point to a cudaEventRecord
    with cudaEventRecord.ts <= stream_wait.ts.r.   r/   r2   )r7   Úcuda_driverr4   r0   r5   r   )r1   r6   rK   rJ   rL   Ú"_check_stream_wait_corr_id_in_pastzStream Wait Event at ts=r<   zus references corr_id=z) but no matching cudaEventRecord in tracer   z'us references cudaEventRecord (corr_id=z) z"us in the future (event_record_ts=ú))r$   Ú_CUDA_EVENT_RECORD_NAMESr>   r=   r@   r   )r*   Úevent_record_tsrC   r0   r5   ÚfieldÚcidrE   ÚrefÚsw_tsÚ	record_tsÚlags               r   rf   rf   º   só  € ð )+€OØò 2ˆà�F‰F�4‹L˜CÓØ—‘�u“Ð!@Ò@Ø—‘�v“Ô":Ò:à—6‘6˜& "Ó%ˆDÜ�r—v‘v˜d A“Ó'ˆBØ7ò 2�Ø—h‘h˜u“o�Ø‘?Ü˜c›(�CØ /Ñ1°R¸/È#Ñ:NÓ5NØ/1˜¨Ò,ñ2ð2ð €JØò "ˆØ�6‰6�$‹<˜3ÒØØ�v‰v�f˜bÓ!ˆØ�8‰8Ð$Ó%Ð)<Ò<ØØ�h‰hÐ:Ó;ˆØˆ;œ#˜c›( Qš,ØÜ�#‹hˆÜ�b—f‘f˜T 1“oÓ&ˆØ#×'Ñ'¨Ó,ˆ	àÐØ×ÑÜØBà2°5¸°+ð >#Ø#& %Ð'PðRôõð ˜ÓØ˜eÑ#ˆCØ×ÑÜØBà2°5¸°+ð >4Ø47°5¸¸3¸s¸)ð D,Ø,5°c¨?¸!ð=ôõ	ð3"ðF Ðr   >   ú
Group sizeúIn msg nelemsúOut msg nelemsúCollective nameÚdtypec                ó^  — g }| D ]¥  }|j                  d«      dk7  s|j                  d«      dk7  rŒ,|j                  di «      }t        t        |j                  «       «      z
  }|sŒa|j	                  t        ddt        |j                  dd	«      «      d
›dt        |«      › �¬«      «       Œ§ |S )zlrecord_param_comms events must carry: Collective name, dtype,
    In msg nelems, Out msg nelems, Group size.r.   r/   r4   Úrecord_param_commsr0   Ú_check_nccl_metadataz'record_param_comms' at ts=r5   r   r<   zus missing metadata: r   )r$   Ú_NCCL_REQUIRED_FIELDSÚsetÚkeysr@   r   r>   Úsorted)r*   rE   rC   r0   Úmissings        r   rw   rw   ý   s²   € ð €JØò ˆØ�6‰6�$‹<˜3Ò "§&¡&¨£.Ð4HÒ"HØØ�v‰v�f˜bÓ!ˆÜ'¬#¨d¯i©i«kÓ*:Ñ:ˆÚØ×ÑÜØ4à5´e¸B¿F¹FÀ4È»OÓ6LÈSÐ5Qð R-Ü-3°G«_Ð,=ð?ôõðð Ðr   c                óJ  — t        t        «      }| D ]·  }|j                  d«      dk7  rŒ|j                  dd«      }d|vrŒ/|j                  di «      }|j                  d«      xs |j                  d«      }|€Œht        |«      }d	|v r#|j	                  d	d
«      d   j                  «       n|}|||   vsŒ¤||   j                  |«       Œ¹ g }|j                  «       D ]B  \  }}t        |«      d
kD  sŒ|j                  t        dd|› dt        |«      › d|› �¬«      «       ŒD |S )z;Per Sequence number, at most one distinct backward op name.r.   r/   r4   r3   z$autograd::engine::evaluate_function:r0   zSequence numberÚseq_numú:é   éÿÿÿÿÚ!_check_backward_seq_id_uniquenesszSequence number z shared by z backward ops: r   )
r   r#   r$   r=   ÚsplitÚstripr@   r?   Úlenr   )	r*   Ú
seq_to_opsrC   r4   r0   ÚseqÚoprE   Úopss	            r   r‚   r‚     s;  € ä'2´4Ó'8€JØò 'ˆØ�6‰6�$‹<˜3ÒØØ�v‰v�f˜bÓ!ˆØ1¸Ñ=ØØ�v‰v�f˜bÓ!ˆØ�h‰hÐ(Ó)Ò@¨T¯X©X°iÓ-@ˆØˆ;ØÜ�#‹hˆØ/2°d©{ˆT�Z‰Z˜˜QÓ Ñ#×)Ñ)Ô+ÀˆØ�Z ‘_Ò$Ø�s‰O×"Ñ" 2Õ&ð'ð €JØ×$Ñ$Ó&ò 
‰ˆˆSÜˆs‹8�a‹<Ø×ÑÜØAà*¨3¨%¨{¼3¸s»8¸*ð E Ø #˜uð&ôõð
ð Ðr   z-list[Callable[[list[dict]], list[Violation]]]Ú_RULESc                ó€   — t        | «      }g }t        D ]  }|j                   ||«      «       Œ t        |«      dk(  |fS )a  
    Run all validation rules against a Chrome trace JSON file.

    Args:
        trace_path: Path to ``.pt.trace.json`` or ``.pt.trace.json.gz``.

    Returns:
        A ``(passed, violations)`` tuple.  ``passed`` is ``True`` when no
        violations were found.
    r   )r,   rŠ   Úextendr…   )Ú
trace_pathr*   Úall_violationsÚrules       r   Úvalidate_tracer�   >  sI   € ô ˜*Ó%€FØ&(€NÜò ,ˆØ×Ñ™d 6›lÕ+ð,äˆ~Ó !Ñ# ^Ð3Ð3r   )r&   r	   r   ú
list[dict])r*   r‘   r   zlist[Violation])r�   r	   r   ztuple[bool, list[Violation]])r   Ú
__future__r   Údataclassesr   r    Úcollectionsr   Útypingr   Úcollections.abcr   Ú	dataclassr   r,   r;   rM   rY   rh   rf   rx   rw   r‚   rŠ   r   r�   r   r   r   ú<module>r˜      s¤   ðòõ #ã Û Û Ý #Ý  ñ Ý(ð ×Ñ÷3ð 3ó ð3ó6ó+ó\ó:5òpÐ ó7òtÐ óó,ðD  Ø(ØØ&ØØ%ð9€Ð5ó ô4r   