ó
    EñiL  ã                   ó¼  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJr  SSKJrJr  SSKrSSKJr  SS	KJrJr  SS
KJr  \R.                  " \5      r\\SS.S\R4                  S\\R8                     S\\\\4      S\S\4   4S jj5       5       r\R>                  " \SS9r \R>                  " \SS9r!S\"4S jr#\RH                  S\4S j5       r%g)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                ód  ^^^^• Uc  [        S SSS.5      nUc   eSS KmSSKJn  SSKJn  [
        R                  R                  X5      n[        U5      n[        U5       VVs/ s H  u  pxSU 3UR                  4PM     n	nnU " U6 n
[        U
5      S:X  a!  [        R                  S5        U R                  $ UR                  R!                  XY5      u  p¼UR"                  S	:X  a6  TR%                  UR&                  5      nTR(                  R%                  5       nO4TR+                  S5      nTR(                  R-                  [/        5       5      nUR1                  S
S 5      nUc   [2        R4                  R1                  SS 5      nUR1                  SS5      nUR1                  SS5      nUS:X  au  SSKJn  [8        R:                  " 5        nUR=                  U5         TR>                  RA                  USS0S9   URC                  X¾US9nS S S 5        S S S 5        S S S 5        GO
US:X  a¹  SSKJ"n  [8        RF                  " 5        nUR"                  S	:w  a?  TR(                  R-                  [/        5        SURH                  RK                  SS9 35      nUS:”  d   eURL                  RO                  UUUUSUSUS9nURL                  RQ                  UUUUUS9nS S S 5        OKUS:X  d  U(       d3  TR>                  RA                  US9   URC                  X¾US9nS S S 5        O[S        S5      eURU                  WS   " U5      5      mS TRV                  RX                  S![
        RZ                  4S" jmS#[
        RZ                  S!TRV                  RX                  4U4S$ jjmS%[
        RZ                  S![\        [
        RZ                     4UUU4S& jjnU$ s  snnf ! , (       d  f       GN×= f! , (       d  f       GNá= f! , (       d  f       NÞ= f! , (       d  f       Nï= f! , (       d  f       GN= f)'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                 óØ   • U R                   S:X  a$  [        R                  " U R                  5       5      $ [        R                  R
                  R                  U R                  5       5      $ )z8A helper function to transfer a NDArray to torch.tensor.Úbool)ÚdtypeÚtorchÚ
from_numpyÚnumpyÚutilsÚdlpackÚfrom_dlpackÚ	to_dlpack)r*   s    ÚW/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/_dynamo/backends/tvm.pyÚto_torch_tensorÚtvm.<locals>.to_torch_tensor‡   sL   € à�?‰?˜fÓ$ô ×#Ò# I§O¡OÓ$5Ó6Ð6Ü�{‰{×!Ñ!×-Ñ-¨i×.AÑ.AÓ.CÓDÐDó    Útorch_tensorc                 óä   >• U R                   [        R                  :X  a7  TR                  R	                  U R                  5       R                  5       5      $ TR                  R                  U 5      $ )z8A helper function to transfer a torch.tensor to NDArray.)r-   r.   r,   ÚndÚarrayÚcpur0   r3   )r9   Útvms    €r5   Úto_tvm_tensorÚtvm.<locals>.to_tvm_tensor�   sQ   ø€ à×Ñ¤§¡Ó+ð —6‘6—<‘< × 0Ñ 0Ó 2× 8Ñ 8Ó :Ó;Ð;Ø�v‰v×!Ñ! ,Ó/Ð/r8   Úi_argsc                  óx  >• U  Vs/ s H  oR                  5       PM     nnTR                  5       u  p4UR                  5        VVs1 s H  u  pTUiM	     nnn[        US5       Hv  u  pxUR	                  5       S:w  d  M  UR
                  (       a  UR                  5       nSU 3n	X–;  a  [        R                  SU	5        M^  TR                  U	T" U5      5        Mx     TR                  5         [        TR                  5       5       V
s/ s H  n
T" TR                  U
5      5      PM     sn
$ s  snf s  snnf s  sn
f )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)rA   ÚaÚargsÚ
shape_infoÚ_ÚnameÚactive_inputsÚidxÚargÚinp_nameÚiÚmr6   r?   s              €€€r5   Úexec_tvmÚtvm.<locals>.exec_tvm˜   s
  ø€ Ù(.Ó/ª 1—‘–©ˆÐ/Ø×(Ñ(Ó*‰ˆ
Ø-7×-=Ñ-=Ô-?Ô@Ò-?¡' $›Ñ-?ˆÑ@Ü! $¨Ö*‰HˆCØ�w‰w‹y˜A�~Ø×$×$ØŸ*™*›,�CØ! # ˜<�ØÓ0Ü—K‘KØPØ ôñ Ø—‘ØÙ! #Ó&öñ +ð 	
�‰ŒÜ:?À×@QÑ@QÓ@SÔ:TÓUÒ:T°Q‘ §¡¨Q£Ö0Ñ:TÑUÐUùò' 0ùã@ùò" Vs   †D,ÁD1Ä!D7)/r   r>   r   Útvm.contribr   r.   ÚjitÚtracer
   rF   ÚshapeÚlenrJ   rK   Ú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ÚdevicerW   rZ   Ú
shape_listÚexample_outputsr#   r   Údevr   r   r   r   r   Úlog_fileÚlibÚmsr$   r(   r\   r[   r6   r?   r>   s                            @@@@r5   r>   r>   ,   s²  û€ ð �Ü"°ÀÐUVÑ#WÓXˆØÑÐÐÛÝÝ*ä�i‰i�o‰o˜bÓ1€GÜ Ó/€FÜ8AÀ.Ô8QÔRÒ8Q©f¨c�T˜#˜�< §¡Ó)Ñ8Q€JÑRÙ˜.Ð)€OÜ
ˆ?Ó˜qÓ Ü�‰ÐFÔGØ�z‰zÐØ—.‘.×-Ñ-¨gÓB�K€CØ‡{�{�fÓØ�h‰h�v—|‘|Ó$ˆØ—‘—‘Ó"‰à�g‰g�a‹jˆØ—‘×"Ñ"¤;£=Ó1ˆà—‘˜K¨Ó.€IØÑÜ—J‘J—N‘N ?°DÓ9ˆ	à�[‰[˜ 5Ó)€FØ—‘˜K¨Ó+€IàÐ$Ó$å&ô ×'Ò'Ô)¨XØ×+Ñ+¨HÕ5Ø�M‰M×%Ñ%Ø#Ð-OÐQUÐ,Vð &ò ð —+‘+˜c¸�+Ð@ˆC÷	÷ 6÷ *Ñ)ð 
�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à�]‰]×&Ñ&°Ð&Ò;Ø—+‘+˜c¸�+Ð@ˆC÷ <Ð;ô "ð\ó
ð 	
ð 	×"Ñ" 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ñ Vð, €Oùóc S÷6ö ú÷ 6Ö5ú÷ *Õ)ú÷ +Õ*ú÷: <Ö;ús[   Á$OÇ
O>ÇO,Ç9OÈ
O,ÈO>ÉBPÌ	P Ï
O)Ï$O,Ï,
O;	Ï6O>Ï>
PÐ
PÐ 
P/r   )r   r   c                  óR   •  [         R                  " S5        g! [         a     gf = f)Nr>   TF)Ú	importlibÚimport_moduleÚImportError© r8   r5   Úhas_tvmr‰   µ   s*   € ðÜ×Ò Ô&ØøÜó Ùðús   ‚ ™
&¥&c                  óz   • [         R                  S:X  a'  [        S5      R                  5       n SU ;   a  gSU ;   a  gg)NÚlinuxz/proc/cpuinfoÚavx512zllvm -mcpu=skylake-avx512Úavx2zllvm -mcpu=core-avx2Úllvm)ÚsysÚplatformr   Ú	read_text)Úcpuinfos    r5   ri   ri   ½   s:   € ä
‡|�|�wÓÜ�Ó'×1Ñ1Ó3ˆØ�wÓØ.Ø�wÓØ)Ør8   )&Ú__doc__Ú	functoolsr…   Úloggingrk   r�   rm   Úcollections.abcr   Úpathlibr   Útypesr   Útypingr   r   r.   r   Úcommonr
   r   Úregistryr   Ú	getLoggerÚ__name__rJ   ry   r{   rz   Ústrr>   ÚpartialÚtvm_meta_scheduleÚtvm_auto_schedulerr,   r‰   Úcacheri   rˆ   r8   r5   Ú<module>r£      s  ðñó, Û Û Û 	Û 
Û Ý $Ý Ý "ß  ã Ý ç ?Ý &ð ×Ò˜Ó!€ð Øð
 59ò	@Ø
�‰ð@à˜Ÿ™Ñ&ð@ð Ð& s¨C xÑ0Ñ1ð	@ð
 ˆc�3ˆhÑô@ó ó ð@ðF ×%Ò% c°_ÑEÐ Ø×&Ò& sÐ6FÑGÐ ð�ô ð ‡�ð�Só ó ñr8   