§
    ž²Åj±!  ã                   ó¶  — d dl Z d dlmZ d dlmZmZ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mZmZmZmZmZ d dlmZmZmZmZmZ d d	lmZ d
dlmZ d„ Zdej         j!        fd„Z"dej         j!        dee#         fd„Z$dej         j!        dee#         fd„Z%de&fd„Z'deee#                  fd„Z(d„ Z) G d„ d¦  «        Z* ed e*¦   «         ¬¦  «         dd„Z+dS )é    N)Údefaultdict)ÚDictÚListÚ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_backendc           	      ó,  — d„ }t          t          ¦  «        }d}t          ¦   «         }| j        D �]c}|j        dk    rvt	           ||j        ¦  «        t          j        ¦  «        rH|t           ||j        ¦  «         	                    ¦   «         ¦  «                  
                    |¦  «         |dz  }Œ„|j        dk    rÔt          |j        d¦  «        sŒ¥|j        j        }t          |j        ¦  «        D ]�\  }}|t!          |j        ¦  «        k     r|j        |         }	n!|j        |j        vrŒ:|j        |j                 }	d}
|j        r|j        j        rd}
|
r8||t           ||	j        ¦  «         	                    ¦   «         ¦  «                 z  }Œž�Œe|S )	Nc                 ó*   — d| v r| d         n| d         S )NÚvalÚfake_result© )Úmetas    úRC:\Projects\Historical\venv\Lib\site-packages\torch/_dynamo/backends/cudagraphs.pyÚmeta_fkz%find_input_mutations.<locals>.meta_fk    s   € Ø# t˜m˜mˆt�EŒ{ˆ{°°mÔ1DÐDó    r   Úplaceholderr   Úcall_functionÚ_schemaFT)r   ÚsetÚnodesÚopÚ
isinstancer   ÚtorchÚTensorr   Ú_typed_storageÚaddÚhasattrÚtargetr#   Ú	enumerateÚ	argumentsÚlenÚargsÚnameÚkwargsÚ
alias_infoÚis_write)Úgr   ÚinputsÚ	input_idxÚmutated_inputsÚnÚschemaÚiÚargÚargumentÚmut_args              r   Úfind_input_mutationsr@      s£  € ðEð Eð Eõ �ÑÔ€FØ€IÝ‘U”U€NØŒWð ñ ˆØŒ4�=Ò Ð Ý˜'˜' !¤&™/œ/­5¬<Ñ8Ô8ð XØ•~ g g¨a¬f¡o¤o×&DÒ&DÑ&FÔ&FÑGÔGÔH×LÒLÈYÑWÔWÐWØ˜‰NˆIˆIØŒT�_Ò$Ð$Ý˜1œ8 YÑ/Ô/ð Øà”XÔ%ˆFÝ# FÔ$4Ñ5Ô5ð ð ‘��3Ø•s˜1œ6‘{”{’?�?Ø œv aœy�H�Hà”x q¤xÐ/Ð/Ø Ø œx¨¬Ô1�HØ�Ø”>ð 'Ø”~Ô.ð 'Ø"&˜Øð ð # fÝ& w w¨x¬}Ñ'=Ô'=×'LÒ'LÑ'NÔ'NÑOÔOô'ñ �Nøùð
 Ðr    Úgmc                 ó¸   — i }| j         j        D ]J}|j                             dd ¦  «        }t	          |t
          j        ¦  «        r|j        |vr
|||j        <   ŒK|S )Nr   )Úgraphr%   r   Úgetr'   r(   r)   Údevice)rA   Údevice_node_mappingr:   Úts       r   Úget_device_node_mappingrH   F   se   € Ø=?ÐØŒXŒ^ð .ð .ˆØŒF�JŠJ�u˜dÑ#Ô#ˆÝ�a�œÑ&Ô&ð 	.¨1¬8Ð;NÐ+NÐ+NØ,-Ð ¤Ñ)øØÐr    Ú	aot_modelÚreturnc                 ó´   — t          | j        ¦  «        t          t          |¦  «        ¦  «        z
  }|sd S t	          | j        ¦  «        }t          ||¦  «        S ©N)r@   rC   r$   Úranger   r   )rI   Ú	num_fixedÚmutation_indicesÚplaceholderss       r   Ú3check_for_mutation_ignore_cuda_graph_managed_tensorrQ   O   sV   € õ ,¨I¬OÑ<Ô<½sÅ5ÈÑCSÔCSÑ?TÔ?TÑTÐØð Øˆtå'¨	¬Ñ8Ô8€LÝ# LÐ2BÑCÔCÐCr    c                 óØ   — t           j        st          | |¦  «        x}r|S t          t	          | ¦  «        ¦  «        x}r|S t          | ¦  «        x}rt          d|j        › d�¦  «        S d S )Nzincompatible op (ú))r   Ú(cudagraph_backend_support_input_mutationrQ   r   rH   r   r   r2   )rI   rN   Úmut_skipÚskipÚnodes        r   Úcheck_for_skiprX   Z   s”   € ÝÔ:ð ÝJØ�yñ
ô 
ð 
ˆ8ð 	ð ˆOå6Ý 	Ñ*Ô*ñô ð €tð ð ˆå4°YÑ?Ô?Ð?€tð MÝ*Ð+K¸t¼yÐ+KÐ+KÐ+KÑLÔLÐLàˆ4r    c                 ó|   — t          t          t          | ¦  «        ¦  «        ¦  «        }|j        dk    sJ ‚|j        S )NÚcuda)ÚnextÚiterrH   ÚtypeÚindex)rA   rE   s     r   Úget_device_indexr_   l   s;   € Ý•$Õ.¨rÑ2Ô2Ñ3Ô3Ñ4Ô4€FØŒ;˜&Ò Ð Ð Ð ØŒ<Ðr    c                 ó‚   — t          | ¦  «        }t          |j        ¦  «        dk    sJ ‚d„ |j        d         D ¦   «         S )Nr   c                 óh   — g | ]/}t          |t          j        j        j        ¦  «        r|j        nd ‘Œ0S rL   )r'   r(   ÚfxrW   ÚNodeÚstack_trace)Ú.0r=   s     r   ú
<listcomp>z$get_stack_traces.<locals>.<listcomp>u   sD   € ð ð ð àõ ' s­E¬H¬MÔ,>Ñ?Ô?Ð	IˆŒˆÀTðð ð r    r   )r   r0   r1   )rA   Úoutputs     r   Úget_stack_tracesrh   r   sO   € Ý˜‰_Œ_€FÝˆvŒ{ÑÔ˜qÒ Ð Ð Ð ðð à”;˜q”>ðñ ô ð r    c                 ó   ‡‡‡‡— ddl mŠ t          d¦  «        Št          d ¦  «        Šd	ˆˆˆˆfd„	}ˆˆˆfd„}t	          ||t          j        |d¬¦  «        t          j        j	        j
        ¬¦  «        } || ‰¦  «        S )
Nr   )Úcudagraphify_implTFc                 óð  •— t          | |¦  «        }t          t          ‰
¦  «        t          |¦  «        ¦  «        }t          | |¦  «        x}r(t	          j        ‰	¦  «         t          d|› �¦  «         |S ‰                     t          | ¦  «        ¦  «          ‰||t          |¦  «        ‰j
        ddt          | ¦  «        t          | j        ¦  «        t          | j        ¦  «        ¬¦	  «	        }d|_        |S )Nzskipping cudagraphs due to F©Údevice_indexÚis_backwardÚis_inferenceÚstack_tracesrP   Úmutated_input_idxsT)r	   r   r0   rX   r   Údisabler   r$   r_   rM   Úvaluerh   r   rC   r@   Ú_boxed_call)rI   Ú
aot_inputsro   ÚinterpÚfixedÚskip_msgÚoutÚboxed_device_indexrj   Údo_cudagraphsÚdynamo_inputss          €€€€r   Úforward_cudagraphsz&cudagraphs.<locals>.forward_cudagraphs�   sý   ø€ Ý˜9 jÑ1Ô1ˆÝ&¥s¨=Ñ'9Ô'9½3¸z¹?¼?ÑKÔKˆÝ% i°Ñ7Ô7Ð7ˆ8ð 	ÝÔ˜mÑ,Ô,Ð,Ý/Ø8¨hÐ8Ð8ñô ð ð ˆMà×ÒÕ/°	Ñ:Ô:Ñ;Ô;Ð;ØÐØØÝ�%‰LŒLØ+Ô1ØØÝ)¨)Ñ4Ô4Ý-¨i¬oÑ>Ô>Ý3°I´OÑDÔDð

ñ 

ô 

ˆð ˆŒØˆ
r    c                 óÞ  •‡ ‡— t          ‰ |¦  «        }‰
s‰ S t          ‰ ¦  «        }t          ‰ |¦  «        x}rNt          d|¦  «         t          j        j                             ‰j        d¬¦  «        Š‰€J ‚ˆ ˆfd„}d|_	        |S  ‰	||t          |¦  «        t          ‰ ¦  «        ddt          ‰ ¦  «        t          ‰ j        ¦  «        t          ‰ j        ¦  «        ¬¦	  «	        }d|_	        |S )Nzskipping cudagraphs due to %sF)Úcreate_if_none_existsc                 óB   •— ‰                      ¦   «           ‰| ¦  «        S rL   )Úset_to_running_backward)r7   rI   Úmanagers    €€r   Úfnz3cudagraphs.<locals>.backward_cudagraphs.<locals>.fn«   s%   ø€ Ø×/Ò/Ñ1Ô1Ð1Ø �y Ñ(Ô(Ð(r    Trl   )r	   r   rX   r   r(   Ú	_inductorÚcudagraph_treesÚget_managerrs   rt   rM   r_   rh   r   rC   r@   )rI   ru   rv   rw   rx   rƒ   ry   r‚   rz   rj   r{   s   `      @€€€r   Úbackward_cudagraphsz'cudagraphs.<locals>.backward_cudagraphsš   s+  øøø€ Ý˜9 jÑ1Ô1ˆØð 	ØÐå˜yÑ)Ô)ˆÝ% i°Ñ7Ô7Ð7ˆ8ð 	Ý/Ø/°ñô ð õ
 ”oÔ5×AÒAØ"Ô(Àð Bñ ô ˆGð Ð&Ð&Ð&ð)ð )ð )ð )ð )ð )ð "ˆBŒNØˆIàÐØØÝ�%‰LŒLÝ)¨)Ñ4Ô4ØØÝ)¨)Ñ4Ô4Ý-¨i¬oÑ>Ô>Ý3°I´OÑDÔDð

ñ 

ô 

ˆð ˆŒØˆ
r    )ro   )Úfw_compilerÚbw_compilerÚinference_compilerÚkeep_inference_input_mutations)F)Útorch._inductor.cudagraph_treesrj   r   r
   r   Ú	functoolsÚpartialr(   Ú_dynamor   Ú%cudagraph_backend_keep_input_mutation)Údynamo_modelr|   r}   r‡   Úaot_cudagraphsrz   rj   r{   s    `   @@@r   Ú
cudagraphsr“   {   sÑ   øøøø€ ØAÐAÐAÐAÐAÐAå˜d‘O”O€MÝ)¨$Ñ/Ô/Ððð ð ð ð ð ð ð ð ð2$ð $ð $ð $ð $ð $ð $õL "Ø&Ø'Ý$Ô,Ð-?ÈdÐSÑSÔSÝ',¤}Ô';Ô'að	ñ ô €Nð ˆ>˜,¨Ñ6Ô6Ð6r    c                   ó>   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         ZdS )ÚCudagraphsBackendr“   c                  ó&   — ddl m}   | ¦   «          d S )Nr   ©Úreset_cudagraph_trees)rŒ   r˜   r—   s    r   ÚresetzCudagraphsBackend.resetÌ   s)   € àIÐIÐIÐIÐIÐIàÐÑÔÐÐÐr    c                 ó"   — t          | |¦  «        S rL   )r“   )Úmodelr7   s     r   Ú__call__zCudagraphsBackend.__call__Ò   s   € å˜% Ñ(Ô(Ð(r    N)Ú__name__Ú
__module__Ú__qualname__Úcompiler_nameÚstaticmethodr™   rœ   r   r    r   r•   r•   É   sM   € € € € € Ø €Màð ð  ñ „\ð ð
 ð)ð )ñ „\ð)ð )ð )r    r•   r“   )r2   Úcompiler_fnTc                 ó¨  ‡‡‡‡‡— t          |t          t          f¦  «        sJ ‚‰rd„ |D ¦   «         Šnt          |¦  «        Št          j                             ¦   «          t          j                             ¦   «         }|                     t          j                             ¦   «         ¦  «         t          j         	                    |¦  «        5   | |Ž  ddd¦  «         n# 1 swxY w Y   |                     ¦   «          t          j                             ¦   «                              |¦  «         t          j                             ¦   «          t          j         
                    ¦   «         Št          j                             ‰|¬¦  «        5   | ‰Ž Šddd¦  «         n# 1 swxY w Y   t          ‰t          t          f¦  «        s‰fŠˆˆˆˆˆfd„}|S )zBThis isn't registered as a backend, but is used in some benchmarksc                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r   )r(   Ú
zeros_like©re   Úxs     r   rf   z$cudagraphs_inner.<locals>.<listcomp>à   s#   € Ð=Ð=Ð=°�Ô)¨!Ñ,Ô,Ð=Ð=Ð=r    N)Ústreamc                  óê   •— t          ‰¦  «        t          | ¦  «        k    sJ ‚‰r+t          ‰| ¦  «        D ]\  }}|                     |¦  «         Œ‰                     ¦   «          ‰rd„ ‰D ¦   «         S ‰S )Nc                 ó6   — g | ]}|                      ¦   «         ‘ŒS r   )Úcloner¦   s     r   rf   z1cudagraphs_inner.<locals>.run.<locals>.<listcomp>ü   s    € Ð6Ð6Ð6 !�A—G’G‘I”IÐ6Ð6Ð6r    )r0   ÚzipÚcopy_Úreplay)Ú
new_inputsÚdstÚsrcÚcopy_inputsÚcopy_outputsrC   Ústatic_inputsÚstatic_outputss      €€€€€r   Úrunzcudagraphs_inner.<locals>.runõ   s‡   ø€ Ý�=Ñ!Ô!¥S¨¡_¤_Ò4Ð4Ð4Ð4Øð 	Ý ¨zÑ:Ô:ð ð ‘��SØ—	’	˜#‘”��Ø�Š‰ŒˆØð 	"Ø6Ð6 ~Ð6Ñ6Ô6Ð6à!Ð!r    )r'   ÚlistÚtupler(   rZ   ÚsynchronizeÚStreamÚwait_streamÚcurrent_streamr¨   Ú	CUDAGraphrC   )	r›   r7   r³   r²   r¨   r¶   rC   r´   rµ   s	     ``  @@@r   Úcudagraphs_innerr¾   Ü   s5  øøøøø€ å�f�t¥U˜mÑ,Ô,Ð,Ð,Ð,Øð %Ø=Ð=°fÐ=Ñ=Ô=ˆˆå˜V™œˆõ 
„J×ÒÑÔÐÝŒZ×ÒÑ Ô €FØ
×Ò•u”z×0Ò0Ñ2Ô2Ñ3Ô3Ð3Ý	Œ×	Ò	˜6Ñ	"Ô	"ð ð Øˆˆvˆˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à
×ÒÑÔÐÝ	„J×ÒÑÔ×+Ò+¨FÑ3Ô3Ð3Ý	„J×ÒÑÔÐõ ŒJ× Ò Ñ"Ô"€EÝ	Œ×	Ò	˜%¨Ð	Ñ	/Ô	/ð /ð /Ø˜ Ð.ˆð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /å�n¥t­U mÑ4Ô4ð +Ø(Ð*ˆð	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð €Js$   ÃC Ã C$Ã'C$ÆFÆF#Æ&F#)TT),r�   Úcollectionsr   Útypingr   r   r   r(   Ú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   r@   rb   ÚGraphModulerH   ÚstrrQ   rX   Úintr_   rh   r“   r•   r¾   r   r    r   ú<module>rË      s†  ðð Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à €€€Ø  Ð  Ð  Ð  Ð  Ð  Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;à &Ð &Ð &Ð &Ð &Ð &ð$ð $ð $ðN ¤Ô 4ð ð ð ð ðDØŒxÔ#ðDàˆc„]ðDð Dð Dð Dð˜eœhÔ2ð À(È3Ä-ð ð ð ð ð$˜Cð ð ð ð ð˜D ¨#¤Ô/ð ð ð ð ðK7ð K7ð K7ð\)ð )ð )ð )ð )ñ )ô )ð )ð  Ð �lÐ0AÐ0AÑ0CÔ0CÐ DÑ DÔ DÐ Dð$ð $ð $ð $ð $ð $r    