
    PhG              	       F   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZmZmZm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mZ d dlmZ d dlm Z  d d	l!m"Z"m#Z# d d
l$m%Z% d dl&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2  ejf                  e4      Z5ee   Z6 e jn                  dddg      Z8g dZ9 ejt                  d      de;fd       Z<d+dee,   fdZ=dee,   dej|                  fdZ?	 	 d,de6dee@e@f   dee@   deAfdZBdee@e@f   fdZCdej2                  j@                  de6ddfd ZDej                  d!        ZF G d" d#      ZG G d$ d%      ZHej                   G d& d'             ZJ ej                         ZLd( ZMd)e@fd*ZNy)-    N)AnyDictListOptional)patch)
draw_graphget_aot_graph_nameget_graph_being_compiled)fx)save_graph_reprowrap_compiler_debug)get_debug_dir)GraphModule)_extract_tensor_metadataTensorMetadata)legalize_graph)tree_map   )configir)BaseSchedulerNodeFusedSchedulerNodeNopKernelSchedulerNode
OutputNodeSchedulerNode)VBufMetanamen_origin)dotz-Gnslimit=2z-Gnslimit1=2z-Gmaxiter=5000returnc                      	 t        j                  ddgt         j                         y# t         j                  $ r Y yw xY w)Nwhichr    )stderrTF)
subprocesscheck_outputPIPESubprocessError     `C:\Users\daisl\Desktop\realtime-object-detection\venv\Lib\site-packages\torch/_inductor/debug.pyhas_dotr,   .   s;    % 0I%% s   '* A A nodesc           
         t               st        j                  d       y|
t               }t	        |       }|j
                  D ]  }d|j                  vr|j                  d   j                  }t        |t              rt        |d   t              r|d   f}n|d   }d}t        |t        j                        r|j                  j                  }t        ||ddddd      }||j                  d<    |rt!        |       t#        i |      }t%        |       |j&                  j)                          t+        ||dt,        j.                  j0                         y)z$
    Draw a graph in fname.svg.
    z*draw_buffers() requires `graphviz` packageNfusion_metar   tensor_metaF)
clear_metadot_graph_shape)r,   logwarningr
   create_fx_from_snodesr-   metagroup
isinstancetupleintr   ComputedBufferdatadtyper   printr   r   graphlintr   r   tracer2   )	r-   print_graphfnamer?   noder7   r=   metadatagms	            r+   draw_buffersrG   7   s    9@A}(*!%(E		)		-(..eU#%(C(qa dB--.IIOOE!%dD$M#+		- ! $ e	R	B2HHMMO
EeV\\5Q5Qr*   snodesc                    d }t        j                  dg d      }i }t        j                  j	                         }d}g }d}| D ]  }|j                         rd}	|	}ns|j                         rd}	|	}n^t        |t              rd}	|	}nIt        |t              rd}	|j                  }n*t        |t              rd	}	|j                  }nt        d
      t        j                  j                  j                  |j!                         d      }
|	 d|
 } ||      }i }t#        |d      rd|j%                         i}|j'                  |d|      }fd |      r|j)                  |       |j+                         }||_         ||||	      |j.                  d<   t        |t              r$|j0                  D ]  }|||j+                         <    |||<   ||} | D ]  }|j+                         }|j2                  j4                  }||   }g }|D ]u  }|j,                  |v r||j,                     }nD|j7                  |      5  |j9                  |j,                        }|||j,                  <   ddd       |j)                         w t;        |      |_         |j?                  tA        |      dk(  r|d          |S t;        |             |S # 1 sw Y   cxY w)B
    Creates a FX Graph from a list of SchedulerNode objects.
    c                     d }| |_         |S )Nc                       yNr   r)   )argss    r+   func1z;create_fx_from_snodes.<locals>.get_fake_func.<locals>.func1g   s    r*   )__name__)r   rO   s     r+   get_fake_funcz,create_fx_from_snodes.<locals>.get_fake_funcf   s    	 r*   
FusionMeta)r7   snodetypeNexterntemplatenopcomputefusedzUnknown node typeoriginal_atenz: 
get_devicedevicer)   rN   kwargsc                     t        | t              rt        fd| j                  D              S t        d | j                  D              S )Nc              3   .   K   | ]  } |        y wNr)   ).0x	in_outputs     r+   	<genexpr>z;create_fx_from_snodes.<locals>.in_output.<locals>.<genexpr>   s     >A9Q<s   c              3   P   K   | ]  }t        |j                  t                 y wra   )r8   rD   r   )rb   users     r+   re   z;create_fx_from_snodes.<locals>.in_output.<locals>.<genexpr>   s     Q[Tz$))Z8[s   $&)r8   r   anyrH   users)rS   rd   s    r+   rd   z(create_fx_from_snodes.<locals>.in_output   s8    %!34>>>>QU[[QQQr*   r/   r   r   )!collections
namedtupletorchr   Graph	is_externis_templater8   r   r   r7   r   RuntimeError	_inductorutilsget_fused_kernel_name	get_nodeshasattrr[   call_functionappendget_namer   r6   rH   read_writesreadsinserting_beforeplaceholderr9   rN   outputlen)rH   rQ   rR   buf_to_fx_noder?   
first_nodeoutputsr7   rS   	node_type
fused_name	func_name	node_funcr^   fx_noder   rc   depsnew_argsdepdep_noderd   s                        @r+   r5   r5   a   s   
 ''6PQJNHHNNEJGE?? IE "IE56IE}-!IKKE12IKKE233__**@@OO

 !kJ<0	!),	5,' 0 0 23F%%ib%H	R
 UNN7#~~&0y&I]#e/0\\/6qzz|, "&t J_ d ~~  && &Cxx>))#((3++J7$00:H/7N388, 8 OOH%  X " 
LLs7|q0EL 7<GnEL 87s    +KKnode_name_to_buf_nameparent_buf_name	n_originsc                 X   | y | D ]  }|j                         }|j                         }| t        |      dkD  rt        ||||n|       Et        |      dk(  r|d   |k(  sJ |j                  }||j
                  x|j
                  D ]  }|j                  }	|	|vs||n|||	<     y )Nr   r   )rx   rt   r~   $update_orig_fx_node_name_to_buf_namerD   originsr   )
r-   r   r   r   rD   buf_namechildren_nodesir_nodeorigin	node_names
             r+   r   r      s     }==?)%#n*=*A0%+3
 ~&!+q0AT0III))?goo5ooFI  55 / 7H_ &i0 &# r*   c                     i }| j                         D ]$  \  }}||vr|h||<   ||   j                  |       & i }| j                         D ]"  \  }}t        ||         }t        ||      ||<   $ |S ra   )itemsaddr~   r   )r   buf_name_to_n_noder   r   node_name_to_buf_metan_nodes         r+   get_node_name_to_buf_metar      s    4::<	8--,5;x(x(,,Y7	  = 4::<	8'12+28V+Di(  = ! r*   rF   c                     i }t        ||       |yt        |      }| j                  j                  D ]9  }|j                  |v s|j                  |j                        |j                  d<   ; y)rJ   Nbuf_meta)r   r   r?   r-   r   getr6   )rF   rH   r   r   rD   s        r+   annotate_orig_fx_with_snodesr      sf     -/(1FG$56KL99--$9$=$=dii$HDIIj! r*   c               #     K   t         j                  j                  dd      dk(  } dd l}t	        j
                  |j                  j                  j                        }t        j                         }| s	 d  |j                          y |j                  t        dd             t         j                  j                  t!               d      }t         j                  j#                  |      st        j$                  |       t	        j&                  t         j                  j                  |dt)                d	            }|j+                  t        j,                         |j/                  t	        j0                  d
             |j3                  |       	 d  |j5                  |       |j                          y # |j                          w xY w# |j5                  |       |j                          w xY ww)NTORCH_COMPILE_DEBUG01r   z*functorch.compile.config.debug_partitionerTtorchinductoraot_z
_debug.log3[%(filename)s:%(lineno)d %(levelname)s] %(message)s)osenvironr   torch._functorch.aot_autogradlogging	getLogger
_functorchaot_autogradrP   
contextlib	ExitStackcloseenter_contextr   pathjoinr   existsmakedirsFileHandlerr	   setLevelDEBUGsetFormatter	Formatter
addHandlerremoveHandler)compile_debugrl   r3   stackr   fhs         r+   enable_aot_loggingr      sh    JJNN#8#>#EM(


E,,99BB
CC  "E	KKM 
JDQR77<<9D77>>$
D			
%'(
3	

B KKOOOP NN2"5 KKM2 	"s7   A1G54F: 8DG5G "G5:GG5#G22G5c                       e Zd Z ej                         Zed        Zedede	e   fd       Z
d ZdefdZdefd	Zd
efdZd Zd ZdedefdZd Zd Zd Zy)DebugContextc                 X     t        j                          fd       }t        |d      S )Nc                  T    t               5   | i |cd d d        S # 1 sw Y   y xY wra   )r   )rN   r^   fns     r+   innerz DebugContext.wrap.<locals>.inner.  s    4*6*  s   'inductor)compiler_name)	functoolswrapsr   )r   r   s   ` r+   wrapzDebugContext.wrap,  s-    			+ 
	+ #5
CCr*   folder_namer!   c                 6   t         j                  j                  xs
 t               }t        j
                  D ]`  }t        j                  j                  |d|  d|       }t        j                  j                  |      rIt        j                  |       |c S  y )Nr   .)r   rA   	debug_dirr   r   _counterr   r   r   r   r   )r   r   ndirnames       r+   create_debug_dirzDebugContext.create_debug_dir5  sv    LL**=mo	&&Aggll-q$G
 77>>'*G$ ' r*   c                 R    d | _         d | _        t        j                         | _        y ra   )_prof_pathr   r   _stack)selfs    r+   __init__zDebugContext.__init__C  s     

 **,r*   new_pathc                 f   | j                   sy |j                  d      sJ |       t        j                  j	                  |      rt        j                  |       	 t        j                  | j                   |       || _         y # t        $ r$ t        j                  d| j                   |       Y y w xY w)Nz.debugz(Failed to copy debug files from %s to %s)r   endswithr   r   r   shutilrmtreecopytreeOSErrorr3   r4   )r   r   s     r+   copyzDebugContext.copyH  s    zz  *4H4*77>>(#MM(#	OODJJ1!DJ 	KK:DJJ 		s   'B *B0/B0filenamec                     | j                   sJ t        t        j                  j	                  | j                   |      d      S )Nw)r   openr   r   r   r   r   s     r+   fopenzDebugContext.fopenW  s.    zzzBGGLLX6<<r*   suffixc                 r    | j                   sJ t        j                  j                  | j                   |      S ra   )r   r   r   r   )r   r   s     r+   r   zDebugContext.filename[  s'    zzzww||DJJ//r*   c                    t         j                  j                  dd l}| j                  sJ t
        j                  j                  | j                  t
        j                  j                  | j                         d      }|j                  |d      5 }|j                  | j                  t
        j                  j                  | j                               d d d        t         j                  j                  |       y y # 1 sw Y   *xY w)Nr   z.tar.gzzw:gz)arcname)r   rA   
upload_tartarfiler   r   r   r   basenamer   r   )r   r   tar_filetars       r+   r   zDebugContext.upload_tar_  s    <<"".:::ww||

rww//

;<GDH h/3

BGG,<,<TZZ,HI 0LL##H- / 0/s   ADD
c                 :   t         j                  rat        j                  d      j                  }j                  t        j                         fd}| j                  j                  ||       | j                  j                  t        j                  |              t         j                  j                  sy | j                  t                     | _        t         j                  j"                  r | j%                  dt        j                         t         j                  j&                  r | j%                  dt        j(                         t         j                  j*                  r4t-        j.                         | _        | j0                  j3                          y y )Nztorch._dynamoc                 (    j                  |        y ra   )r   )levelr3   s    r+   reset_log_levelz/DebugContext.__enter__.<locals>.reset_log_levelq  s    U#r*   z	debug.logzinfo.log)r   debugr   r   r   r   r   r   callbackr   r   set_debug_handlerrA   enabledr   r	   r   	debug_log_setup_log_captureinfo_logINFOcompile_profilecProfileProfiler   enable)r   
prev_levelr   r3   s      @r+   	__enter__zDebugContext.__enter__k  s   <<##O4CJLL'$ KK  *=!!!"5"5d";<||##**+=+?@
<<!!##K?<<  ##J=<<''!))+DJJJ (r*   r   c                    t        j                  d      }| j                  j                  | j	                  |            }t        j
                  |      }|j                  |       |j                  t        j                  d             |j                  |       |j                  t        |j                  |             | j                  j                  |j                  |       y )Nztorch._inductorr   )r   r   r   r   r   StreamHandlerr   r   r   r   minr   r   r   )r   r   r   r3   fdchs         r+   r   zDebugContext._setup_log_capture  s     12[[&&tzz(';<""2&
E
ST	
 	rSE*+S..3r*   c                 .   | j                   r*| j                   j                          | j                          | j                  r9| j	                          t
        j                  dt               | j                         | j                  j                          y )Nz%s debug trace: %s)
r   disable_save_profile_datar   r   r3   r4   r
   r   r   )r   exc_typeexc_valexc_tbs       r+   __exit__zDebugContext.__exit__  s_    ::JJ ##%::OOKK,.F.H$**Ur*   c                    | j                   sJ | j                   j                  | j                  d             | j                  d      5 }t	        j
                  | j                   |      }|j                          |j                  d       |j                  d       |j                  d       |j                  d       d d d        y # 1 sw Y   y xY w)Nzcompile.profzcompile.stats)streamcumtimed   tottime)	r   
dump_statsr   r   pstatsStats
strip_dirs
sort_statsprint_stats)r   r  statss      r+   r  zDebugContext._save_profile_data  s    zzz

dmmN;<ZZ(BLLB7EY'c"Y'c" )((s   
A6C		Cc                     t         j                  j                  r0t        t         j                  |      r	 t        t	        |       |      S d }|S # t
        $ r t        j                  dd       Y y w xY w)Nz Ignoring exception in debug codeT)exc_infoc                       y ra   r)   r]   s     r+   ignoredz)DebugContext.__getattr__.<locals>.ignored  s    r*   )r   rA   r   getattrDebugFormatter	Exceptionr3   r4   )r   r   r  s      r+   __getattr__zDebugContext.__getattr__  sd    <<GFLL$$?O~d3T::
 N  O>NOs   A  A32A3N)rP   
__module____qualname__	itertoolscountr   staticmethodr   strr   r   r   r   r   r   r   r  r:   r   r  r  r#  r)   r*   r+   r   r   )  s    y HD D c hsm  -
S =c =0s 0
. 4
43 
4s 
4	#r*   r   c                   (   e Zd Zd Zdej
                  j                  deej                     fdZ	dej
                  j                  deej                     fdZ
defdZdefdZd	edefd
ZdefdZdej
                  j                  defdZd Zy)r!  c                 V    |j                   | _         |j                  | _        || _        y ra   )r   r   handler)r   r,  s     r+   r   zDebugFormatter.__init__  s!    ]]
((r*   rF   inputsc                     | j                  d      5 }t        |||d       d d d        | j                  d      5 }|j                  |j                  d             d d d        y # 1 sw Y   ExY w# 1 sw Y   y xY w)Nzfx_graph_runnable.pyr   zfx_graph_readable.pyFprint_output)r   r   writeprint_readabler   rF   r-  r  s       r+   fx_graphzDebugFormatter.fx_graph  si    ZZ./2RVZ8 0 ZZ./2HHR&&E&:; 0/ 0/ 0/s   A%"A1%A.1A:c                     | j                  d      5 }|j                  |j                  d             d d d        y # 1 sw Y   y xY w)Nzfx_graph_transformed.pyFr/  )r   r1  r2  r3  s       r+   fx_graph_transformedz#DebugFormatter.fx_graph_transformed  s9     ZZ12bHHR&&E&:; 322s	   "=Ar-   c                 (    | j                  d|       y )Nzir_pre_fusion.txt	_write_irr   r-   s     r+   ir_pre_fusionzDebugFormatter.ir_pre_fusion  s    *E2r*   c                 (    | j                  d|       y )Nzir_post_fusion.txtr8  r:  s     r+   ir_post_fusionzDebugFormatter.ir_post_fusion  s    +U3r*   r   c                     | j                  |      5 }t        j                  d|j                         |D ]2  }|j	                  |j                                |j	                  d       4 	 d d d        y # 1 sw Y   y xY w)NzWriting debug ir to  %sz


)r   r3   infor   r1  	debug_str)r   r   r-   r  rD   s        r+   r9  zDebugFormatter._write_ir  sX    ZZ!RHH.8)*"  "!!s   AA44A=c                 <    t        || j                  d             y )Nzgraph_diagram.svg)rC   )rG   r   r:  s     r+   graph_diagramzDebugFormatter.graph_diagram  s    U$--0C"DEr*   c                     t        ||       t        || j                  d      dt        dt        j
                  j                         y )Nzorig_fx_graph_diagram.svgFT)rC   r1   progparse_stack_tracer2   )r   r   r   GRAPHVIZ_COMMAND_SCALABLEr   rA   r2   )r   rF   r-   s      r+   draw_orig_fx_graphz!DebugFormatter.draw_orig_fx_graph  s:    $R/-- ;<*""LL88	
r*   c                 N    t        j                  || j                  d             y )Nzoutput_code.py)r   r   r   r   s     r+   output_codezDebugFormatter.output_code  s    Hdmm,<=>r*   N)rP   r$  r%  r   rl   r   r   r   Tensorr4  r6  SchedulerNodeListr;  r=  r)  r9  rB  rG  rI  r)   r*   r+   r!  r!    s    
<588// <ell9K <<((&&<04U\\0B<3#4 34$5 4## #.? #F#4 F	
UXX%9%9 	
BS 	
?r*   r!  c                   6    e Zd ZU eed<   ej                  ed<   y)TensorMetadataHoldertensor_metadatar\   N)rP   r$  r%  r   __annotations__rl   r\   r)   r*   r+   rM  rM    s    ##LLr*   rM  c                     d}t         j                  j                  |      st        j                  |       d }t	        || |f      \  }}d}| d| dt        t               d}t        |d      5 }t        j                  ||f|       ddd       t        j                  t        j                        rd	| d
|d}	t        |	       yy# 1 sw Y   BxY w)z
    This function is used to save arguments for a compile_fx_inner function call
    to the file system.  Later on one can replay the compile_fx_inner call
    with the saved arguments using load_args_and_run_compile_fx_inner.
    z/tmp/inductor_saved_argsc                 x    t        | t        j                        rt        t	        |       | j
                        S | S )z
        Pickle FakeTensor will result in error:
        AttributeError: Can't pickle local object 'WeakValueDictionary.__init__.<locals>.remove'

        Convert all Tensor to metadata. This may also makes pickle faster.
        )r8   rl   rJ  rM  r   r\   rc   s    r+   handle_tensorz5save_args_for_compile_fx_inner.<locals>.handle_tensor  s.     a&'(@(CQXXNNHr*   compile_fx_inner/_z.pklwbNz3
Arguments for a compile_fx_inner call is saved to z. To replay the call,
run the following:

from torch._inductor.debug import load_args_and_run_compile_fx_inner
load_args_and_run_compile_fx_inner(z
)
        )r   r   r   mkdirr   nextsave_args_cntr   pickledumpr3   isEnabledForr   r   r>   )
rN   r^   folderrS  args_to_savekwargs_to_savefn_namer   fmessages
             r+   save_args_for_compile_fx_innerrd    s     (F77>>&!

 $,MD&>#J L. GXQwiqm!4 5T:D	dD	Q\>2A6 
 &337& 9$ %)8 ,	 	g ' 
	s   1CCr   c                    ddl m} t        | d      5 }t        j                  |      \  }}d d d        d }t
        j                  j                  d      }|5  t        j                  dd      5  t        |f      \  }} ||i |cd d d        cd d d        S # 1 sw Y   qxY w# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)	Nr   )rT  rbc                 
   t        | t              rrt        j                  j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                        S | S ra   )r8   rM  rl   _dynamotestingrand_stridedrN  shapestrider=   r\   rR  s    r+   rS  z9load_args_and_run_compile_fx_inner.<locals>.handle_tensor#  se    a-.==((55!!''!!((!!''	  Hr*   T)allow_non_fake_inputs	save_argsF)torch._inductor.compile_fxrT  r   r[  loadrl   _subclassesFakeTensorModer   r   r   )r   rT  rb  rN   r^   rS  	fake_modes          r+   "load_args_and_run_compile_fx_innerrt    s    ;	dD	Q{{1~f 
	 !!00t0LI	FLLe4f~>f00 54 
	 54s/   BB=0B(		B=B%(B1	-B==C)FNrM   )Orj   r   r   dataclassesr   r&  r   r   os.pathr[  r  r   r%   typingr   r   r   r   unittest.mockr   functorch.compiler   r	   r
   rl   r   torch._dynamo.repro.after_aotr   r   torch._dynamo.utilsr   torch.fx.graph_moduler   torch.fx.passes.shape_propr   r   torch.fx.passes.tools_commonr   torch.utils._pytreer    r   r   	schedulerr   r   r   r   r   virtualizedr   r   rP   r3   rK  rk   r   rF  	lru_cacheboolr,   rG   rm   r5   r)  r:   r   r   r   contextmanagerr   r   r!  	dataclassrM  r'  rZ  rd  rt  r)   r*   r+   <module>r     s          	      , ,  V V   O - - O 7 (   g!I 
 +
 
 VZ,@
AT  T  './ 'TY$'8"9 Ybhh Y~ &*	  S>  c]  	 F!T#s(^ !II&7I	I  & &RH HV/? /?d   
  	!+\1S 1r*   