
    rh                        U 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Zd dlZd dlmZ d dlmZmZmZmZmZ d dlmZ d dlZd dlmZ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& d dl'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z<  ejz                  e>      Z? e$e>d      Z@ e$e>d      ZAeBe   ZC e j                  dddg      ZEg dZFej                  deHfd       ZI	 	 dDdeBe6   deHdeeJ   ddfdZKd eBe6   dej                  fd!ZM	 	 dEdeeC   d"eNeJeJf   d#eeJ   d$eOddf
d%ZPd"eNeJeJf   deNeJeEf   fd&ZQd'ej<                  jL                  d eCddfd(ZRej                  ded   fd)       ZTi ZUeNeJef   eVd*<   dZWeeO   eVd+<    G d, d-      ZX G d. d/      ZYdeCddfd0ZZdeCddfd1Z[ej                   G d2 d3             Z] ej                         Z_d4eOd5eNeJef   d6eNeJef   deNeJeNeJef   f   fd7Z`d8ed9eddfd:Zad;eJdefd<Zbdd=d>ed?eJf   d@ej                  j                  dAeNeJef   dBee-   deJf
dCZey)F    N)Iterator)AnyCallableIOOptionalUnion)patch)
draw_graphget_aot_graph_nameget_graph_being_compiled)fx)save_graph_repro)get_debug_dir)getArtifactLogger)GraphModule)_extract_tensor_metadataTensorMetadata)legalize_graph)FileLike)
OrderedSet)tree_map   )configir)BaseSchedulerNodeFusedSchedulerNodeNopKernelSchedulerNode
OutputNodeSchedulerNode)Vir_pre_fusionir_post_fusionBufMetanamen_origin)dotz-Gnslimit=2z-Gnslimit1=2z-Gmaxiter=5000returnc                  0    t        j                  d      d uS )Nr&   )shutilwhich     h/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/_inductor/debug.pyhas_dotr.   5   s    <<d**r,   nodesprint_graphfnamec           
         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   tracer6   )	r/   r0   r1   rC   noder;   rA   metadatagms	            r-   draw_buffersrI   :   s"    9@A}(*!%(E ,		)		-(..eU#%(C(qa dB--.IIOOE!%dD$M#+		- !,$ e	R	B2HHMMO
EeV\\5Q5Qr,   snodesc                 
   dt         dt        dt        f   fd}t        j                  dg d      }i }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|      }dt.        t0        t        f   dt2        ffd |	      r|j5                  |       |	j7                         }||_         |||	|
      |j:                  d<   |||<   |	j=                         D ]  }|||j7                         <    ||} | D ]  }	|	j7                         }|	j>                  j@                  }||   }g }|D ]{  }|j8                  |v r||j8                     }nD|jC                  |      5  |jE                  |j8                        }|||j8                  <   ddd       |k(  rk|j5                  |       } tG        |      |_$         |jK                  tM        |      dk(  r|d          |S tG        |             |S # 1 sw Y   ixY w)B
    Creates a FX Graph from a list of SchedulerNode objects.
    r$   r'   .c                 4    dt         dt        fd}| |_        |S )Nargsr'   c                       yNr   r+   )rN   s    r-   func1z;create_fx_from_snodes.<locals>.get_fake_func.<locals>.func1n   s    r,   )r   r>   __name__)r$   rQ   s     r-   get_fake_funcz,create_fx_from_snodes.<locals>.get_fake_funcm   s#    	 	 	 r,   
FusionMeta)r;   snodetypeNexterntemplatenopcomputefusedzUnknown node typeoriginal_atenz: 
get_devicedevicer+   rN   kwargsrU   c                     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   r   K   | ]/  }|j                   D ]  }t        |j                  t                 1 y wrc   )usersr<   rF   r   )rd   bufusers      r-   rg   z;create_fx_from_snodes.<locals>.in_output.<locals>.<genexpr>   s<      II  499j11s   57)r<   r   anyrJ   get_outputs)rU   rf   s    r-   rf   z(create_fx_from_snodes.<locals>.in_output   sF    %!34>>>>  ,,.  r,   r3   r   r   )'strr   r>   collections
namedtupletorchr   Graph	is_externis_templater<   r   r   r;   r   RuntimeError	_inductorutilsget_fused_kernel_name	get_nodeshasattrr]   call_functionr   r   boolappendget_namer$   r:   rm   read_writesreadsinserting_beforeplaceholderr=   rN   outputlen)rJ   rS   rT   buf_to_fx_nodenode_to_fx_noderC   
first_nodeoutputsr;   rU   	node_type
fused_name	func_name	node_funcr`   fx_noder$   rj   depsnew_argsdepdep_noderf   s                         @r-   r9   r9   h   s   
C HS#X$6  ''6PQJNOHHNNEJGE 2!?? 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	U#46H#HI 	d 	 UNN7#~~&0y&I]# '$$& 	5C-4N3<<>*	5  Je2!j  '~~  &&!$' 		&Cxx>))#((3++J7 8$00:H/7N388,8 7"OOH%		& X#'& 
LLs7|q0EL 7<GnEL8 8s   &+K99L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   )r~   ry   r   $update_orig_fx_node_name_to_buf_namerF   originsr$   )
r/   r   r   r   rF   buf_namechildren_nodesir_nodeorigin	node_names
             r-   r   r      s     } ==?)%#n*=*A0%+3
 ~&!+q0AT0III))?goo5oo 	FI  55 / 7H_ &i0	#r,   c                     i }| j                         D ]-  \  }}||vrt        |g      ||<   ||   j                  |       / i }| j                         D ]"  \  }}t        ||         }t	        ||      ||<   $ |S rc   )itemsr   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	8--+5yk+Bx(x(,,Y7	8 4::< E	8'12+28V+Di(E ! r,   rH   c                     i }t        ||       |yt        |      }| j                  j                  D ]9  }|j                  |v s|j                  |j                        |j                  d<   ; y)rL   Nbuf_meta)r   r   rC   r/   r$   getr:   )rH   rJ   r   r   rF   s        r-   annotate_orig_fx_with_snodesr      sm     -/(1FG$56KL I99--$9$=$=dii$HDIIj!I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"                  |d       t	        j$                  t         j                  j                  |d	t'                d
            }|j)                  t        j*                         |j-                  t	        j.                  d             |j1                  |       	 d  |j3                  |       |j                          y # |j                          w xY w# |j3                  |       |j                          w xY ww)NTORCH_COMPILE_DEBUG01r   z*functorch.compile.config.debug_partitionerTtorchinductor)exist_okaot_z
_debug.log3[%(filename)s:%(lineno)d %(levelname)s] %(message)s)osenvironr   torch._functorch.aot_autogradlogging	getLogger
_functorchaot_autogradrR   
contextlib	ExitStackcloseenter_contextr	   pathjoinr   makedirsFileHandlerr   setLevelDEBUGsetFormatter	Formatter
addHandlerremoveHandler)compile_debugrq   r7   stackr   fhs         r-   enable_aot_loggingr     sZ    JJNN#8#>#EM(


E,,99BB
CC  "E	KKM 
JDQR77<<9DKKt$			
%'(
3	

B KKOOOP NN2"3 KKM0 	"s7   A1G4F 8C>G7F2 ;"GF//G2#GG _inductor_post_to_pre_grad_nodes_pre_grad_graph_idc                   ~   e Zd ZU  ej                         Zi Zeee	e   f   e
d<   ededee   fd       ZddZdeddfdZ	 dd	ed
edededee   f
dZej(                  	 dd	ed
edededeee      f
d       ZdedefdZddZddZd	ededdfdZdeee      dee   dee   ddfdZddZdedee d      fdZ!y)DebugContext._inductor_triton_kernel_to_post_grad_node_info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   rE   	debug_dirr   r   _counterr   r   r   existsr   )r   r   ndirnames       r-   create_debug_dirzDebugContext.create_debug_dirE  s{    LL**=mo	&& 	Aggll-q$G
 77>>'*G$	 r,   Nc                 R    d | _         d | _        t        j                         | _        y rc   )_prof_pathr   r   _stack)selfs    r-   __init__zDebugContext.__init__S  s     

 **,r,   new_pathc                    | j                   sy |j                  d      sJ |       ddlm} 	  || d      5  t        j
                  j                  |      rt        j                  |       t        j                  | j                   |       d d d        y # 1 sw Y   y xY w# t        $ r$ t        j                  d| j                   |       Y y w xY w)Nz.debugr   )FileLockz.lockz(Failed to copy debug files from %s to %s)r   endswithfilelockr   r   r   r   r)   rmtreecopytreeOSErrorr7   r8   )r   r   r   s      r-   copyzDebugContext.copyX  s    zz  *4H4*%	XJe,- 677>>(+MM(+

H56 6 6  	KK:DJJ	s/   B" ABB" BB" B" "*CCfilename
write_moderN   r`   c                     | j                   sJ t        t        j                  j	                  | j                   |      |g|i |S rc   r   openr   r   r   )r   r   r   rN   r`   s        r-   fopenzDebugContext.fopenh  s:     zzzBGGLLX6
TTTVTTr,   c              /      K   | j                   sJ t        t        j                  j	                  | j                   |      |g|i |5 }| d d d        y # 1 sw Y   y xY wwrc   r   )r   r   r   rN   r`   fs         r-   fopen_contextzDebugContext.fopen_contextr  sW      zzz"'',,tzz84jR4R6R 	VWG	 	 	s   AA#	A	A#A A#suffixc                 r    | j                   sJ t        j                  j                  | j                   |      S rc   )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   rE   
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/ J3

BGG,<,<TZZ,HIJLL##H- /J Js   ADD
c                    t         j                  rjt        j                  d      j                  }j                  t        j                         dt        dd f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*                         y y )Nztorch._dynamolevelr'   c                 (    j                  |        y rc   )r   )r   r7   s    r-   reset_log_levelz/DebugContext.__enter__.<locals>.reset_log_level  s    U#r,   z	debug.logzinfo.log)r   debugr   r   r   r   r   r   r   callbackr   r    set_debug_handlerrE   enabledr   r   r   	debug_log_setup_log_captureinfo_logINFO)r   
prev_levelr   r7   s      @r-   	__enter__zDebugContext.__enter__  s    <<##O4CJLL'$s $t $ KK  *=!!!"5"5d";<||##**+=+?@
<<!!##K?<<  ##J= !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   r7   fdchs         r-   r  zDebugContext._setup_log_capture  s    
  12[[&&tzz(';<""2&
E
ST	
 	rSE*+S..3r,   exc_typeexc_valexc_tbc                 .   | 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   r7   r8   r   r   r   )r   r  r  r  s       r-   __exit__zDebugContext.__exit__  sa     ::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r$   ).Nc                 
   t         j                  j                  r0t        t         j                  |      r	 t        t	        |       |      S dt        dt        dd fd}|S # t
        $ r t        j                  dd       Y y w xY w)Nz Ignoring exception in debug codeT)exc_inforN   r`   r'   c                       y rc   r+   r_   s     r-   ignoredz)DebugContext.__getattr__.<locals>.ignored  s    r,   )	r   rE   r   getattrDebugFormatter	Exceptionr7   r8   r   )r   r$   r!  s      r-   __getattr__zDebugContext.__getattr__  sy    <<GFLL$$?~d3T::s c d  N  >Ns   A  BB)r'   N)w)"rR   
__module____qualname__	itertoolscountr   r   dictrn   list__annotations__staticmethodr   r   r   r   r   r   r   r   contextmanagerr   r   r   r   r  r>   r  rV   BaseExceptionr  r  r   r%  r+   r,   r-   r   r   ?  s   y H LN2Dd3i4HMc hsm  -
S T & UU U 	U
 U 
CU  		 	 		
 	 
"S'		 	0s 0s 0
.>.44 4 
	4 4./ -( 	
 
	# )1D(E r,   r   c                      e Zd ZdeddfdZdej                  j                  deej                     ddfdZ
dej                  j                  deej                     ddfdZd	eddfd
Zd	eddfdZed	edefd       Zd	eddfdZdej                  j                  d	eddfdZddededdfdZ	 ddedeeeee   f   eeef   f   fdZdedeej4                     dedef   dededee   ddfdZy)r#  handlerr'   Nc                 x    |j                   | _         |j                  | _        |j                  | _        || _        y rc   )r   r   r   r2  )r   r2  s     r-   r   zDebugFormatter.__init__  s/    ]]
$22((r,   rH   inputsc           
         | j                  d      5 }d }t        j                  j                  j                  j
                  rRt        j                  j                  j                  |      }t        j                  j                  |j                        }t        j                  j                  j                  j
                  }t        j                  j                  j                  ddd      5  t        |||d||       d d d        d d d        | j                  d      5 }|j                  |j!                  d             d d d        y # 1 sw Y   MxY w# 1 sw Y   QxY w# 1 sw Y   y xY w)Nzfx_graph_runnable.pyF)ztrace.enabledztrace.save_real_tensorsinductor)save_dirstable_hashzfx_graph_readable.pyprint_output)r   rq   rv   r   rE   save_real_tensors_subclasses
fake_utilstry_convert_fake_to_realr   r   r   r$   r	   r   writeprint_readable)r   rH   r4  r	  r7  r8  s         r-   fx_graphzDebugFormatter.fx_graph  s+   
 ZZ./ 	2H%%++==**55NNvV77??2773
  //0066HHK''--"'EJ 
 !% +
	, ZZ./ 	<2HHR&&E&:;	< 	<
 
	 	,	< 	<s0   CE/EE""E%E	EE"%E.c                     | j                  d      5 }|j                  |j                  d             d d d        y # 1 sw Y   y xY w)Nzfx_graph_transformed.pyFr9  )r   r?  r@  )r   rH   r4  r	  s       r-   fx_graph_transformedz#DebugFormatter.fx_graph_transformed  sB    
 ZZ12 	<bHHR&&E&:;	< 	< 	<s	   "=Ar/   c                     | j                  d      5 }|j                  | j                  |             d d d        y # 1 sw Y   y xY w)Nzir_pre_fusion.txtr   r?  	_write_irr   r/   r	  s      r-   r!   zDebugFormatter.ir_pre_fusion  s;    ZZ+, 	,HHT^^E*+	, 	, 	,	   !<Ac                     | j                  d      5 }|j                  | j                  |             d d d        y # 1 sw Y   y xY w)Nzir_post_fusion.txtrE  rG  s      r-   r"   zDebugFormatter.ir_post_fusion  s;    ZZ,- 	,HHT^^E*+	, 	, 	,rH  c                     t        j                         }| D ]2  }|j                  |j                                |j                  d       4 |j	                         S )Nz


)ioStringIOr?  	debug_strgetvalue)r/   rj   rF   s      r-   rF  zDebugFormatter._write_ir  sI    kkm 	 DIIdnn&'IIh	  ||~r,   c                 <    t        || j                  d             y )Nzgraph_diagram.svg)r1   )rI   r   )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)r1   r5   progparse_stack_tracer6   )r   r
   r   GRAPHVIZ_COMMAND_SCALABLEr   rE   r6   )r   rH   r/   s      r-   draw_orig_fx_graphz!DebugFormatter.draw_orig_fx_graph  s<    
 	%R/-- ;<*""LL88	
r,   r   	extensionc                 T    t        j                  || j                  d|              y )Nzoutput_code.)r)   r   r   )r   r   rV  s      r-   output_codezDebugFormatter.output_code-  s     Hdmml9+,FGHr,   c                    i }| j                  |d      5 }t        j                  d|j                         t        j
                  }t        j                  ||       d d d        i }t        rJ| j                  dd      5 }t        t        t        |      }t        j                  ||       d d d        ||fS ||fS # 1 sw Y   _xY w# 1 sw Y   ||fS xY w)Nr&  z/Writing provenance tracing debugging info to %sz/inductor_provenance_tracking_node_mappings.json)r   r7   infor$   r   r   jsondumpr   create_node_mappingr   )r   r   
debug_infor	  node_mappings        r-   1log_inductor_triton_kernel_to_post_grad_node_infoz@DebugFormatter.log_inductor_triton_kernel_to_post_grad_node_info0  s     
ZZ#& 	&"HHFP%TTJIIj"%	& A3 ,2&(H*  		,+, <''z<''	& 	&, <''s   AB:>,C:CCr$   input_nodestimingsChoiceCallerelapseprecompile_elapseprescreening_elapsec           	      N   ddl m dt         j                  dt        t        t        f   ffd|t
        j                  j                         t
        j                  j                         |D cg c]
  } |       c}|||d}| j                  ddd	
      5 }	|j                         D ][  \  }
}t        |
j                               }|j                  |       ||d<   t        j                  ||	       |	j                  d       ] 	 d d d        y c c}w # 1 sw Y   y xY w)Nr   )FixedLayoutrF   r'   c           	          t        | d      r| j                  }nd}|t        |       j                  d}	 | j	                         }t        |      rd}	 t        |j                        } |j                  |j                  g t        j                  j                  j                  |j                         g t        j                  j                  j                  |j"                        |      }t%        |      |d<   nt%        |      |d<   	 t%        | j'                               |d<   	 t%        | j)                               |d	<   	 t%        t        j                  j                  j                  | j+                                     |d
<   	 t%        t        j                  j                  j                  | j-                                     |d<   	 t%        t        j                  j                  j                  | j/                                     |d<   t        | d      r9t        | j0                  t2        j4                        r | j0                        |d<   |S # t        $ rJ 	 t        j                  j                  j                  |j                  d      }n# t        $ r Y nw xY wY Cw xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y aw xY w# t        $ r Y -w xY w# t        $ r Y w xY w)Nr$    )r$   rV   r   )fallback)rA   sizestrideoffsetlayoutrA   r^   rm  rl  numelr@   )rz   r$   rV   rR   get_output_specr<   r>   rn  r$  r    rC   sizevars	size_hintr^   rA   
size_hintsrl  rm  rn   	get_dtyper]   
get_strideget_size	get_numelr@   r   IRNode)rF   r   	node_inforo  rn  static_layoutrh  build_node_infos         r-   r|  z>DebugFormatter.log_autotuning_results.<locals>.build_node_infoN  s   tV$ II		!T
++I--/fk2F!!$V]]!3 %0$llHqww//::6;;GHL!1!1!<!<V]]!KL%%M +.m*<Ih'*-f+Ih'%()9%:	'"&)$//*;&<	(#&)GG$$//0AB'	(#
$'(8(8(C(CDMMO(T$U	&!%()9)9)C)CDNNDT)U%V	'" tV$DIIryy)I$3DII$>	&!W % !!%&WW%5%5%?%? & &@ &F  ) ! !!"            s   J1 I *B$J1 K ,K 	AK! AK1 AL 	J.%5JJ.	J'$J.&J''J.*J1 -J..J1 1	J>=J>	KK	KK!	K.-K.1	K>=K>	LL)op_namecuda_device_namecuda_device_countra  autotuning_timeprecompile_timeprescreening_timezautotuning_result_json_list.txtatzutf-8)encodingbenchmark_result
)r   rh  ry  r+  rn   rq   cudaget_device_namedevice_countr   r   	info_dictupdater[  r\  r?  )r   r$   ra  rb  rd  re  rf  rF   general_propertiesr	  callertimer  rh  r|  s                @@r-   log_autotuning_resultsz%DebugFormatter.log_autotuning_resultsC  s    	$:	")) :	S#X :	z  %

 : : <!&!8!8!:>IJdOD1J%0!4
 -tg   
 	 '  !1!1!34	  !3404	,-		)R(	 	 K
	 	s   2D
A/DD$)py)z1inductor_generated_kernel_to_post_grad_nodes.json)rR   r'  r(  r   r   rq   r   r   r,  TensorrA  rC  SchedulerNodeListr!   r"   r.  rn   rF  rP  rU  rX  r=   r+  r   r`  r   ry  floatr   r  r+   r,   r-   r#  r#    s     <HH  < U\\"< 
	<<<HH  < U\\"< 
	<,#4 , ,,$5 ,$ , * s  F#4 F F
HH  
 !
 
	
IC IC I4 I R((	tCcN#T#s(^3	4(&XX "))_X ne+,	X
 X !X &e_X 
Xr,   r#  c                     t         j                  t        j                        r)t         j	                  dt
        j                  |              t        j                  j                  |        y )NzBEFORE FUSION
%s)
ir_pre_fusion_logisEnabledForr   r  rZ  r#  rF  r    r   r!   r/   s    r-   log_ir_pre_fusionr    sB    %%gll32N4L4LU4STGG% r,   c                     t         j                  t        j                        r)t         j	                  dt
        j                  |              t        j                  j                  |        y )NzAFTER FUSION
%s)
ir_post_fusion_logr  r   r  rZ  r#  rF  r    r   r"   r  s    r-   log_ir_post_fusionr    sB    &&w||4 2N4L4LU4STGG5!r,   c                   6    e Zd ZU eed<   ej                  ed<   y)TensorMetadataHoldertensor_metadatar^   N)rR   r'  r(  r   r-  rq   r^   r+   r,   r-   r  r    s    ##LLr,   r  pre_grad_graph_idpost_to_pre_grad_nodes_jsontriton_kernel_to_post_grad_jsonc           	         i i i i d}t         j                  d       t        |t              st         j	                  d       |S t        |t              st         j	                  d       |S t        | t
              st         j	                  d       |S t        j                  t              }t        j                  t              }t        j                  t              }	 |j                         D ]I  \  }}t        |t              st         j	                  d       |c S |D ]  }	||	   j                  |        K dt        t        t        f   dt        fd	}
|j                         D ]<  \  }}t        |t              st         j	                  d
       |c S |D ]  } |
|      s|c c S |j                  d      | k(  r.||d      j                  |       ||   j                  |d          |j                  dg       D cg c]  }||f }}|sx|j!                         \  } |
|      s|c c S |j                  d      | k(  r.||d      j                         |   j                  |d          |j#                  fd|j                  dg       D               |r
 ? dt        t        t        f   ddfd} ||        ||        ||       ||||dS c c}w # t$        $ r}t         j	                  d|       t         j	                  d|       t         j	                  d|       t         j	                  d|        t         j	                  t'        j(                                |cY d}~S d}~ww xY w)zCreate bidirectional mappings between:

    - pre_grad graph nodes and post_grad graph code nodes, and vice versa
    - triton kernel name and post_grad graph code nodes, and vice versa
    )	preToPost	postToPrecppCodeToPostpostToCppCodez.Creating node mappings for provenance trackingzCProvenance tacking error: post_to_pre_grad_nodes_json is not a dictzGProvenance tacking error: triton_kernel_to_post_grad_json is not a dictz9Provenance tacking error: pre_grad_graph_id is not an intzMProvenance tacking error: triton_kernel_to_post_grad_json value is not a listrF   r'   c                     t        | t              st        j                  d       yd| vsd| vsd| vrt        j                  d       yy)NzVProvenance tacking error: node provenance in post_to_pre_grad_nodes_json is not a dictFgraph_idr$   	from_nodezYProvenance tacking error: node provenance in post_to_pre_grad_nodes_json has wrong formatT)r<   r+  r7   error)rF   s    r-   check_formatz)create_node_mapping.<locals>.check_format  sN    dD)		l %t);{RV?V		o r,   zIProvenance tacking error: post_to_pre_grad_nodes_json value is not a listr  r$   r  c              3   &   K   | ]  }|f 
 y wrc   r+   )rd   r   
parent_keys     r-   rg   z&create_node_mapping.<locals>.<genexpr>  s      !,-J!s   dNc                 J    | D ]  }t        | |         | |<    t        |       } y rc   )r,  r+  )r  keys     r-   convert_sets_to_listsz2create_node_mapping.<locals>.convert_sets_to_lists  s+     &af#&QAr,   z+Unexpected error in create_node_mapping: %sz post_to_pre_grad_nodes_json:  %sz$triton_kernel_to_post_grad_json:  %szpre_grad_graph_id:  %s)r7   rZ  r<   r+  r  r>   ro   defaultdictr   r   r,  r   rn   r   r|   r   popextendr$  	traceback
format_exc)r  r  r  empty_returnpre_to_postpost_to_prepost_to_cpp_code	outer_key
node_array	curr_noder  rF   r   r   current_noder  er  s                    @r-   r]  r]    sM    	/L HH=>148		WX5t<		U	
 '-		MN"-"9"9*"EK"-"9"9*"EK'2'>'>z'JK%D%J%J%L 	;!Izj$/		c $#' ;	 +//	:;	;	tCH~ 	$ 	 &A%F%F%H 	!Izj$/		_ $#" #D)''88J'+<<V-11)<	*..tF|< 26+r1JKA!YKK/4yy{,L*'5++#''
37HH#L$89==jI#J/33L4HILL !1=1A1A+r1R!  	6	T#s(^ 	 	 	k*k*./$$<-	
 	
+ L6  
 			?C		46QR		24S	
 			*,=>		)&&()
sX   >K% A9K% K% ,AK% K K%  K% 3A.K% "=K%  K% %	M9.B M4.M94M9rN   r`   c                     d}t         j                  j                  |      st        j                  |       dt        dt        f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_argsre   r'   c                 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.
        )r<   rq   r  r  r   r^   re   s    r-   handle_tensorz5save_args_for_compile_fx_inner.<locals>.handle_tensor6  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   r   nextsave_args_cntr   pickler\  r7   r  r   r   rB   )
rN   r`   folderr  args_to_savekwargs_to_savefn_namer   r   messages
             r-   save_args_for_compile_fx_innerr  +  s     (F77>>&!

 
 
 $,MD&>#J L. GXQwiqm!4 5T:D	dD	 7Q\>2A67 &337& 9$ %)8 ,	 	g '7 7s   >CC!r   c                    ddl m} t        | d      5 }t        j                  |      \  }}d d d        dt
        dt
        f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   ~xY w# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   )r  rbre   r'   c                 
   t        | t              rrt        j                  j                  j                  | j                  j                  | j                  j                  | j                  j                  | j                        S | S rc   )r<   r  rq   _dynamotestingrand_stridedr  shaperm  rA   r^   r  s    r-   r  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_fxr  r   r  loadr   rq   r<  FakeTensorModer   r	   r   )r   r  r   rN   r`   r  	fake_modes          r-   "load_args_and_run_compile_fx_innerr  Y  s    ;	dD	 &Q{{1~f&	 	 	 !!00t0LI	 1FLLe4 1f~>f001 1 1& &1 1 1 1 1s/   B)&C
=B5	C
)B25B>	:C

C)package_pathfunc.exported_programinductor_configsr  c                   ddl m} ddlm} ddlm} ddlm} |j                  j                  }|j                         }	t        |	t        j                  j                        sJ |j                  \  }
}	 |r$|j                  j                   dk(  r ||d|       |r|j                  j                   d	k(  rt#        j$                  |	      }t#        j$                  |j                        }t#        j$                  |      } |||d   |d
   |      \  }}t'        |      }t        j(                  j)                  ||d      } | |j                         |||dd        | |	|
||||      S # |$ r(} ||dd|       t*        j-                  d       |d }~wt.        $ r2}|r)d}|j                  j                   d
k(  rd} ||d||       |d }~ww xY w)Nr   )AccuracyError)dump_to_minify)r   )_aoti_flatten_inputs   aot_inductor)options   r   F)strictTaccuracy)r  r  load_and_runcheck_accuracy)r  r  r  aot_inductor_accuracyminify)commandr  zAccuracy failedrun)torch._dynamo.debug_utilsr  torch._dynamo.repro.aotir  torch._inductorr   r  r  r  dump_aoti_minifiermoduler<   rq   r   r   example_inputsrepro_levelr   deepcopyr=   exportr7   r8   r$  )r  r  r  r  r  r  r   r  use_minifierrH   rN   r`   gm_copyexample_inputs_copyconfig_copyflat_example_inputstuple_inputsflattened_epr  r  s                       r-   aot_inductor_minifier_wrapperr  p  s    87&?&&99L		 	 	"Bb%((..///#22LD&>F//;;q@ (
 F//;;q@ mmB'G"&--0@0O0O"P--(89K/C#A&#A&#	0, !!45L <<..wU.SL##%!,)!) -%%
 	
  #$		
 	%& G""..!3 (	 s%   5C5E+ +G0#FG-GG)FNrP   )fro   r   r   dataclasses	functoolsrK  r)  r[  r   r   os.pathr  r  r)   r  collections.abcr   typingr   r   r   r   r   unittest.mockr	   rq   functorch.compiler
   r   r   r   torch._dynamo.repro.after_aotr   torch._dynamo.utilsr   torch._loggingr   torch.fx.graph_moduler   torch.fx.passes.shape_propr   r   torch.fx.passes.tools_commonr   torch.typesr   torch.utils._ordered_setr   torch.utils._pytreer   rj  r   r   	schedulerr   r   r   r   r   virtualizedr    r   rR   r7   r  r  r,  r  rp   r#   rT  cacher|   r.   rn   rI   rr   r9   r+  r>   r   r   r   r/  r   r   r-  r   r   r#  r  r  	dataclassr  r*  r  r]  r  r  r  ExportedProgramr  r+   r,   r-   <module>r     s        	    	      $ 5 5   V V  : - , - O 7   / (    g!%h@ &x1AB I 
 +
 
 VZ,@
AT  + + + +!"++ C=+ 
	+\_$'8"9 _bhh _J &*	 %& S>  c]  	 
 
 F!S>!	#w,!"III 
I" %HTN % %V 46  $sCx. 5$( HSM (\ \~} }@!. !4 !"/ "D "   
  	!ss!%c3hs &*#s(^s 
#tCH~
	sl+# + + +\1S 1S 18 (,Q
38
Qll22Q 38n	Q
 8$Q 	Qr,   