o
    0j-                     @   s   d Z ddlZddlmZ ddlmZmZmZ ddlZ	ddl
mZmZmZ ddlmZ ddlmZ ddlm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m Z m!Z!m"Z" edG dd de#Z$edG dd deZ%dS )z(HPI (High Performance Inference) runner.    N)Path)ListSequenceUnion)	CACHE_DIRPaddleStaticRunnerPaddleStaticRunnerConfig)get_default_run_mode)sort_inputs)get_model_paths)logging)class_requires_depsrequire_hpip   )InferenceRunner   )$suggest_inference_backend_and_config)	HPIConfigOMConfigONNXRuntimeConfigOpenVINOConfigTensorRTConfigzultra-inferc                       s$   e Zd Z fddZdd Z  ZS )MultiBackendInferc                    s   t    || _d S N)super__init__
ui_runtime)selfr   	__class__ l/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/runners/hpi/runner.pyr   /   s   

zMultiBackendInfer.__init__c                 C   s   | j |S r   )r   Zinfer)r   xr    r    r!   __call__3   s   zMultiBackendInfer.__call__)__name__
__module____qualname__r   r#   __classcell__r    r    r   r!   r   -   s    r   c                       s   e Zd ZdZdeeef dededdf fddZe	defd	d
Z
e	defddZe	defddZdeej deej fddZdddZdd Zdd ZdddZ  ZS )	HPIRunnerzGHPI runner supporting multiple backends (Paddle, ONNX, TensorRT, etc.).	model_dirmodel_file_prefixconfigreturnNc                    s   t   t   t|| _|| _|| _|  \}}|dkr(d| _| 	|| _
d S d| _| || t | _  } fddt|D | _d S )NpaddleTFc                    s   g | ]}  |jqS r    )Zget_input_infoname).0ir   r    r!   
<listcomp>O   s    z&HPIRunner.__init__.<locals>.<listcomp>)r   r   r   r   
_model_dir_model_file_prefix_config_determine_backend_and_config_use_paddle_build_paddle_static_runner_paddle_runner_build_ui_runtimer   _multi_backend_infer
num_inputsrange_input_names)r   r)   r*   r+   backendbackend_configr<   r   r1   r!   r   ;   s    



zHPIRunner.__init__c                 C      | j S r   )r3   r   r    r    r!   r)   S      zHPIRunner.model_dirc                 C   rA   r   )r4   rB   r    r    r!   r*   W   rC   zHPIRunner.model_file_prefixc                 C   rA   r   )r5   rB   r    r    r!   r+   [   rC   zHPIRunner.configr"   c                 C   sl   | j r| |S t| j}t||kr td| dt| dt|| j}dd t| j|D }| |S )Nz	Expected z inputs but got z insteadc                 S   s   i | ]
\}}|t |qS r    )npZascontiguousarray)r/   r.   Zinput_r    r    r!   
<dictcomp>f   s    
z&HPIRunner.__call__.<locals>.<dictcomp>)r7   r9   lenr>   
ValueErrorr
   zipr;   )r   r"   r<   Zinputsr    r    r!   r#   _   s   



zHPIRunner.__call__c                 C   s   d S r   r    rB   r    r    r!   closel   s   zHPIRunner.closec                 C   s   | j jr%t| j| j}t| j |}|d d u r td|d  |\}}n| j j}|d u r1td| j jp6i }|dkr^|s@d}n|	 dhkrJd}n|d t
| j j| j jk}|r^td	 ||fS )
Nr   zCNo inference backend and configuration could be suggested. Reason: r   z[When automatic configuration is not used, the inference backend must be specified manually.r-   TZrun_modeFzrThe Paddle Inference backend is selected with the default configuration. This may not provide optimal performance.)r5   Zauto_configr   r3   r4   r   RuntimeErrorr?   r@   keysr	   pdx_model_namedevice_typer   warning)r   model_pathsretr?   r@   Zis_default_configr    r    r!   r6   o   s6   
z'HPIRunner._determine_backend_and_configc                    s   | j j| j jd|}d }| j jr| j jjr| j jjj}|d urB|dd u r1|jd ur1|j|d< |dd u rB|jd urB|j|d< t	t
j   fdd| D }t
|jdd}td td	| t| j j| j| j|d
S )N)rM   	device_idtrt_dynamic_shapestrt_dynamic_shape_input_datac                    s   i | ]\}}| v r||qS r    r    )r/   kvZ
valid_keysr    r!   rE      s    z9HPIRunner._build_paddle_static_runner.<locals>.<dictcomp>T)Zexclude_nonezUsing Paddle Inference backendzPaddle engine config: %s)r+   )r5   rM   rQ   hpi_infobackend_configsZpaddle_infergetrR   rS   setr   Zmodel_fieldsrK   itemsmodel_validateZ
model_dumpr   infor   rL   r3   r4   )r   r@   kwargsZpaddle_infoZfiltered_kwargsZengine_configr    rV   r!   r8      s>   



z%HPIRunner._build_paddle_static_runnerc              
   C   sp  ddl m}m}m} |d u r| }| jjdkr!|| jjpd n!| jjdkr1|| jjp.d n| jjdkrBt	dt
| jj t| j| j}|dv rd|vr| jjrd	|vr]t	d
td ztjdddt| jdt| jgdddd W n tjy } z	t	d|j |d }~ww t| j| j}d|v sJ nt	d|t|d d|j n"|dkrd|vrt	d|t|d d|j n	tdt
| |dkrt|}|  ||j n|dkrt|}|   ||j n|dkr|!ddr4|!dd u r4d }	| jj"r | jj"j#r | jj"j#j$}	|	d ur4|	j%d ur4i |d|	j%i}t&|}|'  | jt( d }
|
j)ddd t|
d |j*_+|j,dkr]d|j*_-|j.set	d |j%d urt/|j*j+0 s|j%1 D ]\}}|j*j2|g|R   qyntd! n|dkrt3|}|4  n	tdt
| td"| td#| ||S )$Nr   )ModelFormatRuntimeRuntimeOptionZgpuZnpucpuzUnsupported device type )openvinoonnxruntimetensorrtZonnxr-   zPaddlePaddle model requiredz:Automatically converting PaddlePaddle model to ONNX formatZpaddlexz--paddle2onnxz--paddle_model_dirz--onnx_model_dirT)capture_outputchecktextz(PaddlePaddle-to-ONNX conversion failed:
zONNX model required omzOM model requiredzUnsupported inference backend rc   rd   re   use_dynamic_shapesdynamic_shapes)parentsexist_okztrt_serialized.trtZfp16z:TensorRT static shape inference is currently not supportedz5TensorRT dynamic shapes will be loaded from the file.zInference backend: %szInference backend config: %s)5Zultra_inferr_   r`   ra   r5   rM   Zuse_gpurQ   Z
use_ascendrJ   reprr   r3   r*   Zauto_paddle2onnxr   r]   
subprocessrunstrCalledProcessErrorstderrZset_model_pathZONNXZOMrG   r   r\   Zuse_openvino_backendZset_cpu_thread_numZcpu_num_threadsr   Zuse_ort_backendrY   rW   rX   re   rl   r   Zuse_trt_backendr   mkdirZ
trt_optionZserialize_file	precisionZenable_fp16rk   r   existsr[   	set_shaper   Zuse_om_backend)r   r?   r@   Z	ui_optionr_   r`   ra   rO   eZtrt_info	cache_dirr.   Zshapesr    r    r!   r:      s   









zHPIRunner._build_ui_runtime)r,   Nr   )r$   r%   r&   __doc__r   rr   r   r   r   propertyr)   r*   r+   r   rD   Zndarrayr   r#   rI   r6   r8   r:   r'   r    r    r   r!   r(   7   s,    

 $r(   )&r{   rp   pathlibr   typingr   r   r   numpyrD   Z.paddlex.inference.models.runners.paddle_staticr   r   r   Z5paddlex.inference.models.runners.paddle_static.configr	   Z&paddlex.inference.models.runners.utilsr
   Z*paddlex.inference.models.utils.model_pathsr   Zpaddlex.utilsr   Zpaddlex.utils.depsr   r   Zinference_runnerr   r?   r   r+   r   r   r   r   r   objectr   r(   r    r    r    r!   <module>   s$   		