o
    öXœi5  ã                   @   sf   d Z ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ dd„ Zdd	„ ZG d
d„ dƒZdd„ ZdS )zÉ
A one-layer Whisper decoder model test case, with inputs: audio_features.
This model contains one layer of self-attention and one layer of cross-attention.
This is an onnxscript version of the model.
é    N)Úscript)Úopset18)ÚFLOATÚINT32c                    s–   t ƒ dtd dtd dtd dtd dtd d	td d
td td td ff‡ ‡‡‡‡‡‡‡‡‡	‡
‡‡‡‡‡‡‡‡‡‡‡‡‡‡fdd„ƒ}| ¡ }|S )NÚdecoder_input_ids©é   r   Úencoder_hidden_states)r   éÜ  é€  Úpast_key_values_0_0)r   é   é    é@   Úpast_key_values_0_1Úpast_key_values_0_2Úpast_key_values_0_3Úreturn)r   r   é™Ê  )r   r   é!   r   c           i         s  t j| ddd}t j|ddd}t  |¡}t j| ddgdd}	t jˆ|	dd}
t  |d¡}t  ||d¡}t  |dg¡}t j|dgdd}t  	||¡}t  |dg¡}t j
ˆ |dd	}t  |
|¡}t  |d¡}t j|dgdd}t jdg|dd}t  d
|¡}t  d|d¡}t j|ddgdd}t  ||¡}t j|dd}t  ||¡}t j|ˆˆdddd}t jˆddgd}t  ||¡}t  |ˆ¡}t  |d¡} t j|dgdgdgdd}!t j| |!dd}"t j|"g d¢d}#t jˆddgd}$t  ||$¡}%t j|dgdgdgdd}&t j|%|&dd}'t j|'g d¢d}(t jˆddgd})t  ||)¡}*t  |*ˆ¡}+t j|dgdgdgdd},t j|+|,dd}-t j|-g d¢d}.t j||(dd}/t j||.dd}0t j|/g d¢d}1t  |#|1¡}2t  |ddg¡}3t j|dgdgdgdd}4t  |4¡}5t  |3|5¡}6t jdgd}7t jdgd}8t j||8dd}9t jdgd}:t  |6|7|9dg|:¡};t  |2|;¡}<t j|<dd}=t  |=|0¡}>t j|>g d¢d}?t j|dgdgdd}@t j|?|@dd}At jˆddgd}Bt  |A|B¡}Ct  |Cˆ¡}Dt  ||D¡}Et j|Eˆˆdddd}Ft jˆddgd}Gt  |F|G¡}Ht  |Hˆ¡}It  |Id¡}Jt j|dgdgdgdd}Kt j|J|Kdd}Lt j|Lg d¢d}Mt j|g d¢d}Nt  |M|N¡}Ot j|Odd}Pt  |P|¡}Qt j|Qg d¢d}Rt j|dgdgdd}St j|R|Sdd}Tt jˆddgd}Ut  |T|U¡}Vt  |Vˆ¡}Wt  |E|W¡}Xt j|Xˆˆdddd}Yt jˆ
ddgd}Zt  |Y|Z¡}[t  |[ˆ	¡}\t  |\d¡}]t  |]¡}^t  |^d¡}_t  d|_¡}`t  |\|`¡}at jˆddgd}bt  |a|b¡}ct  |cˆ¡}dt  |X|d¡}et j|eˆˆdddd}ft jˆddgd}gt  |f|g¡}h|h|/|0fS )Nr   r   )ÚendÚstarté   é   éÿÿÿÿ)Ú	allowzero)Úaxis)Ú
batch_dimsgø¯MåÿÿïÇ)Útog   €µøä>)Ú
stash_typeÚepsilonr   )Úpermg      À?r   r   )r   r   r   r   éþÿÿÿ)r   r   r   r   )Ú
value_intsr   gµüÀUž ö?g      ð?g      à?)r   ÚShapeÚSqueezeÚReshapeÚGatherÚAddÚRangeÚ	UnsqueezeÚConcatÚTileÚGatherNDÚExpandÚGreaterÚCastÚMulÚLayerNormalizationÚ	TransposeÚMatMulÚAbsÚConstantÚSliceÚSoftmaxÚDivÚErf)ir   r	   r   r   r   r   Úval_0Úval_1Úsym_size_int_42ÚviewÚ	embeddingÚadd_7ÚarangeÚ	unsqueezeÚval_16ÚrepeatÚval_22Úval_24Úadd_15Úadd_24Úval_28Úval_29ÚfullÚarange_1Úview_1ÚgtÚconvert_element_type_defaultÚmul_17Ú
layer_normÚval_37Úval_38ÚlinearÚmul_43Úval_44Úview_2Ú	transposeÚval_46Úlinear_1Úval_49Úview_3Útranspose_1Úval_51Úval_52Úlinear_2Úval_55Úview_4Útranspose_2ÚcatÚcat_1Útranspose_3ÚmatmulÚunsqueeze_4Úval_83Úval_85Úexpand_1Úval_104Úval_106Úval_107Úval_111Úslice_12Úadd_125ÚsoftmaxÚmatmul_1Útranspose_4Úval_115Úview_5Úval_117Úval_118Úlinear_3Úadd_163Úlayer_norm_1Úval_121Úval_122Úlinear_4Úmul_125Úval_125Úview_6Útranspose_5Útranspose_6Úmatmul_2Ú	softmax_1Úmatmul_3Útranspose_7Úval_129Úview_7Úval_131Úval_132Úlinear_5Úadd_232Úlayer_norm_2Úval_135Úval_136Úlinear_6Úval_138Úval_139Úval_141Úval_143ÚgeluÚval_144Úval_145Úlinear_7Úadd_261Úlayer_norm_12Úval_457Ú	linear_32©Údecoder_embed_positions_weightÚdecoder_layer_norm_biasÚdecoder_layer_norm_weightÚ-decoder_layers_0_encoder_attn_layer_norm_biasÚ/decoder_layers_0_encoder_attn_layer_norm_weightÚ+decoder_layers_0_encoder_attn_out_proj_biasÚ-decoder_layers_0_encoder_attn_out_proj_weightÚ)decoder_layers_0_encoder_attn_q_proj_biasÚ+decoder_layers_0_encoder_attn_q_proj_weightÚdecoder_layers_0_fc1_biasÚdecoder_layers_0_fc1_weightÚdecoder_layers_0_fc2_biasÚdecoder_layers_0_fc2_weightÚ&decoder_layers_0_final_layer_norm_biasÚ(decoder_layers_0_final_layer_norm_weightÚ(decoder_layers_0_self_attn_k_proj_weightÚ*decoder_layers_0_self_attn_layer_norm_biasÚ,decoder_layers_0_self_attn_layer_norm_weightÚ(decoder_layers_0_self_attn_out_proj_biasÚ*decoder_layers_0_self_attn_out_proj_weightÚ&decoder_layers_0_self_attn_q_proj_biasÚ(decoder_layers_0_self_attn_q_proj_weightÚ&decoder_layers_0_self_attn_v_proj_biasÚ(decoder_layers_0_self_attn_v_proj_weightÚproj_out_weight© ú_/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/models/_whisper_decoder.pyÚ
main_graph-   s   
ú
úú
ú
zmake_model.<locals>.main_graph)r   r   r   Úto_model_proto)rŸ   r·   r°   r¯   r´   r³   r®   r¶   rµ   r²   r±   r£   r¢   r§   r¦   r¥   r¤   r­   r¬   r©   r¨   r«   rª   r¡   r    rº   Úmodelr¸   rž   r¹   Ú
make_model   s,   þýüûúù	ý@ø r½   c                  C   sP  t j d¡ t j dd¡ t j¡} t j dd¡ t j¡}t j d¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}	t j d¡ t j¡}
t j d¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j d¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j dd¡ t j¡}t j d¡ t j¡}t j d¡ t j¡}t j d¡ t j¡}t| |||||||||	|
||||||||||||||ƒ}|S )Né
   iÀ  r   r   i   )ÚnpÚrandomÚseedÚrandÚastypeÚfloat32r½   )rŸ   r·   r°   r¯   r´   r³   r®   r¶   rµ   r²   r±   r£   r¢   r§   r¦   r¥   r¤   r­   r¬   r©   r¨   r«   rª   r¡   r    r¼   r¸   r¸   r¹   Úmake_model_with_random_weightsÀ   sl   çrÅ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_WhisperDecoderTestc                 C   s(   t | dƒstƒ }tj |¡}|| _| jS )NÚ_onnx_model)ÚhasattrrÅ   ÚirÚserdeÚdeserialize_modelrÇ   )ÚselfÚmodel_protor¼   r¸   r¸   r¹   Úget_onnx_modelû   s
   
z"_WhisperDecoderTest.get_onnx_modelc                 C   s´   t | dƒsWtj d¡ tj ddd¡ tj¡tj ddd¡ tj¡tj dd	d
d¡ tj¡tj dd	d
d¡ tj¡tj dd	d
d¡ tj¡tj dd	d
d¡ tj¡dœ}|| _	| j	S )NÚ_ort_inputsr¾   r   i À  r   r   r
   r   r   r   r   )r   r	   r   r   r   r   )
rÈ   r¿   rÀ   rÁ   ÚrandintrÃ   Úint32rÂ   rÄ   rÏ   )rÌ   Úinputsr¸   r¸   r¹   Úget_ort_inputs  s   
úz"_WhisperDecoderTest.get_ort_inputsN)Ú__name__Ú
__module__Ú__qualname__rÎ   rÓ   r¸   r¸   r¸   r¹   rÆ   ú   s    rÆ   c                   C   s   t ƒ S )N)rÆ   r¸   r¸   r¸   r¹   Úwhisper_decoder_test  s   r×   )Ú__doc__Únumpyr¿   Úonnx_irrÉ   Ú
onnxscriptr   Úonnxscript.onnx_opsetr   Úonnxscript.onnx_typesr   r   r½   rÅ   rÆ   r×   r¸   r¸   r¸   r¹   Ú<module>   s    /: