o
    h                     @   sV  U d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZmZ d dlmZ d dlZd dlZd dlZ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mZ d dlmZ d d	lmZ d d
l m!Z! erd dl"Z"d dl#Z#d dl$m%Z& d dl'Zd dl(Zd dl)Zd dl*Zd dl+Zda,ee- e.d< g dZ/de-fddZ0i Z1e2e3e4f e.d< 	dgde5deej6j7 de3fddZ8dee3 fddZ9de3fddZ:dd Z;de3fddZ<e=e>Z?G d d! d!eZ@dej6j7ddfd"d#ZAdeBe3d$f fd%d&ZCdej6j7deBed$f fd'd(ZDdej6j7defd)d*ZEdej6j7deBe3d$f fd+d,ZFd-eBe3d$f deBe3d$f fd.d/ZGd0eBeejHejIe4ejJeKejLe-f d$f deBd1 fd2d3ZMd4eBejHd$f d5eBd1 deBejHd$f fd6d7ZNd8edejHfd9d:ZOd;eejHe4eKe-f d<d=dejHfd>d?ZPd8ejHd@eejHejIe4ejJeKejLe-f deejHe4eKe-f fdAdBZQdCdDdEeBe3d$f dFeBejHd$f dGeBd1 dHeBe3d$f dIeBejHd$f dJeBd1 dKe-dLeBdM dNeBeejHejIe4ejJeKejLe-f d$f deBeejHe4eKe-f d$f fdOdPZRdCdDdEeBe3d$f dFeBejHd$f dGeBd1 dHeBe3d$f dIeBejHd$f dJeBd1 dKe-dLeBdM dNeBeejHejIe4ejJeKejLe-f d$f deBeejHe4eKe-f d$f fdQdRZSdSeTfdTdUZUG dVdW dWZVe jWG dXdY dYZXee3eBe3ee3ef f f ZYee.dZ< 	 e jWd[d\ed]d^G d_d` d`ZZed]d^G dadb dbZ[ed]d^ddcdej6j7ddeeeZee3ef f  fdedfZ\dS )h    N)MappingSequence)AnyCallableFinalOptionalTYPE_CHECKINGUnion)	TypeAlias)
FakeTensor)compatibility)FakeTensorProp)OperatorSupport)CALLABLE_NODE_OPS)_pytree_pybind_state_SUPPORT_ONNXRT)is_onnxrt_backend_supportedtorch_compile_backendOrtExecutionProviderOrtBackendOptions
OrtBackendreturnc                  C   s~   t du r=z,td td td ddl} ddl} ddl} ddlm}m}m	}m
} da W t S  ty<   da Y t S w t S )	a!  Returns ``True`` if ONNX Runtime dependencies are installed and usable
    to support TorchDynamo backend integration; ``False`` otherwise.

    Example::

        # xdoctest: +REQUIRES(env:TORCH_DOCTEST_ONNX)
        >>> import torch
        >>> if torch.onnx.is_onnxrt_backend_supported():
        ...     @torch.compile(backend="onnxrt")
        ...     def f(x):
        ...             return x * x
        ...     print(f(torch.randn(10)))
        ... else:
        ...     print("pip install onnx onnxscript onnxruntime")
        ...
    Nonnxruntimezonnxruntime.capi._pybind_stateZ
onnxscriptr   )decomposition_tablefx_onnx_interpreterpasses
type_utilsTF)r   	importlibimport_module
torch.onnxtorch.onnx._internal%torch.onnx._internal._exporter_legacytorch.onnx._internal.fxr   r   r   r   ImportError)torchr   r   r   r    r'   f/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/torch/onnx/_internal/onnxruntime.pyr   /   s    


r   _dumped_onnx_modelmodel_stringgraph_modulec                 C   s   t jdd}|sdS t|dd }| | d}t|d}||  W d   n1 s/w   Y  |t|< |durc| | d}t|d	d
d}|t|j W d   |S 1 s^w   Y  |S )a  Stores the onnx model into a file.
    The name is "{ONNXRT_DUMP_PATH}{N}.onnx"
    where *N* is the number of files already stored with
    this prefix.
    If graph_module is not None, the graph is stored as a string with
    the same filename except the extension (.txt).
    ONNXRT_DUMP_PATHN    z.onnxwbz.txtwzutf-8)encoding)osenvirongetr)   openwritestrgraph)r*   r+   prefixnfilenamefZfilename_txtr'   r'   r(   _dump_onnx_modelb   s"   

r>   c                   C   s   dgS )NCPUExecutionProviderr'   r'   r'   r'   r(   _infer_default_eps{   s   r@   namec                 C   s    t j rt jj|  dS dS )zIf PyTorch is installed with CUDA support, this starts NVTX range.

    Check torch.cuda.nvtx.range_push's document for more details.
    N)r&   cudais_availablenvtxZ
range_pushrA   r'   r'   r(   _nvtx_range_push   s   
rF   c                   C   s   t j rt jj  dS dS )zIf PyTorch is installed with CUDA support, this terminates NVTX range.

    Check torch.cuda.nvtx.range_pop's document for more details.
    N)r&   rB   rC   rD   Z	range_popr'   r'   r'   r(   _nvtx_range_pop   s   
rG   device_typec                 C   sN   ddl m} | dkr|j S | dkr|j S | dkr!|j S td|  )Nr   r   rB   cpuZmaiazUnsupported device type: )onnxruntime.capir   	OrtDevicerB   rI   Znpu
ValueError)rH   ORTCr'   r'   r(   _get_ort_device_type   s   


rN   c                       s`   e Zd ZdZdee deeef f fddZde	ee
jjf de
jjdef fd	d
Z  ZS )OrtOperatorSupporta0  Operator support for ONNXRuntime backend.

    It has two-level of support decision. One is via support_dict and the other one
    is via extra_support_dict. The logic of using support_dict is implemented in
    OrtOperatorSupport and extra_support_dict is used by OperatorSupport.is_node_supported.
    support_dictextra_support_dictc                    s   t  | || _d S N)super__init___onnx_support_dict)selfrP   rQ   	__class__r'   r(   rT      s   
zOrtOperatorSupport.__init__
submodulesnoder   c                    s   |j tvrdS |j dkr|j| jv rtd|jt|j dS t ||r3td|jt|j dS t	d|jt|j dS )NFZcall_functionz0support_dict supports node.target: %s (type: %s)Tz6extra_support_dict supports node.target: %s (type: %s)zLsupport_dict and extra_support_dict don't support node.target: %s (type: %s))
opr   targetrU   loggerinfotyperS   is_node_supportedwarning)rV   rY   rZ   rW   r'   r(   r`      s,   
z$OrtOperatorSupport.is_node_supported)__name__
__module____qualname____doc__setr   dictr8   rT   r   r&   nnModulefxNodeboolr`   __classcell__r'   r'   rW   r(   rO      s    "rO   c                 C   sh   | j }g }d}|jD ]}|jdkr|| |du r!|jdkr!|}q
|du r(dS |D ]}|| q*dS )z
    In torch.fx.Graph, placeholder is a special assignment node. If it's not
    executed in the beginning, it could overwrite values computed by upstream
    nodes.
    Nplaceholder)r9   nodesr[   appendprepend)r+   r9   placeholdersZfirst_not_placeholderrZ   rn   r'   r'   r(   _move_placeholder_to_front   s   


rs   .c                  G   sP   g }| D ]}t |dr#|j}|jdkr|d q|jdkr#|d qt|S )zBReturn the first valid device (i.e., GPU or CPU) in argument list.devicerB   CUDAExecutionProviderrI   r?   )hasattrrt   r_   rp   tuple)argsepsargrt   r'   r'   r(   _infer_ep_from_device   s   



r{   c                 C   sX   g }| j jD ]!}|jdkr't|dr"d|jv r"t|jd tjs"J || qt	|S )Nrn   metaval)
r9   ro   r[   rv   r|   
isinstancer&   Tensorrp   rw   )r+   rr   rZ   r'   r'   r(   _extract_graph_module_inputs   s   

r   c                 C   s.   | j jD ]}|jdkr|jd   S qtd)zHCollect "val" fields from outputs metadata in this torch.fx.GraphModule.outputr   z2No output node found in this torch.fx.GraphModule.)r9   ro   r[   rx   rL   )r+   rZ   r'   r'   r(   _extract_graph_module_outputs  s
   
r   c                 C   s(   t t| \}}dd |D }t| S )z[Return the all valid devices (i.e., GPU or CPU) among outputs of this torch.fx.GraphModule.c                 S   s*   g | ]}t |d rd|jv r|jd qS )r|   r}   rv   r|   ).0Z
output_argr'   r'   r(   
<listcomp>  s    z/_infer_ep_from_graph_module.<locals>.<listcomp>)r   Ztree_flattenr   r{   )r+   Zflattened_output_args_Zselected_output_argsr'   r'   r(   _infer_ep_from_graph_module  s   r   ry   c                 C   s,   dt dtfdd}t| }tt||ddS )z:Sort execution providers in eps based on pre-set priority.epr   c                 S   s   | dkrdS | dkrdS dS )Nr?      ru   r/   r   r'   )r   r'   r'   r(   get_execution_provider_priority!  s
   z2_sort_eps.<locals>.get_execution_provider_priorityT)keyreverse)r8   intrf   rw   sorted)ry   r   Z
unique_epsr'   r'   r(   	_sort_eps  s   r   valueszORTC.OrtDevice.c              	      s   ddl m  dtdtfdddttjtjttjttj	t
f dtf fdd	t| dkr;tfd
d| D }|S dfS )Nr   r   	device_idr   c                 S   s   | pdS )Nr   r'   )r   r'   r'   r(   _device_id_or_zero:  s   z-_get_onnx_devices.<locals>._device_id_or_zerovaluec                    sx   t | tjr t| jj j | jjS t | tj	t
tjttjtfr2 td j dS tdtt|  )NrI   r   zUnsupported value type: )r~   r&   r   rK   rN   rt   r_   Zdefault_memoryindexSymIntr   SymFloatfloatSymBoolrl   rL   r8   r   )rM   r   r'   r(   _map_tensor_or_sym_to_device=  s   

z7_get_onnx_devices.<locals>._map_tensor_or_sym_to_devicec                 3   s    | ]} |V  qd S rR   r'   )r   r   )r   r'   r(   	<genexpr>R  s    z$_get_onnx_devices.<locals>.<genexpr>r/   )rJ   r   r   r	   r&   r   r   r   r   r   rl   lenrw   )r   Zort_devicesr'   )rM   r   r   r(   _get_onnx_devices0  s   
r   tensorsdevicesc           
      C   s   dd l }ddlm} tj|jtj|jtj|jtj|jtj|jtj	|j	tj
|j
tj|jtj|ji	}| }|t|  g }g }g }| D ]}	|||	j  ||	  ||	  qC|| |||| |S )Nr   r   )numpyrJ   r   r&   float16float32float64uint8int8int16int32int64Zlonglongrl   Zbool_OrtValueVectorZreserver   rp   dtypesizeZdata_ptrpush_back_batch)
r   r   nprM   Ztorch_dtype_to_numpy_dtypeZ	ortvaluesZdtypesZshapesZ	data_ptrstensorr'   r'   r(   !_get_ortvalues_from_torch_tensorsX  s.   r   r   c                 C   s*   | j rtdtj|  | j| jd}|S )Nz#sparse tensor is not yet supported.)r   rt   )Z	is_sparserL   r&   emptyr   r   rt   )r   outr'   r'   r(   _to_real_tensorx  s   r   dynamo_value
value_infoonnx.ValueInfoProtoc                 C   s   t | tjrt|jjjjdkr| jdkrt| S t | t	r'tj
| tjdS t | tr4tj
| tjdS t | trAtj
| tjdS t | tjsIJ |  S )z9Helper function to wrap PyTorch variables as torch.Tensorr   )r/   )r   )r~   r&   r   r   r_   tensor_typeshapedimZsqueezer   r   r   r   r   rl   
contiguous)r   r   r'   r'   r(   _adjust_scalar_from_fx_to_onnx  s   





r   
prim_valuec                 C   s<   t | tjs
J dt |tjttjttjtfr| 	 S | S )zFHelper function to wrap ORT-produced torch.Tensor as PyTorch variableszORT's output must be tensor.)
r~   r&   r   r   r   r   r   r   rl   item)r   r   r'   r'   r(   _adjust_scalar_from_onnx_to_fx  s   r   sessonnxruntime.InferenceSessioninput_namesinputsinput_devicesoutput_namesoutputsoutput_devicespreallocate_outputinput_value_infosr   .normalized_prim_outputsc
                 C   s"  dd l }
ddlm} td tdd t||D }t  td t||}|r7tdd |D }t||}n| }t  td |
	 }|
d	d
 | |||||| t  |rptd tdd t||	D }t  |S dd l}
td |
jjj|}tdd t||	D }t  |S )Nr   r   r   c                 s       | ]
\}}t ||V  qd S rR   r   r   rz   r   r'   r'   r(   r     
    
z8_run_onnx_session_with_ortvaluevector.<locals>.<genexpr>r   c                 s   s&    | ]}t |trt|n|V  qd S rR   )r~   r   r   )r   tr'   r'   r(   r     s    
run_with_ortvaluevectorZ'disable_synchronize_execution_providers1zafter run_with_ortvaluevectorc                 s   r   rR   r   r   onnx_outputprim_outputr'   r'   r(   r     r   c                 s   r   rR   r   r   r'   r'   r(   r     r   )r   rJ   r   rF   rw   ziprG   r   r   Z
RunOptionsZadd_run_config_entryr   Zonnxruntime.trainingZtrainingZ	ortmoduleZ_utilsZ_ortvalues_to_torch_tensor)r   r   r   r   r   r   r   r   r   r   r   rM   Z
ort_inputspth_outputsort_outputsZrun_optionsr'   r'   r(   %_run_onnx_session_with_ortvaluevector  sP   

r   c
                    s`   dd l  tdd t||D } fddt||D }
| ||
}tdd t||	D }|S )Nr   c                 s   r   rR   r   r   r'   r'   r(   r   !  r   z/_run_onnx_session_with_fetch.<locals>.<genexpr>c                    s&   i | ]\}}| j |  qS r'   )ZOrtValueZortvalue_from_numpyrI   r   )r   rA   r   r   r'   r(   
<dictcomp>%  s    z0_run_onnx_session_with_fetch.<locals>.<dictcomp>c                 s   s$    | ]\}}t t||V  qd S rR   )r   r&   Z
from_numpy)r   r   r   r'   r'   r(   r   *  s    
)r   rw   r   run)r   r   r   r   r   r   r   r   r   r   feedr   r   r'   r   r(   _run_onnx_session_with_fetch  s   
r   r_   c                 C   s.   ddl }t|jjt|jjt|jji}|| S )a=  
    Converts a Python type to the corresponding ONNX tensor element type.
    For example, `_from_python_type_to_onnx_tensor_element_type(float)` returns
    `onnx.TensorProto.FLOAT`.

    Args:
      type (type): The Python type to convert.

    Returns:
      int: The corresponding ONNX tensor element type.

    r   N)	onnxr   TensorProtoFLOATr   INT64rl   BOOLr5   )r_   r   Z(_PYTHON_TYPE_TO_ONNX_TENSOR_ELEMENT_TYPEr'   r'   r(   -_from_python_type_to_onnx_tensor_element_type4  s   
r   c                   @   sv   e Zd ZdZdddeedf ded deedf d	ed d
ed ded deeejdf ejf fddZ	dd Z
dS )OrtExecutionInfoPerSessionzWInformation required to execute torch.fx.GraphModule using onnxruntime.InferenceSessionsessionr   r   .r   r   r   output_value_infosr   r   r   example_outputsc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S rR   r   r   r   r   r   r   r   r   )	rV   r   r   r   r   r   r   r   r   r'   r'   r(   rT   N  s   z#OrtExecutionInfoPerSession.__init__c           
      G   s  dd l }|jjtj|jjtj|jjtj|jj	tj
|jjtj|jjtj|jjtj|jjtj|jjtj|jjtj|jjtj|jjtj|jjtji}dd | D }t|t| jkr[dS t || jD ]o\}}t!|tj"t#t$fsq dS t!|t$t#tfrt%t&|}||j&j'j(kr dS t|j&j'j)j*dkr dS qa||j+ }||j&j'j(kr dS t |j)|j&j'j)j*D ]\}}	t!|t$r|	j,|ks|	j-rqt!|tj.r|	j-rq  dS qadS )Nr   c                 S   s   i | ]\}}||qS r'   r'   )r   r   r   r'   r'   r(   r     s    z;OrtExecutionInfoPerSession.is_supported.<locals>.<dictcomp>FT)/r   r   r   r&   r   ZFLOAT16r   Z
FLOAT8E5M2Zfloat8_e5m2ZFLOAT8E5M2FNUZZfloat8_e5m2fnuzZFLOAT8E4M3FNZfloat8_e4m3fnZFLOAT8E4M3FNUZZfloat8_e4m3fnuzDOUBLEr   r   rl   ZUINT8r   ZINT8r   ZINT16r   ZINT32r   r   r   itemsr   r   r   r~   r   r   r   r   r_   r   Z	elem_typer   r   r   Z	dim_valueZ	dim_paramr   )
rV   rx   r   Z(_onnx_tensor_element_type_to_torch_dtypeZ(_torch_dtype_to_onnx_tensor_element_typerz   r   Z
onnx_dtyper   Zonnx_dimr'   r'   r(   is_supportedo  sZ   














	z'OrtExecutionInfoPerSession.is_supportedN)rb   rc   rd   re   rw   r8   r	   r&   r   rT   r   r'   r'   r'   r(   r   K  s(    

	
!r   c                   @   s>   e Zd ZdddZdejjfddZdejjdefd	d
Z	dS )"OrtExecutionInfoForAllGraphModulesr   Nc                 C   s
   i | _ d S rR   )execution_info_per_graph_module)rV   r'   r'   r(   rT     s   z+OrtExecutionInfoForAllGraphModules.__init__r+   c                 G   s8   || j vrd S | j | }|D ]}|j| r|  S qd S rR   )r   r   )rV   r+   rx   
candidates	candidater'   r'   r(   &search_reusable_session_execution_info  s   


zIOrtExecutionInfoForAllGraphModules.search_reusable_session_execution_infor^   c                 C   s.   || j vr|g| j |< d S | j | | d S rR   )r   rp   )rV   r+   r^   r'   r'   r(   cache_session_execution_info  s   
z?OrtExecutionInfoForAllGraphModules.cache_session_execution_info)r   N)
rb   rc   rd   rT   r&   rj   GraphModuler   r   r   r'   r'   r'   r(   r     s    

r   r   T)frozenF)Zis_backward_compatiblec                   @   s   e Zd ZU dZdZeee  ed< 	 dZ	e
ed< 	 dZeee  ed< 	 dZe
ed< 	 dZe
ed	< 	 dZed
 ed< 	 dZeeedgdf   ed< dS )r   aJ  Options for constructing an ``OrtBackend``, the ONNX Runtime
    backend (``"onnxrt"``) for ``torch.compile``.

    Example::

        >>> @torch.compile(
        ...     backend="onnxrt",
        ...     options=torch.onnx._OrtBackendOptions(...),
        ... )
        ... def ort_function(x):
        ...     return x ** x
    Npreferred_execution_providersTinfer_execution_providersdefault_execution_providersFr   use_aot_autogradzonnxruntime.SessionOptionsort_session_optionszonnx.ModelProtopre_ort_model_transforms)rb   rc   rd   re   r   r   r   r   __annotations__r   rl   r   r   r   r   r   r   r'   r'   r'   r(   r     s&   
 	r   c                	   @   s   e Zd ZU dZddee fddZdejj	de
eeeeef f  fdd	Zdejj	fd
dZdejj	dejj	fddZdejj	dejj	fddZdZeed< g Zeed   ed< e	ddeeeeeef f  dd fddZedd Zedd ZdS )r   a	  A backend compiles (sub-)graphs in torch.fx.GraphModule to onnxruntime.InferenceSession calls.

    The compiler entry point is OrtBackend.compile, which
        1. partitions the original graph into supported sub-graphs (type: torch.fx.GraphModule) and unsupported
           sub-graphs.
        2. For each supported sub-graph, it replaces its _wrapped_call function with _ort_accelerated_call.
        3. Inside _ort_accelerated_call, it creates onnxruntime.InferenceSession and calls it to execute the sub-graph.
    Noptionsc                 C   s   ddl m} dd l}dd l}dd l}|d u rt n|| _|jjj	
 | _|jjjj| jj}d d d d d d}t||| _i | _t | _d| _d| _t|jdrUt| _d S t| _d S )Nr   r   )getattrz_operator.getitemz_operator.mulz_operator.addz_operator.subFr   )rJ   r   r!   r#   +torch.onnx._internal.fx.decomposition_tabler   _optionsr   	_internalZ_exporter_legacyZResolvedExportOptions_resolved_onnx_exporter_optionsrj   r   Z'_create_onnx_supports_op_overload_tableonnx_registryrO   _supported_ops_partitioner_cacher   _all_ort_execution_info_assert_allclose_to_baselineexecution_countrv   r   r   r   r   )rV   r   rM   r&   rP   rQ   r'   r'   r(   rT   !  s4   
zOrtBackend.__init__r+   r   c                 G   s   d}| j jrt|  }r|}nt| }r|}g }g | j jpg t|| j jp*t R D ]*}t|t	r9|i f}nt|t
rJ|d d u rJ|d i f}|d urW||vrW|| q-|S )Nr'   r/   r   )r   r   r{   r   r   r   r   r@   r~   r8   rw   rp   )rV   r+   rx   Zinferred_epsZeps_from_argsZeps_from_graph_moduleZselected_epsr   r'   r'   r(   _select_epsu  s,   




zOrtBackend._select_epsc                 O   s  ddl }ddlm}m} | jj|g|R  }|r1|j}|j}	|j}
|j	}|j
}|j}|j}|j}n|| }| jjrNd| _t|}dd }t||}nzt|j|i |}W n tyk   td| d| _ w | }|| }|j|| jjd}|j| jjj d	}| j!j"r| j!j"D ]}|| q|# }t$j%&d
drt'||d |j(|| j!j)| j*|g|R  d}t+dd |j,j-D }	t+dd |j,j.D }
t/|}t0|t+rt/|}nt/|f}t+dd |j,j-D }t+dd |j,j.D }t1||	||
||||d}| j2|| |  j3d7  _3t0|t4j5}|r|fn|}t0|t+s)J t6dd |D s5J t7d | ||	|||
||| j!j||
}t8  | j9rxt4j:j;j<|g|R ddi}|rd|fn|}t=||D ]\}}t4j>?|| qk|r|d S |S )a  This function replaces GraphModule._wrapped_call in compiled model.

        The _wrapped_call is the underlying implementation of forward method. Replacing
        it means we delegate the computation to _ort_acclerated_call and therefore
        onnxruntime.InferenceSession.
        r   N)r   r   Fc                 S   s"   t | drd| jv r| jd S | S )Nr|   r}   r   r   r'   r'   r(   maybe_map_to_meta_val  s   
z>OrtBackend._ort_acclerated_call.<locals>.maybe_map_to_meta_valzFakeTensorProb failed for %s)Zfx_graph_moduleonnxfunction_dispatcher)opset_versionr,   )r+   )Zpath_or_bytesZsess_options	providersc                 s       | ]}|j V  qd S rR   rE   r   inputr'   r'   r(   r         z2OrtBackend._ort_acclerated_call.<locals>.<genexpr>c                 s   r  rR   rE   r   r   r'   r'   r(   r     r  c                 s       | ]}|V  qd S rR   r'   r  r'   r'   r(   r         c                 s   r  rR   r'   r  r'   r'   r(   r     r  r   r/   c                 s   s$    | ]}t |tjtjtfV  qd S rR   )r~   r&   r   r   r   )r   elemr'   r'   r(   r   7  s
    
Z$run_onnx_session_with_ortvaluevectorexecutorZaten)@r   r$   r   r   r  r   r   r   r   r   r   r   r   r   ZMovePlaceholderToFrontr   r  Zdynamic_shapesr   r   r   Ztree_mapr   	propagate	Exceptionr]   ra   ZFxOnnxInterpreterZInsertTypePromotionr
  Zto_model_protor  r  r   r   ZSerializeToStringr3   r4   r5   r>   ZInferenceSessionr   r  rw   r9   r  r   r   r~   r   r   r  r&   r   allrF   rG   r  Z_primsr  executer   ZtestingZassert_close)rV   r+   rx   kwargsr   r   r   Z!cached_execution_info_per_sessionZonnx_sessionr   r   r   r   r   r   Zprim_outputsZextracted_outputsr	  Zfx_interpreterZexportedZ
onnx_model	transformZonnx_model_bytesZexecution_info_per_sessionZis_single_tensor_outputr   Zonnx_outputsZbaseline_outputsZnormalized_baseline_ouptutsr   Zbaseline_outputr'   r'   r(   _ort_acclerated_call  s   	

	


zOrtBackend._ort_acclerated_callc           	      C   s   ddl m} || jv r| j| }|S |}||| jdd}| }|| j|< |jjD ]}|jdkr?d|jv r?t	||j}| j
|_q)|S )Nr   )CapabilityBasedPartitionerT)Zallows_single_node_partitionZcall_moduleZfused_)Z!torch.fx.passes.infra.partitionerr  r  r  Zpartition_and_fuser9   ro   r[   rA   r   r  Z_wrapped_call)	rV   r+   rx   r  Zpartitioned_prim_graph_moduleZprim_graph_moduleZpartitionerrZ   Zfused_moduler'   r'   r(   compileZ  s$   


zOrtBackend.compilec                 C   sF   | j jrddlm} ddlm} || j|| jjd||S | ||S )zIf ``OrtBackendOptions.use_aot_autograd`` is ``True``, the `auto_autograd` compiler
        will be invoked, wrapping this ``OrtBackend`` instance's ``compile`` method. Otherwise,
        the ``compile`` method is invoked directly.r   )#min_cut_rematerialization_partition)aot_autograd)Zfw_compilerZpartition_fnZdecompositions)	r   r   Zfunctorch.compiler  Ztorch._dynamo.backends.commonr   r  r  r   )rV   r+   rx   r  r   r'   r'   r(   __call__  s   zOrtBackend.__call__   %_OrtBackend__instance_cache_max_count_OrtBackend__instance_cachec                    s   dt dt fddt t st di  pi  t fddtjD d}|du rJttjtjk s@J dtj d	t d
t dtjt  } |S )a  Returns a possibly cached instance of an ``OrtBackend``. If an existing
        backend was created previously through this function with the same options,
        it will be returned. Otherwise a new backend will be created, cached, and
        returned.

        Note: if ``options`` sets ``ort_session_options``, a new ``OrtBackend``
        will always be returned, since ``onnxruntime.SessionOptions`` cannot
        participate in caching.abc                 S   sh   | j |j ks$| j|jks$| j|jks$| j|jks$| j|jks$| j|jkr&dS | jd us0|jd ur2dS dS )NFT)r   r   r   r   r   r   r   )r%  r&  r'   r'   r(   reusable  s    





z<OrtBackend.get_cached_instance_for_options.<locals>.reusablec                 3   s     | ]}|j  r|V  qd S rR   )r   )r   r&  r   r'  r'   r(   r     s    z=OrtBackend.get_cached_instance_for_options.<locals>.<genexpr>NzNo more than z instances of z allowed. Please instantiate `z` explicitly to pass to `torch.compile`. See https://github.com/pytorch/pytorch/pull/107973#discussion_r1306144795 for discussion.r'   )r   r~   nextr   r$  r   r#  rp   )r   backendr'   r(  r(   get_cached_instance_for_options  s$   

	z*OrtBackend.get_cached_instance_for_optionsc                   C   s   t j  d S rR   )r   r$  clearr'   r'   r'   r(   clear_cached_instances  s   z!OrtBackend.clear_cached_instancesc                   C   s
   t tjS rR   )rw   r   r$  r'   r'   r'   r(   get_cached_instances  s   
zOrtBackend.get_cached_instancesrR   )rb   rc   rd   re   r   r   rT   r&   rj   r   r   rw   r8   r   r   r  r  r  r!  r#  r   r   r$  liststaticmethodr	   r+  r-  r.  r'   r'   r'   r(   r     s:   
 	T
! E6
6
r   )r   r   c                C   s   t || |S rR   )r   r+  )r+   rx   r   r'   r'   r(   r     s   r   rR   )]dataclassesr   loggingr3   collections.abcr   r   typingr   r   r   r   r   r	   Ztyping_extensionsr
   r&   Ztorch._CZ
torch._opsZtorch._prims.executorZtorch.fxZ!torch.onnx._internal._lazy_importZtorch._subclasses.fake_tensorr   Ztorch.fx._compatibilityr   Z torch.fx.passes.fake_tensor_propr   Z torch.fx.passes.operator_supportr   Ztorch.fx.passes.tools_commonr   Ztorch.utilsr   r   r   rJ   r   rM   r!   r"   r#   r   Ztorch.onnx._internal.fx.passesr   rl   r   __all__r   r)   rg   r8   r   bytesrj   r   r>   r@   rF   rG   rN   	getLoggerrb   r]   rO   rs   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r   r   	dataclassr   r   r   r   r   r'   r'   r'   r(   <module>   sr  
 	0

		
2

"
(
 
 


	

S

	

&^$!
<   Q