
    ړi%                     4   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y)    N)Path)SymbolicShapeInference)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           	      b   | |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#        |      }|s.t$        j'                  d       t)        j*                  |||||      }|s4|sDt-        |dz        } |	rt        j.                  || d|
|d       nt        j0                  ||        d}t-        |dz        }	 t3        j4                         }||_        t2        j8                  j:                  |_        t	        | t
        j                        rYt?        |       rtA        d      tC        |       \  }}|jE                  tG        |      tG        |             | jI                         } n|r|	r|jK                  dd       t3        jL                  | |dg      }~|} |s|Dt-        |dz        } |	rt        j.                  || d|
|d       nt        j0                  ||        d}t	        | t
        j                        r2t-        t        |      dz        } t        j.                  || d|
|d       t-        |dz        }t
        jV                  jY                  | |       t        j                  |      }ddd       1t	        | t
        j                        r| nt        j                  |       }t[        |       |	rt        j.                  ||d|
||d       yt        j0                  ||       yc c}w # tN        $ r@ t$        jQ                  d       t$        jQ                  tS        jT                                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   
      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    ).poptempfileTemporaryDirectoryr   
isinstanceonnx
ModelProtoloadopset_importdomainlenversionr   r	   applyversion_converterconvert_versionr   loggerinfor   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_versionopt_model_pathsess_optionexternal_namesexternal_valuessessinferred_model_paths                             O/tmp/pip-target-gsye3yef/lib/python/onnxruntime/quantization/shape_inference.pyquant_pre_processrX      s   V '++,>E"""(J*JJ(		$	$L	9 o3]'	)+tGTYYWbMc
 .3-?-?qEu||W\WcWcgpWp%qq~!#*1-55M"))E*:MJPPR..>>ubI>uE"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2E_o3b })+tGTYYWbMcU#"&$;+7#	
 			%*+u r~  5o Y1134	5Mo3 o3sL   AP% O$O(C9P%"CO?CP%P%AP"P%!P""P%%P.)NNFFFFiFr   FFNi   )loggingr%   rF   pathlibr   r(   r8   &onnxruntime.tools.symbolic_shape_inferr   #onnxruntime.transformers.onnx_utilsr   r   fusionsr   
onnx_modelr	   quant_utilsr
   r   	getLogger__name__r2   r5   r)   boolintrX        rW   <module>rf      s         I ^ . ! Y			8	$ 8<+/#! %#"'$))-(,r,tdoo-4r,TzD(r, r, 	r,
 r, r, r, r, r,  r, "r,  $Jr, #&r, 
r,re   