ó
    Eñié9  ã                  óü  • S SK Jr  S SKrS SKJr  S SKJr  S SKJrJ	r	J
r
Jr  S SKrS SKJrJr  S SKJrJr  S SKJrJr  S S	KJr  S
SKJr  \
(       a  S SKJrJr  \R:                  R=                  \S5      r \R:                  R=                  \S5      r!\"\	\\#\RH                  4         r%\\"\   /\%4   r&\RN                  " SSS9 " S S5      5       r(\RN                  " SSS9 " S S5      5       r)\RN                  " SSS9 " S S5      5       r*    S1S jr+S2S jr,S3S jr-S4S jr.S5S jr/      S6S jr0        S7S jr1S8S jr2    S9S jr3    S9S  jr4S:S! jr5\RN                   " S" S#5      5       r6          S;S$ jr7S<S% jr8 " S& S'\5      r9            S=S( jr:      S>S) jr;\RN                  " SS*9 " S+ S,5      5       r<\RN                  " SS*9 " S- S.5      5       r=      S?S/ jr>S@S0 jr?g)Aé    )ÚannotationsN)ÚCallable)ÚEnum)ÚAnyÚOptionalÚTYPE_CHECKINGÚUnion)ÚcountersÚget_metrics_context)ÚGraphPartitionMapÚ	InputType)Úget_plain_tensorsÚis_fake)Ú
OrderedSeté   )Úis_using_cudagraph_partition)ÚSequenceÚSetÚ
cudagraphsÚcudagraph_static_inputsT)ÚfrozenÚslotsc                  ó$   • \ rS rSr% SrS\S'   Srg)Ú
FunctionIDé    z9Unique counter of a function wrapped in cudagraphify_implÚintÚid© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__Ú__static_attributes__r   ó    Ú\/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_inductor/cudagraph_utils.pyr   r       s
   ‡ á?à†Gr'   r   c                  óB   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
rg)ÚPlaceholderInfoé'   zÊ
A serializable version of torch.fx.Node that contains information
pertinent to placeholder stack traces. We use these in logging and error messages
related to cudagraphs, and will cache these results.
ÚstrÚnameúOptional[str]Ústack_traceúlist[PlaceholderInfo]ÚusersÚmutating_use_stack_tracer   Nr   r   r'   r(   r*   r*   '   s    ‡ ñð ƒIØÓà Ó Ø+Ö+r'   r*   c                  óV   • \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   S\S'   Srg)ÚWrappedFunctioné6   z¸
Represents a function that you want to record for CUDA graph replay,
with a little more metadata so we can identify if we have an applicable
CUDA graph in our CUDA graph tree for it.
zCallable[..., Any]ÚmodelúSequence[int]Ústatic_input_idxsr   r   ztuple[torch.Tensor, ...]Ú	constantsúSequence[PlaceholderInfo]ÚplaceholdersÚmutated_input_idxsr   Nr   r   r'   r(   r4   r4   6   s,   ‡ ñð ÓØ$Ó$ØƒNØ'Ó'Ø+Ó+Ø%Ö%r'   r4   c                ó”  • [        U R                  5      S:X  a8  [        [        U R                  5      5      R                  R                  SS 5      $ U R                   Hg  nUR                  [        R                  R                  R                  R                  L d  M@  UR                  R                  SS 5      =n(       d  Me  Us  $    g )Nr   r/   )Úlenr1   ÚnextÚiterÚmetaÚgetÚtargetÚtorchÚopsÚatenÚcopy_Údefault)Úplaceholder_nodeÚuser/   s      r(   Ú&get_mutating_use_stack_trace_from_noderK   F   s—   € ô Ð×!Ñ!Ó" aÓ'Ü”DÐ)×/Ñ/Ó0Ó1×6Ñ6×:Ñ:¸=È$ÓOÐOà×%Ô%ˆØ�:‰:œŸ™Ÿ™×-Ñ-×5Ñ5Ô5Ø!Ÿh™hŸl™l¨=¸$Ó?Ð?ˆ{×?Ø"Ò"ñ &ð
 r'   c                ó   • U R                   $ ©N)r2   )Úplaceholder_infos    r(   Úget_mutating_use_stack_tracerO   U   s   € Ø×4Ñ4Ð4r'   c                óü   • U R                   nU R                  R                  SS 5      n/ nS nU R                  S:X  a0  U R                   Vs/ s H  n[        U5      PM     nn[        U 5      n[        XX45      $ s  snf )Nr/   Úplaceholder)r-   rA   rB   Úopr1   Úto_placeholder_inforK   r*   )rI   r-   r/   r1   r2   Úis         r(   rS   rS   Y   sƒ   € Ø× Ñ €DØ"×'Ñ'×+Ñ+¨M¸4Ó@€KØ€EØ#Ðà×Ñ˜mÓ+Ø1A×1GÒ1GÓHÒ1G¨AÔ$ QÖ'Ñ1GˆÐHÜ#IØó$
Ð ô ˜4¨eÓNÐNùò Is   ÁA9c                óz   • U R                    Vs/ s H  oR                  S:X  d  M  [        U5      PM!     sn$ s  snf )NrQ   )ÚnodesrR   rS   )ÚgraphÚnodes     r(   Úget_placeholder_inforY   h   s9   € à.3¯kªkóÚ.9 d¿W¹WÈÑ=UÓ!Ô˜DÖ!©kñð ùò s   �8¦8c                ó   • SU  3$ )Nzskipping cudagraphs due to r   )Úreasons    r(   Úformat_default_skip_messager\   n   s   € Ø(¨¨Ð1Ð1r'   c                ó˜   • SnU H  nX   n[        U5      =n(       d  M    O   [        S[        U5       S35      nU(       a  U SU 3$ U$ )NÚ zmutated inputs (z instances)ú. Found from : 
 )rO   r\   r>   )r;   Úmutation_indicesr/   ÚidxrQ   Úmsgs         r(   Úget_mutation_stack_tracerc   r   si   € ð "$€KãˆØ"Ñ'ˆÜ6°{ÓCÐCˆ;×CÙñ  ô
 &Ø
œ3Ð/Ó0Ð1°Ð=ó€Cö Ø�Ð(¨¨Ð6Ð6à€Jr'   c                ó²  • [         R                  R                  R                  R                  (       a?  U R
                   Vs/ s H'  nX0R                  ;   a  M  U" X   5      (       a  M%  UPM)     nnOU R
                  n[        R                  SU R                  5        [        R                  SU5        U(       a  [        U R                  U5      $ S $ s  snf )Nz'check mutation static input indices: %sz#check mutation mutation indices: %s)rD   Ú	_inductorÚconfigÚtritonÚcudagraph_treesr<   r8   Ústatic_inputs_logÚdebugrc   r;   )ÚfuncÚinputsÚis_cuda_graph_recorded_tensorra   r`   s        r(   Úcheck_for_mutationrn   †   sÌ   € ô ‡�×Ñ×$Ñ$×4×4ð ×.Ò.ó+
â.�à×-Ñ-Ñ-ó ñ 1°±×=÷	 Ù.ð 	ð +
Ðð  ×2Ñ2Ðä×ÑØ1°4×3IÑ3Iôô ×ÑÐAÐCSÔTö ô 	! ×!2Ñ!2Ð4DÓEðð ðùò!+
s   ÁCÁCÁ*Cc                óx   • U R                    H*  nUR                  R                  SS 5      =n(       d  M(  Us  $    g )Nr/   )r1   rA   rB   )rX   rJ   r/   s      r(   Ú_get_use_stack_tracerp   ¥   s5   € Ø�zŒzˆØŸ(™(Ÿ,™, }°dÓ;Ð;ˆ;×;ØÒñ ð r'   c                óV  • U R                  [        R                  " S5      S 5        [        5       (       a&  U R                  [        R                  " S5      S 5        U R	                  [        R                  " S5      5      =n(       a=  SUR
                   S3n[        U5      =n(       a  [        U SU 35      $ [        U5      $ [        U 5      S:X  a1  [        [        U R                  5       5      5      R                  S:X  a  g S U  5       n[        S	S
R                  U5       35      $ )NrA   Úcpuzcpu device (Ú)r_   r   Úcudac              3  ó8   #   • U  H  n[        U5      v •  M     g 7frM   )Úrepr)Ú.0Úkeys     r(   Ú	<genexpr>Ú:check_multiple_devices_or_any_cpu_nodes.<locals>.<genexpr>Ä   s   é € Ð:Ò&9˜s”�c—�Ò&9ùs   ‚zmultiple devices: z, )ÚpoprD   Údevicer   rB   r-   rp   r\   r>   r?   r@   ÚkeysÚtypeÚjoin)Údevice_node_mappingÚcpu_noderb   r/   Ú	keys_reprs        r(   Ú'check_multiple_devices_or_any_cpu_nodesrƒ   ¬   s  € ð ×ÑœEŸLšL¨Ó0°$Ô7ô $×%Ñ%à×Ñ¤§¢¨UÓ 3°TÔ:à&×*Ñ*¬5¯<ª<¸Ó+>Ó?Ð?€xÕ?Ø˜XŸ]™]˜O¨1Ð-ˆÜ.¨xÓ8Ð8ˆ;Õ8Ü.°#°Ð6HÈÈÐ/VÓWÐWä*¨3Ó/Ð/ô 	ÐÓ  AÓ%Ü”Ð)×.Ñ.Ó0Ó1Ó2×7Ñ7¸6ÓAàá:Ñ&9Ó:€IÜ&Ð);¸D¿I¹IÀiÓ<PÐ;QÐ'RÓSÐSr'   c                ó   • [        U 5      $ rM   )rƒ   )r€   s    r(   Ú check_lowering_disable_cudagraphr…   È   s   € ô 3Ð3FÓGÐGr'   c                ó4  • [         R                  U 5        [        S   S==   S-  ss'   [        R                  R
                  R                  R                  (       a  [        U 5      e[        5       nUR                  5       (       a  UR                  SU SS9  g g )NÚinductorÚcudagraph_skipsr   Úcudagraph_skip_reasonT)Ú	overwrite)Úcudagraphs_logÚwarningr
   rD   re   rf   rg   Úcudagraph_or_errorÚRuntimeErrorr   Úin_progressÚset)rb   Úmetrics_contexts     r(   Ú#log_cudagraph_skip_and_bump_counterr’   Î   s|   € Ü×Ñ˜3ÔÜˆZÑÐ*Ó+¨qÑ0Ó+ä‡�×Ñ×$Ñ$×7×7Ü˜3ÓÐä)Ó+€OØ×"Ñ"×$Ñ$Ø×ÑÐ3°SÀDÐÒIð %r'   c                  ó*   • \ rS rSr% S\S'   SS jrSrg)ÚBoxedDeviceIndexéÚ   úOptional[int]Úvaluec                óD   • Ub  [        U[        5      (       d   eXl        g rM   )Ú
isinstancer   r—   )ÚselfÚ
device_idxs     r(   r�   ÚBoxedDeviceIndex.setÞ   s   € ØÑ!¤Z°
¼C×%@Ñ%@Ð@Ð@Ø�
r'   )r—   N)r›   r–   ÚreturnÚNone)r    r!   r"   r#   r%   r�   r&   r   r'   r(   r”   r”   Ú   s   ‡ àÓ÷ r'   r”   c                ón  • [        S5      n[        R                  R                  R                  R
                  (       aZ  [        U5      nU Vs/ s H  ofU;  d  M
  UPM     nn[        U5      S:g  nU(       d  g [        U R                  5      n	[        X—5      $ [        U5      S:g  nU(       d  S $ U$ s  snf )Nzmutated inputsr   )r\   rD   re   rf   rg   rh   r   r>   rY   rW   rc   )
ÚgmÚmutated_inputsr<   r8   Údefault_msgÚunique_idxsra   r`   Úhas_mutationr;   s
             r(   Ú3check_for_mutation_ignore_cuda_graph_managed_tensorr¥   ã   s¤   € ô .Ð.>Ó?€Kô ‡�×Ñ×$Ñ$×4×4Ü Ð!2Ó3ˆá+=ÓXÒ+= CÈKÑAWŸCÑ+=ÐÐXÜÐ+Ó,°Ñ1ˆÞØÜ+¨B¯H©HÓ5ˆÜ'¨ÓGÐGô ˜>Ó*¨aÑ/ˆÞ'ˆtÐ8¨[Ð8ùò Ys   Á	B2ÁB2c                ó¢   • U R                   (       a  U R                   $ U R                   H"  nUR                   (       d  M  UR                   s  $    g)zE
Gets the first non-empty stack trace of a placeholder or its users.
N)r/   r1   )rQ   Úusers     r(   Úget_placeholder_stack_tracer¨   û   sF   € ð ××Ø×&Ñ&Ð&à×!Ô!ˆØ××ÑØ×#Ñ#Ò#ñ "ð r'   c                  ó.   • \ rS rSrSrSrSrSrS	S jrSr	g)
ÚCheckInvariantStatusi	  r   é   é   é   c                óž   • U R                   S:X  a  gU R                   S:X  a  gU R                   S:X  a  gU R                    SU R                   3$ )NÚCudagraphManagedIdxMismatchz-cudagraph managed tensor data pointer changedÚStaticInputIdxMismatchz!static input data pointer changedÚ&ExpectedDeadIndicesBeforeGraphMismatchz+expected dead indices before graph are livez: )r-   r—   )rš   s    r(   Ú__str__ÚCheckInvariantStatus.__str__  sK   € Ø�9‰9Ð5Ó5ØBØ�Y‰YÐ2Ó2Ø6Ø�Y‰YÐBÓBØ@à—i‘i�[  4§:¡: ,Ð/Ð/r'   r   N©r�   r,   )
r    r!   r"   r#   ÚSUCCESSr¯   r°   r±   r²   r&   r   r'   r(   rª   rª   	  s$   † à€Gð #$Ðð Ðð ./Ð*÷0r'   rª   c                ó  • [        U5      [        U5      :X  a  [        U5      [        U 5      :X  d   S5       eU Vs/ s H  oQU   PM	     nnU Vs/ s H  oRU   PM	     nnU S3n[        [        Xg5      5       Hy  u  nu  pš[        U	[        R
                  5      (       d   eX5   nU	R                  5       U
:w  d  MC  X   nU SUR                   SU
 SU	R                  5        S[        U5       S3
nM{     U$ s  snf s  snf )zq
Logs the mismatch between input data pointers and recorded data pointers.
This checks only idxs in target_idxs.
zClength mismatch between inputs, recorded_data_ptr, and placeholdersz.
zinput name: z. data pointer changed from z to z. input stack trace: Ú
)	r>   Ú	enumerateÚzipr™   rD   ÚTensorÚdata_ptrr-   r¨   )r;   rl   Úrecorded_data_ptrÚtarget_idxsÚmismatchrT   Ú	t_tensorsÚt_data_ptrsÚ	error_msgÚtensorr»   ÚindexrQ   s                r(   Úlog_data_ptr_mismatchrÄ   !  s  € ô ˆv‹;œ#Ð/Ó0Ó0´S¸³[ÄCÈÓDUÓ5Uð ØMóÐUñ %0Ó0¢K˜q˜”¡K€IÐ0Ù1<Ó=²¨A QÔ'±€KÐ=Ø�*˜CÐ €IÜ!*¬3¨yÓ+FÖ!GÑˆÑˆFÜ˜&¤%§,¡,×/Ñ/Ð/Ð/Ø‘ˆØ�?‰?Ó Õ(Ø&Ñ-ˆKà�+˜\¨+×*:Ñ*:Ð);ð <-Ø-5¨J°d¸6¿?¹?Ó;LÐ:Mð N&Ü&AÀ+Ó&NÐ%OÈrðSò ñ "Hð Ðùò 1ùÚ=s   ¼C8ÁC=c                óN  ^• [        U R                  5       5      S-   mSU4S jjn[        R                  R                  R
                  R                  (       aM  T[        R                  R                  R
                  R                  :”  a  [        R                  U" 5       5        gg)Nr   c                 ó   >• ST  S3$ )Nz¤CUDAGraph supports dynamic shapes by recording a new graph for each distinct input size. Recording too many CUDAGraphs may lead to extra overhead. We have observed a0   distinct sizes. Please consider the following options for better performance: a) padding inputs to a few fixed number of shapes; or b) set torch._inductor.config.triton.cudagraph_skip_dynamic_graphs=True. Set torch._inductor.config.triton.cudagraph_dynamic_shape_warn_limit=None to silence this warning.r   )Únum_cudagraphss   €r(   Úwarn_msgÚ4maybe_warning_due_to_dynamic_shape.<locals>.warn_msgF  s   ø€ ð0à0>Ð/?ð @'ð'ð		
r'   TFr´   )	r>   r}   rD   re   rf   rg   Ú"cudagraph_dynamic_shape_warn_limitr‹   rŒ   )Úfn_cacheÚnew_int_keyrÈ   rÇ   s      @r(   Ú"maybe_warning_due_to_dynamic_shaperÍ   @  st   ø€ ô ˜Ÿ™›Ó)¨AÑ-€N÷

ô 	�‰×Ñ×%Ñ%×H×HØÜ
�/‰/×
 Ñ
 ×
'Ñ
'×
JÑ
JóKô 	×Ñ™x›zÔ*Øàr'   )r   c                  ó8   • \ rS rSr% SrS\S'   S\S'   S\S'   S	rg
)ÚCudagraphCachedInfoi]  z
Info needed to realign inputs
r:   r;   úlist[Optional[str]]Ústack_tracesz	list[str]Úcudagraph_fail_reasonsr   Nr   r   r'   r(   rÏ   rÏ   ]  s   ‡ ñð ,Ó+Ø%Ó%Ø%Ö%r'   rÏ   c                  óL   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S	'   S
\S'   Srg)ÚCudagraphMetadataih  z&
Metadata for recording a CUDA graph.
r:   r;   úOrderedSet[int]r8   r<   rÐ   rÑ   zdict[str, torch.Tensor]r9   r   Nr   r   r'   r(   rÔ   rÔ   h  s'   ‡ ñð ,Ó+Ø&Ó&Ø'Ó'Ø%Ó%Ø&Ö&r'   rÔ   c                óv  • / n[        5       n[        5       n[        U R                  5       H…  u  pVXaR                  ;   a  UR	                  U5        XaR
                  ;   a  UR	                  U5        Ub  UR                  U   nO[        SU R                   SU 3S/ SS9nUR                  U5        M‡     / nU R                   H7  n	U	b   UR                  UR                  U	   5        M&  UR                  S5        M9     U R                   V
s0 s H  oªUR                  U
   _M     nn
[        UUUUU5      $ s  sn
f )z¿
Convert the cudagraph metadata at the graph level to the graph partition level,
given the graph partition info (i.e., mapping from partition input/output index
to graph input/output index).
NÚ
partition_Ú_placeholder_)r-   r/   r1   r2   )r   r¸   Úinput_index_mappingr8   Úaddr<   r;   r*   r   ÚappendÚoutput_index_mappingrÑ   Úconstant_namesr9   rÔ   )Úpartition_mapÚmetadataÚpartition_placeholdersÚpartition_static_input_idxsÚpartition_mutated_input_idxsÚpartition_input_idxÚgraph_input_idxrQ   Úpartition_stack_tracesÚgraph_output_idxr-   Úpartition_constantss               r(   Ú get_partition_cudagraph_metadatarè   u  s`  € ð  ÐÜ3=³<ÐÜ4>³LÐ Ü09Ø×)Ñ)ö1Ñ,Ðð ×8Ñ8Ó8Ø'×+Ñ+Ð,?Ô@à×9Ñ9Ó9Ø(×,Ñ,Ð-@ÔAàÑ&Ø"×/Ñ/°Ñ@‰Kô *Ø! -×"2Ñ"2Ð!3°=ÐATÐ@UÐVØ ØØ)-ñ	ˆKð 	×%Ñ% kÖ2ñ'1ð*  ÐØ)×>Ô>ÐØÑ'Ø"×)Ñ)¨(×*?Ñ*?Ð@PÑ*QÖRà"×)Ñ)¨$Ö/ñ	 ?ð 4A×3OÒ3OóÚ3O¨4ˆh× Ñ  Ñ&Ò&Ñ3Oð ð ô ØØ#Ø$ØØóð ùò	s   ÄD6c                ó¦  • [        U [        R                  5      (       d
  [        5       $ [        5       n[	        U / S9 H~  n[        U5      [        R                  La  M!  [        U5      (       d+  UR                  (       d  UR                  R
                  S:w  a  M^   UR                  UR                  5       5        M€     U$ ! [         a     M‘  f = f)zODebug helper that collects the data pointers of all CUDA tensors in the object.)Úoutrt   )r™   rD   rº   r   r   r~   r   Úis_metar|   rÚ   r»   Ú	Exception)ÚobjÚptrsÚbases      r(   Úcollect_cuda_data_ptrsrð   «  s›   € ä�cœ5Ÿ<™<×(Ñ(Ü‹|Ðä&›L€DÜ! #¨2Ô.ˆÜ�‹:œUŸ\™\Ò)ÙÜ�4�=‰=˜DŸLŸL¨D¯K©K×,<Ñ,<ÀÓ,FÙð	Ø�H‰H�T—]‘]“_Ö%ñ /ð €Køô ó 	Úð	ús   ÂCÃ
CÃC)rI   útorch.fx.Noder�   r.   )rN   r*   r�   r.   )rI   rñ   r�   r*   )rW   ztorch.fx.Graphr�   r0   )r[   r,   r�   r,   )r;   r:   r`   z&Union[AbstractSet[int], Sequence[int]]r�   r,   )rk   r4   rl   úlist[InputType]rm   zCallable[[torch.Tensor], bool]r�   r.   )rX   rñ   r�   r.   )r€   z!dict[torch.device, torch.fx.Node]r�   r.   )rb   r,   r�   rž   )
r    ztorch.fx.GraphModuler¡   zOrderedSet[str]r<   rÕ   r8   r7   r�   r.   )rQ   r*   r�   r.   )r;   r:   rl   rò   r¼   zSequence[Optional[int]]r½   r7   r¾   rª   r�   r,   )rË   z)dict[tuple[int, ...], Callable[..., Any]]rÌ   r   r�   Úbool)rÞ   r   rß   rÔ   r�   rÔ   )rí   Úobjectr�   rÕ   )@Ú
__future__r   ÚdataclassesÚcollections.abcr   Úenumr   Útypingr   r   r   r	   rD   Útorch._dynamo.utilsr
   r   Útorch._inductor.utilsr   r   Útorch._subclasses.fake_tensorr   r   Útorch.utils._ordered_setr   Úutilsr   r   r   ÚAbstractSetÚ_loggingÚgetArtifactLoggerr    r‹   ri   Úlistr   rº   Ú
OutputTypeÚ	ModelTypeÚ	dataclassr   r*   r4   rK   rO   rS   rY   r\   rc   rn   rp   rƒ   r…   r’   r”   r¥   r¨   rª   rÄ   rÍ   rÏ   rÔ   rè   rð   r   r'   r(   Ú<module>r     så  ðå "ã Ý $Ý ß 6Ó 6ã ß =ß >ß DÝ /å /ö ß<ð —‘×1Ñ1°(¸LÓI€Ø—N‘N×4Ñ4ØÐ'óÐ ð
 �(˜5  e§l¡lÐ!2Ñ3Ñ4Ñ5€
Ø�d˜9‘oÐ&¨
Ð2Ñ3€	ð ×Ò˜d¨$Ñ/÷ð ó 0ðð ×Ò˜d¨$Ñ/÷,ð ,ó 0ð,ð ×Ò˜d¨$Ñ/÷&ð &ó 0ð&ðØ#ðàôô5ôOôô2ðØ+ðà<ðð 	ôð(Ø
ðàðð $Bðð ô	ô>ðTØ:ðTàôTð8HØ:ðHàôHô	Jð ×Ñ÷ ð  ó ð ð9Øð9à#ð9ð (ð9ð %ð	9ð
 ô9ô0ô0˜4ô 0ð0Ø+ðàðð /ðð ð	ð
 #ðð 	ôð>Ø7ðàðð 
ôð: ×Ò˜dÑ#÷&ð &ó $ð&ð ×Ò˜dÑ#÷	'ð 	'ó $ð	'ð3Ø$ð3àð3ð ô3õlr'   