U
    zhu9                     @   s  d dl Z d dlZd dlmZmZmZmZ d dlZd dlm	Z	m
Z
 d dlmZmZ d dlmZmZmZ d dlmZ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mZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z' d dl(m)Z)m*Z* d dl+m,Z, erd dl-m.Z. ee/dZ0ee/dZ1dd Z2e3ddddZ4dd Z5dd Z6G dd dZ7da8d a9e j:dd Z;e j:d d! Z<dd"d#d$Z=dS )%    N)DictListOptionalTYPE_CHECKING)call_backward	call_hookGetItemSourceLocalSource)counterslazy_format_graph_codeset_locals_to_steal)getArtifactLoggertrace_structuredclone_preserve_strides)FakeTensorMode)GraphModule)BackwardState)	decomposedisable_autocast_cachedisable_proxy_modes_tracingfetch_object_proxyProxyTorchDispatchModePythonKeyTracertrack_tensor_tree)
DimDynamicShapeEnv)preserve_node_metaset_stack_trace)CapturedTraceback)Proxycompiled_autogradcompiled_autograd_verbosec                   C   s   t jjjdS )Nr#   )torchZ_logging	_internalZ	log_stateZis_artifact_enabled r&   r&   Q/var/www/html/venv/lib/python3.8/site-packages/torch/_dynamo/compiled_autograd.py snapshot_verbose_logging_enabled#   s    
r(   )msgreturnc                 C   s   t |  d S N)verbose_logdebug)r)   r&   r&   r'   cpp_verbose_log_fn)   s    r.   c                   C   s   t jjjjS r+   )r$   Z	_inductorconfigZtritonZ
cudagraphsr&   r&   r&   r'   snapshot_cudagraph_enabled-   s    r0   c                 C   s   | d k	rt | S | S r+   r   )xr&   r&   r'   maybe_clone1   s    r2   c                   @   s   e Zd ZddddZdd ZeedddZee	j
 ee d	d
dZedddZdd ZedddZdd Zdd Zdd Zee dddZdd Zdd Zd d! Zd"d# Zed$d%d&Zd'd( ZdS ))AutogradCompilerInstanceNr*   c                 C   sT   || _ t | _| jj| _t | _tdd| jd| _t	 | _
t| j
d| _d | _d S )NT)Zallow_fallback_kernelsZallow_non_fake_inputs	shape_envZsymbolic)compiler_fn
contextlib	ExitStackstackcloser   r5   r   fake_tensor_moder   	fx_tracerr   
proxy_modehooks_proxy)selfr6   r&   r&   r'   __init__8   s    

z!AutogradCompilerInstance.__init__c                 C   s    t |tjst| jj||dS )N)source)
isinstancer$   TensorAssertionErrorr;   Zfrom_tensor)r?   r1   rA   r&   r&   r'   	wrap_fakeF   s    z"AutogradCompilerInstance.wrap_fakec                 C   s   t t| |S r+   r   )nameidxr&   r&   r'   rA   J   s    zAutogradCompilerInstance.source)inputssizesc                    s2  t d d  d7  < tj j_tjjtdj_	i j_
jdddi  jdddi }jdd	di _fd
dt|D } fddtt|D }|| fddt|D }|| jti  jj jjj jj jt  jt  ||fS )Nr"   Zcaptures   )Z
tracer_clsplaceholderrH   r&   rI   hooksc              	      s$   g | ]\}}  | d |qS )rH   )rE   rA   ).0rG   r1   r?   r&   r'   
<listcomp>X   s   z:AutogradCompilerInstance.begin_capture.<locals>.<listcomp>c                    s   g | ]} | qS r&   r&   rM   i)
args_proxyr&   r'   rO   \   s     c              	      s*   g | ]"\}} j | d |tjqS )rI   )r5   Z$create_unspecified_symint_and_symbolrA   r   ZDYNAMIC)rM   rG   valrN   r&   r'   rO   `   s   
)r   r$   nnModuler<   rootfxZGraphr   graphZtensor_attrscreate_proxyr>   	enumeraterangelenbind_tensors_to_proxiesr9   enter_contextr   r;   r=   Zsym_moder   r   )r?   rH   rI   Zsizes_proxyproxiesr&   )rR   r?   r'   begin_captureN   s.    

z&AutogradCompilerInstance.begin_capture)backward_idxc              
   C   s   | j d k	st| j | }| jjdt|| |f| |i d}t X g }|D ]<}|d krh|d  qP|\}	}
}}|tj	|||	|
d qP| 
|| W 5 Q R X t|S )Ncall_function)kindtargetargskwargs)sizedtypelayoutdevice)r>   rD   r<   rY   r   to_proxyr   appendr$   emptyr]   tuple)r?   rH   Zoutput_metadatasZsaved_tensorsra   Zbackward_c_functionr_   Zgrad_insZoutput_metadatari   rj   rh   rg   r&   r&   r'   proxy_call_backwards   s0    

z,AutogradCompilerInstance.proxy_call_backwardc                    s&    j dt|f fdd|D i S )Nrb   c                    s   g | ]}  |qS r&   rk   rM   r1   rN   r&   r'   rO      s     z<AutogradCompilerInstance.proxy_call_hook.<locals>.<listcomp>)r<   rY   r   )r?   hookre   r&   rN   r'   proxy_call_hook   s    z(AutogradCompilerInstance.proxy_call_hook)rQ   c              	   C   sb   | j d k	st| j | }| ||| }t * t|| ||< | || g|g W 5 Q R X |S r+   )r>   rD   rs   r   r2   r]   )r?   rH   hook_idrQ   rr   proxyr&   r&   r'   tensor_pre_hook   s    
z(AutogradCompilerInstance.tensor_pre_hookc              	   C   sT   | j d k	st| j | }| ||}t   dd |D }| || W 5 Q R X |S )Nc                 S   s   g | ]}t |qS r&   r2   rq   r&   r&   r'   rO      s     z5AutogradCompilerInstance.pre_hook.<locals>.<listcomp>r>   rD   rs   r   r]   )r?   rH   rt   rr   r_   r&   r&   r'   pre_hook   s    
z!AutogradCompilerInstance.pre_hookc              	   C   sV   | j d k	st| j | }| |||}t   dd |D }| || W 5 Q R X |S )Nc                 S   s   g | ]}t |qS r&   rw   rq   r&   r&   r'   rO      s     z6AutogradCompilerInstance.post_hook.<locals>.<listcomp>rx   )r?   outputsrH   rt   rr   r_   r&   r&   r'   	post_hook   s    
z"AutogradCompilerInstance.post_hookc              	   C   s`   t |tjst| jd k	st| j| }| ||}t  t|g}| || W 5 Q R X |S r+   )	rB   r$   rC   rD   r>   rs   r   r2   r]   )r?   inputrt   rr   r_   r&   r&   r'   post_acc_grad_hook   s    

z+AutogradCompilerInstance.post_acc_grad_hookc                 C   s6  i }d}t |j}|d jdks$t|d }t |j }d}|| |d ksRt|t| d }|| |d ksvtt|D ]|\}	}
|s|
jd j	j
dkrd	}q~|
jd j	j
d
k}t|
jd  dk}|r~|r~t |
j }tdd |D r~|
||	< q~|r2| D ]}
|
jd  |
jd< q
t | S g S )NFr   rH      rJ   rS   cudaTcpuc                 s   s*   | ]"}t |jtjjo |jjd kV  qdS ))ZprimsZatenN)rB   rd   r$   Z_opsZ
OpOverload	namespace)rM   userr&   r&   r'   	<genexpr>   s   zDAutogradCompilerInstance.move_graph_nodes_to_cuda.<locals>.<genexpr>)listnodesrd   rD   Zuserskeysr\   rZ   metarj   typerg   allvaluesr   )r?   rX   Zto_moveZhas_cuda_inputsr   rH   Zinputs_usersZfirst_getitem_idxZlast_getitem_idxrQ   nodeZis_cpuZ	is_scalarZ
node_usersr&   r&   r'   move_graph_nodes_to_cuda   s6    

z1AutogradCompilerInstance.move_graph_nodes_to_cudac              	      s   | j   | jdd| j| |fi  |   g t rL| | jj	t
| jj| jj	d t dg tdtd  tdtd dd td fd	d
d fdd}||  fS )NoutputZCompiledAutogradrH   z%szCompiled autograd graphT)Zinclude_deviceZcompiled_autograd_graphc                      s    j ddS )NF)Zprint_output)Zprint_readabler&   )rX   r&   r'   <lambda>      z6AutogradCompilerInstance.end_capture.<locals>.<lambda>)Z
payload_fnc                    s&    D ]}||   ||< q| |||S r+   )r   )Zcompiled_fnrH   rI   rL   rQ   )runtime_inputs_to_mover&   r'   runtime_wrapper   s    z=AutogradCompilerInstance.end_capture.<locals>.runtime_wrapper)r9   r:   r<   Zcreate_nodeZ
create_argrk   reorder_accumulate_grad_nodesr0   r   rX   r   rV   r   compiled_autograd_loginfor   r,   r-   r   r6   )r?   rz   r   r&   )rX   r   r'   end_capture  sF    
     
z$AutogradCompilerInstance.end_capturec                 C   sL   | j jjdtjjjjdD ],}t|j	}||j
k	r|jdkr|| qdS )a  
        Usage of AOTAutograd causes all the accumulate_grad_ nodes to get pushed to the end of
        the graph.  This differs from eager mode, which schedules them as soon as possible. This
        pass attempts to reorder the graph to mimic eager behavior.
        rb   )oprd   rK   N)r<   rX   Z
find_nodesr$   ZopsZinductorZaccumulate_grad_defaultmaxre   prevr   rl   )r?   r   argr&   r&   r'   r   (  s     


z6AutogradCompilerInstance.reorder_accumulate_grad_nodesc                    sn   |d krd S t |tr( fdd|D S t |trHt fdd|D S t |tjtjfs^tt j|j	S )Nc                    s   g | ]}  |qS r&   rp   rq   rN   r&   r'   rO   9  s     z5AutogradCompilerInstance.to_proxy.<locals>.<listcomp>c                 3   s   | ]}  |V  qd S r+   rp   rq   rN   r&   r'   r   ;  s     z4AutogradCompilerInstance.to_proxy.<locals>.<genexpr>)
rB   r   rn   r$   rC   ZSymIntrD   r   r<   ru   )r?   tr&   rN   r'   rk   5  s    

z!AutogradCompilerInstance.to_proxyc                    sR   t  tjjr( fddtt|D  t|t ks<tt| d | jd d S )Nc                    s   g | ]} | qS r&   r&   rP   r_   r&   r'   rO   A  s     zDAutogradCompilerInstance.bind_tensors_to_proxies.<locals>.<listcomp>ZconstantZtracer)	rB   r$   rW   r!   r[   r\   rD   r   r<   )r?   Ztensorsr_   r&   r   r'   r]   ?  s    z0AutogradCompilerInstance.bind_tensors_to_proxies)indexc                 C   s4   | j d k	st| j | }t }t||d | jd |S )Nr   )r>   rD   r   r   r<   )r?   r   ru   Zbw_stater&   r&   r'   bind_backward_stateE  s
    
z,AutogradCompilerInstance.bind_backward_statec                 C   s8   t   d }| d| d}|d|}t| d S )Nr   z (NodeCall )z:raw_stack_trace = CapturedTraceback.extract().format()[-1])r    extractformatreplacer   )r?   Z	node_nameZ
node_indexZraw_stack_traceZnew_codeZnew_stack_tracer&   r&   r'   set_node_originL  s     z(AutogradCompilerInstance.set_node_origin)__name__
__module____qualname__r@   rE   staticmethodr	   rA   r   r$   rC   intr`   ro   rs   rv   ry   r{   r}   r   r   r   rk   r]   r   r   r&   r&   r&   r'   r3   7   s&   *#)'
r3   Fc              	   c   s   t jjjtt| }t r.t jjj	t
 datd7 az"t jd d V  W 5 Q R X W 5 td8 a|sndat jjj| X d S )NTrJ   F)r$   _C_dynamor"   set_autograd_compiler	functoolspartialr3   r(   set_verbose_loggerr.   compiled_autograd_enabledcompiled_autograd_enabled_countZautogradZset_multithreading_enabled)r6   priorr&   r&   r'   enableg  s    

r   c               	   c   s>   t jjjd } daz
d V  W 5 | r(dat jjj|  X d S )NFT)r$   r   r   r"   r   r   )r   r&   r&   r'   disable{  s    
r   r4   c                  C   s4   d} t dksttjjjd  tjjjd  d S )NFr   )r   rD   r$   r   r   r"   r   r   )Zcompiled_autograd_enabler&   r&   r'   reset  s    r   )>r7   r   typingr   r   r   r   r$   Ztorch._dynamo.external_utilsr   r   Ztorch._dynamo.sourcer	   r
   Ztorch._dynamo.utilsr   r   r   Ztorch._loggingr   r   Ztorch._prims_commonr   Ztorch._subclassesr   Ztorch.fxr   Z%torch.fx.experimental._backward_stater   Z"torch.fx.experimental.proxy_tensorr   r   r   r   r   r   r   Z%torch.fx.experimental.symbolic_shapesr   r   Ztorch.fx.tracebackr   r   Ztorch.utils._tracebackr    Ztorch.fx.proxyr!   r   r   r,   r(   strr.   r0   r2   r3   r   r   contextmanagerr   r   r   r&   r&   r&   r'   <module>   sB   $	

   

