
    i'                       U d Z ddlm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 ddlmZm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" ddl#m$Z$ dd	l%m&Z& dd
l'm(Z(m)Z)m*Z* ddl+m,Z, erddl-Z-ddl.m/Z/ ddl0m1Z1m2Z2  G d de3      Z4 ejj                  e6      Z7dZ8ejr                  dDd       Z: ejv                  d       G d d             Z<ejv                   G d d             Z=da>de?d<   da@de?d<   daAde?d<    eB       aCde?d<    ejv                  d       G d  d!             ZD ed"      ZE G d# d$ej                        ZGeGj                  ZI G d% d&ej                        ZJeJj                  ZKejv                   G d' d(             ZLdd)	 	 	 	 	 	 	 	 	 dEd*ZMdd)	 	 	 	 	 	 	 	 	 dEd+ZNdFd,ZOdGd-ZPdHd.ZQdId/ZRdJd0ZSdKd1ZTdLd2ZUdMd3ZVdNd4ZWdOd5ZXdPd6ZYe)j                   G d7 d8e(             Z[dQd9Z\dRd:Z]	 dS	 	 	 	 	 	 	 dTd;Z^dRd<Z_dUd=Z`dVd>ZadOd?ZbdWd@ZcdUdAZddXdYdBZedOdCZfy)Za  
Profile Guided Optimization (PGO) implementation for Dynamo.

This module provides functionality for caching and managing code state profiles
that guide optimization decisions in Dynamo. It implements both local and remote
caching mechanisms for storing profile information across runs, handles profile
merging across distributed ranks, and manages the lifecycle of profile data
during compilation. The profiles track dynamic vs static properties of tensors
and help Dynamo make better specialization decisions.
    )annotationsN)defaultdict)OptionalTYPE_CHECKINGTypeVarUnion)overrideSelf)CompileEventLoggerdynamo_timedset_feature_use	warn_once)	is_fbcode)trace_structured_artifact)CacheArtifactCacheArtifactFactoryCacheArtifactManager)
OrderedSet)InstructionTranslator)
JsonDataTyRemoteCachec                      e Zd Zy)ReservedWorkflowIdUserErrorN)__name__
__module____qualname__     K/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/pgo.pyr   r   7   s    r   r   
   c                    t         j                  j                  |       s| S t        | d      5 }|j	                         }t        j                  |      }t        |dz  d      }|cd d d        S # 1 sw Y   y xY w)Nrbl    08x)ospathexistsopenreadzlibcrc32format)filepathfilecontentcrc32_valuehashs        r   _hash_containing_filer1   r   sg     77>>(#	h	 ))+jj)kJ.6	  s   6A..A7T)frozenc                  `    e Zd ZU ded<   ded<   ded<   ded<   ddZddZdd	Zedd
       Zy)CodeIdstrfilenameintfirstlinenoname	file_hashc                    t        |t              sy| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S NF)
isinstancer4   r:   r8   r9   selfothers     r   __eq__zCodeId.__eq__   sR    %(NNeoo- (  E$5$55(		UZZ'	
r   c                Z    t        | j                  | j                  | j                  f      S N)r0   r:   r9   r8   r?   s    r   __hash__zCodeId.__hash__   s"    T^^TYY0@0@ABBr   c                n    d| j                    d| j                   d| j                   d| j                   S )Nzhash():)r:   r6   r8   r9   rD   s    r   __str__zCodeId.__str__   s5    t~~&aa8H8H7I499+VVr   c                    t        | j                  | j                  | j                  t	        | j                              S rC   )r4   co_filenameco_firstlinenoco_namer1   )codes    r   makezCodeId.make   s6    LL!$"2"23	
 	
r   N)r@   objectreturnbool)rQ   r7   rQ   r5   )rN   types.CodeTyperQ   r4   )	r   r   r   __annotations__rA   rE   rI   staticmethodrO   r   r   r   r4   r4      s>    M
I N
CW 
 
r   r4   c                  @    e Zd ZU  ej                  d       Zded<   y)	CodeStatec                      t        t              S rC   )r   FrameStateSizeEntryr   r   r   <lambda>zCodeState.<lambda>   s    ,? @ r   )default_factoryz%defaultdict[str, FrameStateSizeEntry]automatic_dynamicN)r   r   r   dataclassesfieldr]   rU   r   r   r   rX   rX      s!    ?P{?P?P@@< r   rX   (Optional[defaultdict[CodeId, CodeState]]_INIT_CODE_STATE_CODE_STATEFrR   _LOGGED_DYNAMIC_ALLOWLISTzset[str]_KNOWN_DYNAMIC_SOURCESc                      e Zd ZU dZded<   y)InferStrideaX  
    Denotes the quantity stride[dim] * size[dim], which is what the stride would
    be for the next physical dimension that results in a contiguous layout.

    For example, given size = [2, 3], stride = [3, 1], we can replace this with
    stride = [InferStride(1), 1], because InferStride(1) = stride[1] * size[1] = 1 * 3 = 3

    Indirecting the representation in this way is important for the join operation
    on strides as if we join [2, 3][3, 1] and [2, 4][4, 1],
    we don't want [2, None][None, 1] which would get eventually symbolized into
    [2, s0][s1, 1] (notice that the relationship between s0 and s1 is broken).
    If we instead rewrite the expressions as InferStride so we have [2, 3][InferStride(1), 1]
    and [2, 4][InferStride(1), 1] we now join to [2, None][InferStride(1), 1] will
    result in [2, s0][s0, 1], as desired.
    r7   dimN)r   r   r   __doc__rU   r   r   r   rf   rf      s      
Hr   rf   _Tc                      e Zd ZdZdZy)	AutoUnsetz
    The identity element of our semilattice, a generic "don't know" element that
    is always subsumed when we get more information.
    r   Nr   r   r   rh   tokenr   r   r   rk   rk          
 Er   rk   c                      e Zd ZdZdZy)AutoDynamicz
    The top element of our (bounded) semilattice, whenever you merge this with
    any other element you always get it again
    r   Nrl   r   r   r   rp   rp      rn   r   rp   c                  J   e Zd ZU  ej                  e      Zded<    ej                  e      Zded<    ej                  e      Z	ded<   ddZ
dd	Zdd
ZddZedd       Zedd       Ze	 	 	 	 	 	 dd       Zedd       Zedd       Ze	 	 	 	 	 	 dd       ZddZy)rZ   )defaultz"Union[int, AutoDynamic, AutoUnset]scalarzBUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic], ...]]sizezOUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic, InferStride], ...]]stridec                   ddd	fd}| j                   t        u r4| j                  t        u r"| j                  t        u ryd| j                   S | j                  t        u r\t	        | j                   t
              rBt	        | j                  t
              r(d || j                          d || j                         S dt        |        S )
Nc                |    | t         u ry| t        u ryt        | t              rd| j                   dS t        |       S )N?z
auto unsetzS(rG   )auto_dynamic
auto_unsetr=   rf   rg   r5   )ss    r   render_singlez1FrameStateSizeEntry.render.<locals>.render_single   s<    L j#A{+AEE7!}$1vr   c                D    ddj                  fd| D              z   dz   S )N[z, c              3  .   K   | ]  } |        y wrC   r   ).0r{   r|   s     r   	<genexpr>zCFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>   s     "@=#3"@s   ])join)ssr|   s    r   render_tuplez0FrameStateSizeEntry.render.<locals>.render_tuple   s"    "@R"@@@3FFr   zfully dynamic scalar or tensorzscalar ztensor size=z stride=zunusual )r{   z/Union[int, AutoDynamic, AutoUnset, InferStride]rQ   r5   )r   z0tuple[Union[int, AutoDynamic, InferStride], ...]rQ   r5   )rt   ry   ru   rs   r=   tuplerepr)r?   r   r|   s     @r   renderzFrameStateSizeEntry.render   s    			G 99$)D{{l*7 ..[[L($))U+
4;;0N%l499&=%>h|TXT_T_G`Fabb $t*&&r   c                   t        | j                  t        j                        rJ | j                         t        | j                  t
              r2| j                  D ]#  }t        |t        j                        sJ |        t        | j                  t
              r3| j                  D ]#  }t        |t        j                        sJ |        y y rC   )r=   rs   torchSymIntrt   r   ru   )r?   r{   s1s      r   __post_init__z!FrameStateSizeEntry.__post_init__  s    dkk5<<8E$++E8dii'YY :%a6996:dkk5)kk <%b%,,7;;7< *r   c                x    | j                   t        u ry| j                   t        u ry| j                   |   t        u S )NTF)rt   ry   rz   r?   rg   s     r   is_size_dynamicz#FrameStateSizeEntry.is_size_dynamic  s3    99$99
"yy~--r   c                    t        | j                  t              rt        d | j                  D              sy| j                  t
        u ry| j                  t        u ry| j                  |   t
        u S )Nc              3  >   K   | ]  }t        |      t        u   y wrC   )typer7   )r   r{   s     r   r   z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>/  s     0SAaC0Ss   FT)r=   rt   r   allru   ry   rz   r   s     r   is_stride_dynamicz%FrameStateSizeEntry.is_stride_dynamic  sX    " tyy%(S0S0S-S;;,&;;*${{3<//r   c                &    t        d | D              S )Nc              3  `   K   | ]&  }t        |t        j                        rt        n| ( y wrC   )r=   r   r   ry   )r   xs     r   r   z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>:  s"     TAZ5<<%@\aGTs   ,.)r   )xss    r   _munge_symintz!FrameStateSizeEntry._munge_symint8  s    TQSTTTr   c                .    t        |t        t              S N)rs   rt   ru   )rZ   ry   )clsr   s     r   make_scalarzFrameStateSizeEntry.make_scalar<  s    "!,|TTr   c                b    t        t        | j                  |      | j                  |            S r   )rZ   ry   r   )r   rt   ru   s      r   make_tensorzFrameStateSizeEntry.make_tensor@  s0     #""4($$V,
 	
r   c                L    t        t        | j                  |      t              S r   )rZ   rz   r   )r   rt   s     r   	make_sizezFrameStateSizeEntry.make_sizeJ  s#    """4(
 	
r   c                d    | t         u r|S |t         u r| S | t        u s|t        u s| |k7  rt        S | S rC   )rz   ry   )r   ys     r   _merge_atomzFrameStateSizeEntry._merge_atomR  s:    
?H
?H\ 1Q!Vr   c                     |t         u r|S |t         u r|S |t        u s|t        u rt        S t        |      t        |      k7  rt        S t         fdt	        ||      D              S )Nc              3  H   K   | ]  \  }}j                  ||        y wrC   )r   )r   r   r   r   s      r   r   z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>j  s      Ctq!S__Q*Cs   ")rz   ry   lenr   zip)r   r   yss   `  r   _merge_atom_tupz#FrameStateSizeEntry._merge_atom_tup\  sa     II|!3r7c"gCs2r{CCCr   c                   | j                  | j                  |j                        | _        | j                  | j                  |j                        | _        | j                  | j                  |j                        | _        | S rC   )r   rs   r   rt   ru   r>   s     r   __ior__zFrameStateSizeEntry.__ior__l  s[    &&t{{ELLA((EJJ?	**4;;Er   NrS   rQ   None)rg   r7   rQ   rR   )r   tuple[int, ...]rQ   z#tuple[Union[AutoDynamic, int], ...])r   r7   rQ   rZ   )rt   r   ru   r   rQ   rZ   )rt   r   rQ   rZ   )r   ri   r   ri   rQ   zUnion[AutoDynamic, _T])r   -Union[AutoDynamic, AutoUnset, tuple[_T, ...]]r   r   rQ   zAUnion[AutoDynamic, AutoUnset, tuple[Union[AutoDynamic, _T], ...]])r@   r
   rQ   r
   )r   r   r   r^   r_   rz   rs   rU   rt   ru   r   r   r   r   rV   r   classmethodr   r   r   r   r   r   r   r   r   rZ   rZ      s)   1B1B1B:1VF.V 	*- 	
L 
 	*-   .':<.04 U U U U 
"
,;
	
 
 
 
   D9D :D 
K	D Dr   rZ   is_unspecialized_nn_modulec          
       
 t         j                  | j                        }t               |   }t        j
                  j                  j                  r|j                  v }|j                     }t        j                  |      
|z  }|r
j                  |j                  k7  rt        j                  dj                  
j                         t        j                  dddt        
j                        t        j                        d       |rt        j!                  d       	 d	 	 	 	 	 	 	 	 	 d
fd}|r
j"                  |j"                  k7  rt%        
j"                  t&              rt%        j"                  t&              rt)        
j"                        t)        j"                        k7  r |dd	d
       n]t+        t)        j"                              D ]1  }	
j"                  |	   j"                  |	   k7  s# |dd|	 dd|	       3 n
 |ddd       |r
j,                  |j,                  k7  rt%        
j,                  t&              rt%        j,                  t&              rt)        
j,                        t)        j,                        k7  r |dd	d
       |S t+        t)        j,                              D ]1  }	
j,                  |	   j,                  |	   k7  s# |dd|	 dd|	       3 |S  |ddd       |S |j                     
t        j                  d
j                  j                         |j                  <   }|S )Nz%automatic dynamic int %s val %s != %sr]   rs   zscalar changer9   dim_changedreasoncachednewz%s is converted to a symbolic integer. It is an attribute of a user defined nn module class. If you wish to keep it static, you can mark the nn module class as `torch._dynamo.mark_static`.c           
        |t        |       nt        |       |   }|t        |       nt        |       |   }t        j                  d| |||       t        j                  d|dn||t        |      t        |      d       y )Nz#automatic dynamic %s %s %s %s != %sr]   r   r   )getattrlogdebugr   instantr5   )	tup_nameshort_reasonlong_reasoni	entry_tupold_entry_tupentryr9   	old_entrys	         r   log_tupz)update_automatic_dynamic.<locals>.log_tup  s     -.Ix(75(;STU;V 
 9 	8,Y1!4 
 II5 &&# ,-I51)!-0y>	r   rt   rg   zdimensionality changezsize(rG   zsize changer@   ru   zstride(zstride changez9automatic dynamic is off, overwriting int %s val %s -> %srC   )
r   r5   r   r5   r   r5   r   zOptional[int]rQ   r   )r4   rO   f_codeget_code_stater   _dynamoconfigautomatic_dynamic_shapesr]   copyrs   r   r   r   r   r5   infort   r=   r   r   rangeru   )txr9   r   r   code_idframe_state	is_update	mut_entryr   r   r   s    ``       @r   update_automatic_dynamicr   s  s
    kk"))$G "7+K}}44K999	11$7	IIi(	U	 ))Y-=-==II7  	 &&# #+-!)"2"23u||,	 *O 	 TX		),	;>	CP		> 9>>9)..%0Z

E5Ry~~&#ejj/9FE+BC"3uzz?3 L$>>!,

1=#FeA3aL-KL 1))Y-=-==)**E2z%,,PU7Vy''(C,==He-DE$ ! #3u||#45 R$++A.%,,q/A#Hs!noqQR   '73   11$7			GLL		
 /4%%d+	r   c                  | j                   x}t        | |||      S |j                  ||j                  j                  |<   |S d }|j                  D ]-  }||j                  v st        | ||j                  |   |      }/ |J |S )Nr   )distributed_stater   
all_stateslocal_stater]   )r   r9   r   r   stres	sub_states          r   process_automatic_dynamicr     s     """+''A	
 	
 
	 27((.  	Iy222.//5/I		 
r   c                    d }t        j                         r(t        j                         rt        j                         }t        j
                  j                  j                  }|  d| d| S )NrH   )distis_availableis_initializedget_rankr   compilerr   cache_key_tag)keyranktags      r   format_cache_keyr     sW     Dt224}}
..


-
-CU!D63%  r   c                 j   t         j                  j                  j                  rt	        d       y t         j                  j                  j
                  x} '| j                  d      rt        d      t        |       S t         j                  j                         x}|\  }}t        d| d|       S y )NGdynamo_pgo force disabled by torch.compiler.config.force_disable_cachesmast:ztorch.compiler.config.job_id with prefix 'mast:' is reserved for automatically generated job id associated with a specific MAST job name and version.rH   )r   r   r   force_disable_cachesr   job_id
startswithr   r   _utils_internalget_mast_job_name_version)rname_versionmast_job_namemast_job_versions       r   get_cache_keyr     s    ~~11U	
  ^^"")))6<< -$ 
  ""--GGIIV*6''%a8H7I JKKr   c                x    t         j                  j                  j                  rt	        d       y t        |       S )Nr   )r   r   r   r   r   r   )
sticky_keys    r   get_extra_cache_keyr   2  s0    ~~11U	
 J''r   c                   t         j                  j                  j                  st        j                  d       y ddlm} t        j                  ddd|  d      }t        j                  j                   |       d|      S )	Nz'automatic_dynamic_local_pgo not enabledr   )	cache_dirz[<>:"/\\|?*]_code_state_z.pkldynamo)r   r   r   automatic_dynamic_local_pgor   r   %torch._inductor.runtime.runtime_utilsr   resubr$   r%   r   )	cache_keyr   code_state_keys      r   code_state_pathr  =  s\    ==;;		;<?VVOSK	{$2OPN77<<	X~>>r   c                 `   t         j                  j                  j                  ryt         j                  j                  j
                  x} | S t               syt         j                  j                         ry	 ddl	m
} |t         j                  j                  d      k\  S # t        $ r Y yw xY w)NFr   )REMOTE_CACHE_VERSIONz'pytorch/remote_cache:dynamo_pgo_version)r   r   r   r   r   automatic_dynamic_remote_pgor   r   is_fb_unit_testtorch._inductor.fb.remote_cacher  ModuleNotFoundErrorjustknobs_getval_int)r   r  s     r   "should_use_remote_dynamo_pgo_cacher  H  s    ~~11]]!!>>>K;,,.H  5#8#8#M#M1$    s   9B! !	B-,B-c                 J    ddl m}  t               sy  | dt               dd      S )Nr   create_cachez
dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacher  r  r   r  s    r   get_remote_cacher  _  s)    9-/ 	 r   c                   t               }| j                  j                         D ]]  \  }}d}t        |j                  t
              rt        |j                  v }n|j                  t        k(  rd}|sM|j                  |       _ |S )NFT)	r   r]   itemsr=   rt   r   ry   rs   add)
code_statedynamic_sourcessrcfsdynamics        r   _collect_dynamic_sourcesr  m  sv    '1|O//557 %Rbggu%"bgg-GYY,&G$% r   c                    ddl m} t               }| D ]:  }|t        v r ||      rt        j	                  |       *|j	                  |       < |S )Nr   )is_dynamic_source)torch._dynamo.variables.builderr  r   rd   r  )all_sourcesr  missing_sourcesr  s       r   _collect_missing_sourcesr#  z  sX    A (2|O !((s#"&&s+C ! r   c                2   t         j                  |       }t               |   }t        |      }dj	                  |      }dj	                  t        |            }|r1t        dx}d      5  t        j                  |||       d d d        y y # 1 sw Y   y xY w)N,zpgo.dynamic_whitelistTlog_pt2_compile_event)recompile_dynamic_whitelistmissing_dynamic_whitelist)	r4   rO   r   r  r   r#  r   r   pt2_compile)r   r   r   all_dynamic_sourcesframe_whitelistmissing_whitelistr9   s          r   log_frame_dynamic_whitelistr.    s    kk&!G "7+K2;?hh23O!9:M!NO"99$QUV 	**,;*;	 	 	 	s   *BBc                 Z    t         s%t        j                  j                  ddd       da y y )Ndynamic_shapes_analysisz$Dynamic shape recompilation detectedzPGO detected a recompilation due to dynamic shapes.             Please follow the instruction from the action link to reduce             recompilation overhead.)categoryinsightinsight_descriptionT)rc   r   r   add_mlhub_insightr   r   r   _log_size_mismatch_recompiler5    s6    $//.:!% 	0 	
 %)! %r   c                    dj                  d | j                         D              }t               }| j                         D ]  }|j	                  t        |              |r|ddj                  |       dz  }|S )N
c              3     K   | ]=  \  }}| d dj                  d |j                  j                         D              z    ? yw)z:
r7  c              3  N   K   | ]  \  }}d | d|j                            yw)z  z: N)r   )r   r  r  s      r   r   z.render_code_state.<locals>.<genexpr>.<genexpr>  s,      
*1#rbR		}%
s   #%N)r   r]   r  )r   kvs      r   r   z$render_code_state.<locals>.<genexpr>  sQ      
 Aq	 #S	
)) 
565H5H5N5N5P
 
	
s   AAz

PGO detected a recompilation due to dynamic shapes. To reduce shape recompilations by compiling dynamically to start, set environment variable TORCH_COMPILE_DYNAMIC_SOURCES="r%  ")r   r  r   valuesupdater  )cscode_state_strr  states       r   render_code_staterB    s    YY 
 HHJ N (2|O @7>?@GGJxxP_G`Faabd	

 r   c                  L    e Zd Zedd       Zeedd              Zedd       Zy)PGOCacheArtifactc                j    t        | j                  | j                        | j                        }|J y rC   )write_local_impl!_rewrite_cache_key_for_mega_cacher   r.   )r?   metas     r   populate_cachezPGOCacheArtifact.populate_cache  s2    22488<dll
 r   c                      y)Npgor   r   r   r   r   zPGOCacheArtifact.type  s     r   c                H    | j                  d      s| S t               x}|S | S )z
        The PGO cache artifact key for a MAST job contains the job name and the version.
        When we want to use the cache artifact on a different MAST job, we need to
        update the key to use the new MAST job's name and version.
        r   )r   r   )original_keynew_keys     r   rG  z2PGOCacheArtifact._rewrite_cache_key_for_mega_cache  s0     &&w/$&G3Nr   Nr   rS   )rM  r5   rQ   r5   )r   r   r   r	   rI  rV   r   rG  r   r   r   rD  rD    sD            r   rD  c                    t        t        t              sJ t        j	                  d| |t        t                     t        d| ddd        t        dd       t        j                  t              a
t        S )Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                      t        t              S rC   rB  rb   r   r   r   r[   zhit.<locals>.<lambda>  s    !+. r   rK  T)r=   rb   r   r   r   r   r   r   r   deepcopyra   )r   tys     r   hitrW    se    k;///HH3S"c+>NO
rd+.
 E4 }}[1r   c                   t        |       }|t        j                  j                  |      rt	        dx}d      5  t        j                  ||        t        |d      5 }	 |j                         }t        j                  |      at        j                  ||j                                t        j                  t        j!                         | |       t#        |d      cd d d        cd d d        S y # t$        $ r t&        j)                  d|d	       Y nw xY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)
Nzpgo.get_local_code_stateTr&  r  r"   cache_size_byteslocalz&get_code_state failed while reading %sexc_info)r  r$   r%   r&   r   r   r*  r'   r(   pickleloadsrb   tellr   record_artifactrD  r   rW  	Exceptionr   warning)r  r%   r9   fr.   s        r   get_local_code_staterf    s*   9%DBGGNN40..Dd
 	. **49E dD! .Q.ffhG"(,,w"7K&224!&&(S )88(--/G tW-. .	. 	.(  ! KK@$QU   . . .	.( )	.( sN   $D: D%"A
C4,4D% 	D:4!DD%DD%	D:%D.	*D::Ec                @   d }	 | j                  |      }|	 t        |t              sJ |d   }t        |t              sJ t	        j
                  |      }| t        j                  |t        |             t        j                  |      }t        j                  t        j                         ||       |S t         j%                  d|       |S # t        $ r t         j#                  d|d       Y |S w xY w# t        $ r t         j#                  d|d       Y |S w xY w)NdatarZ  z1get_code_state failed parsing remote result on %sTr]  z get_code_state remote miss on %sz'get_code_state failed remote read on %s)getr=   dictr5   base64	b64decoder   r*  r   r_  r`  r   rb  rD  r   rc  r   rd  r   )remote_cacher  
event_namer  
cache_datarh  payloads          r   lookup_remote_cache_entryrq    s3   
 JD!%%i0
 !!*d333!&)!$,,, **40)&22"S\ $\\'2
 %44$))+Y
  HH7C  G!     Y=ySWX2 5Ys#   C8 A5C !C54C58!DDc                    t               }|Xt        dx}dd      5  t        j                  ||        t	        || |      }||at        | d      cd d d        S 	 d d d        y y # 1 sw Y   y xY w)Nzpgo.get_remote_code_stateT!pgo_get_remote_code_state_time_usr'  dynamo_compile_column_usrY  remote)r  r   r   r*  rq  rb   rW  r  rm  r9   r  s       r   get_remote_code_staterx  &  s    #%L//D"&%H
 		0
 **49E2<DQJ%(9h/		0 		0 &		0 		0 s   4A&&A/c                @   t         J t               }|}t        dx}dd      5  t        j                  ||        t        ||       t        j                  d| t              nd       t         rJ a t        d	d
fd       ddd       yy# 1 sw Y   yxY w)zo
    Reads an additional PGO profile from the given cache key, and merges it with the default PGO profile.
    Nzpgo.get_extra_remote_code_stateTrs  rt  rY  z'get_extra_code_state %s hit, %d entriesr   get_extra_remote_code_staterR  c                     t               S rC   )rB  )r  s   r   r[   z-get_extra_remote_code_state.<locals>.<lambda>S  s    -j9 r   )
rb   r  r   r   r*  rq  r   r   r   r   rw  s      @r   rz  rz  7  s    
 """#%L55D"&%H
 	
 **49E2<KJHH9#-#9Jq
 %&&()19!	 	  	 	s   A$BBc                 Z   t         t         S t        t              a t               } | t         S t	        |       }|t        |        t         s>t        j                  j                  j                  x}t        |      }|t        |       t        j                  d       t         J t         S )Nzget_code_state using default)rb   r   rX   r   rf  rx  r   r   r   pgo_extra_read_keyr   rz  r   r   )r  local_code_statesticky_readextra_read_keys       r   r   r   W  s     i(KI ,I6 i( !NN11DDD[Q,[9%'7HH+,"""r   c                 r   t         t        j                  d       y t         t        k(  rt        j                  d       y t	               } | t        j                  d       y t        |        t        |        t        j                  j                  j                  x}t        |      }|t        |       y y y )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)rb   r   r   ra   r   put_local_code_stateput_remote_code_stater   r   r   pgo_extra_write_keyr   )r  sticky_writeextra_write_keys      r   put_code_stater  y  s    DE&&67I9:#)$--AAAN-l;&!/2 ' Or   c                   t        |       }|y |dz   }|dz   }ddlm} t        j                  t        j
                  j                  |      d        ||t              5  t        |d      5 }|j                  |       |j                         }d d d        t        j                  ||       d d d        |fS # 1 sw Y   +xY w# 1 sw Y   |fS xY w)	Nz.tmpz.lockr   )FileLockT)exist_ok)timeoutwb)r  torch.utils._filelockr  r$   makedirsr%   dirnameLOCK_TIMEOUTr'   writera  replace)r  pickled_coder%   tmp_path	lock_pathr  re  rt   s           r   rF  rF    s    9%D|
 f}HwI /KK%5	)\	2 #(D! 	QGGL!668D	 	

8T"	#
 :		 	#
 :s$   !C."B:C:C	?CCc                   t        dx}d      5  t        j                  ||        t        J t	        j
                  t              }t        j                  t        j                         | |       t        | |      }|t        j                  d       	 d d d        y |\  }}t        j                  ||       t        j                  d|t        t                     t        dd	d
        d d d        y # 1 sw Y   y xY w)Nzpgo.put_local_code_stateTr&  rY  z$put_code_state: local cache disabledrZ  z*put_code_state: wrote local %s, %d entriesr  rR  c                      t        t              S rC   rT  r   r   r   r[   z&put_local_code_state.<locals>.<lambda>      %k2 r   )r   r   r*  rb   r_  dumpsr   rb  rD  r   rF  r   r   r   r   )r  r9   r  rH  r%   rt   s         r   r  r    s    	88dPT	U 
&&tyA&&&||K0,,!!#Y	
  	<8<HH;<
 
 
d&&tdC=tSEUV!"2	
%
 
 
s   BC6AC66C?c           	     >   |sdnd}t        d| x}dd      5  t        j                  ||        t        J t	               }| t
        j                  d|       	 d d d        y t        j                  t              }t        j                  |t        |      	       d
t        j                  |      j                  d      i}|j                  | |       t
        j                  d|| t        t                     t        |dd        d d d        y # 1 sw Y   y xY w)Nr  put_extra_remote_code_statezpgo.T!pgo_put_remote_code_state_time_usrt  rY  z%s: remote cache disabledrZ  rh  asciiz%s: wrote remote %s, %d entriesrR  c                      t        t              S rC   rT  r   r   r   r[   z'put_remote_code_state.<locals>.<lambda>  r  r   )r   r   r*  rb   r  r   r   r_  r  r   rk  	b64encodedecodeputr   )r  extra_code_statern  r9   rm  r.   ro  s          r   r  r    s      	 * 
 
zl##"!D
 

 	&&tyA&&&')HH0*=
 
 ,,{+&&tc'lKF$$W-44W="

 	J/-z9c+FV	
 	"2	
1
 
 
s   AD&B$DDc                     d a d aday r<   )rb   ra   rc   r   r   r   reset_code_stater    s    K %r   )r,   r5   rQ   r5   )
r   r   r9   r5   r   rZ   r   rR   rQ   rZ   )r   r5   rQ   r5   )rQ   Optional[str])r   r5   rQ   r  )r  r5   rQ   r  )rQ   rR   )rQ   z!Optional[RemoteCache[JsonDataTy]])r  rX   rQ   OrderedSet[str])r!  r  rQ   r  )r   rT   rQ   r   r   )r?  defaultdict[CodeId, CodeState]rQ   r5   )r   r5   rV  r5   rQ   r  )r  r5   rQ   r`   rC   )rm  zRemoteCache[JsonDataTy]r  r5   rn  r  rQ   r`   )r  r5   rQ   r   )rQ   r  )r  r5   r  bytesrQ   zOptional[tuple[str, int]])F)r  r5   r  rR   rQ   r   )grh   
__future__r   rk  r   r^   enum	functoolsloggingr$   r_  r  r)   collectionsr   typingr   r   r   r   typing_extensionsr	   r
   torch._dynamo.configr   torch._utils_internaltorch.compiler.configtorch.distributeddistributedr   torch._dynamo.utilsr   r   r   r   torch._environmentr   torch._logging._internalr   torch.compiler._cacher   r   r   torch.utils._ordered_setr   typestorch._dynamo.symbolic_convertr   r  r   r   
ValueErrorr   	getLoggerr   r   r  cacher1   	dataclassr4   rX   ra   rU   rb   rc   setrd   rf   ri   Enumrk   rm   rz   rp   ry   rZ   r   r   r   r   r   r  r  r  r  r#  r.  r5  rB  registerrD  rW  rf  rq  rx  rz  r   r  rF  r  r  r  r   r   r   <module>r     s  	 #       	  	  # : : ,       ) > 
 0 DD	* 	 g!j 	 	 d#$
 $
 $$
N    >B : A8<5 <"' 4 '#&5  ( d#  $( T]		  __
$))     J J Jd (-ii
i i
 !%i ib (-++
+ +
 !%+ +\!4(?.
 )( }  8< !%")"" " .	"J"@D3,2
4"
L&r   