~L i&jUdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl mZddlmZmZmZmZddlmZmZddlZddlZddlZddlmZddlmZm Z m!Z!m"Z"ddl#m$Z$dd l%m&Z&dd l'm(Z(m)Z)m*Z*dd l+m,Z,erddl-Z-dd l.m/Z/dd l0m1Z1m2Z2Gdde3Z4ejje6Z7dZ8ejrdAdZ:ejvdGddZde?d<da@de?d<daAde?d<ejvdGddZBed ZCGd!d"ejZEeEjZGGd#d$ejZHeHjZIejvGd%d&ZJdd' dBd(ZKdd' dBd)ZLdCd*ZMdDd+ZNdEd,ZOdFd-ZPdGd.ZQdHd/ZRdId0ZSdJd1ZTdKd2ZUdLd3ZVe)jGd4d5e(ZXdMd6ZYdNd7ZZ dO dPd8Z[dNd9Z\dQd:Z]dRd;Z^dSd<Z_dTd=Z`dQd>ZadQd?ZbdSd@Zcy)Ua Profile Guided Optimization (PGO) implementation for Dynamo. This module provides functionality for caching and managing code state profiles that guide optimization decisions in Dynamo. It implements both local and remote caching mechanisms for storing profile information across runs, handles profile merging across distributed ranks, and manages the lifecycle of profile data during compilation. The profiles track dynamic vs static properties of tensors and help Dynamo make better specialization decisions. ) annotationsN) defaultdict)Optional TYPE_CHECKINGTypeVarUnion)overrideSelf)CompileEventLogger dynamo_timedset_feature_use warn_once) is_fbcode)trace_structured_artifact) CacheArtifactCacheArtifactFactoryCacheArtifactManager) OrderedSet)InstructionTranslator) JsonDataTy RemoteCachec eZdZy)ReservedWorkflowIdUserErrorN)__name__ __module__ __qualname__W/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/torch/_dynamo/pgo.pyrr7srr ctjj|s|St|d5}|j }t j |}t|dzd}|cdddS#1swYyxYw)Nrbl08x)ospathexistsopenreadzlibcrc32format)filepathfilecontent crc32_valuehashs r_hash_containing_filer1rsg 77>>( # h ))+jj) kJ.6 s 6A..A7T)frozenc`eZdZUded<ded<ded<ded<d dZd dZdd Zedd Zy )CodeIdstrfilenameint firstlinenoname file_hashct|tsy|j|jk(xr4|j|jk(xr|j|jk(SNF) isinstancer4r:r8r9selfothers r__eq__z CodeId.__eq__sR%( NNeoo - (  E$5$55 ( UZZ' rcZt|j|j|jfSN)r0r:r9r8r?s r__hash__zCodeId.__hash__s"T^^TYY0@0@ABBrcnd|jd|jd|jd|jS)Nzhash():)r:r6r8r9rDs r__str__zCodeId.__str__s5t~~&a a8H8H7I499+VVrct|j|j|jt |jSrC)r4 co_filenameco_firstlinenoco_namer1)codes rmakez CodeId.makes6       LL !$"2"2 3   rN)r@objectreturnbool)rQr7rQr5)rNtypes.CodeTyperQr4) rrr__annotations__rArErI staticmethodrOrrrr4r4s>M IN CW  rr4c@eZdZUejdZded<y) CodeStatec ttSrC)rFrameStateSizeEntryrrrzCodeState.s ,? @r)default_factoryz%defaultdict[str, FrameStateSizeEntry]automatic_dynamicN)rrr dataclassesfieldr]rUrrrrXrXs!?P{?P?P@@<rrX(Optional[defaultdict[CodeId, CodeState]]_INIT_CODE_STATE _CODE_STATEFrR_LOGGED_DYNAMIC_ALLOWLISTceZdZUdZded<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. r7dimN)rrr__doc__rUrrrreres Hrre_TceZdZdZdZy) AutoUnsetz The identity element of our semilattice, a generic "don't know" element that is always subsumed when we get more information. rNrrrrgtokenrrrrjrj ErrjceZdZdZdZy) AutoDynamicz The top element of our (bounded) semilattice, whenever you merge this with any other element you always get it again rNrkrrrrorormrrocJeZdZUejeZded<ejeZded<ejeZ ded<ddZ dd Z dd Z dd Z edd Zedd Ze ddZeddZeddZe ddZddZy)rZ)defaultz"Union[int, AutoDynamic, AutoUnset]scalarzBUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic], ...]]sizezOUnion[AutoDynamic, AutoUnset, tuple[Union[int, AutoDynamic, InferStride], ...]]stridecddd fd }|jtur4|jtur"|jturyd|jS|jtur\t |jt rBt |jt r(d||jd||jSy) Nc||tury|turyt|trd|jdSt |S)N?z auto unsetzS(rG) auto_dynamic auto_unsetr=rerfr5)ss r render_singlez1FrameStateSizeEntry.render..render_singles<L j#A{+AEE7!}$1v rcDddjfd|DzdzS)N[z, c3.K|] }|ywrCr).0rzr{s r zCFrameStateSizeEntry.render..render_tuple..s"@=#3"@s])join)ssr{s r render_tuplez0FrameStateSizeEntry.render..render_tuples""@R"@@@3F Frzfully dynamic scalar or tensorzscalar z tensor size=z stride=zunusual {repr(self)})rzz/Union[int, AutoDynamic, AutoUnset, InferStride]rQr5)rz0tuple[Union[int, AutoDynamic, InferStride], ...]rQr5)rsrxrtrrr=tuple)r?rr{s @rrenderzFrameStateSizeEntry.renders  G 99 $ )D{{l*7  .. [[L ($))U+ 4;;0N%l499&=%>h|TXT_T_G`Fabb&rct|jtjrJ|jt|jt r2|jD]#}t|tjsJ|t|j t r3|j D]#}t|tjsJ|yyrC)r=rrtorchSymIntrsrrt)r?rzs1s r __post_init__z!FrameStateSizeEntry.__post_init__ sdkk5<<8E$++E8 dii 'YY :%a6996 : dkk5 )kk <%b%,,7;;7 < *rcx|jtury|jtury|j|tuS)NTF)rsrxryr?rfs ris_size_dynamicz#FrameStateSizeEntry.is_size_dynamics3 99 $ 99 "yy~--rct|jtrtd|jDsy|jt ury|jt ury|j|t uS)Nc3>K|]}t|tuywrC)typer7)rrzs rrz8FrameStateSizeEntry.is_stride_dynamic..-s0SAaC0SsFT)r=rsrallrtrxryrs ris_stride_dynamicz%FrameStateSizeEntry.is_stride_dynamicsX" tyy% (S0S0S-S ;;, & ;;* ${{3<//rc&td|DS)Nc3`K|]&}t|tjrtn|(ywrC)r=rrrx)rxs rrz4FrameStateSizeEntry._munge_symint..8s"TAZ5<<%@\aGTs,.)r)xss r _munge_symintz!FrameStateSizeEntry._munge_symint6sTQSTTTrc.t|ttSN)rrrsrt)rZrx)clsrs r make_scalarzFrameStateSizeEntry.make_scalar:s"!,|TTrcbtt|j||j|Sr)rZrxr)rrsrts r make_tensorzFrameStateSizeEntry.make_tensor>s0#""4($$V,  rcLtt|j|tSr)rZryr)rrss r make_sizezFrameStateSizeEntry.make_sizeHs#"""4(  rcd|tur|S|tur|S|tus |tus||k7rtS|SrC)ryrx)rys r _merge_atomzFrameStateSizeEntry._merge_atomPs: ?H ?H \ 1Q!V rc|tur|S|tur|S|tus|turtSt|t|k7rtStfdt ||DS)Nc3HK|]\}}j||ywrC)r)rrrrs rrz6FrameStateSizeEntry._merge_atom_tup..hs Ctq!S__Q*Cs")ryrxlenrzip)rryss` r_merge_atom_tupz#FrameStateSizeEntry._merge_atom_tupZsa  I  I  |!3  r7c"g  Cs2r{CCCrc|j|j|j|_|j|j|j|_|j|j|j|_|SrC)rrrrrsrtr>s r__ior__zFrameStateSizeEntry.__ior__js[&&t{{ELLA ((EJJ? **4;; E  rNrSrQNone)rfr7rQrR)rtuple[int, ...]rQz#tuple[Union[AutoDynamic, int], ...])rr7rQrZ)rsrrtrrQrZ)rsrrQrZ)rrhrrhrQzUnion[AutoDynamic, _T])r-Union[AutoDynamic, AutoUnset, tuple[_T, ...]]rrrQzAUnion[AutoDynamic, AutoUnset, tuple[Union[AutoDynamic, _T], ...]])r@r rQr )rrrr^r_ryrrrUrsrtrrrrrVr classmethodrrrrrrrrrrZrZs)1B1B1B:1VF .V  *- L  *-  .&:<.04UUUU " ,;      D 9 D : D K D DrrZis_unspecialized_nn_modulec  tj|j}t|}tj j jr|jv}|j}tj| |z}|r j|jk7rtjdj jtjdddt jtjd|rtj!d d d fd }|r j"|j"k7rt% j"t&rt%j"t&rt) j"t)j"k7r |dd d n]t+t)j"D]1} j"| j"| k7s#|dd | d d | 3n |ddd|r j,|j,k7rt% j,t&rt%j,t&rt) j,t)j,k7r |dd d |St+t)j,D]1} j,| j,| k7s#|dd| d d| 3|S|ddd|S|j tjd jj|j<}|S)Nz%automatic dynamic int %s val %s != %sr]rrz scalar changer9 dim_changedreasoncachednewz%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|nt||}| t|nt||}tjd||||tjd|dn||t |t |dy)Nz#automatic dynamic %s %s %s %s != %sr]rr)getattrlogdebugr instantr5) tup_name short_reason long_reasoni entry_tup old_entry_tupentryr9 old_entrys rlog_tupz)update_automatic_dynamic..log_tups-.Ix(75(;STU;V  9 8,Y1!4  II5   & &# ,-I51)!-0y>  rrsrfzdimensionality changezsize(rGz size changer@rtzstride(z stride changez9automatic dynamic is off, overwriting int %s val %s -> %srC) rr5rr5rr5rz Optional[int]rQr)r4rOf_codeget_code_stater_dynamoconfigautomatic_dynamic_shapesr]copyrrrrr rr5inforsr=rrrangert) txr9rrcode_id frame_state is_update mut_entryrrrs `` @rupdate_automatic_dynamicrqs kk"))$G "7+K }}44K999 11$7 IIi( U  ))Y-=-== II7      & &# #+-!)"2"23u||,  *O TX  ), ;> CP   > 9>>9)..%0Z E5Ry~~&#ejj/9FE+BC"3uzz?3L$>>!, 1 =#FeA3aL-KL1 ))Y-=-==)**E2z%,,PU7Vy''(C ,==He-DE$ !#3u||#45R$++A.%,,q/A#Hs!noqQR '73  11$7  G     LL  /4 %%d+ rc|jx}t||||S|j||jj|<|Sd}|jD]-}||jvst|||j||}/|J|S)Nr)distributed_stater all_states local_stater])rr9rrstres sub_states rprocess_automatic_dynamicrs"""+'   'A    27((.  Iy222.//5/I   rcd}tjr(tjrtj}tj j j}|d|d|S)NrH)dist is_availableis_initializedget_rankrcompilerr cache_key_tag)keyranktags rformat_cache_keyr sW D t224}} ..   - -CU!D63%  rcjtjjjr t dytjjj x}'|j dr tdt|Stjjx}|\}}td|d|Sy)NGdynamo_pgo force disabled by torch.compiler.config.force_disable_cachesmast:ztorch.compiler.config.job_id with prefix 'mast:' is reserved for automatically generated job id associated with a specific MAST job name and version.rH) rrrforce_disable_cachesrjob_id startswithrr_utils_internalget_mast_job_name_version)r name_version mast_job_namemast_job_versions r get_cache_keyrs ~~11 U ^^ " " ) ))6 << -$   ""--GGII V*6' '% a8H7I JKK rcxtjjjr t dyt |S)Nr)rrrrrr) sticky_keys rget_extra_cache_keyr0s0 ~~11 U  J ''rctjjjstj dyddlm}tjddd|d}tjj|d|S) Nz'automatic_dynamic_local_pgo not enabledr) cache_dirz [<>:"/\\|?*]_ code_state_z.pkldynamo) rrrautomatic_dynamic_local_pgorr%torch._inductor.runtime.runtime_utilsrresubr$r%r) cache_keyrcode_state_keys rcode_state_pathr;s\ ==   ; ; ;<?VVOSK {$2OPN 77<< X~ >>rc`tjjjrytjjj x}|St sytjjry ddl m }|tjjdk\S#t$rYywxYw)NFr)REMOTE_CACHE_VERSIONz'pytorch/remote_cache:dynamo_pgo_version) rrrrrautomatic_dynamic_remote_pgorris_fb_unit_testtorch._inductor.fb.remote_cacherModuleNotFoundErrorjustknobs_getval_int)rrs r"should_use_remote_dynamo_pgo_cacher Fs ~~11 ]] ! ! > >>K ; ,,.H 5#8#8#M#M1$  s9B!! B-,B-cJddlm}tsy|dtddS)Nr create_cachez dynamo-pgoFbRemoteDynamoPGOCacheRemoteDynamoPGOCache)torch._inductor.remote_cacherr rr s rget_remote_cacher]s)9 - /     rct}|jjD]]\}}d}t|jt rt |jv}n|jt k(rd}|sM|j|_|S)NFT) rr]itemsr=rsrrxrradd) code_statedynamic_sourcessrcfsdynamics r_collect_dynamic_sourcesrksv'1|O//557%R bggu %"bgg-G YY, &G     $% rcNtj|}t|}djt |}|r[t dx}d5t j||dddts%tjjddd dayyy#1swY6xYw) N,zpgo.dynamic_whitelistTlog_pt2_compile_event)recompile_dynamic_whitelistdynamic_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.)categoryinsightinsight_description) r4rOrrrr r pt2_compilercrradd_mlhub_insight)rrrframe_whitelistr9s rlog_frame_dynamic_whitelistr(xskk&!G "7+Khh7 DEO "99$QU V   * */  )  ! ! 3 32>%) 4 )- %)   s BB$cdjd|jD}t}|jD]}|j t ||r|ddj|dz }|S)N c3K|]=\}}|ddjd|jjDz?yw)z: r*c3NK|]\}}d|d|jyw)z z: N)r)rrrs rrz.render_code_state...s, *1#rbR } % s#%N)rr]r)rkvs rrz$render_code_state..sQ Aq #S )) 565H5H5N5N5P   sAAz PGO detected a recompilation due to dynamic shapes. To reduce shape recompilations by compiling dynamically to start, set environment variable TORCH_COMPILE_DYNAMIC_SOURCES="r")rrrvaluesupdater)cscode_state_strrstates rrender_code_stater5sYY HHJ N(2|O@7>?@ GGJxxP_G`Faab d  rc:dd}||||k(r||z}yy)Ncbt|jtsyt|jS)N)r=rsrr)rs rrzmerge_pgo_entry..ranks!%**e,5::r)rrZrQr7r)rdstrs rmerge_pgo_entryr:s'  CyDI s rcLeZdZeddZeeddZeddZy)PGOCacheArtifactcjt|j|j|j}|JyrC)write_local_impl!_rewrite_cache_key_for_mega_cacherr.)r?metas rpopulate_cachezPGOCacheArtifact.populate_caches2  2 2488 .s !+.rrCT) r=rbrrrrrr rdeepcopyra)rtys rhitrOse k; // /HH 3S"c+>NO rd+. E4 }}[1 rct|}|tjj|rt dx}d5t j ||t|d5} |j}tj|a t j ||jtjtj!||t#|dcdddcdddSy#t$$rt&j)d|d YnwxYw dddn #1swYnxYwdddy#1swYyxYw) Nzpgo.get_local_code_stateTrrr"cache_size_byteslocalz&get_code_state failed while reading %sexc_info)rr$r%r&r r r%r'r(pickleloadsrbtellrrecord_artifactr<rrO Exceptionrwarning)rr%r9fr.s rget_local_code_stater^s* 9 %D BGGNN40 . .Dd  .  * *49 EdD! .Q .ffhG"(,,w"7K&224!&&(S )88(--/GtW- . .  . .( !KK@$QU  . . .  .( ) .( sN$D: D%"A C4,4D% D:4!DD%DD% D:%D. *D::Ec@d} |j|}| t|tsJ|d}t|tsJt j |}| t j|t|tj|}tjtj|||St j%d||S#t$rt j#d|dY|SwxYw#t$rt j#d|dY|SwxYw)NdatarRz1get_code_state failed parsing remote result on %sTrUz get_code_state remote miss on %sz'get_code_state failed remote read on %s)getr=dictr5base64 b64decoder r%rrWrXrrZr<rr[rr\r) remote_cacher event_namer cache_datar`payloads rlookup_remote_cache_entryris3 JD!%%i0   ! !*d333!&)!$,,, **40)&22"S\$\\'2 %44$))+Y  HH7 C   G!   Y =ySW X2 5Ys#C8A5C!C54C58!DDct}|Xtdx}dd5tj||t |||}||at |dcdddS dddyy#1swYyxYw)Nzpgo.get_remote_code_stateT!pgo_get_remote_code_state_time_usrdynamo_compile_column_usrQremote)rr r r%rirbrO)rrer9rs rget_remote_code_stateros#%L / /D"&%H 0  * *49 E2<DQJ%( 9h/ 0 0& 0  0 s 4A&&A/ctJt}|tdx}dd5tj||t ||t jd| tnd|jD]Y\}}|tvrC|jjD]%\}}t|t|j|'Q|t|<[td d fd dddyy#1swYyxYw) zo Reads an additional PGO profile from the given cache key, and merges it with the default PGO profile. Nzpgo.add_extra_remote_code_stateTrkrlrQz'add_extra_code_state %s hit, %d entriesradd_extra_remote_code_staterJctSrC)r5)rsrr[z-add_extra_remote_code_state..Os -j9r) rbrr r r%rirrrrr]r:r)rrer9rr4rrrs @rrqrq(s  "" "#%L 5 5D"&%H    * *49 E2<KJ HH9#-#9Jq  %&0&6&6&8 5NGU+-*/*A*A*G*G*IJC , %{7';'M'Mc'R 05 G, 5*197     s CC66C?cNttSttat}|tSt |}| t |t jjjx}t|}| t|tjdtJtS)Nzget_code_state using default)rbrrXrr^rorrrpgo_extra_read_keyrrqrr)rlocal_code_state sticky_readextra_read_keys rrrSsi(KI,I6i(~~,,??? L,[9  % ' 7HH +,  "" " rcrttjdyttk(rtjdyt }|tjdyt |t |tjjjx}t|}| t |yyy)Nz1put_code_state: never initialized, will not writez#put_code_state: no change, skippingz&put_code_state: no cache key, skipping) rbrrrarput_local_code_stateput_remote_code_staterrrpgo_extra_write_keyr)r sticky_writeextra_write_keys rput_code_stater~rs DE&& 67I 9:#)$--AAA N-l;  & !/ 2 'Orct|}|y|dz}|dz}ddlm}tjtj j |d||t5t|d5}|j||j}dddtj||ddd|fS#1swY+xYw#1swY|fSxYw) Nz.tmpz.lockr)FileLockT)exist_ok)timeoutwb) rtorch.utils._filelockrr$makedirsr%dirname LOCK_TIMEOUTr'writerYreplace)r pickled_coder%tmp_path lock_pathrr]rss rr>r>s 9 %D | f}HwI/KK%5 )\ 2# (D ! Q GGL !668D  8T" # :   # :s$! C."B:C:C ?CCctdx}d5tj||tJt j t}t jtj||t||}|tjd dddy|\}}tj||tjd|tttdd d dddy#1swYyxYw) Nzpgo.put_local_code_stateTrrQz$put_code_state: local cache disabledrRz*put_code_state: wrote local %s, %d entriesryrJc ttSrCrLrrrr[z&put_local_code_state.. %k2r)r r r%rbrWdumpsrrZr<rr>rrrr)rr9rr@r%rss rryrys 88dPT U &&tyA&&&||K0 ,,  ! ! #Y   <8 < HH; <    d&&tdC =tSEUV! "  2 %   sBC6AC66C?c(tdx}dd5tj||tJt }|t j d dddytjt}tj|t|dtj|jd i}|j||t j d |tttd d d dddy#1swYyxYw)Nzpgo.put_remote_code_stateT!pgo_put_remote_code_state_time_usrlrQz%put_code_state: remote cache disabledrRr`asciiz+put_code_state: wrote remote %s, %d entriesrzrJc ttSrCrLrrrr[z'put_remote_code_state..rr)r r r%rbrrrrWrrrc b64encodedecodeputr)rr9rer.rgs rrzrzs ++"!D  &&tyA&&&')   HH< =   ,,{+&&tc'lK F$$W-44W="  J/  99c+FV  " #  2 1   sADB#DDcdadadayr<)rbrarcrrrreset_code_statersK %r)r,r5rQr5) rrr9r5rrZrrRrQrZ)rr5rQr5)rQ Optional[str])rr5rQr)rr5rQr)rQrR)rQz!Optional[RemoteCache[JsonDataTy]])rrXrQzOrderedSet[str])rrTrQr)r2defaultdict[CodeId, CodeState]rQr5)rrZr9rZrQr)rr5rNr5rQr)rr5rQr`rC)rezRemoteCache[JsonDataTy]rr5rfrrQr`)rr5rQr)rQrr)rr5rbytesrQzOptional[tuple[str, int]])drg __future__rrcrr^enum functoolsloggingr$rWrr) collectionsrtypingrrrrtyping_extensionsr r torch._dynamo.configrtorch._utils_internaltorch.compiler.configtorch.distributed distributedrtorch._dynamo.utilsr r r rtorch._environmentrtorch._logging._internalrtorch.compiler._cacherrrtorch.utils._ordered_setrtypestorch._dynamo.symbolic_convertrrrr ValueErrorr getLoggerrrrcacher1 dataclassr4rXrarUrbrcrerhEnumrjrlryrorxrZrrrrrrr rrr(r5r:registerr<rOr^rirorqrr~r>ryrzrrrrrs #   #::,  )> 0DD * g! j   d#$ $ $$ N  >B:A8< 5<"'4'd#  $ ( T] __ $))   JJJd(- ii i i !% i  ib(- ++ + + !% +  +\!4(?.  -,(}8 <!%")""". "J"(V>3,2 4 B&r