
    9i                        S 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Jr  SSKrSSKJr  SSKJrJr  SSKJr  \R(                  " \5      r\\SS	.S
\R.                  S\\R2                     S\\\\
4      S\S\
4   4S jj5       5       r\R8                  " \SS9r\R8                  " \SS9rS\4S jr \RB                  S\4S j5       r"g)a*  
This module provides TVM backend integration for TorchDynamo.

Apache TVM is a deep learning compiler framework that can optimize and execute
models on various hardware backends. This module enables:

- Compilation of PyTorch models to TVM's computation graphs
- Multiple scheduling options:
  - Default scheduler
  - Auto-scheduler for automatic optimization
  - Meta-schedule for evolutionary search-based tuning
- Hardware-specific optimizations:
  - CUDA GPU support
  - CPU support with LLVM targeting and architecture-specific tuning
  - Automatic detection of CPU capabilities (AVX2, AVX512)
- Tensor conversion utilities between PyTorch and TVM formats
- Configurable optimization levels and tuning trials

The backend can be used with torch.compile():
    model = torch.compile(model, backend="tvm")
    N)MappingProxyType)AnyCallableOptional)fx   )device_from_inputsfake_tensor_unsupported)register_backend)optionsgmexample_inputsr   return.c                >
  ^^^^  Uc  [        S SSS.5      nUc   eSS Km SSKJn  SSKJn  [
        R                  R                  X5      n[        U5      n[        U5       VVs/ s H  u  pxSU 3UR                  4PM     n	nnU " U6 n
[        U
5      S:X  a!  [        R                  S5        U R                  $ UR                  R!                  XY5      u  pUR"                  S	:X  a6  T R%                  UR&                  5      nT R(                  R%                  5       nO4T R+                  S5      nT R(                  R-                  [/        5       5      nUR1                  S
S 5      nUc   [2        R4                  R1                  SS 5      nUR1                  SS5      nUR1                  SS5      nUS:X  Ga(  SSKJn  [8        R:                  " 5       n[2        R<                  R?                  U5      (       d  URA                  US   X5      u  nn[        U5      S:w  aq  URC                  UU5      n[2        R<                  R?                  U5      (       d;  US:  d   eURE                  UURG                  U5      /SS9n URI                  U5        URO                  U5         T RP                  RS                  USS0S9   URU                  XUS9nS S S 5        S S S 5        GO
US:X  a  SSKJ+n  [8        RX                  " 5        nUR"                  S	:w  a?  T R(                  R-                  [/        5        SURZ                  R]                  SS9 35      nUS:  d   eUR^                  Ra                  UUUUSUSUS9nUR^                  Rc                  UUUUUS9nS S S 5        OKUS :X  d  U(       d3  T RP                  RS                  US!9   URU                  XUS9nS S S 5        O[e        S"5      eURg                  WS    " U5      5      mS#T Rh                  Rj                  S$[
        Rl                  4S% jmS&[
        Rl                  S$T Rh                  Rj                  4U 4S' jjmS([
        Rl                  S$[n        [
        Rl                     4UUU4S) jjnU$ s  snnf ! [J         a<    [2        R<                  R?                  U5      (       a  [2        RL                  " U5        e f = f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN(= f! , (       d  f       GN:= f)*Ni N     )	schedulertrials	opt_levelr   )relay)graph_executorinp_z0Explicitly fall back to eager due to zero outputcudar   TVM_SCHEDULERr   r   auto_scheduler)r   maini  )num_measure_trialsmeasure_callbacksearly_stoppingz relay.backend.use_auto_schedulerT)r   config)targetparamsmeta_schedule)r"   z --num-cores F)logical@   evolutionary)modr    work_dirmax_trials_globalnum_trials_per_iterr!   strategyr   )databaser&   r    r!   r   default)r   zThis tuning option is invalid/not implemented for torchdynamo's TVM-related backend. There are three available options: default, auto_scheduler and meta_schedule.	nd_tensorr   c                     U R                   S:X  a$  [        R                  " U R                  5       5      $ [        R                  R
                  R                  U R                  5       5      $ )z8A helper function to transfer a NDArray to torch.tensor.bool)dtypetorch
from_numpynumpyutilsdlpackfrom_dlpack	to_dlpack)r-   s    Z/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/torch/_dynamo/backends/tvm.pyto_torch_tensortvm.<locals>.to_torch_tensor   sL    ??f$ ##IOO$566{{!!--i.A.A.CDD    torch_tensorc                    > U R                   [        R                  :X  a7  TR                  R	                  U R                  5       R                  5       5      $ TR                  R                  U 5      $ )z8A helper function to transfer a torch.tensor to NDArray.)r0   r1   r/   ndarraycpur3   r6   )r<   tvms    r8   to_tvm_tensortvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r;   i_argsc                  x  > U  Vs/ s H  oR                  5       PM     nnTR                  5       u  p4UR                  5        VVs1 s H  u  pTUiM	     nnn[        US5       Hv  u  pxUR	                  5       S:w  d  M  UR
                  (       a  UR                  5       nSU 3n	X;  a  [        R                  SU	5        M^  TR                  U	T" U5      5        Mx     TR                  5         [        TR                  5       5       V
s/ s H  n
T" TR                  U
5      5      PM     sn
$ s  snf s  snnf s  sn
f )Nr   r   z6input %s skipped as not found in tvm's runtime library)
contiguousget_input_infoitems	enumeratedimrequires_graddetachlogwarning	set_inputrunrangeget_num_outputs
get_output)rD   aargs
shape_info_nameactive_inputsidxarginp_nameimr9   rB   s              r8   exec_tvmtvm.<locals>.exec_tvm   s
   (./1/((*
-7-=-=-?@-?'$-?@!$*HCwwyA~$$**,C!#<0KKP  !#& + 	
:?@Q@Q@S:TU:TQQ0:TUU' 0@" Vs   D,D1!D7)8r   rA   r   tvm.contribr   r1   jittracer	   rI   shapelenrM   rN   forwardfrontendfrom_pytorchtyper   indexr    r@   Targetllvm_targetgetosenvironr   tempfileNamedTemporaryFilepathexistsextract_tasksTaskSchedulerTuningOptionsRecordToFiletune	ExceptionunlinkApplyHistoryBest	transformPassContextbuildr"   TemporaryDirectoryr4   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler>   r?   Tensorlist)!r   r   r   r   r   jit_moddevicerZ   r]   
shape_listexample_outputsr&   r!   devr    r   r   r   r   log_filetaskstask_weightstunertune_optionlibmsr'   r+   r_   r^   r9   rB   rA   s!                                @@@@r8   rA   rA   *   s    "UV#WX*iioob1G/F8A.8QR8QfcT#<)8QJR.)O
?q FGzz..--gBKC{{fhhv||$"ggaj"";=1K.IJJNN?D9	[[5)FK+I$$&..0ww~~h''"0">">FV#E< 5zQ&44ULIww~~h//!A:%:"0">">+1+9+F+Fx+P*Q'+ #? #K


;/ ,,X6**#-OQU,V +  kk#VkD 76
 
o	%+((*h{{f$ **"}o]2883E3Ee3E3T2UV
 A::++66!"($&'# 7 	H &&44!# 5 C) +*6 
i	y]]&&&;++c+@C <; "\
 	
 	""3y>##67AE366<< EELL E0ELL 0SVV\\ 0V%,, V4+= V V, OE SP % 77>>(33IIh/  76 +*: <;sP   $R6R S)5SS)9BS;=TAS
S&	!S))
S8;
T

Tr"   )r   r   c                  R     [         R                  " S5        g! [         a     gf = f)NrA   TF)	importlibimport_moduleImportError r;   r8   has_tvmr      s*    & s    
&&c                  z    [         R                  S:X  a'  [        S5      R                  5       n SU ;   a  gSU ;   a  gg)Nlinuxz/proc/cpuinfoavx512zllvm -mcpu=skylake-avx512avx2zllvm -mcpu=core-avx2llvm)sysplatformopenread)cpuinfos    r8   rl   rl      s:    
||w',,.w.w)r;   )#__doc__	functoolsr   loggingrn   r   rp   typesr   typingr   r   r   r1   r   commonr	   r
   registryr   	getLogger__name__rM   r   r   r   strrA   partialtvm_meta_scheduletvm_auto_schedulerr/   r   cacherl   r   r;   r8   <module>r      s
  ,    	 
  " * *   ? & ! 
 59	Q
Q&Q &sCx01	Q
 c3hQ  Qh %%c_E &&s6FG   S  r;   