o
    ¢Äi3:  ã                   @   s€   d dl Z d dlZd dlZd dlmZ d dlmZmZmZ d dlm	Z	m
Z
 d dlmZmZ e  e¡Zdd„ Zdd	d
„Zdd„ ZdS )é    N)Ú	Precision)Úget_shared_initializersÚ.update_decoder_subgraph_output_cross_attentionÚ?update_decoder_subgraph_share_buffer_and_use_decoder_masked_mha)ÚTensorProtoÚhelper)ÚWhisperConfigÚWhisperTokenizerc                 C   sP   t tdd„ | ƒƒ}t|ƒt|ƒksJ ‚t||ddD ]\}}|j|v s%J ‚qd S )Nc                 S   s   | S )N© )Ú
beam_inputr
   r
   úo/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/models/whisper/whisper_chain.pyÚ<lambda>   s    zverify_inputs.<locals>.<lambda>F)Ústrict)ÚlistÚfilterÚlenÚzipÚname)Úbeam_inputsÚgraph_inputsZbeam_required_inputsZgraph_inputr   r
   r
   r   Úverify_inputs   s
   þr   Tc                 C   sN   |rt tdd„ | ƒƒS t| ƒdkr%| d dkr|  ¡  n	 | S t| ƒdks| S )Nc                 S   s   | dkS )NÚ r
   )Úelmr
   r
   r   r   #   s    zclean_list.<locals>.<lambda>r   éÿÿÿÿr   )r   r   r   Úpop)ZarrÚremove_all_stringsr
   r
   r   Ú
clean_list    s   
ûr   c           3      C   sf  t j| jdd}d|j_t j| jdd}d|j_tj| j| j	d}t
j| j| j	d}| jtjkr2dnd}| jtjkr<dnd	d
ddd| jtjkrIdnd| jtjkrRdnd| jrXdnd| jr^dndd| jrednd| jrkdnd| jrqdnd| jrwdnd| jr}|ndg}| jtjkrˆdnd}| jtjkr’dnd}d| jrš|nd| jr |nd| jr¦dnd| jr¬dndg}	g }
| jtjkr(tjd d	gdgd!tjd"}tjd dgdgd#tjd"}tjd dgdgd$tjd"}|
 |||g¡ | jrütjd dgdgd%tjd"}|
 |¡ | jrtjd dgdgd&tjd"}|
 |¡ | jr(tjd dgdgd'tjd"}|
 |¡ t d(|j¡t d)|j ¡t d*|j!¡t d+| "d,g¡d- ¡t d.| "d/g¡d- ¡t d0| "d1g¡d- ¡| jrkt d2| "d3g¡d- ¡ndt d4| "d5g¡d- ¡t d6| "d7g¡d- ¡t d8| j#¡t d9d¡t d:d;¡| jrœt d<d=¡ndg}tjd>t$|d?d@t$|	d?d@dAdBdC}|j% t$|dd@¡ t &d	tjg dD¢¡}t &d
tj'd=g¡}t &dtj'd=g¡}t &dtj'd=g¡}t &dtj'd=g¡}t &dtjd=g¡}t &dtjd=g¡}t &dtj'|j(g¡}t &dtj'dE|j(g¡}t &dtj'dEdFg¡}t &dtj'd=g¡}t &dtj'dGd;g¡}t &dtj'dEdHg¡}t &dtjd=g¡} t$|||||||| jrN|nd| jrU|nd| jr\|nd| jrc|nd| jrj|nd| jrq|nd| jrx| ndgƒ}!t &dtj'g dI¢¡}"t &dtjdEg¡}#t &dtjdEg¡}$t &dtjg dJ¢¡}%t &dKtjdEg¡}&t$|"| jr³|#nd| jrº|$nd| j)sÇ| j*sÉ| jrÉ|%nd| jrÐ|&ndgƒ}'t+| dLƒrþ| j,rþt-|jƒrêt. /dM¡ nt. 0dN¡ t+| dOƒrþ| jrþt1|jƒ t2||ƒ}(|j% t dP|j¡t dQ|j¡g¡ tj3dBd=dRtj3ddSdRg})|
 |¡ | jr>tjd dgdKgdTtjd"}*|
 |*¡ tj4|
dU|!|'|(dV}+dWdX„ |!D ƒ},dYdX„ |'D ƒ}-| j*ršt j| j*dd}.|.j}/|+j5 |/j5¡ |+j6 |/j6¡ |/j7D ]}0|0j|,vr‘|0j|-vr‘|0jdkr‘|+j7 |0g¡ qv|+j8 |/j8¡ t9||!ƒ |j:|j:ks¨J ‚t. /dZ|j:› d[¡ tj;|+d\|)|j:d]}1t<j= >| j?¡rót. /d^| j?› d_| j?d` › ¡ t<j= @| j?¡rát< A| j?¡ t<j= @| j?d` ¡rót< A| j?d` ¡ t jB|1| j?| jCddt<j= D| j?¡› d`da zt jEjF| j?ddb W d S  tGy2 }2 zt.jHdc|2› ddd W Y d }2~2d S d }2~2ww )eNT)Zload_external_datazencoderdecoderinit subgraphzdecoder subgraph)Ú	cache_dirZtemperature_fp16ÚtemperatureZinput_features_fp16Úinput_featuresÚ
max_lengthÚ
min_lengthÚ	num_beamsÚnum_return_sequencesZlength_penalty_fp16Úlength_penaltyZrepetition_penalty_fp16Úrepetition_penaltyÚ
vocab_maskr   Úprefix_vocab_maskÚdecoder_input_idsÚlogits_processorÚcross_qk_layer_headÚextra_decoding_idsZsequence_scores_fp16Úsequence_scoresZscores_fp16ÚscoresÚ	sequencesÚcross_qkZno_speech_probs_beamZCastZCastInputFeaturesToFp16)ÚinputsÚoutputsr   ÚtoZCastLengthPenaltyToFp16ZCastRepetitionPenaltyToFp16Ztemperature_to_fp16ZCastOutputSequenceScoresToFp32ZCastScoresToFp32Úeos_token_idÚpad_token_idÚdecoder_start_token_idZtranslate_token_idz<|translate|>r   Ztranscribe_token_idz<|transcribe|>Zstart_of_lm_token_idz<|startoflm|>Zno_speech_token_idz<|nospeech|>Zno_timestamps_token_idz<|notimestamps|>Zbeginning_timestamp_token_idz<|0.00|>Úno_repeat_ngram_sizeZearly_stoppingZ
model_typeé   Zdecoder_output_cross_qké   ZWhisperBeamSearchF)r   Z
BeamSearchzcom.microsoft)r0   r1   r   Údomain)Ú
batch_sizeZfeature_sizeZsequence_lengthr:   Zinitial_sequence_lengthZnum_layer_headZextra_decoding_ids_len)r:   r#   r    )r:   r#   Znum_layer_head_cross_qkr    ÚframesÚno_speech_probsÚuse_gpuzUUpdated whisper decoder subgraph to use DecoderMaskedMultiHeadAttention successfully!zPDecoderMaskedMultiHeadAttention could not be applied to whisper decoder subgraphÚcollect_cross_qkÚdecoderÚencoder)r9   Úversioné   Zno_speech_probs_cast_to_fp32zWhisperBeamSearch Graph)r   r0   r1   Úinitializerc                 S   ó   g | ]}|j ‘qS r
   ©r   )Ú.0Úgir
   r
   r   Ú
<listcomp>  ó    zchain_model.<locals>.<listcomp>c                 S   rD   r
   rE   )rF   Úgor
   r
   r   rH     rI   zUsing IR version z for chained modelzonnxruntime.transformers)Zproducer_nameZopset_importsÚ
ir_versionzOverwriting z and z.data)Zsave_as_external_dataZall_tensors_to_one_fileZconvert_attributeÚlocation)Z
full_checkz2An error occurred while running the ONNX checker: )Úexc_info)IÚonnxZ
load_modelZencoder_pathÚgraphr   Zdecoder_pathr   Zfrom_pretrainedZmodel_name_or_pathr   r	   Ú	precisionr   ZFLOAT16Zuse_vocab_maskZuse_prefix_vocab_maskZuse_forced_decoder_idsZuse_logits_processorr>   r+   Zuse_temperatureZoutput_sequence_scoresZoutput_scoresZoutput_no_speech_probsr   Z	make_noder   ÚextendÚappendÚFLOATZmake_attributer3   r4   r5   Zconvert_tokens_to_idsr6   r   Ú	attributeZmake_tensor_value_infoZINT32Z
vocab_sizeZoutput_cross_qkZcross_qk_onnx_modelÚhasattrr=   r   ÚloggerÚinfoÚwarningr   r   Zmake_opsetidZ
make_graphrC   ÚnodeÚinputÚoutputr   rK   Zmake_model_gen_versionÚosÚpathÚisfileZbeam_model_output_dirÚexistsÚremoveÚsaveZuse_external_data_formatÚbasenameÚcheckerZcheck_modelÚ	ExceptionÚerror)3ÚargsZencoder_modelZdecoder_modelÚconfigÚ	tokenizerZtemperature_namer   Zsequence_scores_nameZscores_nameZbeam_outputsZgraph_nodesZinput_features_cast_nodeZlen_pen_cast_nodeZrep_pen_cast_nodeZtemp_cast_nodeZ output_sequence_scores_cast_nodeZoutput_scores_cast_nodeZbeam_search_attrsrY   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r   r   r.   r,   r-   r/   r<   Zgraph_outputsZinitializersZopset_importZprob_cast_nodeZ
beam_graphZbeam_graph_input_namesZbeam_graph_output_namesZpost_qk_modelZpost_qk_graphZpgiZ
beam_modelÚer
   r
   r   Úchain_model.   sÞ  ñûûûûû
û
û
ÿÿ

í

ûÿÿÿÿòÿÿýûÿ


þÿ
û
û
€
üú"€ÿrj   )T)Úloggingr\   rN   Zbenchmark_helperr   Zconvert_generationr   r   r   r   r   Ztransformersr   r	   Ú	getLoggerÚ__name__rV   r   r   rj   r
   r
   r
   r   Ú<module>   s   

	