§
    kŠtjA'  ã                   ó  — 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dS )é    N)ÚPath)Ú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          |¦  «        }t	          | t
          j        ¦  «        r| nt          j        | ¦  «        }d„ |j        D ¦   «         }t          |¦  «        dk    rq|d         j
        }|d	k    r^t          t          |¦  «        |¦  «                             ¦   «          t
          j                             |d
¦  «        }t!          |¦  «        }|s]	 ddlm} n"# t&          $ r}t'          d¦  «        |‚d}~ww xY wt(                               d¦  «         |                     |||||¦  «        }|�s¥|sFt/          |dz  ¦  «        } |	rt          j        || d|
|d¬¦  «         nt          j        || ¦  «         d}t/          |dz  ¦  «        }	 t5          j        ¦   «         }||_        t4          j        j        |_        t	          | t
          j        ¦  «        rutA          | ¦  «        rtC          d¦  «        ‚tE          | ¦  «        \  }}| #                    tI          |¦  «        tI          |¦  «        ¦  «         |  %                    ¦   «         } n|r|	r| &                    dd¦  «         t5          j'        | |dg¬¦  «        }~nU# tP          $ rH t(           )                    d¦  «         t(           )                    tU          j+        ¦   «         ¦  «         Y nw xY w|} |sá|�Ft/          |dz  ¦  «        } |	rt          j        || d|
|d¬¦  «         nt          j        || ¦  «         d}t	          | t
          j        ¦  «        r9t/          t          |¦  «        dz  ¦  «        } t          j        || d|
|d¬¦  «         t/          |dz  ¦  «        }t
          j,         -                    | |¦  «         t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |€0t	          | t
          j        ¦  «        r| nt          j        | ¦  «        }t]          |¦  «         |	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.)Úprefixc                 ó6   — g | ]}|j         r|j         d k    ¯|‘ŒS )zai.onnx)Údomain)Ú.0Úopsets     úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/quantization/shape_inference.pyú
<listcomp>z%quant_pre_process.<locals>.<listcomp>Q   s.   € ÐqÐqÐq EÀuÄ|ÐqÐW\ÔWcÐgpÒWpÐWp˜%ÐWpÐWpÐWpó    r   r   é
   é   )ÚSymbolicShapeInferencez¨sympy 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.onnxzÒModelProto 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Ú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Úai_onnx_domainÚopset_versionr'   ÚeÚopt_model_pathÚsess_optionÚexternal_namesÚexternal_valuesÚsessÚinferred_model_paths                              r"   Úquant_pre_processra      s¤  € ðV ÐØ'×+Ò+Ð,>ÀÑEÔEˆØÐ"Ð"Ð"àÐ(Ð(Ð*JÑ(Ô(Ð(å	Ô	$¨LÐ	9Ñ	9Ô	9ð v3¸]Ý˜Ñ'Ô'ˆ	Ý)¨+µt´ÑGÔGÐc��ÍTÌYÐWbÑMcÔMcˆð
 rÐq¨UÔ-?ÐqÑqÔqˆÝˆ~ÑÔ !Ò#Ð#Ø*¨1Ô-Ô5ˆMØ Ò"Ð"Ý)­)°EÑ*:Ô*:¸MÑJÔJ×PÒPÑRÔRÐRÝÔ.×>Ò>¸uÀbÑIÔI�Ý>¸uÑEÔE�à"ð 	ðØYÐYÐYÐYÐYÐYÐYøÝð ð ð Ý!ðqñô ð ðøøøøðøøøõ
 �KŠKÐ@ÑAÔAÐAØ*×7Ò7ØØØØ!Øñô ˆEð !ñ 3	)à&ð å! )Ð.LÑ"LÑMÔM�Ø(ð 
2Ý”OØØ#Ø.2Ø0GØ'CØ*/ðñ ô ð ð õ ”I˜e [Ñ1Ô1Ð1Ø�å  Ð-=Ñ!=Ñ>Ô>ˆNð5Ý)Ô8Ñ:Ô:�Ø7E�Ô4Ý7BÔ7YÔ7j�Ô4å˜k­4¬?Ñ;Ô;ð Ý(¨Ñ5Ô5ð Ý(ðiñô ð õ
 7RÐR]Ñ6^Ô6^Ñ3�N OØ×9Ò9½$¸~Ñ:NÔ:NÕPTÐUdÑPeÔPeÑfÔfÐfØ"-×"?Ò"?Ñ"AÔ"A�K�Kð )ð Ð-Bð Ø×8Ò8ØQÐShñô ð õ #Ô3°KÀÐYoÐXpÐ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ØØ#Ø.2Ø0GØ'CØ*/ðñ ô ð ð õ ”I˜e [Ñ1Ô1Ð1Ø�å˜+¥t¤Ñ7Ô7ð 	Ý!¥$ }Ñ"5Ô"5Ð8JÑ"JÑKÔK�Ý”ØØØ*.Ø,CØ#?Ø&+ðñ ô ð õ #& iÐ2LÑ&LÑ"MÔ"MÐÝÔ ×2Ò2°;Ð@SÑTÔTÐTÝ”IÐ1Ñ2Ô2ˆEðmv3ð v3ð v3ñ v3ô v3ð v3ð v3ð v3ð v3ð v3ð v3øøøð v3ð v3ð v3ð v3ðp €}Ý)¨+µt´ÑGÔGÐc��ÍTÌYÐWbÑMcÔMcˆå˜UÑ#Ô#Ð#àð ,ÝŒØØØ"&Ø$;Ø+Ø7Ø#ð	
ñ 	
ô 	
ð 	
ð 	
ð 	
õ 	Œ	�%Ð*Ñ+Ô+Ð+Ð+Ð+s^   ¾CP	ÄDÄP	Ä
D<Ä'D7Ä7D<Ä<BP	ÇC2KËP	ËALÌP	ÌLÌC(P	Ð	PÐP)NNFFFFr   Fr   FFNr   )Úloggingr.   rP   Úpathlibr   r1   rB   Ú#onnxruntime.transformers.onnx_utilsr   r   Úfusionsr   Ú
onnx_modelr   Úquant_utilsr	   r
   Ú	getLoggerÚ__name__r<   r?   r2   ÚboolÚintra   © r$   r"   ú<module>rm      s¸  ðð €€€Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à Ð Ð Ð Ø ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^à .Ð .Ð .Ð .Ð .Ð .Ø !Ð !Ð !Ð !Ð !Ð !Ø YÐ YÐ YÐ YÐ YÐ YÐ YÐ Yà	ˆÔ	˜8Ñ	$Ô	$€ð 8<Ø+/Ø#Ø!Ø %ØØØ#ØØ"'Ø$)Ø)-Ø(,ðy,ð y,Ø�t‘˜dœoÑ-°Ñ4ðy,à˜T‘z DÑ(ðy,ð ðy,ð ð	y,ð
 ðy,ð ðy,ð ðy,ð ðy,ð ðy,ð  ðy,ð "ðy,ð   $™Jðy,ð #&ðy,ð 
ðy,ð y,ð y,ð y,ð y,ð y,r$   