
    3jV                       % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKJr  SSKJrJr  SSKJrJr  SSKrSSKrSSKrSSKJr  SSKJrJrJrJ r   SSK!J"r"  SS	K#J$r$  SS
K%J&r&J'r'J(r(  SSK)J*r*  \(       a  SSK+r+SSK,J-r-  SSK.J/r/J0r0   " S S\15      r2\Rf                  " \45      r5Sr6\Rn                  SFS j5       r8SGS jr9SGS jr:\Rv                  " SS9 " S S5      5       r<\Rv                   " S S5      5       r=Sq>S\?S'   Sq@S\?S'   SqAS\?S'   \B" 5       qCS \?S!'   \Rv                  " SS9 " S" S#5      5       rD\" S$5      rE " S% S&\R                  5      rG\GR                  rI " S' S(\R                  5      rJ\JR                  rK\Rv                   " S) S*5      5       rLSS+.         SHS, jjrMSS+.         SHS- jjrNSIS. jrOSJS/ jrPSKS0 jrQSLS1 jrRSMS2 jrSSNS3 jrTSOS4 jrUSPS5 jrVSQS6 jrWSRS7 jrXSSS8 jrY\'R                   " S9 S:\&5      5       r[STS; jr\SUS< jr] SV       SWS= jjr^SUS> jr_SXS? jr`SYS@ jraSRSA jrbSZSB jrcSXSC jrdS[S\SD jjreSRSE jrfg)]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                      \ rS rSrSrg)ReservedWorkflowIdUserError7    N)__name__
__module____qualname____firstlineno____static_attributes__r       K/home/wildlama/miniconda3/lib/python3.13/site-packages/torch/_dynamo/pgo.pyr   r   7   s    r   r   
   c                
   [         R                  R                  U 5      (       d  U $ [        U S5       nUR	                  5       n[
        R                  " U5      n[        US-  S5      nUsS S S 5        $ ! , (       d  f       g = f)Nrbl    08x)ospathexistsopenreadzlibcrc32format)filepathfilecontentcrc32_valuehashs        r    _hash_containing_filer2   r   sa     77>>(##	h	))+jj)kJ.6	 
		s   7A44
Bc                ^    [        U 5      (       a  [        U S5      (       a  U R                  $ g )N__code__)callablehasattrr4   r/   s    r    _get_closure_contentr8      s(    WWj99r   c                N     [        U R                  5      $ ! [         a     g f = fN)r8   cell_contents
ValueErrorr7   s    r    _get_cell_hash_contentr=      s*    #G$9$9:: s    
$$T)frozenc                      \ rS rSr% S\S'   S\S'   S\S'   S\S'   SrS	\S
'   SS jrSS jrSS jr\	 S     SS jj5       r
Srg)CodeId   strfilenameintfirstlinenoname	file_hashN
int | Noneclosure_hashc                    [        U[        5      (       d  gU R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ NF)
isinstancer@   rG   rE   rF   rI   )selfothers     r    __eq__CodeId.__eq__   sp    %((NNeoo- 8  E$5$558		UZZ'8 !!U%7%77		
r   c                p    [        U R                  U R                  U R                  U R                  45      $ r:   )r1   rG   rF   rE   rI   rM   s    r    __hash__CodeId.__hash__   s*    T^^TYY0@0@$BSBSTUUr   c                n    SU R                    SU R                   SU R                   SU R                   3$ )Nzhash():)rG   rC   rE   rF   rR   s    r    __str__CodeId.__str__   s5    t~~&aa8H8H7I499+VVr   c                    S nU(       a  [        [        S U 5       5      5      n[        U R                  U R                  U R
                  [        U R                  5      U5      $ )Nc              3  8   #    U  H  n[        U5      v   M     g 7fr:   )r=   ).0cs     r    	<genexpr>CodeId.make.<locals>.<genexpr>   s     %QA&<Q&?&?s   )r1   tupler@   co_filenameco_firstlinenoco_namer2   )codeclosurerI   s      r    makeCodeId.make   sX     %Q%Q QRLLL!$"2"23
 	
r   r   )rN   objectreturnbool)ri   rD   ri   rB   r:   )rd   types.CodeTypere   z!tuple[types.CellType, ...] | Noneri   r@   )r   r   r   r   __annotations__rI   rO   rS   rX   staticmethodrf   r   r   r   r    r@   r@      sc    M
I N#L*#
VW KO

'H
	
 
r   r@   c                  B    \ rS rSr% \R
                  " S S9rS\S'   Srg)	CodeState   c                      [        [        5      $ r:   )r   FrameStateSizeEntryr   r   r    <lambda>CodeState.<lambda>   s
    ,? @r   )default_factoryz%defaultdict[str, FrameStateSizeEntry]automatic_dynamicr   N)	r   r   r   r   dataclassesfieldrw   rm   r   r   r   r    rp   rp      s    ?J?P?P@@< r   rp   %defaultdict[CodeId, CodeState] | None_INIT_CODE_STATE_CODE_STATEFrj   _LOGGED_DYNAMIC_ALLOWLISTzset[str]_KNOWN_DYNAMIC_SOURCESc                  $    \ rS rSr% SrS\S'   Srg)InferStride   a(  
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.
rD   dimr   N)r   r   r   r   __doc__rm   r   r   r   r    r   r      s      
Hr   r   _Tc                      \ rS rSrSrSrSrg)	AutoUnset   z
The identity element of our semilattice, a generic "don't know" element that
is always subsumed when we get more information.
r   r   Nr   r   r   r   r   tokenr   r   r   r    r   r          
 Er   r   c                      \ rS rSrSrSrSrg)AutoDynamic   zv
The top element of our (bounded) semilattice, whenever you merge this with
any other element you always get it again
r   r   Nr   r   r   r    r   r      r   r   r   c                     \ rS rSr% \R
                  " \S9rS\S'   \R
                  " \S9r	S\S'   \R
                  " \S9r
S\S'   \R
                  " S	S
S9rS\S'   \R
                  " S	S
S9rS\S'   SS jrSS jrSS jrSS jr\SS j5       r\S S j5       r\      S!S j5       r\S"S j5       r\S#S j5       r\      S$S j5       rS%S jrSrg	)&rs      )defaultzint | AutoDynamic | AutoUnsetscalarz7AutoDynamic | AutoUnset | tuple[int | AutoDynamic, ...]sizezEAutoDynamic | AutoUnset | tuple[int | AutoDynamic | InferStride, ...]strideNF)r   compareztuple[int | None, ...] | Noneexcluded_sizesrH   excluded_scalarc                  ^ SS jmS	U4S jjnU R                   [        L a6  U R                  [        L a#  U R                  [        L a  gSU R                   3$ U R                  [        L af  [	        U R                   [
        5      (       aG  [	        U R                  [
        5      (       a(  SU" U R                   5       SU" U R                  5       3$ S[        U 5       3$ )
Nc                    U [         L a  gU [        L a  g[        U [        5      (       a  SU R                   S3$ [        U 5      $ )N?z
auto unsetzS(rV   )auto_dynamic
auto_unsetrL   r   r   rB   )ss    r    render_single1FrameStateSizeEntry.render.<locals>.render_single  s?    L j#A{++AEE7!}$1vr   c                F   > SSR                  U4S jU  5       5      -   S-   $ )N[z, c              3  4   >#    U  H  nT" U5      v   M     g 7fr:   r   )r\   r   r   s     r    r^   CFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>  s     "@R=#3#3Rs   ])join)ssr   s    r    render_tuple0FrameStateSizeEntry.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 | InferStrideri   rB   )r   z+tuple[int | AutoDynamic | InferStride, ...]ri   rB   )r   r   r   r   rL   r`   repr)rM   r   r   s     @r    renderFrameStateSizeEntry.render  s    			G 99$)D{{l*7 ..[[L($))U++
4;;0N0N%l499&=%>h|TXT_T_G`Fabb $t*&&r   c                   [        U R                  [        R                  5      (       a   U R                  5       e[        U R                  [
        5      (       a9  U R                   H)  n[        U[        R                  5      (       d  M$   U5       e   [        U R                  [
        5      (       a:  U R                   H)  n[        U[        R                  5      (       d  M$   U5       e   g g r:   )rL   r   torchSymIntr   r`   r   )rM   r   s1s      r    __post_init__!FrameStateSizeEntry.__post_init__(  s    dkk5<<88E$++E8dii''YY%a66996 dkk5))kk%b%,,77;;7 " *r   c                |    U R                   [        L a  gU R                   [        L a  gU R                   U   [        L $ )NTF)r   r   r   rM   r   s     r    is_size_dynamic#FrameStateSizeEntry.is_size_dynamic1  s3    99$99
"yy~--r   c                    [        U R                  [        5      (       a!  [        S U R                   5       5      (       d  gU R                  [
        L a  gU R                  [        L a  gU R                  U   [
        L $ )Nc              3  D   #    U  H  n[        U5      [        L v   M     g 7fr:   typerD   r\   r   s     r    r^   8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>I  s     0SAaCs    FT)rL   r   r`   allr   r   r   r   s     r    is_stride_dynamic%FrameStateSizeEntry.is_stride_dynamic8  s^    " tyy%((S0S0S-S-S;;,&;;*${{3<//r   c                &    [        S U  5       5      $ )Nc              3  p   #    U  H,  n[        U[        R                  5      (       a  [        OUv   M.     g 7fr:   )rL   r   r   r   )r\   xs     r    r^   4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>T  s'     TQSAZ5<<%@%@\aGQSs   46)r`   )xss    r    _munge_symint!FrameStateSizeEntry._munge_symintR  s    TQSTTTr   c                (    [        U[        [        S9$ N)r   r   r   )rs   r   )clsr   s     r    make_scalarFrameStateSizeEntry.make_scalarV  s    "!,|TTr   c                \    [        [        U R                  U5      U R                  U5      S9$ r   )rs   r   r   )r   r   r   s      r    make_tensorFrameStateSizeEntry.make_tensorZ  s0     #""4($$V,
 	
r   c                F    [        [        U R                  U5      [        S9$ r   )rs   r   r   )r   r   s     r    	make_sizeFrameStateSizeEntry.make_sized  s#    """4(
 	
r   c                l    U [         L a  U$ U[         L a  U $ U [        L d  U[        L d  X:w  a  [        $ U $ r:   )r   r   )r   ys     r    _merge_atomFrameStateSizeEntry._merge_atoml  s8    
?H
?H\ 1QVr   c                   ^  U[         L a  U$ U[         L a  U$ U[        L d	  U[        L a  [        $ [        U5      [        U5      :w  a  [        $ [        U 4S j[	        X5       5       5      $ )Nc              3  J   >#    U  H  u  pTR                  X5      v   M     g 7fr:   )r   )r\   r   r   r   s      r    r^   6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>  s     C{tqS__Q**{s    #)r   r   lenr`   zip)r   r   yss   `  r    _merge_atom_tup#FrameStateSizeEntry._merge_atom_tupv  s_     II|!3r7c"gCs2{CCCr   c                   U R                  U R                  UR                  5      n[        U R                  [        5      (       aE  X R                  :w  a"  [        S U R                   5       5      U l        OU R                  b  S U l        X l        [        U R                  5      [        L aH  [        UR                  5      [        L a,  U R                  UR                  :w  a  U R                  U l        O'U R                  [        L a  U R                  b  S U l        U R                  U R                  UR                  5      U l        U R                  U R                  UR                  5      U l        U $ )Nc              3  N   #    U  H  n[        U5      [        L a  UOS v   M     g 7fr:   r   r   s     r    r^   .FrameStateSizeEntry.__ior__.<locals>.<genexpr>  s"      ,;DaaCAT19s   #%)r   r   rL   r`   r   r   r   rD   r   r   r   r   )rM   rN   new_sizes      r    __ior__FrameStateSizeEntry.__ior__  s    ''		5::>dii''99$&+ ,;?99, '# $$0&*#	
 $U\\"c)u||+#';;D [[L(T-A-A-M#'D &&t{{ELLA**4;;Er   )r   r   r   r   r   rk   ri   None)r   rD   ri   rj   )r   tuple[int, ...]ri   ztuple[AutoDynamic | int, ...])r   rD   ri   rs   )r   r   r   r   ri   rs   )r   r   ri   rs   )r   r   r   r   ri   zAutoDynamic | _T)r   (AutoDynamic | AutoUnset | tuple[_T, ...]r   r   ri   z6AutoDynamic | AutoUnset | tuple[AutoDynamic | _T, ...])rN   r   ri   r   )r   r   r   r   rx   ry   r   r   rm   r   r   r   r   r   r   r   r   rn   r   classmethodr   r   r   r   r   r   r   r   r   r    rs   rs      s]   ,7,=,=j,QF)Q EPDUDUED
A  	*- Q  5@4E4Ee5N1  #."3"3D%"POZP':<.04 U U U U 
"
,;
	
 
 
 
   D4D 5D 
@	D Dr   rs   is_unspecialized_nn_modulec          
     D  ^^^
 [         R                  U R                  U R                  5      n[	        5       U   n[
        R                  R                  R                  (       Ga  TUR                  ;   nUR                  T   n[        R                  " U5      m
UT-  nU(       a  T
R                  UR                  :w  a  [        R                  STTR                  T
R                  5        [        R                  " STSS[!        T
R                  5      [!        TR                  5      S.5        U(       a  [        R#                  ST5         S         SUUU
4S jjjnU(       a  T
R$                  UR$                  :w  a  ['        T
R$                  [(        5      (       a  ['        TR$                  [(        5      (       a  [+        T
R$                  5      [+        TR$                  5      :w  a  U" SS	S
5        Oa[-        [+        TR$                  5      5       H4  n	T
R$                  U	   TR$                  U	   :w  d  M%  U" SSU	 S3SU	5        M6     O
U" SSS5        U(       a  T
R.                  UR.                  :w  a  ['        T
R.                  [(        5      (       a  ['        TR.                  [(        5      (       a  [+        T
R.                  5      [+        TR.                  5      :w  a  U" SS	S
5        U$ [-        [+        TR.                  5      5       H4  n	T
R.                  U	   TR.                  U	   :w  d  M%  U" SSU	 S3SU	5        M6      U$ U" SSS5        U$ UR                  T   m
[        R                  STT
R                  TR                  5        TUR                  T'   TnU$ )Nz%automatic dynamic int %s val %s != %srw   r   zscalar changerF   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           
       > Uc  [        TU 5      O[        TU 5      U   nUc  [        TU 5      O[        TU 5      U   n[        R                  SU TUUU5        [        R                  " STUc  SOUU[        U5      [        U5      S.5        g )Nz#automatic dynamic %s %s %s %s != %srw   r   r   )getattrlogdebugr	   instantrB   )	tup_nameshort_reasonlong_reasoni	entry_tupold_entry_tupentryrF   	old_entrys	         r    log_tup)update_automatic_dynamic.<locals>.log_tup  s     -.Ix(75(;STU;V 
 9 	8,Y1!4 
 II5 &&# ,-I51)!-0y>	r   r   r   zdimensionality changezsize(rV   zsize changerN   r   zstride(zstride changez9automatic dynamic is off, overwriting int %s val %s -> %sr:   )
r   rB   r   rB   r   rB   r   rH   ri   r   )r@   rf   f_codere   get_code_stater   _dynamoconfigautomatic_dynamic_shapesrw   copyr   r   r   r	   r   rB   infor   rL   r`   r   ranger   )txrF   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4K999	11$7	IIi(	U	 ))Y-=-==II7  	 &&# #+-!)"2"23u||,	 *O 	 QU		),	;>	CM		 	> 9>>9)..%00Z

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

1=#FeA3aL-K 4 1))Y-=-==)**E22z%,,PU7V7Vy''(C,==He-DE$ ! #3u||#45$++A.%,,q/A#Hs!noqQ 6   '73   11$7			GLL		
 /4%%d+	r   c                  U R                   =nc  [        U UUUS9$ UR                  c  X$R                  R                  U'   U$ S nUR                   H-  nXR                  ;   d  M  [        U UUR                  U   US9nM/     Uc   eU$ )Nr   )distributed_stater  
all_stateslocal_staterw   )r  rF   r   r   stres	sub_states          r    process_automatic_dynamicr    s     """+''A	
 	
 
	 27((. I222.//5/I	 ' 
r   c                    S n[         R                  " 5       (       a/  [         R                  " 5       (       a  [         R                  " 5       n[        R
                  R                  R                  nU  SU SU 3$ )NrW   )distis_availableis_initializedget_rankr   compilerr  cache_key_tag)keyranktags      r    format_cache_keyr  @  s]     Dt2244}}
..


-
-CU!D63%  r   c                    [         R                  R                  R                  (       a  [	        S5        g [         R                  R                  R
                  =n b,  U R                  S5      (       a  [        S5      e[        U 5      $ [         R                  R                  5       =nb  Uu  p#[        SU SU 35      $ g )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.rW   )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                    [         R                  R                  R                  (       a  [	        S5        g [        U 5      $ )Nr   )r   r  r  r"  r   r  )
sticky_keys    r    get_extra_cache_keyr.  e  s0    ~~11U	
 J''r   c                   [         R                  R                  R                  (       d  [        R                  S5        g SSKJn  [        R                  " SSSU  S35      n[        R                  R                  U" 5       SU5      $ )	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_utilsr0  resubr%   r&   r   )	cache_keyr0  code_state_keys      r    code_state_pathr:  p  s\    ==;;		;<?VVOSK	{$2OPN77<<	X~>>r   c                    [         R                  R                  R                  (       a  g[         R                  R                  R
                  =n b  U $ [        5       (       d  g[         R                  R                  5       (       a  g SSK	J
n  U[         R                  R                  S5      :  $ ! [         a     gf = f)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_cacherB  {  s    ~~11]]!!>>>K;;,,..H  5#8#8#M#M1$    s   	B1 1
B>=B>c                 T    SSK Jn   [        5       (       d  g U " S[        5       SS5      $ )Nr   create_cachez
dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacherE  rB  r   rD  s    r    get_remote_cacherI    s,    9-// 	 r   c                *   [        5       nU R                  R                  5        Hj  u  p#Sn[        UR                  [
        5      (       a  [        UR                  ;   nOUR                  [        :X  a  SnU(       d  MY  UR                  U5        Ml     U$ )NFT)	r   rw   itemsrL   r   r`   r   r   add)
code_statedynamic_sourcessrcfsdynamics        r    _collect_dynamic_sourcesrR    st    '1|O//557bggu%%"bgg-GYY,&G7$ 8 r   c                    SSK Jn  [        5       nU  HD  nU[        ;   a  M  U" U5      (       a  [        R	                  U5        M3  UR	                  U5        MF     U$ )Nr   )is_dynamic_source)torch._dynamo.variables.builderrT  r   r~   rL  )all_sourcesrT  missing_sourcesrO  s       r    _collect_missing_sourcesrX    sV    A (2|O((s##"&&s+C   r   c                >   [         R                  U S 5      n[        5       U   n[        U5      nSR	                  U5      nSR	                  [        U5      5      nU(       a,  [        S=nSS9   [        R                  " UUUS9  S S S 5        g g ! , (       d  f       g = f)N,zpgo.dynamic_whitelistTlog_pt2_compile_event)recompile_dynamic_whitelistmissing_dynamic_whitelist)	r@   rf   r   rR  r   rX  r
   r	   pt2_compile)r   r  r  all_dynamic_sourcesframe_whitelistmissing_whitelistrF   s          r    log_frame_dynamic_whitelistrc    s    kk&$'G "7+K2;?hh23O!9:M!NO"99$QUV**,;*; WV VVs   -B
Bc                 ^    [         (       d"  [        R                  R                  SSSS9  Sq g g )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)r}   r   r%  add_mlhub_insightr   r   r    _log_size_mismatch_recompilerj    s9    $$//.:!% 	0 	
 %)! %r   c                   SR                  S U R                  5        5       5      n[        5       nU R                  5        H  nUR	                  [        U5      5        M     U(       a  USSR                  U5       S3-  nU$ )N
c              3     #    U  H=  u  pU S 3SR                  S UR                  R                  5        5       5      -   v   M?     g7f)z:
rl  c              3  R   #    U  H  u  pS U SUR                  5        3v   M     g7f)z  z: N)r   )r\   rO  rP  s      r    r^   .render_code_state.<locals>.<genexpr>.<genexpr>  s)      
5P'#bR		}%5Ps   %'N)r   rw   rK  )r\   kvs      r    r^   $render_code_state.<locals>.<genexpr>  sP      
 DA	 #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="rZ  ")r   rK  r   valuesupdaterR  )cscode_state_strrN  states       r    render_code_statery    s    YY 
 HHJ N (2|O7>? GGJxxP_G`Faabd	

 r   c                  Z    \ rS rSr\SS j5       r\\SS j5       5       r\S	S j5       rSr	g)
PGOCacheArtifacti  c                l    [        U R                  U R                  5      U R                  5      nUc   eg r:   )write_local_impl!_rewrite_cache_key_for_mega_cacher  r/   )rM   metas     r    populate_cachePGOCacheArtifact.populate_cache  s2    22488<dll
 r   c                     g)Npgor   r   r   r    r   PGOCacheArtifact.type  s     r   c                T    U R                  S5      (       d  U $ [        5       =nb  U$ U $ )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~  2PGOCacheArtifact._rewrite_cache_key_for_mega_cache  s3     &&w//$&G3Nr   r   Nr   rk   )r  rB   ri   rB   )
r   r   r   r   r   r  rn   r   r~  r   r   r   r    r{  r{    sD            r   r{  c                    [        [        [        5      (       d   e[        R	                  SX[        [        5      5        [        SU S3SS 5        [        SS5        [        R                  " [        5      q
[        $ )Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                      [        [        5      $ r:   ry  r|   r   r   r    rt   hit.<locals>.<lambda>  s
    !+.r   r  T)rL   r|   r   r   r  r   r   r   r  deepcopyr{   )r  tys     r    hitr    sf    k;////HH3Sc+>NO
rd+.
 E4 }}[1r   c           	        [        U 5      nUb  [        R                  R                  U5      (       a  [	        S=nSS9   [
        R                  " X S9  [        US5       n UR                  5       n[        R                  " U5      q[
        R                  " X#R                  5       S9  [        R                  " [        R!                  5       X5        [#        US5      sS S S 5        sS S S 5        $ g ! [$         a    [&        R)                  SUSS	9   Of = f S S S 5        O! , (       d  f       O= fS S S 5        g ! , (       d  f       g = f)
Nzpgo.get_local_code_stateTr[  r8  r#   cache_size_byteslocalz&get_code_state failed while reading %sexc_info)r:  r%   r&   r'   r
   r	   r_  r(   r)   pickleloadsr|   tellr   record_artifactr{  r   r  	Exceptionr   warning)r8  r&   rF   fr/   s        r    get_local_code_stater    s   9%DBGGNN400..Dd
 **4E dD!Q.ffhG"(,,w"7K&224&&(S )88(--/ tW- "!
 
(  ! KK@$QU    "!!
( )
 
( sN   !D; D!"AC2*4D!	D;2DD!DD!	D;!
D/	+D;;
E	c                R   S n U R                  U5      nUb   [        U[        5      (       d   eUS   n[        U[        5      (       d   e[        R
                  " U5      nUb  [        R                  " U[        U5      S9  [        R                  " U5      n[        R                  " [        R                  5       X5        U$ [         R%                  SU5         U$ ! [         a    [         R#                  SUSS9   U$ f = f! [         a    [         R#                  SUSS9   U$ f = f)Ndatar  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)getrL   dictrB   base64	b64decoder	   r_  r   r  r  r   r  r{  r   r  r   r  r  )remote_cacher8  
event_namerM  
cache_datar  payloads          r    lookup_remote_cache_entryr  4  s7   
 JD!%%i0
 !!*d3333!&)!$,,,, **40)&22"S\ $\\'2
 %44$))+Y
  HH7C  G!     Y=ySWX2 5Ys#   D B C D ?D D&%D&c                    [        5       nUbR  [        S=nSSS9   [        R                  " X S9  [	        XU5      nUb  Uq[        U S5      sS S S 5        $  S S S 5        g g ! , (       d  f       g = f)Nzpgo.get_remote_code_stateT!pgo_get_remote_code_state_time_usr\  dynamo_compile_column_usr  remote)rI  r
   r	   r_  r  r|   r  r8  r  rF   rM  s       r    get_remote_code_stater  Y  s    #%L//D"&%H

 **4E2<DQJ%(9h/
 
 &
 
 
 s   1A!!
A/c                P  ^ [         c   e[        5       nUb~  [        S=nSSS9   [        R                  " X S9  [        X5      m[        R                  SU Tb  [        T5      OS5        Tb   [         (       a   eTq [        S	S
U4S j5        SSS5        gg! , (       d  f       g= f)zg
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  r  z'get_extra_code_state %s hit, %d entriesr   get_extra_remote_code_stater  c                    > [        T 5      $ r:   )ry  )rM  s   r    rt   -get_extra_remote_code_state.<locals>.<lambda>  s    -j9r   )
r|   rI  r
   r	   r_  r  r   r  r   r   r  s      @r    r  r  j  s    
 """#%L55D"&%H

 **4E2<KJHH9#-#9Jq
 %&;&()19!
 
  
 
s   A(B
B%c                 p   [         b  [         $ [        [        5      q [        5       n U c  [         $ [	        U 5      nUc  [        U 5        [         (       d@  [        R                  R                  R                  =nb  [        U5      nUb  [        U5        [        R                  S5        [         c   e[         $ )Nzget_code_state using default)r|   r   rp   r+  r  r  r   r  r  pgo_extra_read_keyr.  r  r   r  )r8  local_code_statesticky_readextra_read_keys       r    r   r     s     i(KI ,I6 i( K!NN11DDD[Q,[9%'7HH+,"""r   c                 |   [         c  [        R                  S5        g [         [        :X  a  [        R                  S5        g [	        5       n U c  [        R                  S5        g [        U 5        [        U 5        [        R                  R                  R                  =nb  [        U5      nUb  [        U5        g g g )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)r|   r   r  r{   r+  put_local_code_stateput_remote_code_stater   r  r  pgo_extra_write_keyr.  )r8  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                   [        U 5      nUc  g US-   nUS-   nSSKJn  [        R                  " [        R
                  R                  U5      SS9  U" U[        S9   [        US5       nUR                  U5        UR                  5       nS S S 5        [        R                  " X25        S S S 5        UW4$ ! , (       d  f       N0= f! , (       d  f       UW4$ = f)	Nz.tmpz.lockr   )FileLockT)exist_ok)timeoutwb)r:  torch.utils._filelockr  r%   makedirsr&   dirnameLOCK_TIMEOUTr(   writer  replace)r8  pickled_coder&   tmp_path	lock_pathr  r  r   s           r    r}  r}    s    9%D|
 f}HwI /KK%5	)\	2(D!QGGL!668D " 	

8"	 
3
 :	 "! 
3	2
 :s$   C*"B6C6
C	 C
Cc                   [        S=nSS9   [        R                  " XS9  [        c   e[        R
                  " [        5      n[        R                  " [        R                  5       X5        [        X5      nUc  [        R                  S5         S S S 5        g Uu  pE[        R                  " XS9  [        R                  SU[        [        5      5        [        SS	S
 5        S S S 5        g ! , (       d  f       g = f)Nzpgo.put_local_code_stateTr[  r  z$put_code_state: local cache disabledr  z*put_code_state: wrote local %s, %d entriesr  r  c                      [        [        5      $ r:   r  r   r   r    rt   &put_local_code_state.<locals>.<lambda>  
    %k2r   )r
   r	   r_  r|   r  dumpsr   r  r{  r   r}  r   r  r   r   )r8  rF   r  r  r&   r   s         r    r  r    s    	88dPT	U&&tA&&&||K0,,!!#Y	
  	8<HH;< 
V	U 
&&tC=tSEUV!"2	
% 
V	U	Us   BC.A
C..
C<c           	     F   U(       d  SOSn[        SU 3=nSSS9   [        R                  " X0S9  [        c   e[	        5       nUc   [
        R                  SU5         S S S 5        g [        R                  " [        5      n[        R                  " U[        U5      S	9  S
[        R                  " U5      R                  S5      0nUR                  X5        [
        R                  SX [        [        5      5        [        USS 5        S S S 5        g ! , (       d  f       g = f)Nr  put_extra_remote_code_statezpgo.T!pgo_put_remote_code_state_time_usr  r  z%s: remote cache disabledr  r  asciiz%s: wrote remote %s, %d entriesr  c                      [        [        5      $ r:   r  r   r   r    rt   'put_remote_code_state.<locals>.<lambda>  r  r   )r
   r	   r_  r|   rI  r   r  r  r  r   r  	b64encodedecodeputr   )r8  extra_code_stater  rF   r  r/   r  s          r    r  r    s
      	 * 
 
zl##"!D

 	&&tA&&&')HH0*=
 
 ,,{+&&tc'lKF$$W-44W="

 	/-zc+FV	
 	"2	
1
 
 
s   AD'B"D
D c                     S q S qSqg rK   )r|   r{   r}   r   r   r    reset_code_stater    s    K %r   )r-   rB   ri   rB   )r/   ztypes.CellTyperi   rh   )
r  r   rF   rB   r   rs   r   rj   ri   rs   )r  rB   ri   rB   )ri   
str | None)r-  rB   ri   r  )r8  rB   ri   r  )ri   rj   )ri   zRemoteCache[JsonDataTy] | None)rM  rp   ri   OrderedSet[str])rV  r  ri   r  )r   rl   ri   r   r   )rv  defaultdict[CodeId, CodeState]ri   rB   )r  rB   r  rB   ri   r  )r8  rB   ri   rz   r:   )r  zRemoteCache[JsonDataTy]r8  rB   r  r  ri   rz   )r8  rB   ri   r   )ri   r  )r8  rB   r  bytesri   ztuple[str, int] | None)F)r8  rB   r  rj   ri   r   )gr   
__future__r   r  r  rx   enum	functoolsloggingr%   r  r6  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   rH  r   r   r<   r   	getLoggerr   r   r  cacher2   r8   r=   	dataclassr@   rp   r{   rm   r|   r}   setr~   r   r   Enumr   r   r   r   r   rs   r  r  r  r+  r.  r:  rB  rI  rR  rX  rc  rj  ry  registerr{  r  r  r  r  r  r   r  r}  r  r  r  r   r   r    <module>r      s  	 #       	  	  # ) ,       ) > 
 0 DD	* 	 !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   