
    WjL                        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j        deej                 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j$        defd            Z%dS )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                :   |t          d ddd          }|J dd lddlm} ddlm} t
          j                            | |          }t          |          }d t          |          D             } | | }t          |          dk    r!t                              d           | j        S |j                            ||          \  }	}
|j        d	k    r4                    |j                  }j                                        }n;                    d          }j                            t-                                }|                    d
d           }| t0          j                            dd           }|                    dd          }|                    dd          }|dk    rddlm} t7          j                    5 }|                    |          5  j                            |ddi          5  |                     |	||
          }d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   n3|dk    rddlm!} t7          j"                    5 }|j        d	k    rDj                            t-                       d|j#        $                    d                     }|dk    sJ |j%        &                    |	|||d|
d|          }|j%        '                    ||	||
|          }d d d            n# 1 swxY w Y   nc|dk    s|sLj                            |          5  |                     |	||
          }d d d            n# 1 swxY w Y   ntQ          d          |)                     |d         |                    d j*        j+        d!t
          j,        fd"d#t
          j,        d!j*        j+        ffd$d%t
          j,        d!tZ          t
          j,                 ffd&}|S )'Ni N     )	schedulertrials	opt_levelr   )relay)graph_executorc                 ,    g | ]\  }}d | |j         fS )inp_)shape).0idxis      _/home/longshao/multi-rider-rag/.venv/lib/python3.11/site-packages/torch/_dynamo/backends/tvm.py
<listcomp>ztvm.<locals>.<listcomp>=   s)    RRRfc1<#<<)RRR    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        |                                           S t          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)r2   s    r   to_torch_tensorztvm.<locals>.to_torch_tensor   sQ    ?f$$ #IOO$5$5666{!--i.A.A.C.CDDDr    torch_tensorc                     | j         t          j        k    r>j                            |                                                                           S j                            |           S )z8A helper function to transfer a torch.tensor to NDArray.)r5   r6   r4   ndarraycpur8   r;   )r>   tvms    r   to_tvm_tensorztvm.<locals>.to_tvm_tensor   sW    ++ 6<< 0 0 2 2 8 8 : :;;;v!!,///r    i_argsc                  $   d | D             }                                 \  }}d |                                D             }t          |d          D ]|\  }}|                                dk    r_|j        r|                                }d| }||vrt                              d|           ]                    | 
|                     }	                                 	fdt                                                    D             S )Nc                 6    g | ]}|                                 S  )
contiguous)r   as     r   r   z)tvm.<locals>.exec_tvm.<locals>.<listcomp>   s     ///1///r    c                     h | ]\  }}|S rH   rH   )r   name_s      r   	<setcomp>z(tvm.<locals>.exec_tvm.<locals>.<setcomp>   s    @@@'$@@@r    r   r   z6input %s skipped as not found in tvm's runtime libraryc                 L    g | ] }                      |                    !S rH   )
get_output)r   r   mr=   s     r   r   z)tvm.<locals>.exec_tvm.<locals>.<listcomp>   s-    UUUQQ00UUUr    )get_input_infoitems	enumeratedimrequires_graddetachlogwarning	set_inputrunrangeget_num_outputs)rE   args
shape_inforM   active_inputsr   arginp_namerQ   r=   rD   s           r   exec_tvmztvm.<locals>.exec_tvm   s.   /////((**
A@@Z-=-=-?-?@@@!$** 	 	HCwwyyA~~$ '**,,C'#<<=00KKP    !M#&&   	
UUUUU%@Q@Q@S@S:T:TUUUUr    ).r   rC   r   tvm.contribr   r6   jittracer
   rT   lenrX   rY   forwardfrontendfrom_pytorchtyper!   indexr%   rB   Targetllvm_targetgetosenvironr#   tempfileNamedTemporaryFileApplyHistoryBest	transformPassContextbuildr'   TemporaryDirectoryr9   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler@   rA   Tensorlist)r   r   r   r   r   jit_moddevice
shape_listexample_outputsr+   r&   devr%   r   r   r   r#   log_filelibmsr,   r0   rc   rQ   r=   rD   rC   s                          @@@@r   rC   rC   ,   s-    "UV#W#WXXJJJ******ioob.11G//FRR	.8Q8QRRRJb.)O
?q  FGGGz.--gzBBKC{fhhv|$$""ggajj"";==11K..IJNN?D99	[[5))FK++I$$$&&&&&& '))	A-5++H55	A 	A M%%#-OQU,V &  	A 	A ++c&+@@C	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 
o	%	%++++++(** 	h{f$$ **"}}VV283E3Ee3E3T3TVV 
 A::::+66!"($&'# 7 	 	H &44!# 5  C)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	6 
i		y	]&&&;; 	A 	A++c&+@@C	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A 	A "\
 
 	
 	"">3y>##6#677AE36< EEL E E E E0EL 0SV\ 0 0 0 0 0 0V%, V4+= V V V V V V V V, Os   
I H;?H$H;$H((H;+H(,H;/I;H?	?IH?	III>BL##L'*L'M77M;>M;r'   )r   r#   c                  R    	 t          j        d           dS # t          $ r Y dS w xY w)NrC   TF)	importlibimport_moduleImportErrorrH   r    r   has_tvmr      s?    &&&t   uus    
&&c                      t           j        dk    r-t          d                                          } d| v rdS d| v rdS dS )Nlinuxz/proc/cpuinfoavx512zllvm -mcpu=skylake-avx512avx2zllvm -mcpu=core-avx2llvm)sysplatformr   	read_text)cpuinfos    r   rn   rn      sO    
|w''1133w..w))6r    )&__doc__	functoolsr   loggingrp   r   rr   collections.abcr   pathlibr   typesr   typingr   r   r6   r   commonr
   r   registryr   	getLogger__name__rX   r~   r   r   strrC   partialtvm_meta_scheduletvm_auto_schedulerr4   r   cachern   rH   r    r   <module>r      s    ,          				 



  $ $ $ $ $ $       " " " " " "                        ? ? ? ? ? ? ? ? & & & & & & g!! 
 59	@ @ @
@&@ &sCx01	@
 c3h@ @ @  @F &I%c_EEE &Y&s6FGGG      S      r    