
    [Th                     V   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
  SSKrSSKJrJr  SSKJr  \R"                  " \5      r\\\" SSS	S
.5      S.S\
\   4S jj5       5       r\R*                  " \SS9r\R*                  " \SS9rS r\R2                  " S5      S 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)Optional   )device_from_inputsfake_tensor_unsupported)register_backend N     )	schedulertrials	opt_level)optionsr   c                	  ^^^^  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R/                  SS 5      nUc   [0        R2                  R/                  SS 5      nUR/                  S	S
5      nUR/                  SS5      nUS:X  Ga(  SSK Jn  [6        R8                  " 5       n[0        R:                  R=                  U5      (       d  UR?                  US   X5      u  nn[        U5      S:w  aq  URA                  UU5      n[0        R:                  R=                  U5      (       d;  US:  d   eURC                  UURE                  U5      /SS9n URG                  U5        URM                  U5         T RN                  RQ                  USS0S9   URS                  XUS9nS S S 5        S S S 5        GO
US:X  a  SSK J*n  [6        RV                  " 5        nUR                   S:w  a?  T R&                  R+                  [-        5        SURX                  R[                  SS9 35      nUS:  d   eUR\                  R_                  UUUUSUSUS9nUR\                  Ra                  UUUUUS9nS S S 5        OKUS:X  d  U(       d3  T RN                  RQ                  US 9   URS                  XUS9nS S S 5        O[c        S!5      eURe                  WS   " U5      5      mS" mU 4S# jmUUU4S$ jnU$ s  snnf ! [H         a<    [0        R:                  R=                  U5      (       a  [0        RJ                  " U5        e f = f! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f)%Nr   )relay)graph_executorinp_z0Explicitly fall back to eager due to zero outputcudar   TVM_SCHEDULERr   r	   r   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.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)	nd_tensors    R/var/www/auris/envauris/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    c                    > 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.)r*   r+   r)   ndarraycpur-   r0   )torch_tensortvms    r3   to_tvm_tensortvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r6   c                  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)i_argsaargs
shape_info_nameactive_inputsidxarginp_nameimr4   r=   s              r3   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)3r<   r   tvm.contribr   r+   jittracer   rC   shapelenrG   rH   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   TemporaryDirectoryr.   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModule)!gmexample_inputsr   r   r   jit_moddevicerU   rX   
shape_listexample_outputsr!   r   devr   r   r   r   r   log_filetaskstask_weightstunertune_optionlibmsr"   r&   rZ   rY   r4   r=   r<   s!                                @@@@r3   r<   r<   +   s    *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0V, OE SP % 77>>(33IIh/  76 +*: <;sP   O8O> QQ/Q"BQ*&Q;>AQ
Q	Q
Q'*
Q8;
R	r   )r   r   c                  R     [         R                  " S5        g! [         a     gf = f)Nr<   TF)	importlibimport_moduleImportError r6   r3   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    r3   rg   rg      s:    
||w',,.w.w)r6   )__doc__	functoolsr   loggingri   r   rk   typesr   typingr   r+   commonr   r   registryr   	getLogger__name__rG   r<   partialtvm_meta_scheduletvm_auto_schedulerr   	lru_cacherg   r   r6   r3   <module>r      s   ,    	 
  "   ? & ! 
 +;e!<+	P &'	P  Pf %%c_E &&s6FG  T r6   