Ë
    g^(hÜ  ã                   ó^  — 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ZddlmZmZ ddlmZ  ej"                  e«      Zee eddd	d
œ«      dœde
e   fd„«       «       Z ej*                  ed¬«      Z ej*                  ed¬«      Zd„ Z ej2                  d«      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)ÚMappingProxyType)ÚOptionalé   )Údevice_from_inputsÚfake_tensor_unsupported)Úregister_backendé N  é   )Ú	schedulerÚtrialsÚ	opt_level)Úoptionsr   c                óà  ‡‡‡‡ — 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-        «       «      }|j/                  dd «      }|€ t0        j2                  j/                  dd «      }|j/                  d	d
«      }|j/                  dd«      }|dk(  �r&ddl m} t7        j8                  «       }t0        j:                  j=                  |«      s•|j?                  |d   ||«      \  }}t        |«      dk7  rn|jA                  ||«      }t0        j:                  j=                  |«      s=|dkD  sJ ‚|jC                  ||jE                  |«      gd¬«      }	 |jG                  |«       |jM                  |«      5  ‰ jN                  jQ                  |ddi¬«      5  |jS                  |||¬«      }d d d «       d d d «       �n|dk(  r¿ddl m*} t7        jV                  «       5 }|j                   dk7  rB‰ j&                  j+                  t-        «       › d|jX                  j[                  d¬«      › �«      }|dkD  sJ ‚|j\                  j_                  ||||d|d|¬«      }|j\                  ja                  |||||¬«      }d d d «       nL|dk(  s|s:‰ jN                  jQ                  |¬ «      5  |jS                  |||¬«      }d d d «       ntc        d!«      ‚|je                   d   |«      «      Šd"„ Šˆ fd#„Šˆˆˆfd$„}|S c c}}w # tH        $ r6 t0        j:                  j=                  |«      rt1        jJ                  |«       ‚ w 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)%Nr   )Úrelay)Úgraph_executorÚinp_z0Explicitly fall back to eager due to zero outputÚcudar   ÚTVM_SCHEDULERr   r	   r   r
   Úauto_scheduler)r   ÚmainiÐ  )Únum_measure_trialsÚmeasure_callbacksÚearly_stoppingz 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.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)Ú	nd_tensors    úX/var/www/skyplay_api_hub/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ó    c                 óâ   •— | 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-   r0   )Útorch_tensorÚtvms    €r3   Úto_tvm_tensorztvm.<locals>.to_tvm_tensorŸ   sQ   ø€ à×Ñ¤§¡Ò+ð —6‘6—<‘< × 0Ñ 0Ó 2× 8Ñ 8Ó :Ó;Ð;Ø�v‰v×!Ñ! ,Ó/Ð/r5   c                  ó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)Úi_argsÚaÚargsÚ
shape_infoÚ_ÚnameÚactive_inputsÚidxÚargÚinp_nameÚiÚmr4   r<   s              €€€r3   Ú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')3r;   r   Útvm.contribr   r+   ÚjitÚtracer   rA   ÚshapeÚlenrE   rF   ÚforwardÚfrontendÚfrom_pytorchÚtyper   Úindexr   r9   ÚTargetÚllvm_targetÚgetÚosÚenvironr   ÚtempfileÚNamedTemporaryFileÚpathÚexistsÚextract_tasksÚTaskSchedulerÚTuningOptionsÚRecordToFileÚtuneÚ	ExceptionÚunlinkÚApplyHistoryBestÚ	transformÚPassContextÚbuildr   ÚTemporaryDirectoryr.   Ú	cpu_countÚrelay_integrationÚ
tune_relayÚcompile_relayÚNotImplementedErrorÚGraphModule)!ÚgmÚexample_inputsr   r   r   Újit_modÚdevicerS   rV   Ú
shape_listÚexample_outputsr!   r   Údevr   r   r   r   r   Úlog_fileÚtasksÚtask_weightsÚtunerÚtune_optionÚlibÚmsr"   r&   rX   rW   r4   r<   r;   s!                                @@@@r3   r;   r;   +   s:  û€ ó ÝÝ*ä�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àÐ$Ó$Ý&ä×.Ñ.Ó0ˆä�w‰w�~‰~˜hÔ'Ø"0×">Ñ">Ø�F‘˜V Vó#ÑˆE�<ô �5‹z˜QŠØ&×4Ñ4°U¸LÓI�Ü—w‘w—~‘~ hÔ/Ø! Aš:Ð%˜:Ø"0×">Ñ">Ø+1Ø+9×+FÑ+FÀxÓ+PÐ*QØ'+ð #?ó #�Kð
ØŸ
™
 ;Ô/ð ×,Ñ,¨XÓ6ñ 	EØ—‘×*Ñ*Ø#Ð-OÐQUÐ,Vð +ó ñ Eð —k‘k #¨f¸V�kÓD�÷E÷	Eñ 	Eð
 
�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ô0öVð, €OùóE SøôP %ò ÜŸ7™7Ÿ>™>¨(Ô3ÜŸI™I hÔ/Øðú÷Eñ Eú÷	Eð 	Eú÷	ð 	ú÷:	Að 	AúsO   ÁO7ÉO= É5 QÊP?Ê*QËBQÎ#Q$Ï=?P<Ð?Q		ÑQÑQÑQ!Ñ$Q-r   )r   r   c                  óN   — 	 t        j                  d«       y# t        $ r Y yw xY w)Nr;   TF)Ú	importlibÚimport_moduleÚImportError© r5   r3   Ú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ÚplatformÚopenÚread)Úcpuinfos    r3   rd   rd   Ì   s:   € ä
‡|�|�wÒÜ�Ó'×,Ñ,Ó.ˆØ�wÑØ.Ø�wÑØ)Ør5   )Ú__doc__Ú	functoolsr�   Úloggingrf   r—   rh   Útypesr   Útypingr   r+   Úcommonr   r   Úregistryr   Ú	getLoggerÚ__name__rE   r;   ÚpartialÚtvm_meta_scheduleÚtvm_auto_schedulerr‘   Ú	lru_cacherd   r�   r5   r3   ú<module>r©      sØ   ðñó, Û Û Û 	Û 
Û Ý "Ý ã ç ?Ý &ð €g×Ñ˜Ó!€ð Øñ
 +;Ø e¸!Ñ<ó+ò	Pð Ð&Ñ'ò	Pó ó ðPðf &�I×%Ñ% c°_ÔEÐ Ø&�Y×&Ñ& sÐ6FÔGÐ òð €×Ñ�TÓñó ñr5   