
    a,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j        deej                 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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)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      Z/var/www/html/banglarbhumi/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)r1   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.)r4   r5   r3   ndarraycpur7   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 rG   rG   )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 rG   )
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)rD   args
shape_inforL   active_inputsr   arginp_namerP   r<   rC   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   rB   r   tvm.contribr   r5   jittracer	   rS   lenrW   rX   forwardfrontendfrom_pytorchtyper    indexr$   rA   Targetllvm_targetgetosenvironr"   tempfileNamedTemporaryFileApplyHistoryBest	transformPassContextbuildr&   TemporaryDirectoryr8   	cpu_countrelay_integration
tune_relaycompile_relayNotImplementedErrorGraphModuler?   r@   Tensorlist)r   r   r   r   r   jit_moddevice
shape_listexample_outputsr*   r%   devr$   r   r   r   r"   log_filelibmsr+   r/   rb   rP   r<   rC   rB   s                          @@@@r   rB   rB   ,   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)NrB   TF)	importlibimport_moduleImportErrorrG   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   rm   rm      sO    
|w''1133w..w))6r   )%__doc__	functoolsr   loggingro   r   rq   collections.abcr   pathlibr   typesr   typingr   r5   r   commonr	   r
   registryr   	getLogger__name__rW   r}   r   r~   strrB   partialtvm_meta_scheduletvm_auto_schedulerr3   r   cacherm   rG   r   r   <module>r      s   ,          				 



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