U
    h                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dlZd dl	m
Z
 ddlmZ e eZdeeeeeeeeeeeee edd
ddZdS )    N)Path)Optional)SymbolicShapeInference   )add_pre_process_metadataF   )input_model_path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              	   C   s  t jddT}t|}d}|sBtd tt| ||||}|s|st	|d } |	rrtj
|| d|
|dd nt||  d}t	|d	 }z0t }||_tjj|_tj| |d
gd}~W n, tk
r   td tt  Y nX |} |s^|dk	r:t	|d } |	r*tj
|| d|
|dd nt||  d}t	|d }tj| | t|}W 5 Q R X |dkr|t| }t| |	rtj
||d|
||dd nt|| dS )a  Shape inference and model optimization, in preparation for quantization.

    Args:
        input_model_path: Path to the input model file")
        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
    z
pre.quant.)prefixNz&Performing symbolic shape inference...zsymbolic_shape_inferred.onnxTF)r   r   size_thresholdconvert_attributezoptimized.onnxZCPUExecutionProvider)Z	providerszYONNX Runtime Model Optimization Failed! Consider rerun with option `--skip_optimization'.zonnx_shape_inferred.onnx)r   r   locationr   r   )tempfileTemporaryDirectoryr   loggerinfor   Zinfer_shapesonnxloadstrZ
save_modelsaveonnxruntimeZSessionOptionsZoptimized_model_filepathZGraphOptimizationLevelZORT_ENABLE_BASICZgraph_optimization_levelZInferenceSession	Exceptionerror	traceback
format_excZshape_inferenceZinfer_shapes_pathr   )r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zquant_tmp_dirZ	temp_pathmodelZopt_model_pathZsess_optionsessZinferred_model_path r*   L/tmp/pip-unpacked-wheel-socb9apf/onnxruntime/quantization/shape_inference.pyquant_pre_process   s    )
	

	


r,   )FFFFr   Fr   FFNr   )loggingr   r&   pathlibr   typingr   r   r#   Z&onnxruntime.tools.symbolic_shape_inferr   Zquant_utilsr   	getLogger__name__r   r!   boolintr,   r*   r*   r*   r+   <module>   sH   
           