
    i&                    j   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                  dAd       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<    ejv                  d       G d d             ZB ed       ZC G d! d"ej                        ZEeEj                  ZG G d# d$ej                        ZHeHj                  ZIejv                   G d% d&             ZJdd'	 	 	 	 	 	 	 	 	 dBd(ZKdd'	 	 	 	 	 	 	 	 	 dBd)ZLdCd*ZMdDd+ZNdEd,ZOdFd-ZPdGd.ZQdHd/ZRdId0ZSdJd1ZTdKd2ZUdLd3ZVe)j                   G d4 d5e(             ZXdMd6ZYdNd7ZZ	 dO	 	 	 	 	 	 	 dPd8Z[dNd9Z\dQd:Z]dRd;Z^dSd<Z_dTd=Z`dQd>ZadQd?ZbdSd@Zcy)Ua  
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_ALLOWLISTc                      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   re   re      s      
Hr   re   _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   rg   tokenr   r   r   rj   rj          
 Er   rj   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   Nrk   r   r   r   ro   ro      rm   r   ro   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 y)
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=   re   rf   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   ).0rz   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 {repr(self)})rz   z/Union[int, AutoDynamic, AutoUnset, InferStride]rQ   r5   )r   z0tuple[Union[int, AutoDynamic, InferStride], ...]rQ   r5   )rs   rx   rt   rr   r=   tuple)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 &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=   rr   torchSymIntrs   r   rt   )r?   rz   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)rs   rx   ry   r?   rf   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   rz   s     r   r   z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>-  s     0SAaC0Ss   FT)r=   rs   r   allrt   rx   ry   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   rx   )r   xs     r   r   z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>8  s"     TAZ5<<%@\aGTs   ,.)r   )xss    r   _munge_symintz!FrameStateSizeEntry._munge_symint6  s    TQSTTTr   c                .    t        |t        t              S N)rr   rs   rt   )rZ   rx   )clsr   s     r   make_scalarzFrameStateSizeEntry.make_scalar:  s    "!,|TTr   c                b    t        t        | j                  |      | j                  |            S r   )rZ   rx   r   )r   rs   rt   s      r   make_tensorzFrameStateSizeEntry.make_tensor>  s0     #""4($$V,
 	
r   c                L    t        t        | j                  |      t              S r   )rZ   ry   r   )r   rs   s     r   	make_sizezFrameStateSizeEntry.make_sizeH  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   )ry   rx   )r   ys     r   _merge_atomzFrameStateSizeEntry._merge_atomP  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>h  s      Ctq!S__Q*Cs   ")ry   rx   lenr   zip)r   r   yss   `  r   _merge_atom_tupz#FrameStateSizeEntry._merge_atom_tupZ  sa     II|!3r7c"gCs2r{CCCr   c                   | j                  | j                  |j                        | _        | j                  | j                  |j                        | _        | j                  | j                  |j                        | _        | S rC   )r   rr   r   rs   rt   r>   s     r   __ior__zFrameStateSizeEntry.__ior__j  s[    &&t{{ELLA((EJJ?	**4;;Er   NrS   rQ   None)rf   r7   rQ   rR   )r   tuple[int, ...]rQ   z#tuple[Union[AutoDynamic, int], ...])r   r7   rQ   rZ   )rs   r   rt   r   rQ   rZ   )rs   r   rQ   rZ   )r   rh   r   rh   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_   ry   rr   rU   rs   rt   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]   rr   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   rs   rf   zdimensionality changezsize(rG   zsize changer@   rt   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]   copyrr   r   r   r   r   r5   infors   r=   r   r   rangert   )txr9   r   r   code_idframe_state	is_update	mut_entryr   r   r   s    ``       @r   update_automatic_dynamicr   q  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   0  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  F  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=   rs   r   rx   rr   add)
code_statedynamic_sourcessrcfsdynamics        r   _collect_dynamic_sourcesr  k  sv    '1|O//557 %Rbggu%"bgg-GYY,&G$% r   c                N   t         j                  |       }t               |   }dj                  t	        |            }|r[t        dx}d      5  t        j                  ||       d d d        t        s%t        j                  j                  ddd	       day y y # 1 sw Y   6xY w)
N,zpgo.dynamic_whitelistTlog_pt2_compile_event)recompile_dynamic_whitelist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_description)r4   rO   r   r   r  r   r   pt2_compilerc   r   r   add_mlhub_insight)r   r   r   frame_whitelistr9   s        r   log_frame_dynamic_whitelistr(  x  s    kk&!G "7+Khh7DEO"99$QUV 	**/	 )!!332>%) 4  )-% ) 	 	s   BB$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:
r*  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_stater5    s    YY 
 HHJ N (2|O @7>?@GGJxxP_G`Faabd	

 r   c                :    dd} ||        ||      k(  r|| z  }y y )Nc                b    t        | j                  t              syt        | j                        S )N)r=   rs   r   r   )r   s    r   r   zmerge_pgo_entry.<locals>.rank  s!    %**e,5::r   )r   rZ   rQ   r7   r   )r  dstr   s      r   merge_pgo_entryr:    s'    
 CyDIs
 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   r?  z2PGOCacheArtifact._rewrite_cache_key_for_mega_cache  s0     &&w/$&G3Nr   Nr   rS   )rE  r5   rQ   r5   )r   r   r   r	   rA  rV   r   r?  r   r   r   r<  r<    sD            r   r<  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   r5  rb   r   r   r   r[   zhit.<locals>.<lambda>  s    !+. r   rC  T)r=   rb   r   r   r   r   r   r   r   deepcopyra   )r   tys     r   hitrO    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_artifactr<  r   rO  	Exceptionr   warning)r  r%   r9   fr.   s        r   get_local_code_stater^    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datarR  z1get_code_state failed parsing remote result on %sTrU  z get_code_state remote miss on %sz'get_code_state failed remote read on %s)getr=   dictr5   base64	b64decoder   r%  r   rW  rX  r   rZ  r<  r   r[  r   r\  r   )remote_cacher  
event_namer  
cache_datar`  payloads          r   lookup_remote_cache_entryri    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_usrQ  remote)r  r   r   r%  ri  rb   rO  )r  re  r9   r  s       r   get_remote_code_statero    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       |j                         D ]Y  \  }}|t         v rC|j                  j                         D ]%  \  }}t        |t         |   j                  |          ' Q|t         |<   [ 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.add_extra_remote_code_stateTrk  rl  rQ  z'add_extra_code_state %s hit, %d entriesr   add_extra_remote_code_staterJ  c                     t               S rC   )r5  )r  s   r   r[   z-add_extra_remote_code_state.<locals>.<lambda>O  s    -j9 r   )rb   r  r   r   r%  ri  r   r   r   r  r]   r:  r   )r  re  r9   r   r4  r  r   r  s          @r   rq  rq  (  s   
 """#%L55D"&%H
 	
 **49E2<KJHH9#-#9Jq
 %&0&6&6&8 5NGU+-*/*A*A*G*G*I JC
 , %{7';'M'Mc'R 05G,5 *197	 	  	 	s   CC66C?c                 N   t         t         S t        t              a t               } | t         S t	        |       }|t        |        t        j                  j                  j                  x}t        |      }|t        |       t        j                  d       t         J t         S )Nzget_code_state using default)rb   r   rX   r   r^  ro  r   r   r   pgo_extra_read_keyr   rq  r   r   )r  local_code_statesticky_readextra_read_keys       r   r   r   S  s     i(KI ,I6 i( ~~,,???L,[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~  r  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'   writerY  replace)r  pickled_coder%   tmp_path	lock_pathr  r]  rs   s           r   r>  r>    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  rQ  z$put_code_state: local cache disabledrR  z*put_code_state: wrote local %s, %d entriesry  rJ  c                      t        t              S rC   rL  r   r   r   r[   z&put_local_code_state.<locals>.<lambda>      %k2 r   )r   r   r%  rb   rW  dumpsr   rZ  r<  r   r>  r   r   r   r   )r  r9   r  r@  r%   rs   s         r   ry  ry    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                (   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 d        y # 1 sw Y   y xY w)Nzpgo.put_remote_code_stateT!pgo_put_remote_code_state_time_usrl  rQ  z%put_code_state: remote cache disabledrR  r`  asciiz+put_code_state: wrote remote %s, %d entriesrz  rJ  c                      t        t              S rC   rL  r   r   r   r[   z'put_remote_code_state.<locals>.<lambda>  r  r   )r   r   r%  rb   r  r   r   rW  r  r   rc  	b64encodedecodeputr   )r  r9   re  r.   rg  s        r   rz  rz    s    	++"!D
 

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

 	J/99c+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   zOrderedSet[str])r   rT   rQ   r   )r2  defaultdict[CodeId, CodeState]rQ   r5   )r  rZ   r9  rZ   rQ   r   )r   r5   rN  r5   rQ   r  )r  r5   rQ   r`   rC   )re  zRemoteCache[JsonDataTy]r  r5   rf  r  rQ   r`   )r  r5   rQ   r   )rQ   r  r   )r  r5   r  bytesrQ   zOptional[tuple[str, int]])drg   
__future__r   rc  r   r^   enum	functoolsloggingr$   rW  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   re   rh   Enumrj   rl   ry   ro   rx   rZ   r   r   r   r   r   r  r  r  r  r(  r5  r:  registerr<  rO  r^  ri  ro  rq  r   r~  r>  ry  rz  r  r   r   r   <module>r     s  	 #       	  	  # : : ,       ) > 
 0 DD	* 	 g!j 	 	 d#$
 $
 $$
N    >B : A8<5 <"' 4 ' d#  $( T]		  __
$))     J J Jd (-ii
i i
 !%i ib (-++
+ +
 !%+ +\!4(?.
-,( }  8< !%")"" " .	"J"(V>3,2
4
B&r   