
    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
 ddlmZ ddl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j4                  deej8                     deeeef      dedef   fd              Z ej>                  ed      Z  ej>                  ed      Z!de"fdZ#ejH                  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)Callable)Path)MappingProxyType)AnyOptional)fx   )device_from_inputsfake_tensor_unsupported)register_backend)optionsgmexample_inputsr   return.c                4   |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:                         5 }|j=                  |      5  j>                  jA                  |ddi      5  |jC                  |||      }d d d        d d d        d d d        n|dk(  rddlm"} t9        jF                         5 }|j"                  d	k7  rBj(                  j-                  t/                d|jH                  jK                  d             }|dkD  sJ |jL                  jO                  ||||d|d|      }|jL                  jQ                  |||||      }d d d        nL|dk(  s|s:j>                  jA                  |      5  |jC                  |||      }d d d        ntS        d      |jU                   d   |            d jV                  jX                  d!t
        jZ                  fd"d#t
        jZ                  d!jV                  jX                  ffd$d%t
        jZ                  d!t\        t
        jZ                     ffd&}|S c c}}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# 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   z 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.)r-   r.   r,   ndarraycpur0   r3   )r8   tvms    r5   to_tvm_tensorztvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r7   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)r?   aargs
shape_info_nameactive_inputsidxarginp_nameimr6   r>   s              r5   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')/r   r=   r   tvm.contribr   r.   jittracer
   rD   shapelenrH   rI   forwardfrontendfrom_pytorchtyper   indexr   r<   Targetllvm_targetgetosenvironr   tempfileNamedTemporaryFileApplyHistoryBest	transformPassContextbuildr   TemporaryDirectoryr1   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler:   r;   Tensorlist)r   r   r   r   r   jit_moddevicerU   rX   
shape_listexample_outputsr#   r   devr   r   r   r   r   log_filelibmsr$   r(   rZ   rY   r6   r>   r=   s                            @@@@r5   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$$& '')	A-5++H5	A MM%%#-OQU,V & 	A ++c&+@C	A 	A 	A 	A 
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, Oc S0	A 	A 	A 	A 	A 	A	 	:	A 	As[   #OO6 O)6OO)O6BPPO&!O))O3	.O66O?PPr   )r   r   c                  N    	 t        j                  d       y# t        $ r Y yw xY w)Nr=   TF)	importlibimport_moduleImportError r7   r5   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platformr   	read_text)cpuinfos    r5   rf   rf      s:    
||w'113w.w)r7   )&__doc__	functoolsr   loggingrh   r   rj   collections.abcr   pathlibr   typesr   typingr   r   r.   r   commonr
   r   registryr   	getLogger__name__rH   rv   rx   rw   strr=   partialtvm_meta_scheduletvm_auto_schedulerr,   r   cacherf   r   r7   r5   <module>r      s  ,    	 
  $  "     ? & g! 
 59	@
@&@ &sCx01	@
 c3h@  @F &I%%c_E &Y&&s6FG   S  r7   