
    i                        d 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 ddlZddlmZ ddlmZmZ ddlmZ  ej(                  e      Zeedd	d
ej.                  deej2                     deeee
f      dede
f   fd              Z ej8                  ed      Z ej8                  ed      ZdefdZ ejB                  defd       Z"y)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                	    |t        d ddd      }|J dd l ddlm} ddlm} t
        j                  j                  | |      }t        |      }t        |      D cg c]  \  }}d| |j                  f }	}} | | }
t        |
      dk(  r!t        j                  d       | j                  S |j                  j!                  ||	      \  }}|j"                  d	k(  r6 j%                  |j&                        } j(                  j%                         }n4 j+                  d      } j(                  j-                  t/                     }|j1                  d
d       }| t2        j4                  j1                  dd       }|j1                  dd      }|j1                  dd      }|dk(  r&ddlm} t9        j:                         }t2        j<                  j?                  |      s|jA                  |d   ||      \  }}t        |      dk7  rn|jC                  ||      }t2        j<                  j?                  |      s=|dkD  sJ |jE                  ||jG                  |      gd      }	 |jI                  |       |jO                  |      5   jP                  jS                  |ddi      5  |jU                  |||      }d d d        d d d        n|dk(  rddlm+} t9        jX                         5 }|j"                  d	k7  rB j(                  j-                  t/                d|jZ                  j]                  d             }|dkD  sJ |j^                  ja                  ||||d|d|      }|j^                  jc                  |||||      }d d d        nL|d k(  s|s: jP                  jS                  |!      5  |jU                  |||      }d d d        nte        d"      |jg                   d    |            d# jh                  jj                  d$t
        jl                  fd%d&t
        jl                  d$ jh                  jj                  f fd'd(t
        jl                  d$tn        t
        jl                     ffd)}|S c c}}w # tJ        $ r6 t2        j<                  j?                  |      rt3        jL                  |        w xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)*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                     | j                   dk(  r#t        j                  | j                               S t        j                  j
                  j                  | j                               S )z8A helper function to transfer a NDArray to torch.tensor.bool)dtypetorch
from_numpynumpyutilsdlpackfrom_dlpack	to_dlpack)r-   s    T/var/www/html/engine/venv/lib/python3.12/site-packages/torch/_dynamo/backends/tvm.pyto_torch_tensorztvm.<locals>.to_torch_tensor   sL    ??f$ ##IOO$566{{!!--i.A.A.CDD    torch_tensorc                     | j                   t        j                  k(  r7j                  j	                  | j                         j                               S j                  j                  |       S )z8A helper function to transfer a torch.tensor to NDArray.)r0   r1   r/   ndarraycpur3   r6   )r;   tvms    r8   to_tvm_tensorztvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r:   i_argsc                  X   | D cg c]  }|j                          }}j                         \  }}|j                         D ch c]  \  }}|	 }}}t        |d      D ]m  \  }}|j	                         dk7  s|j
                  r|j                         }d| }	|	|vrt        j                  d|	       Vj                  |	 |             o j                          t        j                               D 
cg c]  }
 j                  |
             c}
S c c}w c c}}w c c}
w )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)rB   aargs
shape_info_nameactive_inputsidxarginp_nameimr9   rA   s              r8   exec_tvmztvm.<locals>.exec_tvm   s   (./1//((*
A-7-=-=-?@'$@@!$* 	HCwwyA~$$**,C!#<=0KKP  !#&	 	
:?@Q@Q@S:TUQQ0UU' 0@" Vs   DD!;D')8r   r@   r   tvm.contribr   r1   jittracer	   rG   shapelenrK   rL   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devicerX   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   rA   r@   s!                                @@@@r8   r@   r@   *   s    "UV#WX*iioob.1G/F8A.8QRfc1T#<)RJR.)O
?q FGzz..--gzBKC{{fhhv||$"ggaj"";=1K.IJJNN?D9	[[5)FK+I$$&..0ww~~h'"0">">FVV#E< 5zQ&44ULIww~~h/!A:%:"0">">+1+9+F+Fx+P*Q'+ #? #K


;/ ,,X6 	E**#-OQU,V +  E kk#fVkDE	E 	E
 
o	%+((* 	h{{f$ **"}o]2883E3Ee3E3T2UV
 A::++66!"($&'# 7 	H &&44!# 5 C)	 	6 
i	y]]&&&; 	A++c&+@C	A 	A "\
 	
 	"">3y>##67AE366<< EELL E0ELL 0SVV\\ 0V%,, V4+= V, OE SP % 77>>(3IIh/E E	E 	E	 	:	A 	AsO   #R(R 
 S*S
?S0BS#8S0?S
S	SS #S-0S:r"   )r   r   c                  N    	 t        j                  d       y# t        $ r Y yw xY w)Nr@   TF)	importlibimport_moduleImportError r:   r8   has_tvmr      s*    & s    	$$c                  p    t         j                  dk(  r#t        d      j                         } d| v ryd| v ryy)Nlinuxz/proc/cpuinfoavx512zllvm -mcpu=skylake-avx512avx2zllvm -mcpu=core-avx2llvm)sysplatformopenread)cpuinfos    r8   ri   ri      s:    
||w',,.w.w)r:   )#__doc__	functoolsr   loggingrk   r   rm   typesr   typingr   r   r   r1   r   commonr	   r
   registryr   	getLogger__name__rK   r   r   r   strr@   partialtvm_meta_scheduletvm_auto_schedulerr/   r   cacheri   r   r:   r8   <module>r      s  ,    	 
  " * *   ? & g! 
 59	Q
Q&Q &sCx01	Q
 c3hQ  Qh &I%%c_E &Y&&s6FG   S  r:   