o
    ߗive                     @  sP  U 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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 d dl m!Z! d dl"m#Z# erd dl$Z$d d	l%m&Z& d d
l'm(Z(m)Z) G dd de*Z+e,e-Z.dZ/ej0ddG dd dZ1ej0G dd dZ2da3de4d< da5de4d< ej0ddG dd dZ6edZ7G dd dej8Z9e9j:Z;G dd dej8Z<e<j:Z=ej0G dd dZ>d d!dHd*d+Z?d d!dHd,d-Z@dId/d0ZAdJd2d3ZBdKd4d5ZCdLd7d8ZDdMd;d<ZEdNd=d>ZFdOd@dAZGdPdBdCZHdPdDdEZIdOdFdGZJdS )Q    )annotationsN)defaultdict)DefaultDictOptionalTupleTYPE_CHECKINGTypeVarUnion)Self)dynamo_timedget_chromium_event_logger	warn_once)	is_fbcode)trace_structured_artifact)InstructionTranslator)
JsonDataTyRemoteCachec                   @  s   e Zd ZdS )ReservedWorkflowIdUserErrorN)__name__
__module____qualname__ r   r   O/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/torch/_dynamo/pgo.pyr      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   make`      zCodeId.makeN)r!   r"   r#   r   )r   r   r   __annotations__staticmethodr(   r   r   r   r   r   Z   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>h       zCodeState.<lambda>)default_factoryz%DefaultDict[str, FrameStateSizeEntry]automatic_dynamicN)r   r   r   dataclassesfieldr2   r*   r   r   r   r   r,   e   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   r7   p   s   
 r7   _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   r9   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   r@      r?   r@   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
isinstancer7   r8   r   )rE   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   .0rE   rL   r   r   	<genexpr>   s    zCFrameStateSizeEntry.render.<locals>.render_tuple.<locals>.<genexpr>])join)rM   rR   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)})rE   rF   r#   r   )rM   rN   r#   r   )rC   rI   rD   rB   rK   tuple)selfrV   r   rR   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$   )rK   rB   torchSymIntrC   rW   rD   )rX   rE   s1r   r   r   __post_init__   s   

z!FrameStateSizeEntry.__post_init__r8   r   boolc                 C  s*   | j tu rdS | j tu rdS | j | tu S )NTF)rC   rI   rJ   rX   r8   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   rP   r   r   r   rS      s    z8FrameStateSizeEntry.is_stride_dynamic.<locals>.<genexpr>FT)rK   rC   rW   allrD   rI   rJ   r`   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$   )rK   r[   r\   rI   )rQ   xr   r   r   rS      s   " z4FrameStateSizeEntry._munge_symint.<locals>.<genexpr>)rW   )re   r   r   r   _munge_symint   r)   z!FrameStateSizeEntry._munge_symintrh   c                 C  s   t |ttdS N)rB   rC   rD   )r.   rI   )clsrh   r   r   r   make_scalar   s   zFrameStateSizeEntry.make_scalarc                 C  s   t t| || |dS rj   )r.   rI   ri   )rk   rC   rD   r   r   r   make_tensor   s
   zFrameStateSizeEntry.make_tensorc                 C  s   t t| |tdS rj   )r.   rJ   ri   )rk   rC   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$   )rJ   rI   )rh   ro   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$   )rq   )rQ   rh   ro   rk   r   r   rS   %  s    z6FrameStateSizeEntry._merge_atom_tup.<locals>.<genexpr>)rJ   rI   lenrW   zip)rk   re   rs   r   ru   r   _merge_atom_tup  s   z#FrameStateSizeEntry._merge_atom_tupotherr
   c                 C  s:   |  | j|j| _| | j|j| _| | j|j| _| S r$   )rq   rB   rx   rC   rD   )rX   ry   r   r   r   __ior__'  s   zFrameStateSizeEntry.__ior__N)r#   r   r#   rZ   )r8   r   r#   r_   )re   rf   r#   rg   )rh   r   r#   r.   )rC   rf   rD   rf   r#   r.   )rC   rf   r#   r.   )rh   r:   ro   r:   r#   rp   )re   rr   rs   rr   r#   rt   )ry   r
   r#   r
   )r   r   r   r3   r4   rJ   rB   r*   rC   rD   rY   r^   ra   rd   r+   ri   classmethodrl   rm   rn   rq   rx   rz   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 }|rNj|jkrNtd jj t	 
dt ddtjt jd |rNtd 	 dd fdd}|rj|jkrtjtrt jtrtjt jkr~|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 != %sr2   rB   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#   rZ   c              
     s   |d u r	t  | nt  | | }|d u rt | nt | | }td| ||| t dt |d u r8dn||t|t|d d S )Nz#automatic dynamic %s %s %s %s != %sr2   rc   r   )getattrlogdebugr   log_instant_eventtimetime_nsr   )r   r   r   r   	entry_tupold_entry_tupr   r    	old_entryr   r   log_tupX  s0   
	z)update_automatic_dynamic.<locals>.log_tuprC   r8   zdimensionality changezsize(rH   zsize changery   rD   zstride(zstride changer$   )
r   r   r   r   r   r   r   r   r#   rZ   )r   r(   f_codeget_code_stater2   copyrB   r   r   r   r   r   r   r   inforC   rK   rW   rv   rangerD   )
r   r    r   r~   code_idframe_state	is_update	mut_entryr   r   r   r   r   update_automatic_dynamic.  sh   



 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_stater2   )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  s>   t jjjstd d S ddlm} tj	
| dd|  dS )Nz'automatic_dynamic_local_pgo not enabledr   )	cache_dirdynamocode_state_z.pkl)r[   _dynamor   automatic_dynamic_local_pgor   r   %torch._inductor.runtime.runtime_utilsr   ospathrU   )r   r   r   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)rY   )rQ   srcfsr   r   r   rS     s    
z.render_code_state.<locals>.<genexpr>.<genexpr>N)r   r   r    rU   r2   items)rQ   kvr   r   r   rS     s    

z$render_code_state.<locals>.<genexpr>)rU   r   )r   r   r   r   render_code_state  s   
r   c            	   
     sd  t d urt S t } tta t }|d u rt S d fdd}t|  d urtj rt	d }dd	X | j
||d
 t d<}zt|a | j
|| d W n tyb   tjd dd Y nw |dW  d    W  d    S W d    n1 sw   Y  W d    n1 sw   Y  t }|d ur$t	d }dd	x | j
||d
 z||}W n ty   tjd|dd Y nQw |d urz't|tsJ |d }t|tsJ t|}| j
|t|d t|a W n ty   tjd|dd Y nw |dW  d    S td| W d    n	1 sw   Y  td t d us0J t S )Ntyr   r#   r   c                   sH   t ttsJ td | tt td|  dddd  tta	tS )Nz$get_code_state %s hit %s, %d entriesget__code_statestringc                   S  r-   r$   r   r6   r   r   r   r   r/   0  r0   z-get_code_state.<locals>.hit.<locals>.<lambda>)
rK   r6   r   r   r   rv   r   r   deepcopyr5   )r   r   r   r   hit)  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   )r6   r   r   r,   r   r   r   r   existsr   add_event_dataopenpickleloadtell	Exceptionr   warningr   getrK   dictr   base64	b64decoderv   loadsr   )	chromium_logr   r   r    fremote_cache
cache_datar   payloadr   r   r   r     s   







r   rZ   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)r6   r   r   r5   r   put_local_code_stateput_remote_code_stater   r   r   r   put_code_stateq  s   


r  c              
   C  sf  t d }dd t }|j|| d td usJ t| }|d u r/td 	 W d    d S |d }|d }dd	lm} t	j
t	j|dd
 ||tdC t|d}tt| |j|| d W d    n1 snw   Y  t	|| td|tt tdddd  W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nzpgo.put_local_code_stateTr   r   z$put_code_state: local cache disabledz.tmpz.lockr   )FileLock)exist_ok)timeoutwbr   z*put_code_state: wrote local %s, %d entriesr  r   c                   S  r-   r$   r   r   r   r   r   r/     r0   z&put_local_code_state.<locals>.<lambda>)r   r   r   r6   r   r   r   filelockr  r   makedirsr   dirnameLOCK_TIMEOUTr   r   dumpr   renamerv   r   )r   r    r   r   tmp_path	lock_pathr  r   r   r   r   r    s>   

"r  c                 C  s   t d }dd] t }|j|| d td usJ t }|d u r.td 	 W d    d S tt}|j|t	|d dt
|di}|| | td	| t	t td
ddd  W d    d S 1 shw   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   r/     r0   z'put_remote_code_state.<locals>.<lambda>)r   r   r   r6   r   r   r   r   dumpsrv   r   	b64encodedecodeputr   )r   r    r   r   contentr   r   r   r   r    s.   


"r  c                   C  s   d a d ad S r$   )r6   r5   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#   rZ   )K
__future__r   r   r   r3   enumloggingr   r   r   collectionsr   typingr   r   r   r   r   r	   typing_extensionsr
   torch._dynamo.configr[   torch._utils_internaltorch.compiler.configtorch.distributeddistributedr   torch._dynamo.utilsr   r   r   torch._environmentr   torch._logging._internalr   typestorch._dynamo.symbolic_convertr   r   r   r   
ValueErrorr   	getLoggerr   r   r  	dataclassr   r,   r5   r*   r6   r7   r:   Enumr<   r>   rJ   r@   rI   r.   r   r   r   r   r   r   r   r   r  r  r  r  r   r   r   r   <module>   sp     

5

		 h
.
#






V

&