
    g_                        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j8                  d<    e j:                  e      Zdej@                  iZ!d-dZ"d Z#d Z$ejJ                  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% Z3d/d&Z4d' Z5d( Z6d) Z7d* Z8d+ Z9d, Z:y)0    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#| j                  d      | j                  d      k(  sJ t        d   } |t	        j
                  dt        j                        |      }|d | j                  d      d | j                  d      f   }t	        j                  |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         [/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_exporter.py	triu_onnxr-   #   s    ;;qww<1affQi!777F#J%**\ExPHKaffQiK166!9,-D;;tyy{Au'7'7':;;    c                  "    t         t        _        y N)r-   r    r    r.   r,   replace_torch_functionsr2   -   s	    EJr.   c                  (    t         d   t        _        y )Nr   )r   r    r   r1   r.   r,   restore_torch_functionsr4   1   s    F#EJr.   c                    |j                   dv rYt        j                  j                  |d|j                  |j                        j                  t        j                        }d|i}|S t        j                  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                  j                  dd|j                        j                  t        j                        |d<   t        j                  j                  dd|j                        j                  t        j                        |d<   t        |t               r3t        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+LL%%j!V5F5FHYHYZaabgbobop	 ),$$azSbFckt$uI9%F;&Z$AS#1 ;&kk:"?yQ#.   &/"#&,'!&!3!3Aq&:P:P!Q!X!XY^YfYf!g~$||11!Q8M8MNUUV[VcVcd|&/*UZU`U` V
QR Mr.   c                 2    i }|D ]  }|| v s| |   ||<    |S r0   r1   )rY   rV   remaining_model_inputs
input_names       r,   filter_inputsr_   S   s2    !
17
1C":. " "!r.   c                 r    t        | t        t        f      r| D cg c]  }t        |       c}gS | gS c c}w r0   )rN   listtupleflatten)rY   is     r,   rc   rc   [   s7    ,6ve},M(AWQZ(ZZSYZZ(s   4c                 z    | D ]5  }t        |t        t        f      s|j                  |      nt	        ||       7 |S r0   )rN   ra   rb   appendupdate_flatten_list)rY   res_listrd   s      r,   rg   rg   _   s7    ",Qu">DWXY[cDd Or.   c                 x   | d   j                   d   }| D ci c]  }|ddd
 }}t        t        |            D cg c]  }dt        |dz         z    }}t	        |      D ]J  \  }}ddi||<   ||   j                   }t	        |      D ]!  \  }	}
|
|k(  s||   j                  |	di       # L ||fS c c}w c c}w )	Nr>   rT   seq_len)r   r   output_r   r   )r   ranger   str	enumerateupdate)example_inputsoutputs_flattenrU   keydynamic_axesrd   output_namesoutput_namedimsjdims              r,   build_dynamic_axesrz   e   s    $[177;ODRSNSC\i88NLS49#o:N4OP4OqIAE
*4OLP#L1;%&$5[!q!''oFAso%[)00!Y@ & 2 %% TPs
   B2B7c           	         t        | |d      }|t        j                  |  d       yt        j                  |  d       |j	                         D ci c]  \  }}||j                          }	}}|j                  ||	      }
t        |      t        |
      k7  r.t        j                  dt        |       dt        |
              yt        t        |            D ]  }t        j                  t        j                  |
|   ||   j                         j                         z
              }|dkD  rt        j                  d| d	|        |rd
nd}|rdnd}t        j                  |
|   ||   j                         j                         ||      rt        j                  d| d| d|         y t        j                  d|         yc c}}w )NF)enable_all_optimizationz is an invalid ONNX modelz is a valid ONNX modelz"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itemsrE   runr   rm   amaxabscpuallclose)onnx_model_pathrq   example_outputs_flattenuse_gpufp16ru   test_sessionktexample_ort_inputsexample_ort_outputsrd   abs_diffr}   r~   s                  r,   validate_onnx_modelr   t   s    .ow`efL((ABC
KK?##9:; 4B3G3G3IJ3I41a!QWWY,3IJ&**<9KL
"#s+>'??05L1M0NfUXYlUmTno	
 3./0::eii(;A(>AXYZA[A_A_AaAgAgAi(ijkd?KK,XJ6I!MNu$u$~~"#A&**,224	
 LL>!,@gdVTU 1  KKB?BSTU3 Ks   Gonnx_dir
model_nameinput_countoptimized_by_scriptr   	precisionoptimized_by_onnxruntimeuse_external_datac                 d   ddl m}  |dd|      }	|s|	 d| }
n|rdnd}|	 d| d| d| }
|r|
dz  }
| }|rV|sTt        j                  j	                  | |
      }t        j                  j                  |      st        j                  |       t        j                  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      0#zB+,Ak];!u+,Ak]!I;axPFI!9GGLL84	ww~~i(KK	"77<<	hZu#566r.   	file_pathsuffixreturnc                     t        |       }t        |j                  j                  |j                  |z         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   rn   parentjoinpathstemwith_suffixr   )r   r   r   s      r,   add_filename_suffixr      s?     	?Dt{{##DII$67CCDKKPQQr.   c                    |st         j                  j                  |      sFt        |      j                  j                  dd       ddlm}m}  || ||d      } ||      ||<   y t        j                  d|        y )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      su    ~6^##))$)FL $!/	
 3H2W/=n=MNOr.   c           
      t   |st         j                  j                  |      st        |      j                  j                  dd       ddlm} ddlm	} | ||      }|j                  |       |t        j                  k(  rd|_        |t        j                  k(  rd|_        |dk(  rd}d} || |||d||d      }|d	k(  s|d
k(  r|j!                          |j#                         |	|<   |t        j                  k(  r|j%                  d       |j'                  ||
       y t(        j+                  d|        y )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:    ';<!"))//t/L0,'#0#< 334JK	)))=A :	&;@ 8 "#K
 #)#!5"	
	 %y)@&&(8A8_8_8a 45	)))..T.B$$%9;ST=>R=STUr.   c                     |+|t         v r|S t        ddj                  t               z         | t        v rydd l}|j                  d|       y|j                  d|       y|j                  d	|       y
y)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]4KKLL++%	yyJ'3.	8Z	(	43	6:	&	2$r.   c                 "   t        | |      }|dk(  r2|rt        j                  | ||      S t        j                  | ||      S |rd|z   }t	        d|g      }t
        j                  d|        t        ||      }|j                  | ||      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11)99*V_hii'77
6]fgg"22$^?O>PQ
KK$%5$678-/?@K&&z&I&VVr.   c                     t        j                  | |      }t        |d      rd|_        |j	                  |       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  sO    ''
iHFv}%"6"!*VyepqE5=r.   c                     t        j                  | |      }|j                  |       t               }|j	                          t        | |||d      }|j                          ||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  sj    ''
iHF6" '(!!#!&E !!#5=r.   c                 ,    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  s     <":.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(  rGt        j                  d|        t        j                   |||       t        j                  d|        |t        j"                  k(  r|rt%        |d      }t'        ||||
|       |||dv r|j(                  fS |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   rq   r   ru   r   is_valid_onnx_modelr   r   s                        r,   validate_and_optimize_onnxr  m  s   ( 1#
 +++ 3V5F5FFF 	///9	@Q@Q3QU^bkbpbpUp1$	 
 	 &&"#$	
 /"5'Y...# 	&KK,_,=>?..QijKK5o5FGH+++0&IN&' 	'?:  AG@Q@Q r.   c                 0   t        | |||      \  }}|j                          d }d }|dv rt        j                  | |      }t        j
                  j                  dd|j                  |j                  z  dz  t        j                        j                  |j                  |j                  d      } ||d      }nFt        j                  | |      }|j                  j                  | d	      }|j                  d
d      }t        ||      } |di |}t        |t         t"        f      sJ dt%        |              t'        |      }t)        |g       }t+        || t-        |      d|	|
d|      }|st.        j0                  j3                  |      st4        j7                  d|        t9        |      j:                  j=                  dd       d }d }|dv r|D ci c]  }|ddi	 c}dg}}nt?        ||      \  }}tA                tC        |t#        |jE                               |t!        |jG                               ||d||	       tI                nt4        j7                  d|        tK        | |||||	|
|||||||||d |      \  }}} ||| |fS c c}w )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   r:   logits)	r   argsfrV   ru   rt   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   ra   rb   typerc   rg   r   r   r   r   r   r   r   r   r   r   rz   r2   r
   valueskeysr4   r  )!r   r  r   rD   r   r   r   r   rV   r   r   optimizer_infor
  r   r   r   r   rW   r   rq   max_input_sizeimage_processordata	tokenizerexample_outputsr   r   rt   ru   rs   onnx_model_filer  rS   s!                                    r,   export_onnx_model_from_ptr'    s   & "*k9oVMFE	IIKNN_$.>>zU^_||##&"3"3f6G6G"G!"KSXS^S^ $ 

'&##V%6%6
: 	 )dC!11*	R	"88<<ZN"../GX\.]">;?N-n-Ooe}5v9^_cds_t^u7vv5 &o612I2N(K 	O 7..?@A_$$**4$*G(N\)]ns#>/B*Bn)]`h_i,L);NLc)d&L,!~,,./^0023%% $'%=
	
 	 !77HIJ7Q %84O(** /^KKS *^s   Jc                 .   dd l }|j                  j                  g d       t        j                  | |      }|j
                  |j                  ddi       |j                  j                  | d      }t        | |||      \  }}|j                  t        |             |j                  dd|d	d
      }t        ||      }|j                  r#|j                  dd|d	d
      j                  |d<   | dk(  rV|j                   j#                  dd|j$                  g      |d<   |j                   j#                  dd|j&                  g      |d<   	 |j(                  rd|_         ||d      }d }| dk(  s| dk(  rdg}|d   }ddlm} |j1                  |      }t3        || t        |      d|	|
d|      }|r|d d n|}|s t4        j6                  j9                  |      st:        j=                  d|        |s&t?        |      j@                  jC                  d
d
       dd l"}dd l#}|jH                  jK                  |jH                  jL                         g }|jO                         D ]T  \  } }!d gt        |!jP                        z  }"|jS                  |jU                  tW        |"      |!jX                  |              V |jZ                  j]                  |tW        |      |||      \  }#}#|r|j_                  |d      5 }$|$ja                  t4        j6                  jc                  |             d d d        t4        j6                  je                  t4        j6                  jc                  |      d      }t4        j6                  j9                  |      rt5        jf                  |       t5        jh                  ||       nt:        j=                  d|        |dz   }tk        | |||||	|
|||||||||||      \  }%}&}'|%|&|'|fS # t*        $ r Y w xY w# 1 sw Y   xY w) Nr   GPUr   	pad_tokenz[PAD]r   r  tf
max_lengthT)r  r,  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   r*  add_special_tokensr  r  r   resize_token_embeddingsr   r  r_   rM   r>   rF   normalrP   rQ   	use_cacher   tensorflow.python.utilr1  rc   r   r   r   r   r   r   r   r   r   zipfiletf2onnxlogging	set_levelERRORr   r   rf   
TensorSpecrb   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   r+  r$  r!  rW   r   rq   r%  ru   r1  r   r   tf_internal_model_pathrA  rB  specsr3  valuerw   r   zoptimized_onnx_pathr  rS   s(                                           r,   export_onnx_model_from_tfrS  ;  s   ( II!!"e,--jINI"$$k7%;<4488TJN!*k9oVMFE	!!#i.1** ! + N #>;?N  .7.C.C$%  /D /
 ) 	*+ 22)+)9)91aAWAW:X)Y~&')yy'7'7Av?T?T8U'V|$$F NU;OL '':9L+L+,)*=> ,"ll?;(K 	O 6N_Sb1Sb'=>..?@A''(//55dT5R!!'//"7"78)//1KD%6C,,DLLuT{EKKdKL 2 ))!%L0. * 
1 $!7=RWW__-CDE >%'WW\\"''//BX2Y[o%p"ww~~o.		/*II,o> 	77HIJe#J;U %<8,j, 		 g  f >=s   O; 9/P;	PPP)r   Nr0   )F);rC  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_   rc   rg   rz   r   rn   intr$   r   r   r   r   r   r   r   r   r  r  r'  rS  r1   r.   r,   <module>r`     s]    	    + Q Q , * 6 g g  &)

! "			8	$ ejj!
<$ fkepep <"[&* )X777 7 	7
 7 7 #7 7B	R3 	R 	R 	RP: 8Vv,W&	*\~lL^Rr.   