o
    g_                     @   s  d dl Z d dlZd dlm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 d dlmZ d dlmZ d dlmZmZmZmZmZ d d	lmZmZmZ d
ejd< e eZdej iZ!dCddZ"dd Z#dd Z$ej%fddZ&dd Z'dd Z(dd Z)dd Z*	dDddZ+de,d e,d!e-d"e.d#e.d$e
d%e.d&e.fd'd(Z/d)e,d*e,d+e,fd,d-Z0d.d/ Z1	dDd0d1Z2d2d3 Z3dEd5d6Z4d7d8 Z5d9d: Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:dS )F    N)Path)AffinitySetting)OptimizerInfo	Precisioncreate_onnxruntime_session)MODEL_CLASSES)QuantizeHelper)torch_onnx_export)
AutoConfigAutoFeatureExtractorAutoTokenizerLxmertConfigTransfoXLConfig)PRETRAINED_GPT2_MODELSGPT2ModelNoPastStateTFGPT2ModelNoPastState2TF_CPP_MIN_LOG_LEVELtriuc                 C   s   |d u sJ t | jdkr| d| dksJ td }|tjdtjd|}|d | dd | df }t| | t	| S )N   r      r   )   r   dtype)
lenshapesize
torch_functorchonesuint8wherebool
zeros_like)xdiagonalout
torch_triutemplatemask r*   ]/var/www/visachat/venv/lib/python3.10/site-packages/onnxruntime/transformers/onnx_exporter.py	triu_onnx#   s   & r,   c                   C   s
   t t_d S N)r,   r   r   r*   r*   r*   r+   replace_torch_functions-   s   
r.   c                   C   s   t d t_d S )Nr   )r   r   r   r*   r*   r*   r+   restore_torch_functions1   s   r/   c           
      C   s  |j dv rtj|d|j|jtj}d|i}|S tjjd| d ||f|d}d|i}d|v r=tj||g|d	}||d< d
|v rNtj	||g|d	}	|	|d
< |j
rU||d< t|trxtjdd|jtj|d< tjdd|jtj|d< t|trtj	|jgtjd	|d< |S )Nvitswin   pixel_valuesr   r   lowhighr   r   	input_idsattention_maskr   token_type_idsdecoder_input_idsvisual_feats
visual_posz@tf_transfo_xl_model/transformer/pos_emb/einsum/Einsum/inputs_1:0)
model_typenumpyrandomrand
image_sizeastypefloat32randintr   zerosis_encoder_decoder
isinstancer   randnvisual_feat_dimvisual_pos_dimr   hidden_size)

vocab_size
batch_sizesequence_lengthinput_namesconfig	data_typer8   inputsr9   segment_idsr*   r*   r+   create_onnxruntime_input5   s,   




rU   c                 C   s&   i }|D ]}|| v r| | ||< q|S r-   r*   )rS   rP   remaining_model_inputs
input_namer*   r*   r+   filter_inputsS   s   rX   c                 C   s$   t | ttfrdd | D gS | gS )Nc                 S   s   g | ]}t |qS r*   )flatten.0ir*   r*   r+   
<listcomp>\   s    zflatten.<locals>.<listcomp>)rH   listtuple)rS   r*   r*   r+   rY   [   s   $rY   c                 C   s0   | D ]}t |ttfs||nt|| q|S r-   )rH   r^   r_   appendupdate_flatten_list)rS   res_listr\   r*   r*   r+   ra   _   s    ra   c           
      C   s   | d j d }dd | D }dd tt|D }t|D ]%\}}ddi||< || j }t|D ]\}}	|	|krA|| |d	i q0q||fS )
Nr8   c                 S   s   i | ]}|d ddqS )rN   seq_len)r   r   r*   r[   keyr*   r*   r+   
<dictcomp>h   s    z&build_dynamic_axes.<locals>.<dictcomp>c                 S   s   g | ]
}d t |d  qS )output_r   )strrZ   r*   r*   r+   r]   j   s    z&build_dynamic_axes.<locals>.<listcomp>r   rN   rd   )r   ranger   	enumerateupdate)
example_inputsoutputs_flattenrO   dynamic_axesoutput_namesr\   output_namedimsjdimr*   r*   r+   build_dynamic_axese   s   
ru   c              	   C   sN  t | |dd}|d u rt|  d dS t|  d dd | D }|||}t|t|krEtdt| dt|  dS tt|D ]Q}	t	t
||	 ||	    }
|
d	krntd
|
 d|	  |rrdnd	}|rxdnd	}tj||	 ||	   ||dstd|	 d| d|   dS qKtd|   dS )NF)enable_all_optimizationz is an invalid ONNX modelz is a valid ONNX modelc                 S   s   i | ]	\}}||  qS r*   )r?   )r[   ktr*   r*   r+   rg      s    z'validate_onnx_model.<locals>.<dictcomp>z"Number of output tensors expected z, got g-C6?zMax absolute diff=z for output tensor g?g?)rtolatolzOutput tensor z is not close: rtol=z, atol=z0inference result of onnxruntime is validated on T)r   loggererrorinfoitemsrunr   rj   r?   amaxabscpuallclose)onnx_model_pathrm   example_outputs_flattenuse_gpufp16rp   test_sessionexample_ort_inputsexample_ort_outputsr\   abs_diffry   rz   r*   r*   r+   validate_onnx_modelt   s:   $	r   onnx_dir
model_nameinput_countoptimized_by_scriptr   	precisionoptimized_by_onnxruntimeuse_external_datac                 C   s   ddl m} |dd|}	|s|	 d| }
n|rdnd}|	 d| d| d| }
|r/|
d7 }
| }|rG|sGtj| |
}tj|sGt| tj||
 dS )	Nr   )subz[^a-zA-Z0-9_]_gpur   _ortz.onnx)rer   ospathjoinexistsmakedirs)r   r   r   r   r   r   r   r   r   normalized_model_namefilenamedevice	directoryr*   r*   r+   get_onnx_file_path   s   

r   	file_pathsuffixreturnc                 C   s&   t | }t|j|j| |jS )a  
    Append a suffix at the filename (before the extension).
    Args:
        path: pathlib.Path The actual path object we would like to add a suffix
        suffix: The suffix to add
    Returns: path with suffix appended at the end of the filename and before extension
    )r   ri   parentjoinpathstemwith_suffixr   )r   r   r   r*   r*   r+   add_filename_suffix   s   r   c                 C   sh   |st j|s*t|jjddd ddlm}m} || ||dd}||||< d S t	
d|  d S )NTparentsexist_okr   )get_fusion_statisticsoptimize_by_onnxruntimec   )r   optimized_model_path	opt_level'Skip optimization since model existed: )r   r   r   r   r   mkdir	optimizerr   r   r{   r}   )r   ort_model_pathr   	overwritemodel_fusion_statisticsr   r   r   r*   r*   r+   optimize_onnx_model_by_ort   s   r   c              
   C   s   |st j|stt|jjddd ddlm} ddlm	} |d u r&||}|
| |tjkr3d|_|tjkr;d|_|dkrCd}d}|| |||d||dd}|d	ksW|d
kr[|  | |	|< |tjkrl|jdd |||
 d S td|  d S )NTr   r   )FusionOptions)optimize_modelFr2   )	num_headsrL   r   optimization_optionsr   only_onnxruntime
bert_kerasbert_tf)keep_io_typesr   )r   r   r   r   r   r   fusion_optionsr   r   r   use_raw_attention_maskr   FLOAT16enable_gelu_approximationINT8enable_embed_layer_normuse_dynamic_axesget_fused_operator_statisticsconvert_float_to_float16save_model_to_filer{   r}   )r   r   r>   num_attention_headsrL   r   r   r   r   r   use_external_data_formatr   r   r   	opt_modelr*   r*   r+   optimize_onnx_model   s>   




r   c                 C   sz   |d ur|t v r
|S tddt  | tv rdS dd l}|d| d ur'dS |d| d ur1dS |d	| d ur;d
S dS )NzValid model class:  r   r   z-squad$AutoModelForQuestionAnsweringz-mprc$"AutoModelForSequenceClassificationgpt2AutoModelWithLMHead	AutoModel)r   	Exceptionr   r   r   search)r   custom_model_classr   r*   r*   r+   modelclass_dispatcher  s   r   Fc                 C   sz   t | |}|dkr|rtj| ||dS tj| ||dS |r!d| }td|gd}td|  t||}|j| ||dS )Nr   )rQ   	cache_dirTFtransformers)fromlistzModel class name: )r   r   from_pretrainedr   
__import__r{   r}   getattr)r   rQ   r   r   is_tf_modelmodel_class_nametransformers_modulemodel_classr*   r*   r+   load_pretrained_model/  s   

r   c                 C   s@   t j| |d}t|drd|_|| t| |||d}||fS )Nr   return_dictF)rQ   r   r   )r
   r   hasattrr   modifyr   )r   r   r   config_modifierrQ   modelr*   r*   r+   load_pt_modelB  s   

r   c                 C   sH   t j| |d}|| t }|  t| |||dd}|  ||fS )Nr   T)rQ   r   r   r   )r
   r   r   r   get_affinityr   set_affinity)r   r   r   r   rQ   affinity_settingr   r*   r*   r+   load_tf_modelN  s   
r   c                 C   s    ddl m} || \}}||fS )Nr   )tf2pt_pipeline)convert_tf_models_to_pytorchr   )r   r   rQ   r   r*   r*   r+   load_pt_model_from_tfc  s   r   c                 C   s&  d}|rt ||||d|}|tjkr|||jfS |tjks'|tjks'|tjkrqt|| t	|d||d|}t
||||j|j|||	|
||| |}|rUt |||||tjk|}|tjkrqtd|  t||| td|  |tjkr|rt|d}t||||
| |||dv r|jfS |jfS )NTFzQuantizing model: zFinished quantizing model: r   r0   )r   r   NOOPTrM   BYSCRIPTr   r   r   r   r   r   r   rL   r{   r}   r   quantize_onnx_modelBYORTr   r   
num_labels)r   r   r>   r   rP   r   r   optimize_infovalidate_onnxr   r   rQ   r   r   rm   r   rp   r   is_valid_onnx_modelr   r   r*   r*   r+   validate_and_optimize_onnxm  s   


	

	r   c                  C   s  t | |||\}}|  d }d }|dv r;tj| |d}tjjdd|j|j d tjd	|j|jd}||dd}nt
j| |d}|j| d	}|jd
dd}t||}|di |}t|ttfslJ dt| t|}t|g }t|| t|d|	|
d|}|stj|std|  t|jjddd d }d }|dv rdd |D dg}}nt||\}}t   t!|t|" |t|# ||d||d	 t$  ntd|  t%| |||||	|
|||||||||d |\}}}||||fS )Nr0   r   r      r3   r5   pt)return_tensorsr   This is a sample inputz%type of output is not list or tuple: FExporting ONNX model to Tr   c                 S   s   i | ]}|d diqS )r   r4   r*   re   r*   r*   r+   rg     s    z-export_onnx_model_from_pt.<locals>.<dictcomp>logits)	r   argsfrP   rp   ro   do_constant_foldingopset_versionr   !Skip export since model existed: r*   )&r   r   r   r   r?   r@   rE   rB   r    reshaper   max_model_input_sizesgetencode_plusrX   rH   r^   r_   typerY   ra   r   r   r   r   r   r{   r}   r   r   r   ru   r.   r	   valueskeysr/   r   ) r   r  r   r>   r   r   r   r   rP   r   r   optimizer_infor   r   r   r   r   rQ   r   rm   max_input_sizeimage_processordata	tokenizerexample_outputsr   r   ro   rp   onnx_model_filer   rM   r*   r*   r+   export_onnx_model_from_pt  s   
 



r  c           (      C   s  dd l }|jg d tj| |d}|jd u r|ddi |j| d}t	| |||\}}|
t| |jdd|d	d
d}t||}|jrT|jdd|d	d
dj|d< | dkrp|jdd|jg|d< |jdd|jg|d< z|jrwd|_W n	 ty   Y nw ||dd}d }| dks| dkrdg}|d }ddlm} ||}t|| t|d|	|
d|}|r|d d n|}|stj|sYtd|  |st|j j!d
d
d dd l"}dd l#}|j$%|j$j& g }|' D ]\} }!d gt|!j( }"|)|j*t+|"|!j,| d q|j-j.|t+||||d\}#}#|rX|/|d}$|$0tj1| W d    n	1 s6w   Y  tj2tj1|d}tj|rRt3| t4|| ntd|  |d }t5| |||||	|
|||||||||||\}%}&}'|%|&|'|fS ) Nr   GPUr   	pad_tokenz[PAD]r   r   tf
max_lengthT)r   r  padding
truncationr;   zunc-nlp/lxmert-base-uncasedr   r<   r=   F)trainingzxlnet-base-casedzxlnet-large-casedlast_hidden_state)nestr  r   )name)input_signatureopsetlarge_modeloutput_pathrz__MODEL_PROTO.onnxr  _tf)6
tensorflowrQ   set_visible_devicesr   r   r  add_special_tokensr	  r
  r   resize_token_embeddingsr   r  rX   rG   r8   r@   normalrJ   rK   	use_cacher   tensorflow.python.utilr  rY   r   r   r   r   r{   r}   r   r   r   zipfiletf2onnxlogging	set_levelERRORr~   r   r`   
TensorSpecr_   r   convert
from_kerasZipFile
extractalldirnamer   removerenamer   )(r   r  r   r>   r   r   r   r   rP   r   r   r  r   r   r   r   r   r  r  r  rQ   r   rm   r  rp   r  r   r   tf_internal_model_pathr/  r0  specsr!  valuerr   r   zoptimized_onnx_pathr   rM   r*   r*   r+   export_onnx_model_from_tf;  s   






rA  )r   Nr-   )F);r1  r   pathlibr   r?   r   affinity_helperr   benchmark_helperr   r   r   huggingface_modelsr   quantize_helperr   torch_onnx_export_helperr	   r   r
   r   r   r   r   0onnxruntime.transformers.models.gpt2.gpt2_helperr   r   r   environ	getLogger__name__r{   r   r   r,   r.   r/   int64rU   rX   rY   ra   ru   r   ri   intr"   r   r   r   r   r   r   r   r   r   r   r  rA  r*   r*   r*   r+   <module>   sl   





,
!
;

_o