Ë
    cQêjz-  ã                  óº  — d dl m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Zd dlmZ d dlmZmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ  d d
l!m"Z" d dl#Z$ ejJ                  d«      Z&dd„Z'dd„Z(d„ Z)	 	 d	 	 	 	 	 	 	 	 	 	 	 dd„Z*dd„Z+g fdd„Z,e-dk(  r7dZ.ej^                  j]                  e.«        ej`                  e.«        e,«        yy)é    )ÚannotationsN)Úsetup_logger)Úget_rankÚget_size)Úadd_io_bindings_as_ortvaluesÚconvert_inputs_for_ortÚ%get_merged_sample_with_past_kv_inputsÚget_sample_inputsÚget_sample_with_past_kv_inputsÚverify_ort_inputs)Úsetup_torch_model)Úget_dynamic_cache_key_valueÚmake_dynamic_cache)Ú
AutoConfig)Ú__version__)ÚDynamicCacheÚ c                óJ   — | j                   rdnd\  }}|j                  }|||fS )N)é   é   )r   r   )Úuse_past_kvÚmax_position_embeddings)ÚargsÚconfigÚpast_sequence_lengthÚcurr_sequence_lengthÚmax_sequence_lengths        úw/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/llama/llama_parity.pyÚget_sequence_lengthsr   %   s4   € Ø;?×;KÒ;K±ÐQWÑ.ÐÐ.Ø ×8Ñ8ÐØÐ!5Ð7JÐJÐJó    c                ó\  — t        «       }d}t        | |«      \  }}}| j                  r5t        || j                  ||||| j
                  | j                  d|¬«
      }|S | j                  r(t        || j                  ||| j
                  d|¬«      }|S t        || j                  ||d¬«      }|S )Né   T)Úseq_lenÚpast_seq_lenÚmax_seq_lenÚuse_fp16Úuse_buffer_shareÚreturn_dictÚ
world_size)r&   r(   r)   )r(   )
r   r   Úmergedr	   Údevicer&   r'   r   r   r
   )r   r   r)   Ú
batch_sizer   Úsequence_lengthr   Úinputss           r   Ú
get_inputsr/   +   sÀ   € ä“€JØ€JÜAUÐVZÐ\bÓAcÑ>Ð˜/Ð+>à‡{‚{Ü6ØØ�K‰KØØ#Ø-Ø+Ø—]‘]Ø!×2Ñ2ØØ!ô
ˆð2 €Mð 
×	Ò	Ü/ØØ�K‰KØØØ—]‘]ØØ!ô
ˆð €Mô # 6¨4¯;©;¸
ÀOÐaeÔfˆà€Mr    c                ó  — t        | t        t        t        f«      r| S t        | t        «      rt	        d„ | D «       «      S t        | t
        «      r| D �cg c]  }t        |«      ‘Œ c}S t        | t        «      r| D �ch c]  }t        |«      ’Œ c}S t        | t        «      r-| j                  «       D ��ci c]  \  }}|t        |«      “Œ c}}S t        | t        j                  «      r| j                  «       S t        | d«      r| j                  «       S t        | t        «      r7t!        | «      \  }}t#        t        t        t%        ||d¬«      «      «      «      S t'        dt)        | «      › �«      ‚c c}w c c}w c c}}w )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­w)N)Útorch_deepcopy)Ú.0Úvs     r   ú	<genexpr>z!torch_deepcopy.<locals>.<genexpr>R   s   è ø€ Ò6¨1”^ A×&Ñ6ùs   ‚ÚcloneF)Ústrictz(torch_deepcopy not implemented for type )Ú
isinstanceÚintÚfloatÚstrÚtupleÚlistr2   ÚsetÚdictÚitemsÚnpÚndarrayÚcopyÚhasattrr6   r   r   r   ÚzipÚNotImplementedErrorÚtype)Úvaluer4   ÚkÚ	key_cacheÚvalue_caches        r   r2   r2   N   s.  € Ü�%œ#œu¤cÐ*Ô+ØˆÜ�%œÔÜÑ6°Ô6Ó6Ð6Ü�%œÔØ+0Ö1 a”˜qÕ!Ò1Ð1Ü�%œÔØ+0Ö1 a”˜qÕ!Ò1Ð1Ü�%œÔØ16·±³×?©¨¨A�”> !Ó$Ñ$Ó?Ð?Ü�%œŸ™Ô$Ø�z‰z‹|ÐÜˆu�gÔØ�{‰{‹}ÐÜ�%œÔ&Ü!<¸UÓ!CÑˆ	�;Ü!¤.´´c¸)À[ÐY^Ô6_Ó1`Ó"aÓbÐbô Ð HÌÈeËÈÐVÓ
WÐWùò 2ùâ1ùã?s   ÁE3Á=E8Â5E=c                óÀ  — |}|€Gt        | ||| j                  rt        j                  nt        j                  | j
                  ¬«      \  }}t        | |«      }d|v r@t        j                  t        «      t        j                  d«      k\  rt        |d   «      |d<   t        |«      }| j                  dk7  rt        j                  j                  «        t        j                  «       }	 |di |¤Žj                   j#                  «       j%                  «       j'                  «       }
| j                  dk7  rt        j                  j                  «        t        j                  «       }t(        j+                  d||	z
  › d�«       | j,                  r!|�~t        j                  j/                  «        t1        | |«      \  }}}t3        || j4                  ||¬«      }| j                  j7                  «       › d�}|d	k(  r|d
| j8                  if}t;        j<                  | j>                  t;        j@                  «       |g¬«      }tC        ||«      }| j                  dk7  r©tE        ||| j                  tG        | j8                  «      | j4                  |¬«      \  }}|jI                  «        t        j                  «       }	|jK                  |«       |jM                  «        t        j                  «       }|jO                  «       d   }~n?t        j                  «       }	|jQ                  d |«      }t        j                  «       }|d   }t(        j+                  d||	z
  › d�«       d| j>                  v sd| j>                  v rdnd}tS        jT                  |
|||¬«      }t(        jW                  d|› �«       |s.t(        jW                  dtS        jX                  |
|z
  «      › �«       |S )N©Útorch_dtyper+   Úpast_key_valuesz4.45ÚcpuzPyTorch took z s)r'   r$   r%   ÚExecutionProviderÚCUDAExecutionProviderÚ	device_id)Úsess_optionsÚ	providers)Ú
ort_inputsr+   rS   r'   Úkv_cache_ortvaluesr   zONNX Runtime took Úint4Úint8g      4@g      à?)ÚrtolÚatolz,Are PyTorch and ONNX Runtime results close? z
Max diff: © )-r   r&   ÚtorchÚfloat16Úfloat32r+   r/   ÚpvÚVersionÚtransformers_versionr   r2   Úexecution_providerÚcudaÚsynchronizeÚtimeÚlogitsÚdetachrP   ÚnumpyÚloggerÚinfoÚ	small_gpuÚempty_cacher   r   r'   ÚupperÚrankÚortÚInferenceSessionÚonnx_model_pathÚSessionOptionsr   r   r9   Úsynchronize_inputsÚrun_with_iobindingÚsynchronize_outputsÚcopy_outputs_to_cpuÚrunrA   ÚallcloseÚwarningÚmax)r   ÚlocationÚuse_auth_tokenrW   Úpytorch_modelr   Úpy_modelr.   Úinputs_after_deepcopyÚ
start_timeÚ
pt_outputsÚend_timer   Ú_r   ÚepÚ	ort_modelÚ
io_bindingÚort_outputsÚtolÚparitys                        r   Úverify_parityr‹   e   sW  € ð €HØÐÜ,ØØØØ*.¯-ª-œŸš¼U¿]¹]Ø—;‘;ô
Ñˆ�ô ˜˜fÓ%€Fà˜FÑ"¤r§z¡zÔ2FÓ'GÌ2Ï:É:ÐV\ÓK]Ò']ä$6°vÐ>OÑ7PÓ$QˆÐ Ñ!ô +¨6Ó2ÐØ×Ñ %Ò'Ü�
‰
×ÑÔ Ü—‘“€Jñ Ñ2Ð1Ñ2×9Ñ9×@Ñ@ÓB×FÑFÓH×NÑNÓP€JØ×Ñ %Ò'Ü�
‰
×ÑÔ Ü�y‰y‹{€HÜ
‡K�K�- ¨:Ñ 5Ð6°bÐ9Ô:à‡~‚~˜(Ð.ØÜ�
‰
×ÑÔ ô 4HÈÈfÓ3UÑ0Ð˜!Ð0Ü#ØØ×.Ñ.Ø)Ø'ô	€Fð ×#Ñ#×)Ñ)Ó+Ð,Ð,=Ð	>€BØ	Ð$Ò$Ø�; §	¡	Ð*Ð+ˆÜ×$Ñ$Ø×ÑÜ×'Ñ'Ó)Ø�$ô€Iô
 ˜y¨&Ó1€Fð ×Ñ %Ò'Ü)EØØØ×*Ñ*Ü˜$Ÿ)™)“nØ!×2Ñ2Ø1ô*
Ñ&ˆ
Ð&ð 	×%Ñ%Ô'Ü—Y‘Y“[ˆ
Ø×$Ñ$ ZÔ0Ø×&Ñ&Ô(Ü—9‘9“;ˆà ×4Ñ4Ó6°qÑ9ˆÙô —Y‘Y“[ˆ
Ø—m‘m D¨&Ó1ˆÜ—9‘9“;ˆà! !‘nˆä
‡K�KÐ$ X°
Ñ%:Ð$;¸2Ð>Ô?ð ˜4×/Ñ/Ñ/°6¸T×=QÑ=QÑ3Q‰#ÐW[€CÜ�[‰[˜ [°sÀÔE€FÜ
‡N�NÐAÀ&ÀÐJÔKÙÜ�‰˜¤B§F¡F¨:¸Ñ+CÓ$DÐ#EÐFÔGØÐr    c                óÜ  — t        j                  «       }|j                  dddd¬«       |j                  dddt        j                  j                  d«      d	¬
«       |j                  dddt        j                  j                  d«      d¬
«       |j                  ddddddgd¬«       |j                  dddd¬«       |j                  d¬«       |j                  dddd¬«       |j                  d¬«       |j                  dd dd!¬«       |j                  d¬"«       |j                  d#dd$¬«       |j                  d¬%«       |j                  d&d'dg d(¢d)¬*«       |j                  d+dt        d,d-¬.«       |j                  d/dd0¬«       | g k(  r|j                  «       n|j                  | «      }|j                  d1v s|j                  d2k(  r|j                  dk(  r	d3|_	        |S d4|_	        |S )5Nz-mz--model_nameFzModel name in Hugging Face)ÚrequiredÚhelpz-tz--torch_model_directoryú.zMPath to folder containing PyTorch model and associated files if saved on disk)r�   ÚdefaultrŽ   z-oz--onnx_model_pathTzSPath to ONNX model (with external data files saved in the same folder as the model)z-epz--execution_providerrP   rd   z(Execution provider to verify parity with)r�   r�   ÚchoicesrŽ   z-vz	--verboseÚ
store_truezPrint verbose logs)ÚactionrŽ   )Úverbosez-pz--use_past_kvzfUse past key and past value as inputs to the model. Necessary for decoder_with_past_model.onnx models.)r   z-gz--use_buffer_sharezWUse if model has GroupQueryAttention and you want to enable past-present buffer sharing)r'   z--mergedz2Use merged model (i.e. decoder_merged_model.onnx).)r*   z-fpz--precision)rX   rY   Úfp16Úfp32zPrecision of model)r�   r‘   rŽ   z--cache_dirz./model_cachezQmodel cache dir to override default HF cache dir to avoid overflood the /home dir)r�   rG   r�   rŽ   z--small_gpuzhLoad the llama in GPU every time for parity_check if it's running in a machine which GPU memory < 36GB. >   r–   rY   rX   r–   r•   )ÚargparseÚArgumentParserÚadd_argumentÚosÚpathÚjoinÚset_defaultsr;   Ú
parse_argsÚ	precisionrc   )ÚargvÚparserr   s      r   Úget_argsr¢   É   sX  € Ü×$Ñ$Ó&€Fà
×ÑØØØØ)ð	 ô ð ×ÑØØ!ØÜ—‘—‘˜SÓ!Ø\ð ô ð ×ÑØØØÜ—‘—‘˜SÓ!Øbð ô ð ×ÑØØØØØ˜�Ø7ð ô ð ×ÑØØØØ!ð	 ô ð ×Ñ ÐÔ&à
×ÑØØØØuð	 ô ð ×Ñ EÐÔ*à
×ÑØØØØfð	 ô ð ×Ñ¨ÐÔ/à
×ÑØØØAð ô ð
 ×Ñ˜uÐÔ%à
×ÑØØØÚ0Ø!ð ô ð ×ÑØØÜØØ`ð ô ð ×ÑØØØwð ô ð #'¨"¢*ˆ6×ÑÔ°&×2CÑ2CÀDÓ2I€Dð
 �>‰>Ð-Ñ-°$·.±.ÀFÒ2JÈt×OfÑOfÐjoÒOoð 	ð 	„Nð
 €Kð ð 	„Nð
 €Kr    c                ó4  — t        | «      }t        |j                  «       t        j	                  d|› �«       t        «       }t        |d|j                  dk(  «       ||_        t        |d|j                  dk(  rdnd|› �«       t        |dt        j                  |j                  «      «       |j                  t        j                  j!                  d«      k(  }|r|j"                  n|j                  }i }|j$                  st'        ||||«       y d x}}|j(                  sGt+        ||||j,                  rt        j.                  nt        j0                  |j                  ¬	«      \  }}d
|_        t'        ||||||¬«      }d|_        t'        ||||||¬«       y )NzArguments: r&   r•   Údevice_namerP   zcuda:r+   r�   rM   F)r~   r   T)r¢   r   r”   rj   rk   r   ÚsetattrrŸ   ro   rc   r]   r+   r¤   Útorch_model_directoryrš   r›   rœ   Ú
model_namer*   r‹   rl   r   r&   r^   r_   r   )r    r   ro   r}   r|   rW   r   Úllamas           r   Úmainr©   -  s`  € Ü�D‹>€DÜ�—‘ÔÜ
‡K�K�+˜d˜VÐ$Ô%Ü‹:€Dô ˆD�*˜dŸn™n°Ñ6Ô7Ø€D„IÜˆD�-¨$×*AÑ*AÀUÒ*J¡ÐRWÐX\ÐW]ÐP^Ô_ÜˆD�(œEŸL™L¨×)9Ñ)9Ó:Ô;Ø×/Ñ/´2·7±7·<±<ÀÓ3DÑD€NÙ"0ˆt�Š°d×6PÑ6P€HàÐØ�;Š;Ü�d˜H nÐ6HÕIàÐˆ�Ø�~Š~Ü-ØØØØ.2¯mªmœUŸ]š]ÄÇÁØ—{‘{ô‰MˆF�Eð !ˆÔÜ*Ø�(˜NÐ,>ÈeÐ\bô
Ðð
  ˆÔÜ�d˜H nÐ6HÐX]ÐflÖmr    Ú__main__r"   )r   úargparse.Namespacer   r   )NN)r   r«   r|   r;   r}   ÚboolrW   r?   r~   zNone | torch.nn.Moduler   zNone | AutoConfig)r    z	list[str])1Ú
__future__r   r—   Úloggingrš   rf   ri   rA   Úpackaging.versionÚversionr`   r]   Úbenchmark_helperr   Údist_settingsr   r   Úllama_inputsr   r   r	   r
   r   r   Úllama_torchr   Ú(models.torch_export_patches.cache_helperr   r   Útransformersr   r   rb   Útransformers.cache_utilsr   Úonnxruntimerp   Ú	getLoggerrj   r   r/   r2   r‹   r¢   r©   Ú__name__ÚseedÚrandomÚmanual_seedr\   r    r   ú<module>r¾      s   ðõ #ã Û Û 	Û ã Ý Û Ý )ß ,÷÷ õ *ß dÝ #Ý <Ý 1ã à	ˆ×	Ñ	˜2Ó	€óKó òFXð8 -1Ø $ðaØ
ðaàðað ðað ð	að
 *ðað óaóHaðH ô $nðN ˆzÒØ€DØ‡I�I‡N�N�4ÔØ€E×Ñ�dÔÙ…Fð	 r    