Ë
    L²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                ó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(  r¿d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   z¢This 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    úY/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/_dynamo/backends/tvm.pyÚto_torch_tensorztvm.<locals>.to_torch_tensor‡   sL   € à�?‰?˜fÒ$ô ×#Ñ# I§O¡OÓ$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   ø€ à×Ñ¤§¡Ò+ð —6‘6—<‘< × 0Ñ 0Ó 2× 8Ñ 8Ó :Ó;Ð;Ø�v‰v×!Ñ! ,Ó/Ð/r6   Ú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Úmr5   r=   s              €€€r4   Úexec_tvmztvm.<locals>.exec_tvm˜   s  ø€ Ø(.Ö/ 1�—‘•Ð/ˆÐ/Ø×(Ñ(Ó*‰ˆ
�AØ-7×-=Ñ-=Ó-?×@¡' $¨šÐ@ˆÑ@Ü! $¨Ó*ò 	‰HˆC�Ø�w‰w‹y˜A‹~Ø×$Ò$ØŸ*™*›,�CØ! # ˜<�Ø =Ñ0Ü—K‘KØPØ ôð Ø—‘ØÙ! #Ó&õð	ð 	
�‰ŒÜ:?À×@QÑ@QÓ@SÓ:TÖU°Q‘ §¡¨Q£Õ0ÒUÐUùò' 0ùã@ùò" Vs   †DÁD!Ã;D')/r   r<   r   Útvm.contribr   r-   ÚjitÚtracer	   rC   ÚshapeÚlenrG   rH   Ú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   Ú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<   ,   só  û€ ð €Ü"°ÀÐUVÑ#WÓXˆØÐÐÐÛÝÝ*ä�i‰i�o‰o˜b .Ó1€GÜ Ó/€FÜ8AÀ.Ó8Q×R©f¨c°1�T˜#˜�< §¡Ò)ÐR€JÑRÙ˜.Ð)€OÜ
ˆ?Ó˜qÒ Ü�‰ÐFÔGØ�z‰zÐØ—.‘.×-Ñ-¨g°zÓB�K€CˆØ‡{�{�fÒØ�h‰h�v—|‘|Ó$ˆØ—‘—‘Ó"‰à�g‰g�a‹jˆØ—‘×"Ñ"¤;£=Ó1ˆà—‘˜K¨Ó.€IØÐÜ—J‘J—N‘N ?°DÓ9ˆ	à�[‰[˜ 5Ó)€FØ—‘˜K¨Ó+€IàÐ$Ò$å&ô ×'Ñ'Ó)ð	AØ-5Ø×+Ñ+¨HÓ5ñ	Að �M‰M×%Ñ%Ø#Ð-OÐQUÐ,Vð &ó ñ	Að —+‘+˜c¨&¸�+Ó@ˆC÷	A÷ 	A÷ 	Añ 	Að 
�oÒ	%å+ä×(Ñ(Ó*ð 	¨hØ�{‰{˜fÒ$ð Ÿ™×*Ñ*Ü"“}�o ]°2·8±8×3EÑ3EÈeÐ3EÓ3TÐ2UÐVó�ð
 ˜A’:Ð�:Ø×+Ñ+×6Ñ6ØØØ!Ø"(Ø$&ØØ'Ø#ð 7ó 	ˆHð ×&Ñ&×4Ñ4Ø!ØØØØ#ð 5ó ˆC÷)	ð 	ð6 
�iÒ	¡yà�]‰]×&Ñ&°Ð&Ó;ñ 	AØ—+‘+˜c¨&¸�+Ó@ˆC÷	Að 	Aô "ð\ó
ð 	
ð 	×"Ñ" > 3 y¡>°#Ó#6Ó7€AðE 3§6¡6§<¡<ð E´E·L±Ló Eð0¤E§L¡Lð 0°S·V±V·\±\õ 0ðVœ%Ÿ,™,ð V¬4´·±Ñ+=÷ Vð, €Oùóc 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© 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   re   re   ½   s:   € ä
‡|�|�wÒÜ�Ó'×1Ñ1Ó3ˆØ�wÑØ.Ø�wÑØ)Ør6   )%Ú__doc__Ú	functoolsr�   Úloggingrg   r‹   ri   Úcollections.abcr   Úpathlibr   Útypesr   Útypingr   r-   r   Úcommonr	   r
   Úregistryr   Ú	getLoggerÚ__name__rG   ru   rw   rv   Ústrr<   ÚpartialÚtvm_meta_scheduleÚtvm_auto_schedulerr+   r…   Úcachere   r„   r6   r4   ú<module>rŸ      s  ðñó, Û Û Û 	Û 
Û Ý $Ý Ý "Ý ã Ý ç ?Ý &ð €g×Ñ˜Ó!€ð Øð
 26ò	@Ø
�‰ð@à˜Ÿ™Ñ&ð@ð ˜c 3˜hÑ'¨$Ñ.ð	@ð
 ˆc�3ˆhÑò@ó ó ð@ðF &�I×%Ñ% c°_ÔEÐ Ø&�Y×&Ñ& sÐ6FÔGÐ ð�ó ð ‡�ð�Sò ó ñr6   