
    Ph                     
   d dl Z d dlZd dlmZ d dl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 d dlmZ d	d
lmZ d	dlmZ  e j*                  e      Zd Z G d de      Zd Zd Zd Z eee      Z ede       ddZy)    N)defaultdict)Set)GraphModule)partition_cudagraphs)StorageWeakRef)Module)tree_map   )aot_autograd)register_backendc                 Z    t        | t        j                        r| j                         S | S N)
isinstancetorchTensorclone)ts    lC:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_dynamo/backends/cudagraphs.pyclonerr      s!    !U\\"wwy    c                   P     e Zd ZU eed<   ee   ed<    fdZdZdZ	dZ
dZd Z xZS )CudaGraphModulegmmutated_inputsc                 >    t         |           || _        || _        y r   )super__init__r   r   )selfr   r   	__class__s      r   r   zCudaGraphModule.__init__   s    ,r   FNc                 F   | j                   t        |      t        | j                        k(  sJ t        | j                  |      D ]  \  }}|j	                  |        | j                   j                          | j                  D ]#  }||   j	                  | j                  |          % t        t        | j                        S | j                  r|D cg c]  }|j                          c}| _        t        j                  j                         | _         t        j                  j                  | j                         5   | j                  | j                   | _	        d d d        | j                   j                          | j                  D ]#  }||   j	                  | j                  |          % t        t        | j                        S t        j                  j!                         }|j#                  t        j                  j%                                t        j                  j'                  |      5   | j                  | }d d d        t        j                  j%                         j#                  |       d| _
        S c c}w # 1 sw Y   -xY w# 1 sw Y   QxY w)NT)graphlenstatic_inputszipcopy_replayr   r	   r   static_outputs	warmed_upr   r   cuda	CUDAGraphr   Streamwait_streamcurrent_streamstream)r   argsdstsrcixr.   rs           r   __call__zCudaGraphModule.__call__,   s   
 ::!t9D$6$6 7777 2 2D9S		# :JJ((Qd0034 )FD$7$788^^59!:T!'')T!:D--/DJ!!$**-&-dggt/A/A&B# . JJ((Qd0034 )FD$7$788 ZZ&&(Fuzz88:;""6*DGGTN +JJ%%'33F;!DNH' ";-- +*s   J J
7J
JJ )__name__
__module____qualname__r   __annotations__r   intr   r(   r!   r#   r'   r5   __classcell__)r   s   @r   r   r      s4    OH-
 I EMN#r   r   c           	      ,   d }t        t              }d}t               }| j                  D ]e  }|j                  dk(  rA|t	         ||j
                        j                                  j                  |       |dz  }T|j                  dk(  sd|j                  t        j                  u r|j                  j                  }t        |j                        D ]  \  }}|t        |j                        k  r|j                  |   }	n2|j                   |j"                  vrG|j"                  |j                      }	d}
|j$                  r|j$                  j&                  rd}
|
s||t	         ||	j
                        j                                  z  } h |S )Nc                     d| v r| d   S | d   S )Nvalfake_result )metas    r   meta_fkz%find_input_mutations.<locals>.meta_fkW   s    #tmtE{Dm1DDr   r   placeholderr
   call_functionFT)r   setnodesopr   rA   _typed_storageaddtargetoperatorgetitem_schema	enumerate	argumentsr"   r/   namekwargs
alias_infois_write)grB   inputs	input_idxr   nschemar2   argargumentmut_args              r   find_input_mutationsr\   V   sL   E FIUNWW44= >'!&&/"@"@"BCDHHSNITT_$xx8+++XX%%F#F$4$453s166{? vvayHxxqxx/  xx1H>>~~.."& #f&wx}}'='L'L'NO' N 6 4 r   c                 X   | j                   j                  D ]  }|j                  dk(  s|j                  rJ | j	                  |j
                        }| j                  |j
                         t        |j                         }| j                  |j
                  t        ||              y )Ncall_module)
r!   rF   rG   rQ   get_submodulerJ   delete_submoduler\   add_submoduler   )r   rW   submodr   s       r   apply_cuda_graphsrc   {   s{    XX^^44= xx<%%ahh/F)1&,,?NQXXv~'NO r   c                 4    t        | |      } t        |        | S r   )r   rc   )modelrU   s     r   
cudagraphsrf      s     /EeLr   )fw_compilerbw_compilerrf   )rP   compiler_fnc                   	 t        |t        t        f      sJ r$|D cg c]  }t        j                  |       c}nt        |      t        j
                  j                          t        j
                  j                         }|j                  t        j
                  j                                t        j
                  j                  |      5   | |  ddd       |j                          t        j
                  j                         j                  |       t        j
                  j                          t        j
                  j                         t        j
                  j                  |      5   |  	ddd       t        	t        t        f      s	f		fd}|S c c}w # 1 sw Y   xY w# 1 sw Y   >xY w)zBThis isn't registered as a backend, but is used in some benchmarksN)r.   c                      t              t        |       k(  sJ r%t        |       D ]  \  }}|j                  |        j                          rD cg c]  }|j	                          c}S S c c}w r   )r"   r$   r%   r&   r   )	
new_inputsr0   r1   r3   copy_inputscopy_outputsr!   r#   r'   s	       r   runzcudagraphs_inner.<locals>.run   so    =!S_444z:S		# ;'56~!AGGI~66!! 7s   A4)r   listtupler   
zeros_liker)   synchronizer+   r,   r-   r.   r*   r!   )
re   rU   rn   rm   r3   r.   ro   r!   r#   r'   s
     ``   @@@r   cudagraphs_innerrt      sO   ftUm,,,6<=f))!,f=V 
JJZZ F
uzz0023			6	"v 
#
	JJ++F3	JJ JJ  "E			%		/. 
0ntUm4(*	" 	" JA > 
#	" 
0	/s   F1F6?G6F?G)TT)loggingrK   collectionsr   typingr   r   torch.fxr   #torch.fx.passes.backends.cudagraphsr    torch.multiprocessing.reductionsr   torch.nnr   torch.utils._pytreer	   commonr   registryr   	getLoggerr6   logr   r   r\   rc   rf   aot_cudagraphsrt   r@   r   r   <module>r      s}      #     D ;  (   &g!5f 5x!JP **M
 l ?$r   