
     Ng_                        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 j        e          Zdej         iZ!d.dZ"d Z#d Z$ej%        fdZ&d Z'd Z(d Z)d Z*	 d/dZ+de,de,de-de.de.de
de.de.fdZ/de,d e,d!e,fd"Z0d# Z1	 d/d$Z2d% Z3d0d'Z4d( Z5d) Z6d* Z7d+ Z8d, Z9d- Z:dS )1    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                    |J t          | j                  dk    r,|                     d          |                     d          k    sJ t          d         } |t	          j        dt          j                  |          }|d |                     d          d |                     d          f         }t	          j        |                                | t	          j	        |                     S )N   r      r   )   r   dtype)
lenshapesize
torch_functorchonesuint8wherebool
zeros_like)xdiagonalout
torch_triutemplatemasks         b/var/www/html/ai-engine/env/lib/python3.11/site-packages/onnxruntime/transformers/onnx_exporter.py	triu_onnxr-   #   s    ;;;qw<<1affQii!7!7!7!7F#Jz%*\EEExPPHKaffQiiK166!99,-D;tyy{{Au'7':':;;;    c                  (    t           t          _        d S N)r-   r    r    r.   r,   replace_torch_functionsr2   -   s    EJJJr.   c                  4    t           d         t          _        d S )Nr   )r   r    r   r1   r.   r,   restore_torch_functionsr4   1   s    F#EJJJr.   c                 h   |j         dv rOt          j                            |d|j        |j                                      t          j                  }d|i}|S t          j                            d| dz
  ||f|          }d|i}d|v rt          j        ||g|	          }||d<   d
|v rt          j	        ||g|	          }	|	|d
<   |j
        r||d<   t          |t                    rt          j                            dd|j                                      t          j                  |d<   t          j                            dd|j                                      t          j                  |d<   t          |t                     r)t          j	        |j        gt          j        	          |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_typer>   inputsr?   segment_idss
             r,   create_onnxruntime_inputr[   5   s   O++L%%j!V5FHYZZaabgbopp	 ),$$azSbFckt$uuI9%F;&&Z$ASSS#1 ;&&k:"?yQQQ#.   0&/"#&,'' e!&!3!3Aq&:P!Q!Q!X!XY^Yf!g!g~$|11!Q8MNNUUV[Vcdd|&/** 
UZU` V
 V
 V
QR Mr.   c                 2    i }|D ]}|| v r| |         ||<   |S r0   r1   )rY   rV   remaining_model_inputs
input_names       r,   filter_inputsr_   S   s;    ! D D
17
1C":.!!r.   c                 X    t          | t          t          f          rd | D             n| gS )Nc                 ,    g | ]}t          |          S r1   )flatten.0is     r,   
<listcomp>zflatten.<locals>.<listcomp>\   s    (((AWQZZ(((r.   )rN   listtuple)rY   s    r,   rb   rb   [   s3    ,6ve},M,MY((((((SYZZr.   c                     | D ]C}t          |t          t          f          s|                    |          nt	          ||           D|S r0   )rN   rg   rh   appendupdate_flatten_list)rY   res_listre   s      r,   rk   rk   _   sN     e e",Qu">">dDWXY[cDdDdOr.   c                 V   | d         j         d         }d | D             }d t          t          |                    D             }t          |          D ]Q\  }}ddi||<   ||         j         }t          |          D ](\  }}	|	|k    r||                             |di           )R||fS )Nr>   c                     i | ]}|d dd	S )rT   seq_len)r   r   r1   rd   keys     r,   
<dictcomp>z&build_dynamic_axes.<locals>.<dictcomp>h   s"    SSSSC\i88SSSr.   c                 8    g | ]}d t          |dz             z   S )output_r   )strrc   s     r,   rf   z&build_dynamic_axes.<locals>.<listcomp>j   s'    PPPqIAE

*PPPr.   r   rT   rp   )r   ranger   	enumerateupdate)
example_inputsoutputs_flattenrU   dynamic_axesoutput_namesre   output_namedimsjdims
             r,   build_dynamic_axesr   e   s    $[17;OSSNSSSLPPE#o:N:N4O4OPPPL#L11 A A;%&$5[!q!'oo 	A 	AFAso%%[)00!Y@@@	A %%r.   c           	      0   t          | |d          }|t                              |  d           dS t                              |  d           d |                                D             }|                    ||          }t          |          t          |          k    r<t                              dt          |           dt          |                      dS t          t          |                    D ]}	t          j	        t          j
        ||	         ||	                                                                         z
                      }
|
dk    r t                              d	|
 d
|	            |rdnd}|rdnd}t          j        ||	         ||	                                                                         ||          s&t                              d|	 d| d|             dS t                              d|             dS )NF)enable_all_optimizationz is an invalid ONNX modelz is a valid ONNX modelc                 >    i | ]\  }}||                                 S r1   )rE   )rd   kts      r,   rs   z'validate_onnx_model.<locals>.<dictcomp>   s&    JJJ41a!QWWYYJJJr.   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   rw   rE   amaxabscpuallclose)onnx_model_pathrz   example_outputs_flattenuse_gpufp16r}   test_sessionexample_ort_inputsexample_ort_outputsre   abs_diffr   r   s                r,   validate_onnx_modelr   t   sA    .ow`efffLBBBCCCu
KK?:::;;; KJ>3G3G3I3IJJJ&**<9KLL
"##s+>'?'???o5L1M1MooUXYlUmUmoo	
 	
 	
 u3.//00  :ei(;A(>AXYZA[A_A_AaAaAgAgAiAi(ijjkkd??KKMXMM!MMNNN&uu$&uu$~"#A&**,,2244	
 
 
 	 LLT!TTTTdTTUUU55	 KKT?TTUUU4r.   onnx_dir
model_nameinput_countoptimized_by_scriptr   	precisionoptimized_by_onnxruntimeuse_external_datac                 h   ddl m}  |dd|          }	|s|	 d| }
n|rdnd}|	 d| d| d| }
|r|
dz  }
| }|rU|sSt          j                            | |
          }t          j                            |          st          j        |           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	directorys                r,   get_onnx_file_pathr      s     C 0#zBB Q+;;k;;!,u+PPkPPIPPPP FI #!9 #GLL844	w~~i(( 	#K	"""7<<	h#5#5#5666r.   	file_pathsuffixreturnc                     t          |           }t          |j                            |j        |z                                 |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   rv   parentjoinpathstemwith_suffixr   )r   r   r   s      r,   add_filename_suffixr      sD     	??Dt{##DI$677CCDKPPQQQr.   c                 "   |st           j                            |          sPt          |          j                            dd           ddlm}m}  || ||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   s           r,   optimize_onnx_model_by_ortr      s     P~66 P^#))$)FFFLLLLLLLL $#!/	
 
 
 3H2G2W2W///NnNNOOOOOr.   c           
         |s t           j                            |          st          |          j                            dd           ddlm} ddlm	} | ||          }|
                    |           |t          j        k    rd|_        |t          j        k    rd|_        |dk    rd}d} || |||d||d          }|d	k    s|d
k    r|                                 |                                |	|<   |t          j        k    r|                    d           |                    ||
           d S t(                              d|            d S )NTr   r   )FusionOptions)optimize_modelFr8   )	num_headsrR   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   rD   num_attention_headsrR   r   r   r   r   r   use_external_data_formatr   r   r   	opt_models                  r,   optimize_onnx_modelr      s     *V';<< *V!"")//t/LLL000000,,,,,,'#0=#<#< 334JKKK	)))=A :	&&;@ 8 "#K
 #N)#!5"	
 	
 	
	 %%y)@)@&&(((8A8_8_8a8a 45	)))..T.BBB$$%9;STTTTTT>RTTUUUUUr.   c                 "   |5|t           v r|S t          dd                    t                     z             | t          v rdS dd l}|                    d|           dS |                    d|           dS |                    d	|           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   s      r,   modelclass_dispatcherr     s    %..%%1CHH]4K4KKLLL+++%%III	yyJ''3..	8Z	(	(	433	6:	&	&	2$$;r.   Fc                 J   t          | |          }|dk    r0|rt          j        | ||          S t          j        | ||          S |rd|z   }t	          d|g          }t
                              d|            t          ||          }|                    | ||          S )Nr   )rW   	cache_dirTFtransformers)fromlistzModel class name: )r   r   from_pretrainedr   
__import__r   r   getattr)r   rW   r   r   is_tf_modelmodel_class_nametransformers_modulemodel_classs           r,   load_pretrained_modelr   /  s    ,Z9KLL111 	h)9*V_hiiii'7
6]fgggg 3"22$^?O>PQQQ
KK7%577888-/?@@K&&z&I&VVVr.   c                     t          j        | |          }t          |d          rd|_        |                    |           t          | |||          }||fS )Nr   return_dictF)rW   r   r   )r   r   hasattrr   modifyr   )r   r   r   config_modifierrW   models         r,   load_pt_modelr  B  sf    '
iHHHFv}%% #"6"""!*VyepqqqE5=r.   c                     t          j        | |          }|                    |           t                      }|                                 t          | |||d          }|                                 ||fS )Nr   T)rW   r   r   r   )r   r   r   r   get_affinityr   set_affinity)r   r   r   r   rW   affinity_settingr  s          r,   load_tf_modelr  N  s    '
iHHHF6""" '((!!###!&  E !!###5=r.   c                 2    ddl m}  ||           \  }}||fS )Nr   )tf2pt_pipeline)convert_tf_models_to_pytorchr	  )r   r	  rW   r  s       r,   load_pt_model_from_tfr  c  s3     <;;;;;"N:..MFE5=r.   c                    d}|rt          ||||d|          }|t          j        k    r
|||j        fS |t          j        k    s |t
          j        k    s|t
          j        k    rt          || t          |          d||d|          }t          ||||j        |j        |||	|
|||           |}|r"t          |||||t
          j        k    |          }|t
          j        k    rPt                              d|            t          j        |||           t                              d|            |t          j        k    r%|r#t%          |d          }t'          ||||
|           |||dv r|j        n|j        fS )NTFzQuantizing model: zFinished quantizing model: r   r6   )r   r   NOOPTrS   BYSCRIPTr   r   r   r   r   r   r   rR   r   r   r	   quantize_onnx_modelBYORTr   r   
num_labels)r   r   rD   r   rV   r   r   optimize_infovalidate_onnxr   r   rW   r   r   rz   r   r}   r   is_valid_onnx_modelr   r   s                        r,   validate_and_optimize_onnxr  m  s   (  
1#
 
 +++ 3V5FFF 	///9	@Q3Q3QU^bkbpUpUp1$	 
 	 
 	 &"#$	
 	
 	
 / 	"5'Y..# # 	&&KK>_>>???.QijjjKKGoGGHHH+++ 	0&IIN&'   	'?::@Q r.   c                    t          | |||          \  }}|                                 d }d }|dv rt          j        | |          }t          j                            dd|j        |j        z  dz  t          j                  	                    |j        |j        d          } ||d          }nHt          j        | |          }|j                            | d	          }|                    d
d          }t          ||          } |di |}t          |t           t"          f          sJ dt%          |                       t'          |          }t)          |g           }t+          || t-          |          d|	|
d|          }|st.          j                            |          st4                              d|            t9          |          j                            dd           d }d }|dv rd |D             dg}}nt?          ||          \  }}tA                       tC          |t#          |"                                          |t!          |#                                          ||d||	  	         tI                       nt4                              d|            tK          | |||||	|
|||||||||d |          \  }}}||||fS )Nr6   r   r      r9   r;   pt)return_tensorsr   This is a sample inputz%type of output is not list or tuple: FExporting ONNX model to Tr   c                     i | ]}|d diS )r   r:   r1   rq   s     r,   rs   z-export_onnx_model_from_pt.<locals>.<dictcomp>  s    )])])]s#>/B)])])]r.   logits)	r  argsfrV   r}   r|   do_constant_foldingopset_versionr   !Skip export since model existed: r1   )&r  r   r   r   rE   rF   rK   rH   r"   reshaper   max_model_input_sizesgetencode_plusr_   rN   rg   rh   typerb   rk   r   r   r   r   r   r   r   r   r   r   r   r2   r
   valueskeysr4   r  ) r   r!  r   rD   r   r   r   r   rV   r   r   optimizer_infor  r   r   r   r   rW   r  rz   max_input_sizeimage_processordata	tokenizerexample_outputsr   r   r|   r}   onnx_model_filer  rS   s                                    r,   export_onnx_model_from_ptr1    sF   & "*k9oVVMFE	IIKKKNN_$$.>zU^___|##&"3f6G"G!"KSXS^ $ 
 

'&#V%6
:
: 	 )dCCC!1*	RRR	"8<<ZNN"../GX\.]]">;??Ne--n--Ooe}55vv7v_cds_t_t7v7vvvv &o6612I2NN(K 	 	O  K77 K@@@AAA_$**4$*GGG(()])]n)])])]`h_i,LL);NLc)d)d&L,!!!~,,..//^002233%% $'%=
	
 
	
 
	
 
	
 	 !!!!IIIJJJ7Q %8 84O(** /^KKr.   c                    dd l }|j                            g d           t          j        | |          }|j        |                    ddi           |j                            | d          }t          | |||          \  }}|
                    t          |                     |                    dd|d	d
          }t          ||          }|j        r"|                    dd|d	d
          j        |d<   | dk    rJ|j                            dd|j        g          |d<   |j                            dd|j        g          |d<   	 |j        rd|_        n# t*          $ r Y nw xY w ||d          }d }| dk    s| dk    rdg}|d         }ddlm} |                    |          }t3          || t          |          d|	|
d|          }|r
|d d         n|}|s t4          j                            |          st:                              d|            |s)t?          |          j         !                    d
d
           dd l"}dd l#}|j$        %                    |j$        j&                   g }|'                                D ]Z\  } }!d gt          |!j(                  z  }"|)                    |*                    tW          |"          |!j,        |                      [|j-        .                    |tW          |          |||          \  }#}#|r|/                    |d          5 }$|$0                    t4          j        1                    |                     d d d            n# 1 swxY w Y   t4          j        2                    t4          j        1                    |          d          }t4          j                            |          rt5          j3        |           t5          j4        ||           nt:                              d|            |dz   }tk          | |||||	|
|||||||||||          \  }%}&}'|%|&|'|fS ) Nr   GPUr   	pad_tokenz[PAD]r   r  tf
max_lengthT)r  r6  padding
truncationrA   zunc-nlp/lxmert-base-uncasedr   rB   rC   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
tensorflowrW   set_visible_devicesr   r   r4  add_special_tokensr$  r%  r  resize_token_embeddingsr   r&  r_   rM   r>   rF   normalrP   rQ   	use_cacher   tensorflow.python.utilr;  rb   r   r   r   r   r   r   r   r   r   zipfiletf2onnxlogging	set_levelERRORr   r   rj   
TensorSpecrh   r   convert
from_kerasZipFile
extractalldirnamer   removerenamer  )(r   r!  r   rD   r   r   r   r   rV   r   r   r*  r  r   r   r   r   r5  r.  r+  rW   r  rz   r/  r}   r;  r   r   tf_internal_model_pathrK  rL  specsr=  valuer   r   zoptimized_onnx_pathr  rS   s(                                           r,   export_onnx_model_from_tfr]  ;  s2   ( I!!"e,,,-jINNNI"$$k7%;<<<488TJJN!*k9oVVMFE	!!#i..111** ! +  N #>;??N  .7.C.C$%  /D /
 /
  	*+ 222)+)9)91aAW:X)Y)Y~&')y'7'7Av?T8U'V'V|$ 	%$F    eNU;;;OL ''':9L+L+L+,)*=> ,+++++"ll?;;(K 	 	O 6Nb_SbS11Sb K'=>> K@@@AAA' 	S'((/55dT5RRR!!'/"7888)//11 	M 	MKD%6C,,,DLLuT{{EKdKKLLLL))!%LL0. * 
 
1 $ 	?!7== FRW__-CDDEEEF F F F F F F F F F F F F F F%'W\\"'//BX2Y2Y[o%p%p"w~~o.. +	/***I,o>>> 	IIIJJJe#J;U %< <8,j, 		 s$   
E 
E&%E&)3M((M,/M,)r   Nr0   )F);rM  r   pathlibr   rE   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-   r2   r4   int64r[   r_   rb   rk   r   r   rv   intr$   r   r   r   r   r   r   r  r  r  r  r1  r]  r1   r.   r,   <module>rj     s3    				         + + + + + + Q Q Q Q Q Q Q Q Q Q , , , , , , * * * * * * 6 6 6 6 6 6 g g g g g g g g g g g g g g          &)
! "		8	$	$ ej!
< < < <  $ $ $ fkep    <" " "[ [ [  & & &* ) ) ) )X777 7 	7
 7 7 #7 7 7 7 7B	R3 	R 	R 	R 	R 	R 	RP P P: 8V 8V 8V 8Vv  ,W W W W&	 	 	  *  \ \ \~lL lL lL^R R R R Rr.   