ó
    Eñi(  ã                   óB  • S r SSKrSSKJr  SSKJrJr  SSKJrJ	r	  SSK
r
SSKr
SSKJr  SSKJr  SSKJr  SS	KJrJrJrJrJrJr  SS
KJrJrJrJrJr  SSKJ r   SSK!J"r"  S\
RF                  RH                  S\%\&   4S jr'S\
RF                  RP                  S\)\
RT                  \
RF                  RV                  4   4S jr,S\
RF                  RP                  S\&S\	\-   4S jr.S\
RF                  RP                  S\&S\	\-   4S jr/S\
RF                  RP                  S\&4S jr0S\
RF                  RP                  S\1\	\-      4S jr2S\
RF                  RP                  S\\   S\4S jr3 " S S5      r4\"" S\4" 5       S9    S&S \S!\4   S"\\   S#\5S$\5S\S!\\   4   4
S% jjr6g)'a�  
This module implements CUDA graphs support for TorchDynamo backends.

CUDA graphs allow for capturing and replaying GPU operations, which can significantly
reduce CPU overhead in GPU-accelerated PyTorch models. This module provides:

- CUDA graph creation and management for both forward and backward passes
- Input mutation detection and handling
- Device compatibility checking
- Stack trace management for debugging
- Integration with TorchInductor's cudagraph trees

The backend supports two main modes:
1. cudagraphs: Full CUDA graph support with both forward and backward pass optimization
2. cudagraphs_inner: Lower-level CUDA graph implementation used for benchmarking

Key components:
- CudagraphsBackend: Main backend class for CUDA graph integration
- Mutation detection utilities to ensure graph safety
- Device mapping and compatibility checks
- Stack trace collection for debugging
é    N)Údefaultdict)ÚCallableÚSequence)ÚAnyÚOptional)Úconfig)Úaot_autograd)Ú	boxed_nop)ÚBoxedDeviceIndexÚ'check_multiple_devices_or_any_cpu_nodesÚformat_default_skip_messageÚget_mutation_stack_traceÚget_placeholder_infoÚ#log_cudagraph_skip_and_bump_counter)Ú	BoxedBoolÚcount_tangentsÚ%get_first_incompatible_cudagraph_nodeÚnum_fw_fixed_argumentsÚoutput_node)ÚStorageWeakRefé   )Úregister_backendÚgÚreturnc           	      óô  • S[         [        [        4   S[        4S jn[        [        5      nSn[	        5       nU R
                   GH­  nUR                  S:X  aq  [        U" UR                  5      [        R                  5      (       a;  U[        U" UR                  5      R                  5       5         R                  U5        US-  nM…  UR                  S:X  d  M—  [        UR                  S5      (       d  M´  UR                  R                   n[#        UR$                  5       HÊ  u  pxU['        UR(                  5      :  a  UR(                  U   n	O5UR*                  UR,                  ;  a  MJ  UR,                  UR*                     n	S	n
UR.                  (       a  UR.                  R0                  (       a  S
n
U
(       d  Mœ  XB[        U" U	R                  5      R                  5       5         -  nMÌ     GM°     U$ )NÚmetar   c                 ó"   • SU ;   a  U S   $ U S   $ )NÚvalÚfake_result© )r   s    Ú^/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_dynamo/backends/cudagraphs.pyÚmeta_fkÚ%find_input_mutations.<locals>.meta_fk7   s   € Ø# t›mˆt�E‰{ÐD°°mÑ1DÐDó    r   Úplaceholderr   Úcall_functionÚ_schemaFT)ÚdictÚstrr   r   ÚsetÚnodesÚopÚ
isinstancer   ÚtorchÚTensorr   Ú_typed_storageÚaddÚhasattrÚtargetr'   Ú	enumerateÚ	argumentsÚlenÚargsÚnameÚkwargsÚ
alias_infoÚis_write)r   r"   ÚinputsÚ	input_idxÚmutated_inputsÚnÚschemaÚiÚargÚargumentÚmut_args              r!   Úfind_input_mutationsrE   6   sz  € ðE”dœ3¤˜8‘nð E¬ô Eô œÓ€FØ€IÜ“U€NØ�W�WˆØ�4‰4�=Ó Ü™' !§&¡&›/¬5¯<©<×8Ñ8Ø”~¡g¨a¯f©f£o×&DÑ&DÓ&FÓGÑH×LÑLÈYÔWØ˜‰NŠIØ�T‰T�_Õ$Ü˜1Ÿ8™8 Y×/Ñ/Ùà—X‘X×%Ñ%ˆFÜ# F×$4Ñ$4Ö5‘�Ø”s˜1Ÿ6™6“{“?Ø Ÿv™v a™y‘Hà—x‘x q§x¡xÓ/Ù Ø Ÿx™x¨¯©Ñ1�HØ�Ø—>—>Ø—~‘~×.×.Ø"&˜ß�7ð #Ü&¡w¨x¯}©}Ó'=×'LÑ'LÓ'NÓOñ'ñ ’Nô 6ñ ð: Ðr$   Úgmc                 óþ   • 0 nU R                   R                   H`  nUR                  R                  SS 5      n[	        U[
        R                  5      (       d  M@  UR                  U;  d  MR  X!UR                  '   Mb     U$ )Nr   )Úgraphr+   r   Úgetr-   r.   r/   Údevice)rF   Údevice_node_mappingr?   Úts       r!   Úget_device_node_mappingrM   ]   sb   € ð >@ÐØ�X‰X�^Œ^ˆØ�F‰F�J‰J�u˜dÓ#ˆÜ�aœŸ™×&Ó&¨1¯8©8Ð;NÕ+NØ,- §¡Ó)ñ ð Ðr$   Ú	aot_modelÚ	num_fixedc                 ó¦   • [        U R                  5      [        [        U5      5      -
  nU(       d  g [	        U R                  5      n[        X25      $ ©N)rE   rH   r*   Úranger   r   )rN   rO   Úmutation_indicesÚplaceholderss       r!   Ú3check_for_mutation_ignore_cuda_graph_managed_tensorrU   h   sA   € ô ,¨I¯O©OÓ<¼sÄ5ÈÓCSÓ?TÑTÐÞØä'¨	¯©Ó8€LÜ# LÓCÐCr$   c                 óæ   • [         R                  (       d  [        X5      =n(       a  U$ [        [	        U 5      5      =n(       a  U$ [        U 5      =n(       a  [        SUR                   S35      $ g )Nzincompatible op (Ú))r   Ú(cudagraph_backend_support_input_mutationrU   r   rM   r   r   r8   )rN   rO   Úmut_skipÚskipÚnodes        r!   Úcheck_for_skipr\   s   sx   € Ü×:×:ÜJØó
ð 
ˆ8õ 
ð ˆOä6Ü 	Ó*óð €tõ ð ˆä4°YÓ?Ð?€tÕ?Ü*Ð->¸t¿y¹y¸kÈÐ+KÓLÐLàr$   c                 óx   • [        [        [        U 5      5      5      nUR                  S:X  d   eUR                  $ )NÚcuda)ÚnextÚiterrM   ÚtypeÚindex)rF   rJ   s     r!   Úget_device_indexrc   …   s3   € Ü”$Ô.¨rÓ2Ó3Ó4€FØ�;‰;˜&Ó Ð Ð Ø�<‰<Ðr$   c                 ó@  • [        U 5      n[        UR                  5      S:X  d   eUR                  S   n[        US5      (       d  / $ U Vs/ s HD  n[	        U[
        R                  R                  R                  5      (       a  UR                  OS PMF     sn$ s  snf )Nr   r   Ú__iter__)
r   r6   r7   r2   r-   r.   Úfxr[   ÚNodeÚstack_trace)rF   Úoutputr7   rB   s       r!   Úget_stack_tracesrj   ‹   s‹   € Ü˜‹_€FÜˆv�{‰{Ó˜qÓ Ð Ð Ø�;‰;�q‰>€DÜ�4˜×$Ñ$Øˆ	ñ óâˆCô ' s¬E¯H©H¯M©M×,>Ñ,>×?Ñ?ˆ�ŠÀTÒ	IÙñð ùò s   ÁABÚdynamo_modelÚdynamo_inputsc           	      óÆ  ^^^^• SSK Jm  [        S5      m[        S 5      m SS[        R
                  R                  S[        [           S[        S[        4UUUU4S jjjnS[        R
                  R                  S[        [           S[        4UUU4S	 jjn[        UU[        R                  " USS
9[        R                  R                  R                  S9nU" U T5      $ )Nr   )Úcudagraphify_implTrN   Ú
aot_inputsÚis_inferencer   c                 ó¬  >• [        X5      n[        [        T
5      [        U5      5      n[        X5      =n(       a&  [        R
                  " T	5        [        SU 35        U$ TR                  [        U 5      5        T" UU[        U5      TR                  SU[        U 5      [        U R                  5      [        U R                  5      S9	nSUl        U$ )Núskipping cudagraphs due to F©Údevice_indexÚis_backwardrp   Ústack_tracesrT   Úmutated_input_idxsT)r
   r   r6   r\   r   Údisabler   r*   rc   rR   Úvaluerj   r   rH   rE   Ú_boxed_call)rN   ro   rp   ÚinterpÚfixedÚskip_msgÚoutÚboxed_device_indexrn   Údo_cudagraphsrl   s          €€€€r!   Úforward_cudagraphsÚ&cudagraphs.<locals>.forward_cudagraphs�   sÃ   ø€ ô
 ˜9Ó1ˆÜ&¤s¨=Ó'9¼3¸z»?ÓKˆÜ% iÓ7Ð7ˆ8Õ7Ü×Ò˜mÔ,Ü/Ø-¨h¨ZÐ8ôð ˆMà×ÑÔ/°	Ó:Ô;ÙØØÜ�%‹LØ+×1Ñ1ØØ%Ü)¨)Ó4Ü-¨i¯o©oÓ>Ü3°I·O±OÓDñ

ˆð ˆŒØˆ
r$   c                 ó   >^ ^• [        T U5      nT(       d  T $ [        T 5      n[        T U5      =n(       aq  [        SU 35        T	R                  nUc  Sn[
        R                  R                  R                  USS9mTc   eS[        [           S[        4U U4S jjnSUl        U$ T
" UU[        U5      [        T 5      SS[        T 5      [        T R                   5      [#        T R                   5      S	9	nSUl        U$ )
Nrr   r   F)Úcreate_if_none_existsr<   r   c                 ó4   >• TR                  5         T" U 5      $ rQ   )Úset_to_running_backward)r<   rN   Úmanagers    €€r!   ÚfnÚ3cudagraphs.<locals>.backward_cudagraphs.<locals>.fnÐ   s   ø€ à×/Ñ/Ô1Ù  Ó(Ð(r$   Trs   )r
   r   r\   r   ry   r.   Ú	_inductorÚcudagraph_treesÚget_managerÚlistr   rz   rR   rc   rj   r   rH   rE   )rN   ro   r{   r|   r}   Ú
device_idxrˆ   r~   r‡   r   rn   r€   s   `       @€€€r!   Úbackward_cudagraphsÚ'cudagraphs.<locals>.backward_cudagraphsº   s  ú€ ô ˜9 jÓ1ˆÞØÐä˜yÓ)ˆÜ% i°Ó7Ð7ˆ8Õ7Ü/Ø-¨h¨ZÐ8ôð
 ,×1Ñ1ˆJØÑ!Ø�
Ü—o‘o×5Ñ5×AÑAØ°%ð Bð ˆGð Ñ&Ð&Ð&ð)œ4¤™9ð )¬÷ )ð )ð
 "ˆBŒNØˆIáØØÜ�%‹LÜ)¨)Ó4ØØÜ)¨)Ó4Ü-¨i¯o©oÓ>Ü3°I·O±OÓDñ

ˆð ˆŒØˆ
r$   )rp   )Úfw_compilerÚbw_compilerÚinference_compilerÚkeep_inference_input_mutations)F)Útorch._inductor.cudagraph_treesrn   r   r   r.   rf   ÚGraphModuler�   r   Úboolr	   Ú	functoolsÚpartialÚ_dynamor   Ú%cudagraph_backend_keep_input_mutation)rk   rl   r�   r�   Úaot_cudagraphsr   rn   r€   s    `   @@@r!   Ú
cudagraphsr�   —   sÑ   û€ ÝAä˜d“O€MÜ)¨$Ó/Ðð
 #ñÜ—8‘8×'Ñ'ðäœ‘Iðô ðô 
÷	ó ð:*Ü—8‘8×'Ñ'ð*Ü59¼#±Yð*ä	÷*ñ *ôX "Ø&Ø'Ü$×,Ò,Ð-?ÈdÑSÜ',§}¡}×';Ñ';×'aÑ'añ	€Nñ ˜,¨Ó6Ð6r$   c                   óz   • \ rS rSrSr\S
S j5       r\S\R                  R                  S\
\   S\4S j5       rS	rg)ÚCudagraphsBackendéï   r�   r   Nc                  ó   • SSK Jn   U " 5         g )Nr   ©Úreset_cudagraph_trees)r•   r£   r¢   s    r!   ÚresetÚCudagraphsBackend.resetò   s   € åIáÕr$   Úmodelr<   c                 ó   • [        X5      $ rQ   )r�   )r¦   r<   s     r!   Ú__call__ÚCudagraphsBackend.__call__ø   s   € ä˜%Ó(Ð(r$   r    )r   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Úcompiler_nameÚstaticmethodr¤   r.   rf   r–   r   r   r¨   Ú__static_attributes__r    r$   r!   rŸ   rŸ   ï   sP   † Ø €Màó ó ð ð
 ð)˜Ÿ™×,Ñ,ð )°h¸s±mð )Èó )ó ó)r$   rŸ   r�   )r8   Úcompiler_fnr¦   .r<   Úcopy_outputsÚcopy_inputsc                 óü  ^^^^^	• [        U[        [        45      (       d   eT(       a(  U Vs/ s H  n[        R                  " U5      PM     snmO[        U5      m[        R
                  R                  5         [        R
                  R                  5       nUR                  [        R
                  R                  5       5        [        R
                  R                  U5         U " U6   SSS5        UR                  5         [        R
                  R                  5       R                  U5        [        R
                  R                  5         [        R
                  R                  5       m[        R
                  R                  TUS9   U " T6 m	SSS5        [        T	[        [        45      (       d  T	4m	S[        S[        [           4UUUUU	4S jjnU$ s  snf ! , (       d  f       N÷= f! , (       d  f       Nc= f)zBThis isn't registered as a backend, but is used in some benchmarksN)ÚstreamÚ
new_inputsr   c                  ó  >• [        T5      [        U 5      :X  d   eT(       a&  [        TU 5       H  u  pUR                  U5        M     TR                  5         T(       a   T Vs/ s H  o3R	                  5       PM     sn$ T$ s  snf rQ   )r6   ÚzipÚcopy_ÚreplayÚclone)	r¶   ÚdstÚsrcÚxr³   r²   rH   Ústatic_inputsÚstatic_outputss	       €€€€€r!   ÚrunÚcudagraphs_inner.<locals>.run!  sk   ø€ Ü�=Ó!¤S¨£_Ó4Ð4Ð4ÞÜ ¨zÖ:‘�Ø—	‘	˜#–ñ ;à�‰ŒÞÙ'5Ó6¢~ !—G‘G–I¡~Ñ6Ð6à!Ð!ùò 7s   Á$B)r-   r�   Útupler.   Ú
zeros_liker^   ÚsynchronizeÚStreamÚwait_streamÚcurrent_streamrµ   Ú	CUDAGraphrH   r   r   )
r¦   r<   r²   r³   r¾   rµ   rÁ   rH   r¿   rÀ   s
     ``   @@@r!   Úcudagraphs_innerrÊ     si  ü€ ô �fœt¤U˜m×,Ñ,Ð,Ð,Þá6<Ó=²f°œ×)Ò)¨!Ö,±fÑ=‰ä˜V›ˆô 
‡J�J×ÑÔÜ�Z‰Z×ÑÓ €FØ
×Ñ”u—z‘z×0Ñ0Ó2Ô3Ü	�‰×	Ñ	˜6Õ	"Ùˆv‰÷ 
#à
×ÑÔÜ	‡J�J×ÑÓ×+Ñ+¨FÔ3Ü	‡J�J×ÑÔô �J‰J× Ñ Ó"€EÜ	�‰×	Ñ	˜%¨Ð	Ò	/Ù Ð.ˆ÷ 
0ä�n¤t¬U m×4Ñ4Ø(Ð*ˆð	"œð 	"¤¬#¡÷ 	"ó 	"ð €JùòA >÷ 
#Õ	"ú÷ 
0Õ	/ús   ® GÃ%GÆ
G-Ç
G*Ç-
G;)TT)7Ú__doc__r˜   Úcollectionsr   Úcollections.abcr   r   Útypingr   r   r.   Útorch.fxÚtorch._dynamor   Útorch._dynamo.backends.commonr	   Ú torch._dynamo.backends.debuggingr
   Útorch._inductor.cudagraph_utilsr   r   r   r   r   r   Útorch._inductor.utilsr   r   r   r   r   Ú torch.multiprocessing.reductionsr   Úregistryr   rf   ÚGraphr*   ÚintrE   r–   r(   rJ   rg   rM   r)   rU   r\   rc   r�   rj   r�   rŸ   r—   rÊ   r    r$   r!   Ú<module>rÙ      sÑ  ðñó. Ý #ß .ß  ã Û Ý  Ý 6Ý 6÷÷ ÷õ õ <å &ð$˜EŸH™HŸN™Nð $¨s°3©xô $ðNØ�‰×Ñðà	ˆ%�,‰,˜Ÿ™Ÿ™Ð
%Ñ&ôðDØ�x‰x×#Ñ#ðDØ03ðDàˆc�]ôDð˜eŸh™h×2Ñ2ð ¸sð ÀxÐPSÁ}ô ð$˜Ÿ™×-Ñ-ð °#ô ð	˜Ÿ™×-Ñ-ð 	°$°xÀ±}Ñ2Eô 	ðU7˜UŸX™X×1Ñ1ð U7À(È3Á-ð U7ÐTWô U7÷p)ñ )ñ  �lÑ0AÓ0CÒ Dð Øñ	*Ø�C˜�HÑð*à�S‰Mð*ð ð*ð ð	*ð
 ˆc�8˜C‘=Ð Ñ!ö*r$   