
    ^h&                     (   d dl Z 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 ddlmZ ddlmZ ddlmZmZ  e j        e          Z	 	 	 	 	 	 	 	 	 	 	 	 	 ddeez  ej        z  dz  deez  dz  dededededededededededz  deddfdZdS )    N)Path)SymbolicShapeInference)extract_raw_data_from_modelhas_external_data   )ReplaceUpsampleWithResize)	ONNXModel)add_pre_process_metadata&save_and_reload_model_with_shape_inferF   input_modeloutput_model_pathskip_optimizationskip_onnx_shapeskip_symbolic_shape
auto_mergeint_maxguess_output_rankverbosesave_as_external_dataall_tensors_to_one_fileexternal_data_locationexternal_data_size_thresholdreturnc           	      ~	   | |                     dd          } | J |
J d            t          j        d          5 }t          |          }d}|sbt                              d           t          | t          j                  r| nt          j	        |           }t          j        |||||          }|rd |j        D             }t          |          dk    r|d	         j        }|d
k     rt          t!          |          |                                           |j                            |d	                    d}|j                            t          j                            d|          g           t          j                            ||          }t1          |          }|s|sFt3          |dz            } |	rt          j        || d|
|d           nt          j        ||            d}t3          |dz            }	 t9          j                    }||_        t8          j        j         |_!        t          | t          j                  rutE          |           rtG          d          tI          |           \  }}|%                    tM          |          tM          |                     | '                                } n|r|	r|(                    dd           t9          j)        | |dg          }~nU# tT          $ rH t          +                    d           t          +                    tY          j-                               Y nw xY w|} |s|Ft3          |dz            } |	rt          j        || d|
|d           nt          j        ||            d}t          | t          j                  r9t3          t          |          dz            } t          j        || d|
|d           t3          |dz            }t          j.        /                    | |           t          j	        |          }ddd           n# 1 swxY w Y   |0t          | t          j                  r| nt          j	        |           }ta          |           |	rt          j        ||d|
||d           dS t          j        ||           dS )a  Shape inference and model optimization, in preparation for quantization.

    Args:
        input_model: Path to the input model file or ModelProto
        output_model_path: Path to the output model file
        skip_optimization: Skip model optimization step if true. This may result in ONNX shape
            inference failure for some models.
        skip_onnx_shape: Skip ONNX shape inference. Symbolic shape inference is most effective
            with transformer based models. Skipping all shape inferences may
            reduce the effectiveness of quantization, as a tensor with unknown
            shape can not be quantized.
        skip_symbolic_shape: Skip symbolic shape inference. Symbolic shape inference is most
            effective with transformer based models. Skipping all shape
            inferences may reduce the effectiveness of quantization, as a tensor
            with unknown shape can not be quantized.
        auto_merge: For symbolic shape inference, automatically merge symbolic dims when
            conflict happens.
        int_max: For symbolic shape inference, specify the maximum value for integer to be
            treated as boundless for ops like slice
        guess_output_rank: Guess output rank to be the same as input 0 for unknown ops
        verbose: Logs detailed info of inference, 0: turn off, 1: warnings, 3: detailed
        save_as_external_data: Saving an ONNX model to external data
        all_tensors_to_one_file: Saving all the external data to one file
        external_data_location: The file location to save the external file
        external_data_size_threshold: The size threshold for external data
    Ninput_model_pathzoutput_model_path is required.z
pre.quant.)prefixz&Performing symbolic shape inference...c                 6    g | ]}|j         r|j         d k    |S )zai.onnx)domain).0opsets     h/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/onnxruntime/quantization/shape_inference.py
<listcomp>z%quant_pre_process.<locals>.<listcomp>^   s.    uuu5<u[`[gkt[t[te[t[t[t    r   r   
       zsymbolic_shape_inferred.onnxTF)r   r   size_thresholdconvert_attributezoptimized.onnxzModelProto has external data not loaded into memory, ORT cannot create session. Please load external data before calling this function. See https://onnx.ai/onnx/repo-docs/ExternalData.html for more information.z7session.optimized_model_external_initializers_file_namezoptimized.onnx.dataCPUExecutionProvider)	providerszYONNX Runtime Model Optimization Failed! Consider rerun with option `--skip_optimization'.zmodel_input.onnxzonnx_shape_inferred.onnx)r   r   locationr)   r*   )1poptempfileTemporaryDirectoryr   loggerinfo
isinstanceonnx
ModelProtoloadr   infer_shapesopset_importlenversionr   r	   applyremoveextendhelpermake_opsetidversion_converterconvert_versionr   str
save_modelsaveonnxruntimeSessionOptionsoptimized_model_filepathGraphOptimizationLevelORT_ENABLE_BASICgraph_optimization_levelr   
ValueErrorr   add_external_initializerslistSerializeToStringadd_session_config_entryInferenceSession	Exceptionerror	traceback
format_excshape_inferenceinfer_shapes_pathr
   )r   r   r   r   r   r   r   r   r   r   r   r   r   deprecated_kwargsquant_tmp_dir	temp_pathmodelloaded_modelai_onnx_domainopset_versionopt_model_pathsess_optionexternal_namesexternal_valuessessinferred_model_paths                             r#   quant_pre_processrd      s   V '++,>EE"""((*J(((		$L	9	9	9 t3]''	" 		KK@AAA*4[$/*R*Rn;;X\XabmXnXnL*7! E  
	Juu1CuuuN>""a'' .q 1 9 2%%-i.>.>NNTTVVV&--nQ.?@@@$&M&--t{/G/GM/Z/Z.[\\\ 2BB5-XXEB5IIE  3	)& !).L"LMM( 
2O#.20G'C*/     Ie[111 -=!=>>N5)8::7E47B7Y7j4k4?;; (55 (i  
 7RR]6^6^3NO99$~:N:NPTUdPePefff"-"?"?"A"AKK ) -B 88QSh   #3KYoXpqqq D 5 5 5o   Y13344444	5 )K !	3
  !).L"LMM( 
2O#.20G'C*/     Ie[111+t77 	!$}"5"58J"JKK*.,C#?&+    #&i2L&L"M"M 22;@STTTI122Eit3 t3 t3 t3 t3 t3 t3 t3 t3 t3 t3 t3 t3 t3 t3l })+tGGcTYWbMcMcU### ,"&$;+7#	
 	
 	
 	
 	
 	
 		%*+++++s9   GP=C2K76P=7AM	P=M		C(P==QQ)NNFFFFr   Fr   FFNr   )loggingr/   rS   pathlibr   r4   rE   &onnxruntime.tools.symbolic_shape_inferr   #onnxruntime.transformers.onnx_utilsr   r   fusionsr   
onnx_modelr	   quant_utilsr
   r   	getLogger__name__r1   rB   r5   boolintrd    r%   r#   <module>rq      s                    I I I I I I ^ ^ ^ ^ ^ ^ ^ ^ . . . . . . ! ! ! ! ! ! Y Y Y Y Y Y Y Y		8	$	$ 8<+/#! %#"'$))-(,w, w,tdo-4w,TzD(w, w, 	w,
 w, w, w, w, w,  w, "w,  $Jw, #&w, 
w, w, w, w, w, w,r%   