
    \jA'                     (   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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y)    N)Path)extract_raw_data_from_modelhas_external_data   )ReplaceUpsampleWithResize)	ONNXModel)add_pre_process_metadata&save_and_reload_model_with_shape_infer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        |      }t	        | t
        j                        r| nt        j                  |       }|j                  D cg c]   }|j                  r|j                  dk(  s|" }}t        |      dk(  rb|d   j                  }|d	k  rNt        t        |      |      j                          t
        j                  j!                  |d
      }t#        |      }|s1	 ddlm} t*        j-                  d       |j/                  |||||      }|s4|sDt1        |dz        } |	rt        j2                  || d|
|d       nt        j4                  ||        d}t1        |dz        }	 t7        j8                         }||_        t6        j<                  j>                  |_         t	        | t
        j                        rYtC        |       rtE        d      tG        |       \  }}|jI                  tK        |      tK        |             | jM                         } n|r|	r|jO                  dd       t7        jP                  | |dg      }~|} |s|Dt1        |dz        } |	rt        j2                  || d|
|d       nt        j4                  ||        d}t	        | t
        j                        r2t1        t        |      dz        } t        j2                  || d|
|d       t1        |dz        }t
        jZ                  j]                  | |       t        j                  |      }ddd       1t	        | t
        j                        r| nt        j                  |       }t_        |       |	rt        j2                  ||d|
||d       yt        j4                  ||       yc c}w # t(        $ r}t)        d      |d}~ww xY w# tR        $ r@ t*        jU                  d       t*        jU                  tW        jX                                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ai.onnxr   r   
      )SymbolicShapeInferencezsympy is required for symbolic shape inference in quantization preprocessing. Install with: 'pip install sympy' or pass skip_symbolic_shape=True to quant_pre_process().z&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.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    )0poptempfileTemporaryDirectoryr   
isinstanceonnx
ModelProtoloadopset_importdomainlenversionr   r   applyversion_converterconvert_versionr
   &onnxruntime.tools.symbolic_shape_inferr   ImportErrorloggerinfoinfer_shapes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opsetai_onnx_domainopset_versionr   eopt_model_pathsess_optionexternal_namesexternal_valuessessinferred_model_paths                               [/root/.hermes/venv/lib/python3.12/site-packages/onnxruntime/quantization/shape_inference.pyquant_pre_processr[      s"   V '++,>E"""(J*JJ(		$	$L	9 v3]'	)+tGTYYWbMc
 .3-?-?qEu||W\WcWcgpWp%qq~!#*1-55M"))E*:MJPPR..>>ubI>uE"Y KK@A*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 )-B88QSh #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2Emv3p })+tGTYYWbMcU#"&$;+7#	
 			%*+C r  !q v  5o Y1134	5[v3 v3sq   AQ O$O(A4QO#BQ%CO9CQQ	O6%O11O66Q9AQ>QQQQ)NNFFFFiFr   FFNi   )loggingr%   rH   pathlibr   r(   r:   #onnxruntime.transformers.onnx_utilsr   r   fusionsr   
onnx_modelr   quant_utilsr	   r
   	getLogger__name__r4   r7   r)   boolintr[        rZ   <module>rh      s         ^ . ! Y			8	$ 8<+/#! %#"'$))-(,y,tdoo-4y,TzD(y, y, 	y,
 y, y, y, y, y,  y, "y,  $Jy, #&y, 
y,rg   