
    
gL!                     ,   d dl Z d dlZd dlZd dlmZ d dlmZ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  e j"                  e      Z	 	 	 	 	 	 	 	 	 	 	 	 	 ddeeeeej*                  f      d	eeeef      d
edededededededededee   deddfdZy)    N)Path)OptionalUnion)SymbolicShapeInference)extract_raw_data_from_modelhas_external_data   )add_pre_process_metadata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           	         | |j                  dd      } | J |J d       t        j                  d      5 }t        |      }d}|s_t        j                  d       t        | t        j                        r| nt        j                  |       }t        j                  |||||      }|s|sDt        |dz        } |	rt        j                  || d|
|d	
       nt        j                  ||        d}t        |dz        }	 t        j                          }||_        t        j$                  j&                  |_        t        | t        j                        rXt+        |       rt-        d      t/        |       \  }}|j1                  t3        |      t3        |             | j5                         } t        j6                  | |dg      }~|} |s|Dt        |dz        } |	rt        j                  || d|
|d	
       nt        j                  ||        d}t        | t        j                        r2t        t        |      dz        } t        j                  || d|
|d	
       t        |dz        }t        j@                  jC                  | |       t        j                  |      }ddd       1t        | t        j                        r| nt        j                  |       }tE        |       |	rt        j                  ||d|
||d	       yt        j                  ||       y# t8        $ r@ t        j;                  d       t        j;                  t=        j>                                Y w xY w# 1 sw Y   xY w)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...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.CPUExecutionProvider)	providerszYONNX Runtime Model Optimization Failed! Consider rerun with option `--skip_optimization'.zmodel_input.onnxzonnx_shape_inferred.onnx)r   r   locationr   r   )#poptempfileTemporaryDirectoryr   loggerinfo
isinstanceonnx
ModelProtoloadr   infer_shapesstr
save_modelsaveonnxruntimeSessionOptionsoptimized_model_filepathGraphOptimizationLevelORT_ENABLE_BASICgraph_optimization_levelr   
ValueErrorr   add_external_initializerslistSerializeToString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opt_model_pathsess_optionexternal_namesexternal_valuessessinferred_model_paths                           ]/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/quantization/shape_inference.pyquant_pre_processrK      s8   V '++,>E"""(J*JJ(		$	$L	9]'	"KK@A*4[$//*R;X\XaXabmXnL*77!E !&!).L"LM(OO#.20G'C*/ IIe[1 -=!=>N5)88:7E47B7Y7Y7j7j4k4??;(5(i 
 7RR]6^3NO99$~:NPTUdPef"-"?"?"AK"33KYoXpq  )K
  !).L"LM(OO#.20G'C*/ IIe[1+t7!$}"58J"JK*.,C#?&+ #&i2L&L"M  22;@STII12E 
:B })+tGTYYWbMcU#"&$;+7#	
 			%*+w  5o Y1134	5m 
:	9s3   CM&?CLCM&AM#M&"M##M&&M/)NNFFFFiFr   FFNi   )loggingr"   r;   pathlibr   typingr   r   r'   r.   &onnxruntime.tools.symbolic_shape_inferr   #onnxruntime.transformers.onnx_utilsr   r   quant_utilsr
   	getLogger__name__r$   r+   r(   boolintrK        rJ   <module>rX      s%       "   I ^ 1			8	$ @D48#! %#"'$),0(,b,%T4?? :;<b,c4i 01b, b, 	b,
 b, b, b, b, b,  b, "b, %SMb, #&b, 
b,rW   