
    ^j                        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 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j2                  deej6                     deeef   dz  dedef   fd              Z ej<                  ed      Z ej<                  ed      Z de!fdZ"ejF                  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)fx   )device_from_inputsfake_tensor_unsupported)register_backend)optionsgmexample_inputsr   return.c                   |t        d ddd      }|t        d      	 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,                  j1                  t3                     }|j5                  dd       }| t6        j8                  j5                  dd       }|j5                  dd      }|j5                  dd      }|dk(  r{ddlm} t=        j>                         5 }|jA                  |      5  jB                  jE                  |ddi      5  |jG                  |||      }d d d        d d d        d d d        n|dk(  rddlm$} t=        jJ                         5 }|j&                  dk7  rBj,                  j1                  t3                d|jL                  jO                  d             }|dk  rt        d|       |jP                  jS                  ||||d|d|      }|jP                  jU                  |||||      }d d d        nL|d k(  s|s:jB                  jE                  |!      5  |jG                  |||      }d d d        ntW        d"      |jY                   d    |            d#jZ                  j\                  d$t        j^                  fd%d&t        j^                  d$jZ                  j\                  ffd'd(t        j^                  d$t`        t        j^                     ffd)}|S # t        $ r}t        d      |d }~ww xY w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_levelzoptions must not be Noner   )relay)graph_executorzvPlease install apache-tvm to use the tvm backend. See https://tvm.apache.org/docs/install/index.html for instructions.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)logicalztrials must be positive, got @   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    e/var/www/ramen.bs-engineer-server.com/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cpur/   r2   )r7   tvms    r4   to_tvm_tensorztvm.<locals>.to_tvm_tensor   sQ    + 66<< 0 0 2 8 8 :;;vv!!,//r6   i_argsc                  :   | D cg c]  }|j                          }}
j                         \  }}t        |j                               }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 )Nr   r   z6input %s skipped as not found in tvm's runtime library)
contiguousget_input_infosetkeys	enumeratedimrequires_graddetachlogwarning	set_inputrunrangeget_num_outputs
get_output)r>   aargs
shape_info_active_inputsidxarginp_nameimr5   r=   s             r4   exec_tvmztvm.<locals>.exec_tvm   s    (./1//((*
AJOO-.!$* 	HCwwyA~$$**,C!#<=0KKP  !#&	 	
:?@Q@Q@S:TUQQ0UU' 0& Vs   D2D)1r   AssertionErrorr<   r   tvm.contribr   ImportErrorr-   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   TemporaryDirectoryr0   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler9   r:   Tensorlist)r   r   r   r   r   ejit_moddevicerT   rW   
shape_listexample_outputsr"   r   devr   r   r   r   r   log_filelibmsr#   r'   rY   rX   r5   r=   r<   s                             @@@@r4   r<   r<   ,   s6    "UV#WX788. 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
 {$'DVH%MNN++66!"($&'# 7 	H &&44!# 5 C+	 	8 
i	y]]&&&; 	A++c&+@C	A 	A "\
 	
 	"">3y>##67AE366<< EELL E0ELL 0SVV\\ 0V%,, V4+= V, Ou  S
 	 S0	A 	A 	A 	A 	A 	A	 	<	A 	Asr   O, -P	P)  P PPP)B(P5"Q,	P5PPPPP&	!P))P25P>Q
r   )r   r   c                  N    	 t        j                  d       y# t        $ r Y yw xY w)Nr<   TF)	importlibimport_moduler\    r6   r4   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    r4   rg   rg      s:    
||w'113w.w)r6   )%__doc__	functoolsr   loggingri   r   rk   collections.abcr   pathlibr   typesr   typingr   r-   r   commonr	   r
   registryr   	getLogger__name__rH   rw   ry   rx   strr<   partialtvm_meta_scheduletvm_auto_schedulerr+   r   cacherg   r   r6   r4   <module>r      s  ,    	 
  $  "    ? & g! 
 26	H
H&H c3h'$.	H
 c3hH  HV &I%%c_E &Y&&s6FG   S  r6   