o
    h4j                     @  sj  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mZ ddlmZmZmZmZ ddl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& erddl'Z'ddl(m)Z) ddl*m+Z+m,Z, G dd de-Z.e/e0Z1dZ2ej3ddG dd dZ4ej3G dd dZ5da6de7d< da8de7d< ej3ddG dd dZ9edZ:G dd dej;Z<e<j=Z>G dd dej;Z?e?j=Z@ej3G d d! d!ZAd"d#dOd,d-ZBd"d#dOd.d/ZCdPd1d2ZDdQd4d5ZEdRd6d7ZFdSd9d:ZGdTd=d>ZHdUd?d@ZIdVdBdCZJdWdGdHZKdXdIdJZLdXdKdLZMdVdMdNZNdS )Ya  
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)Self)CompileEventLoggerdynamo_timedset_feature_use	warn_once)	is_fbcode)trace_structured_artifact)CacheArtifactManagerCacheArtifactType)InstructionTranslator)
JsonDataTyRemoteCachec                   @  s   e Zd ZdS )ReservedWorkflowIdUserErrorN)__name__
__module____qualname__ r   r   e/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torch/_dynamo/pgo.pyr   0   s    r   
   T)frozenc                   @  s4   e Zd ZU ded< ded< ded< edd	d
ZdS )CodeIdstrfilenameintfirstlinenonamecodetypes.CodeTypereturnc                 C  s   t | j| j| jS N)r   co_filenameco_firstlinenoco_name)r"   r   r   r   makeq      zCodeId.makeN)r"   r#   r$   r   )r   r   r   __annotations__staticmethodr)   r   r   r   r   r   k   s   
 r   c                   @  s&   e Zd ZU ejdd dZded< dS )	CodeStatec                   C     t tS r%   )r   FrameStateSizeEntryr   r   r   r   <lambda>y       zCodeState.<lambda>)default_factoryz%defaultdict[str, FrameStateSizeEntry]automatic_dynamicN)r   r   r   dataclassesfieldr3   r+   r   r   r   r   r-   v   s   
 r-   z(Optional[defaultdict[CodeId, CodeState]]_INIT_CODE_STATE_CODE_STATEc                   @  s   e Zd ZU dZded< dS )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__r+   r   r   r   r   r8      s   
 r8   _Tc                   @     e Zd ZdZdZdS )	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   r:   tokenr   r   r   r   r=          r=   c                   @  r<   )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   rA      r@   rA   c                   @  s   e Zd ZU ejedZded< ejedZded< ejedZ	ded< d1d
dZ
d2ddZd3ddZd3ddZed4ddZed5ddZed6ddZed7d d!Zed8d%d&Zed9d*d+Zd:d.d/Zd0S );r/   )defaultz"Union[int, AutoDynamic, AutoUnset]scalarzBUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic], ...]]sizezOUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic, InferStride], ...]]strider$   r   c                   s   ddd d fd	d
}| j tu r#| jtu r#| jtu rdS d| j S | jtu rBt| j trBt| jtrBd|| j  d|| j S dS )Ns/Union[int, AutoDynamic, AutoUnset, InferStride]r$   r   c                 S  s8   | t u rdS | tu rdS t| trd| j dS t| S )N?z
auto unsetzS())auto_dynamic
auto_unset
isinstancer8   r9   r   )rF   r   r   r   render_single   s   
z1FrameStateSizeEntry.render.<locals>.render_singless0tuple[Union[int, AutoDynamic, InferStride], ...]c                   s    dd  fdd| D  d S )N[z, c                 3  s    | ]} |V  qd S r%   r   .0rF   rM   r   r   	<genexpr>   s    zCFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>])join)rN   rS   r   r   render_tuple   s    z0FrameStateSizeEntry.render.<locals>.render_tuplezfully dynamic scalar or tensorzscalar ztensor size=z stride=zunusual {repr(self)})rF   rG   r$   r   )rN   rO   r$   r   )rD   rJ   rE   rC   rL   tuple)selfrW   r   rS   r   render   s   


zFrameStateSizeEntry.renderNonec                 C  sx   t | jtjrJ | jt | jtr"| jD ]}t |tjr!J |qt | jtr8| jD ]}t |tjr7J |q+d S d S r%   )rL   rC   torchSymIntrD   rX   rE   )rY   rF   s1r   r   r   __post_init__   s   

z!FrameStateSizeEntry.__post_init__r9   r   boolc                 C  s*   | j tu rdS | j tu rdS | j | tu S )NTF)rD   rJ   rK   rY   r9   r   r   r   is_size_dynamic   s
   

z#FrameStateSizeEntry.is_size_dynamicc                 C  sN   t | jtrtdd | jD sdS | jtu rdS | jtu r dS | j| tu S )Nc                 s  s    | ]	}t |tu V  qd S r%   )typer   rQ   r   r   r   rT      s    z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>FT)rL   rD   rX   allrE   rJ   rK   ra   r   r   r   is_stride_dynamic   s   


z%FrameStateSizeEntry.is_stride_dynamicxstuple[int, ...]#tuple[Union[AutoDynamic, int], ...]c                 C  s   t dd | D S )Nc                 s  s$    | ]}t |tjrtn|V  qd S r%   )rL   r\   r]   rJ   )rR   xr   r   r   rT     s   " z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>)rX   )rf   r   r   r   _munge_symint  r*   z!FrameStateSizeEntry._munge_symintri   c                 C  s   t |ttdS N)rC   rD   rE   )r/   rJ   )clsri   r   r   r   make_scalar  s   zFrameStateSizeEntry.make_scalarc                 C  s   t t| || |dS rk   )r/   rJ   rj   )rl   rD   rE   r   r   r   make_tensor  s
   zFrameStateSizeEntry.make_tensorc                 C  s   t t| |tdS rk   )r/   rK   rj   )rl   rD   r   r   r   	make_size  s
   zFrameStateSizeEntry.make_sizer;   yUnion[AutoDynamic, _T]c                 C  s8   | t u r|S |t u r| S | tu s|tu s| |krtS | S r%   )rK   rJ   )ri   rp   r   r   r   _merge_atom  s   zFrameStateSizeEntry._merge_atom-Union[AutoDynamic, AutoUnset, tuple[_T, ...]]ysAUnion[AutoDynamic, AutoUnset, tuple[Union[AutoDynamic, _T], ...]]c                   s\   |t u r|S |t u r|S |tu s|tu rtS t|t|kr tS t fddt||D S )Nc                 3  s     | ]\}}  ||V  qd S r%   )rr   )rR   ri   rp   rl   r   r   rT   6  s    z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>)rK   rJ   lenrX   zip)rl   rf   rt   r   rv   r   _merge_atom_tup(  s   z#FrameStateSizeEntry._merge_atom_tupotherr   c                 C  s:   |  | j|j| _| | j|j| _| | j|j| _| S r%   )rr   rC   ry   rD   rE   )rY   rz   r   r   r   __ior__8  s   zFrameStateSizeEntry.__ior__N)r$   r   r$   r[   )r9   r   r$   r`   )rf   rg   r$   rh   )ri   r   r$   r/   )rD   rg   rE   rg   r$   r/   )rD   rg   r$   r/   )ri   r;   rp   r;   r$   rq   )rf   rs   rt   rs   r$   ru   )rz   r   r$   r   )r   r   r   r4   r5   rK   rC   r+   rD   rE   rZ   r_   rb   re   r,   rj   classmethodrm   rn   ro   rr   ry   r{   r   r   r   r   r/      s.   
 






	
		r/   Fis_unspecialized_nn_moduletxr   r!   r   entryr   r`   r$   c          
   	     s  t | j}t | }|jv }|j }t|| O }|rJj|jkrJtd jj t	
dddtjt jd |rJtd 	 dd fdd}|rj|jkrtjtrt jtrtjt jkrz|ddd n&tt jD ]}	j|	  j|	 kr|dd|	 dd|	 qn|ddd |rj|jkrtjtrt jtrtjt jkr|ddd |S tt jD ]}	j|	  j|	 kr|dd|	 dd|	 q|S |ddd |S )Nz%automatic dynamic int %s val %s != %sr3   rC   zscalar changer!   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`.tup_namer   short_reasonlong_reasoniOptional[int]r$   r[   c              	     s   |d u r	t  | nt  | | }|d u rt | nt | | }td| ||| td|d u r4dn||t|t|d d S )Nz#automatic dynamic %s %s %s %s != %sr3   rd   r   )getattrlogdebugr	   instantr   )r   r   r   r   	entry_tupold_entry_tupr   r!   	old_entryr   r   log_tuph  s.   
	z)update_automatic_dynamic.<locals>.log_tuprD   r9   zdimensionality changezsize(rI   zsize changerz   rE   zstride(zstride changer%   )
r   r   r   r   r   r   r   r   r$   r[   )r   r)   f_codeget_code_stater3   copyrC   r   r   r	   r   r   inforD   rL   rX   rw   rangerE   )
r   r!   r   r   code_idframe_state	is_update	mut_entryr   r   r   r   r   update_automatic_dynamic?  sf   




r   c                C  sx   | j  }d u rt| |||dS |jd u r||jj|< |S d }|jD ]}||jv r3t| ||j| |d}q!|d us:J |S )Nr~   )distributed_stater   
all_stateslocal_stater3   )r   r!   r   r   stres	sub_stater   r   r   process_automatic_dynamic  s,   


r   Optional[str]c                  C  s   t jjjrtd d S d } t rt rt } t j	jj
}t j	jj }d ur:|dr0td| d|  d| S t j  }d urU|\}}d| d| d|  d| S d S )NzHdynamo_pgo force disabled by torch._inductor.config.force_disable_cachesz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.:)r\   	_inductorconfigforce_disable_cachesr   distis_availableis_initializedget_rankcompilercache_key_tagjob_id
startswithr   _utils_internalget_mast_job_name_version)ranktagrname_versionmast_job_namemast_job_versionr   r   r   get_cache_key  s&   


r   	cache_keyc                 C  sL   t jjjstd d S ddlm} t	ddd|  d}t
j| d|S )	Nz'automatic_dynamic_local_pgo not enabledr   )	cache_dirz[<>:"/\\|?*]_code_state_z.pkldynamo)r\   _dynamor   automatic_dynamic_local_pgor   r   %torch._inductor.runtime.runtime_utilsr   resubospathrV   )r   r   code_state_keyr   r   r   code_state_path  s   

r   c                  C  sr   t jjjrdS t jjj } d ur| S t sdS t j rdS zddl	m
} W n
 ty0   Y dS w |t jdkS )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   r   r   r   "should_use_remote_dynamo_pgo_cache  s    

r   !Optional[RemoteCache[JsonDataTy]]c                  C  s&   ddl m}  t sd S | dt ddS )Nr   create_cachez
dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacher   r   r   r   r   r   r   get_remote_cache  s   r   csdefaultdict[CodeId, CodeState]c                 C  s   d dd |  D S )N
c                 s  sJ    | ] \}}|j  d |j d |j dddd |j D  V  qdS )r   z:
r   c                 s  s(    | ]\}}d | d|   V  qdS )z  z: N)rZ   )rR   srcfsr   r   r   rT   $  s    
z.render_code_state.<locals>.<genexpr>.<genexpr>N)r   r    r!   rV   r3   items)rR   kvr   r   r   rT   "  s    

z$render_code_state.<locals>.<genexpr>)rV   r   )r   r   r   r   render_code_state!  s   
r   c            	   
     s  t d urt S tta t } | d u rt S d fdd}t|   d urtj rtd }dd	d t	j
|| d
 t dH}z| }t|a t	j
|| d W n tyc   tjd dd Y nw ttj| | |dW  d    W  d    S W d    n1 sw   Y  W d    n1 sw   Y  t }|d ur5td }dd	 t	j
|| d
 z|| }W n ty   tjd| dd Y nYw |d urz't|tsJ |d }t|tsJ t|}t	j
|t|d t|a W n ty   tjd| dd Y nw ttj| | |dW  d    S td|  W d    n	1 s0w   Y  td t d usAJ t S )Ntyr   r$   r   c                   sR   t ttsJ td | tt td|  dddd  tdd t	ta
tS )	Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                   S  r.   r%   r   r7   r   r   r   r   r0   >  r1   z-get_code_state.<locals>.hit.<locals>.<lambda>pgoT)rL   r7   r   r   r   rw   r   r   r   deepcopyr6   )r   r   r   r   hit7  s   


zget_code_state.<locals>.hitzpgo.get_local_code_stateTlog_pt2_compile_eventr   rbcache_size_bytesz&get_code_state failed while reading %s)exc_infolocalzpgo.get_remote_code_statez'get_code_state failed remote read on %sdataz1get_code_state failed parsing remote result on %sremotez get_code_state remote miss on %szget_code_state using default)r   r   r$   r   ) r7   r   r-   r   r   r   r   existsr
   r	   pt2_compileopenreadpickleloadstell	Exceptionr   warningr   record_artifactr   PGOr   getrL   dictr   base64	b64decoderw   r   )	r   r   r!   fcontentremote_cache
cache_datar   payloadr   r   r   r   +  s   






"
$r   r[   c                  C  s\   t d u rtd d S t tkrtd d S t } | d u r$td d S t|  t|  d S )Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping)r7   r   r   r6   r   put_local_code_stateput_remote_code_stater   r   r   r   put_code_state  s   


r
  pickled_codebytesOptional[tuple[str, int]]c              	   C  s   t | }|d u r
d S |d }|d }ddlm} tjtj|dd ||td/ t|d}|	| |
 }W d    n1 sCw   Y  t|| W d    ||fS 1 s[w   Y  ||fS )	Nz.tmpz.lockr   )FileLockT)exist_ok)timeoutwb)r   torch.utils._filelockr  r   makedirsr   dirnameLOCK_TIMEOUTr   writer   replace)r   r  r   tmp_path	lock_pathr  r  rD   r   r   r   write_local_impl  s"   


r  c                 C  s   t d }ddV tj|| d td usJ tt}ttj	| | t
| |}|d u r:td 	 W d    d S |\}}tj||d td|tt tdd	d
d  W d    d S 1 saw   Y  d S )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                   S  r.   r%   r   r   r   r   r   r0     r1   z&put_local_code_state.<locals>.<lambda>)r
   r	   r   r7   r   dumpsr   r   r   r   r  r   r   rw   r   )r   r!   r  metar   rD   r   r   r   r    s*   


"r  c                 C  s   t d }ddZ tj|| d td usJ t }|d u r+td 	 W d    d S tt}tj|t	|d dt
|di}|| | td	| t	t td
ddd  W d    d S 1 sew   Y  d S )Nzpgo.put_remote_code_stateTr   r   z%put_code_state: remote cache disabledr   r   asciiz+put_code_state: wrote remote %s, %d entriesr	  r   c                   S  r.   r%   r   r   r   r   r   r0     r1   z'put_remote_code_state.<locals>.<lambda>)r
   r	   r   r7   r   r   r   r   r  rw   r  	b64encodedecodeputr   )r   r!   r  r  r  r   r   r   r	    s,   



"r	  c                   C  s   d a d ad S r%   )r7   r6   r   r   r   r   reset_code_state  s   r!  )
r   r   r!   r   r   r/   r   r`   r$   r/   )r$   r   )r   r   r$   r   )r$   r`   )r$   r   )r   r   r$   r   )r$   r   r|   )r   r   r  r  r$   r  )r   r   r$   r[   )Or:   
__future__r   r  r   r4   enumloggingr   r   r   collectionsr   typingr   r   r   r   typing_extensionsr   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   typestorch._dynamo.symbolic_convertr   r   r   r   
ValueErrorr   	getLoggerr   r   r  	dataclassr   r-   r6   r+   r7   r8   r;   Enumr=   r?   rK   rA   rJ   r/   r   r   r   r   r   r   r   r   r
  r  r  r	  r!  r   r   r   r   <module>   sv    

5

		 f
.
#





^


