
    9jV                       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 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l.m/Z/m0Z0  G d de1      Z2 ejf                  e4      Z5dZ6ejn                  dFd       Z8dGdZ9dGd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+	 	 	 	 	 	 	 	 	 dHd,ZMdd+	 	 	 	 	 	 	 	 	 dHd-ZNdId.ZOdJd/ZPdKd0ZQdLd1ZRdMd2ZSdNd3ZTdOd4ZUdPd5ZVdQd6ZWdRd7ZXdSd8ZYe'j                   G d9 d:e&             Z[dTd;Z\dUd<Z]	 dV	 	 	 	 	 	 	 dWd=Z^dUd>Z_dXd?Z`dYd@ZadRdAZbdZdBZcdXdCZdd[d\dDZedRdEZfy)]a  
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)TYPE_CHECKINGTypeVar)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__     Q/media/conek/DATA/Code/OCR/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_filer/   r   sg     77>>(#	h	 ))+jj)kJ.6	  s   6A..A7c                J    t        |       rt        | d      r| j                  S y )N__code__)callablehasattrr1   r,   s    r   _get_closure_contentr5      s"    WWj9r   c                L    	 t        | j                        S # t        $ r Y y w xY wN)r5   cell_contents
ValueErrorr4   s    r   _get_cell_hash_contentr:      s*    #G$9$9:: s    	##T)frozenc                  |    e Zd ZU ded<   ded<   ded<   ded<   dZded	<   dd
ZddZddZe	 d	 	 	 	 	 dd       Z	y)CodeIdstrfilenameintfirstlinenoname	file_hashN
int | Noneclosure_hashc                    t        |t              sy| j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S NF)
isinstancer=   rC   rA   rB   rE   )selfothers     r   __eq__zCodeId.__eq__   sm    %(NNeoo- 8  E$5$558		UZZ'8 !!U%7%77		
r   c                p    t        | j                  | j                  | j                  | j                  f      S r7   )r.   rC   rB   rA   rE   rI   s    r   __hash__zCodeId.__hash__   s*    T^^TYY0@0@$BSBSTUUr   c                n    d| j                    d| j                   d| j                   d| j                   S )Nzhash():)rC   r?   rA   rB   rM   s    r   __str__zCodeId.__str__   s5    t~~&aa8H8H7I499+VVr   c                    d }|rt        t        d |D                    }t        | j                  | j                  | j
                  t        | j                        |      S )Nc              3  2   K   | ]  }t        |        y wr7   )r:   ).0cs     r   	<genexpr>zCodeId.make.<locals>.<genexpr>   s     %QA&<Q&?%Qs   )r.   tupler=   co_filenameco_firstlinenoco_namer/   )codeclosurerE   s      r   makezCodeId.make   sX     %Q%Q QRLLL!$"2"23
 	
r   )rJ   objectreturnbool)r`   r@   r`   r>   r7   )r\   types.CodeTyper]   z!tuple[types.CellType, ...] | Noner`   r=   )
r   r   r   __annotations__rE   rK   rN   rR   staticmethodr^   r   r   r   r=   r=      sc    M
I N#L*#
VW KO

'H
	
 
r   r=   c                  @    e Zd ZU  ej                  d       Zded<   y)	CodeStatec                      t        t              S r7   )r   FrameStateSizeEntryr   r   r   <lambda>zCodeState.<lambda>   s    ,? @ r   )default_factoryz%defaultdict[str, FrameStateSizeEntry]automatic_dynamicN)r   r   r   dataclassesfieldrl   rd   r   r   r   rg   rg      s!    ?P{?P?P@@< r   rg   %defaultdict[CodeId, CodeState] | None_INIT_CODE_STATE_CODE_STATEFra   _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.
    r@   dimN)r   r   r   __doc__rd   r   r   r   ru   ru      s      
Hr   ru   _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   rw   tokenr   r   r   rz   rz          
 Er   rz   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   Nr{   r   r   r   r   r      r}   r   r   c                     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<    ej                  dd	
      Z
ded<    ej                  dd	
      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)$ri   )defaultzint | AutoDynamic | AutoUnsetscalarz7AutoDynamic | AutoUnset | tuple[int | AutoDynamic, ...]sizezEAutoDynamic | AutoUnset | tuple[int | AutoDynamic | InferStride, ...]strideNF)r   compareztuple[int | None, ...] | Noneexcluded_sizesrD   excluded_scalarc                   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(rP   )auto_dynamic
auto_unsetrH   ru   rv   r>   )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r7   r   )rU   r   r   s     r   rW   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+int | AutoDynamic | AutoUnset | InferStrider`   r>   )r   z+tuple[int | AutoDynamic | InferStride, ...]r`   r>   )r   r   r   r   rH   rX   repr)rI   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 r7   )rH   r   torchSymIntr   rX   r   )rI   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)r   r   r   rI   rv   s     r   is_size_dynamicz#FrameStateSizeEntry.is_size_dynamic1  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r7   typer@   rU   r   s     r   rW   z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>I  s     0SAaC0Ss   FT)rH   r   rX   allr   r   r   r   s     r   is_stride_dynamicz%FrameStateSizeEntry.is_stride_dynamic8  sX    " tyy%(S0S0S-S;;,&;;*${{3<//r   c                &    t        d | D              S )Nc              3  `   K   | ]&  }t        |t        j                        rt        n| ( y wr7   )rH   r   r   r   )rU   xs     r   rW   z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>T  s"     TAZ5<<%@\aGTs   ,.)rX   )xss    r   _munge_symintz!FrameStateSizeEntry._munge_symintR  s    TQSTTTr   c                .    t        |t        t              S N)r   r   r   )ri   r   )clsr   s     r   make_scalarzFrameStateSizeEntry.make_scalarV  s    "!,|TTr   c                b    t        t        | j                  |      | j                  |            S r   )ri   r   r   )r   r   r   s      r   make_tensorzFrameStateSizeEntry.make_tensorZ  s0     #""4($$V,
 	
r   c                L    t        t        | j                  |      t              S r   )ri   r   r   )r   r   s     r   	make_sizezFrameStateSizeEntry.make_sized  s#    """4(
 	
r   c                d    | t         u r|S |t         u r| S | t        u s|t        u s| |k7  rt        S | S r7   )r   r   )r   ys     r   _merge_atomzFrameStateSizeEntry._merge_atoml  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r7   )r   )rU   r   r   r   s      r   rW   z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>  s      Ctq!S__Q*Cs   ")r   r   lenrX   zip)r   r   yss   `  r   _merge_atom_tupz#FrameStateSizeEntry._merge_atom_tupv  sa     II|!3r7c"gCs2r{CCCr   c                   | j                  | j                  |j                        }t        | j                  t              rD|| j                  k7  r"t        d | j                  D              | _        n| j                  d | _        || _        t        | j                        t        u rFt        |j                        t        u r+| j                  |j                  k7  r| j                  | _        n%| j                  t        u r| j                  d | _        | j                  | j                  |j                        | _        | j                  | j                  |j                        | _        | S )Nc              3  F   K   | ]  }t        |      t        u r|nd   y wr7   r   r   s     r   rW   z.FrameStateSizeEntry.__ior__.<locals>.<genexpr>  s$      ,67aCAT1,s   !)r   r   rH   rX   r   r   r   r@   r   r   r   r   )rI   rJ   new_sizes      r   __ior__zFrameStateSizeEntry.__ior__  s    ''		5::>dii'499$&+ ,;?99, '# $$0&*#	
 $U\\"c)u||+#';;D [[L(T-A-A-M#'D &&t{{ELLA**4;;Er   rb   r`   None)rv   r@   r`   ra   )r   tuple[int, ...]r`   ztuple[AutoDynamic | int, ...])r   r@   r`   ri   )r   r   r   r   r`   ri   )r   r   r`   ri   )r   rx   r   rx   r`   zAutoDynamic | _T)r   (AutoDynamic | AutoUnset | tuple[_T, ...]r   r   r`   z6AutoDynamic | AutoUnset | tuple[AutoDynamic | _T, ...])rJ   r   r`   r   )r   r   r   rm   rn   r   r   rd   r   r   r   r   r   r   r   r   re   r   classmethodr   r   r   r   r   r   r   r   r   ri   ri      sg   ,=K,=,=j,QF)Q EVKDUDUED
A  	*- Q  5FK4E4Ee5N1  #4+"3"3D%"POZP':<.04 U U U U 
"
,;
	
 
 
 
   D4D 5D 
@	D Dr   ri   is_unspecialized_nn_modulec          
       
 t         j                  | 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 != %srl   r   zscalar changerB   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 != %srl   r   r   )getattrlogdebugr	   instantr>   )	tup_nameshort_reasonlong_reasoni	entry_tupold_entry_tupentryrB   	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   r   rv   zdimensionality changezsize(rP   zsize changerJ   r   zstride(zstride changez9automatic dynamic is off, overwriting int %s val %s -> %sr7   )
r   r>   r   r>   r   r>   r   rD   r`   r   )r=   r^   f_coder]   get_code_stater   _dynamoconfigautomatic_dynamic_shapesrl   copyr   r   r   r	   r   r>   infor   rH   rX   r   ranger   )txrB   r   r   code_idframe_state	is_update	mut_entryr   r   r   s    ``       @r   update_automatic_dynamicr     s    kk"))RZZ0G "7+K}}44K999	11$7	IIi(	U	 ))Y-=-==II7  	 &&# #+-!)"2"23u||,	 *O 	 QU		),	;>	CM		> 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_staterl   )r   rB   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 )NrQ   )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.rQ   )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	  K  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  e  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  p  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   {  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   rl   itemsrH   r   rX   r   r   add)
code_statedynamic_sourcessrcfsdynamics        r   _collect_dynamic_sourcesr0    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.builderr2  r   rs   r*  )all_sourcesr2  missing_sourcesr-  s       r   _collect_missing_sourcesr6    sX    A (2|O !((s#"&&s+C ! r   c                4   t         j                  | d       }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)	r=   r^   r   r0  r   r6  r
   r	   pt2_compile)r   r   r   all_dynamic_sourcesframe_whitelistmissing_whitelistrB   s          r   log_frame_dynamic_whitelistrA    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)rr   r   r  add_mlhub_insightr   r   r   _log_size_mismatch_recompilerH    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:
rJ  c              3  N   K   | ]  \  }}d | d|j                            yw)z  z: N)r   )rU   r-  r.  s      r   rW   z.render_code_state.<locals>.<genexpr>.<genexpr>  s,      
*1#rbR		}%
s   #%N)r   rl   r)  )rU   kvs      r   rW   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="r8  ")r   r)  r   valuesupdater0  )cscode_state_strr,  states       r   render_code_staterU    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 r7   )write_local_impl!_rewrite_cache_key_for_mega_cacher   r,   )rI   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   rZ  z2PGOCacheArtifact._rewrite_cache_key_for_mega_cache  s0     &&w/$&G3Nr   Nr   rb   )r`  r>   r`   r>   )r   r   r   r   r\  re   r   rZ  r   r   r   rW  rW    sD            r   rW  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 r7   rU  rq   r   r   r   rj   zhit.<locals>.<lambda>  s    !+. r   r^  T)rH   rq   r   r   r   r   r   r   r   deepcopyrp   )r   tys     r   hitrj    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_stateTr9  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loadsrq   tellr   record_artifactrW  r   rj  	Exceptionr   warning)r  r#   rB   fr,   s        r   get_local_code_statery    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datarm  z1get_code_state failed parsing remote result on %sTrp  z get_code_state remote miss on %sz'get_code_state failed remote read on %s)getrH   dictr>   base64	b64decoder	   r=  r   rr  rs  r   ru  rW  r   rv  r   rw  r   )remote_cacher  
event_namer+  
cache_datar{  payloads          r   lookup_remote_cache_entryr  4  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_usrl  remote)r'  r
   r	   r=  r  rq   rj  r  r  rB   r+  s       r   get_remote_code_stater  Y  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_stateTr  r  rl  z'get_extra_code_state %s hit, %d entriesr   get_extra_remote_code_statere  c                     t               S r7   )rU  )r+  s   r   rj   z-get_extra_remote_code_state.<locals>.<lambda>  s    -j9 r   )
rq   r'  r
   r	   r=  r  r   r   r   r   r  s      @r   r  r  j  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)rq   r   rg   r	  ry  r  r   r   r   pgo_extra_read_keyr  r  r   r   )r  local_code_statesticky_readextra_read_keys       r   r   r     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)rq   r   r   rp   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    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%   writert  replace)r  pickled_coder#   tmp_path	lock_pathr  rx  r   s           r   rY  rY    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_stateTr9  rl  z$put_code_state: local cache disabledrm  z*put_code_state: wrote local %s, %d entriesr  re  c                      t        t              S r7   rg  r   r   r   rj   z&put_local_code_state.<locals>.<lambda>      %k2 r   )r
   r	   r=  rq   rr  dumpsr   ru  rW  r   rY  r   r   r   r   )r  rB   r  r[  r#   r   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_usr  rl  z%s: remote cache disabledrm  r{  asciiz%s: wrote remote %s, %d entriesre  c                      t        t              S r7   rg  r   r   r   rj   z'put_remote_code_state.<locals>.<lambda>  r  r   )r
   r	   r=  rq   r'  r   r   rr  r  r   r~  	b64encodedecodeputr   )r  extra_code_stater  rB   r  r,   r  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 rG   )rq   rp   rr   r   r   r   reset_code_stater    s    K %r   )r*   r>   r`   r>   )r,   ztypes.CellTyper`   r_   )
r   r   rB   r>   r   ri   r   ra   r`   ri   )r   r>   r`   r>   )r`   
str | None)r  r>   r`   r  )r  r>   r`   r  )r`   ra   )r`   zRemoteCache[JsonDataTy] | None)r+  rg   r`   OrderedSet[str])r4  r  r`   r  )r   rc   r`   r   r   )rR  defaultdict[CodeId, CodeState]r`   r>   )r   r>   ri  r>   r`   r  )r  r>   r`   ro   r7   )r  zRemoteCache[JsonDataTy]r  r>   r  r  r`   ro   )r  r>   r`   r   )r`   r  )r  r>   r  bytesr`   ztuple[str, int] | None)F)r  r>   r  ra   r`   r   )grw   
__future__r   r~  r   rm   enum	functoolsloggingr"   rr  r  r'   collectionsr   typingr   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   r9   r   	getLoggerr   r   r  cacher/   r5   r:   	dataclassr=   rg   rp   rd   rq   rr   setrs   ru   rx   Enumrz   r|   r   r   r   ri   r   r   r   r	  r  r  r   r'  r0  r6  rA  rH  rU  registerrW  rj  ry  r  r  r  r   r  rY  r  r  r  r   r   r   <module>r     s  	 #       	  	  # ) ,       ) > 
 0 DD	* 	 g!j 	 	 d#-
 -
 $-
`    ;? 7 >592 9"' 4 '#&5  ( d#  $( T]		  __
$))     g g g^ (-ii
i i
 !%i ib (-++
+ +
 !%+ +\!4(?.
 )( }  8< "")"" " +	"J"@D3,2
4"
L&r   