Ë
    ÃÓ^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(  rËd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   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    ú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Ò$ô ×#Ñ# 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                  ó:  •— | 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Ü˜JŸO™OÓ-Ó.ˆÜ! $¨Ó*ò 	‰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Ã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ðÛÝÝ.ô �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ó�ð
 ˜Š{Ü$Ð'DÀVÀHÐ%MÓNÐNØ×+Ñ+×6Ñ6ØØØ!Ø"(Ø$&ØØ'Ø#ð 7ó 	ˆHð ×&Ñ&×4Ñ4Ø!ØØØØ#ð 5ó ˆC÷+	ð 	ð8 
�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øôu ò Üð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ð ˜c 3˜hÑ'¨$Ñ.ð	Hð
 ˆc�3ˆhÑòHó ó ðHðV &�I×%Ñ% c°_ÔEÐ Ø&�Y×&Ñ& sÐ6FÔGÐ ð�ó ð ‡�ð�Sò ó ñr6   