a
    h?                  V   @   s  U 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Zd dlZd dlZd dl	Z	d dl
Z
d dlmZmZmZmZmZ d dlZd dlm  mZ d dlmZ d dlmZmZ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'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZC ddlDmEZEmFZF eF rd dlGmHZH e$IeJZKejLMddN eEv ZOdePe* eeeQeReQ f  eReQ dddZSg dZTddgZUg ZVeTD ]6ZWeXeWeYr"eVZeSf i eW neVZeSeW qg dZ[e\e]e^eVe[ Z_da`dd ZadddZbd d! Zcd"d# Zdd$d% Zed&d' Zfd(d) Zgdd*d+Zhd,d- Zidd.d/d0Zjd1d2 Zkd3d4 Zlddd.d5d6Zmddd.d7d8Znddd9d:d;Zodd.d<d=Zpd>d? Zqdd.d@dAZrdd.dBdCZsddddDdEdFZtddddDdGdHZudIdJ ZvdKdL ZwdddMdNdOZxdd.dPdQZydRdS ZzdddTdUdVZ{dWdX Z|ddYdZZ}d[d\ Z~d]d^ Zd_d` Zdadb ZddcddZddedfZdgdh Zdidj Zdkdl ZddndoZddqdrZdsdt Zdudv Zdwdx Zdydz Zejjeaejjjebejjecejjedejjeeejefejjjehejjegejeiejejejekejelejemejenejeoejepejjeqejerejesejetejjeuejevejjewejexeje}eje~ejjeejeyejjezeje{ejje|ejjeejjeejeejjeejeejjeejeejjjeejjeejjeejjeejei+ZeYeef ed{< eeejjj< G d|d} d}eZG d~d deZG dd deZG dd deZdeeed ed ed f eeegef  edddZG dd dePZee\eef dddZdd ZePe& eegef dddZede&fi ee&dZede'fi ee'dZede(fi ee(dZdeeeeRe  dddZG dd deZejeReQ dddZddddZddddZddefdeeReQ  eePe edddZdS )    N)AnyCallableLiteralOptionalUnion)nn)GraphGraphModuleNodeProxyTracer)compatibility)is_fx_tracingParameterProxy   )logging)CacheDynamicCacheStaticCache)PretrainedConfigPreTrainedModel)
get_values),MODEL_FOR_AUDIO_CLASSIFICATION_MAPPING_NAMES MODEL_FOR_BACKBONE_MAPPING_NAMES!MODEL_FOR_CAUSAL_LM_MAPPING_NAMESMODEL_FOR_CTC_MAPPING_NAMES3MODEL_FOR_DOCUMENT_QUESTION_ANSWERING_MAPPING_NAMES,MODEL_FOR_IMAGE_CLASSIFICATION_MAPPING_NAMESMODEL_FOR_IMAGE_MAPPING_NAMES-MODEL_FOR_MASKED_IMAGE_MODELING_MAPPING_NAMES!MODEL_FOR_MASKED_LM_MAPPING_NAMES'MODEL_FOR_MULTIPLE_CHOICE_MAPPING_NAMES0MODEL_FOR_NEXT_SENTENCE_PREDICTION_MAPPING_NAMES#MODEL_FOR_PRETRAINING_MAPPING_NAMES*MODEL_FOR_QUESTION_ANSWERING_MAPPING_NAMES-MODEL_FOR_SEMANTIC_SEGMENTATION_MAPPING_NAMES,MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING_NAMES/MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING_NAMES(MODEL_FOR_SPEECH_SEQ_2_SEQ_MAPPING_NAMES,MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING_NAMES,MODEL_FOR_VIDEO_CLASSIFICATION_MAPPING_NAMES6MODEL_FOR_ZERO_SHOT_IMAGE_CLASSIFICATION_MAPPING_NAMESMODEL_MAPPING_NAMES   )ENV_VARS_TRUE_VALUESis_peft_available)	PeftModelZFX_DEBUG_MODE )
model_namesupported_tasksreturnc                 C   s~   t ttttttttt	t
tttttttttd}|d u r>| }t|trN|g}g }|D ]"}|| | d }|rV|| qV|S )N)defaultZpretrainingznext-sentence-predictionz	masked-lmz	causal-lmz
seq2seq-lmzspeech-seq2seqzmultiple-choicezdocument-question-answeringzquestion-answeringzsequence-classificationztoken-classificationzmasked-image-modelingzimage-classificationzzero-shot-image-classificationZctczaudio-classificationzsemantic-segmentationZbackbonezimage-feature-extraction)r-   r$   r#   r!   r   r'   r)   r"   r   r%   r(   r*   r    r   r,   r   r   r&   r   r   keys
isinstancestrgetappend)r3   r4   Ztask_mappingZmodel_class_namestask
class_name r>   Q/var/www/html/assistant/venv/lib/python3.9/site-packages/transformers/utils/fx.py%_generate_supported_model_class_namesM   s>    
r@   )8ZaltclipZalbertZbartZbertZbitnetZ
blenderbotzblenderbot-smallZbloomZclipZconvnextZdebertaz
deberta-v2Zdinov2Zdinov3_convnextZ
dinov3_vitZ
distilbertz
donut-swinZelectraZgpt2Zgpt_neoZgptjZhieraZhubertZijepaZlayoutlmllamaZcohereZlxmertZm2m_100ZmarianZmbartmegatron-bertZmistralZmixtralZ
mobilebertZmt5ZnezhaoptZpegasusZplbartZqwen2Z	qwen2_moeZqwen3Z	qwen3_moeZresnetZrobertaZ	segformerZspeech_to_textZspeech_to_text_2ZswinZt5ZtrocrZvitZvjepa2ZxglmZwav2vec2rA   rC   )ZCLIPTextModelZCLIPTextModelWithProjectionZCLIPVisionModelZCLIPVisionModelWithProjectionZAltCLIPTextModelZAltCLIPVisionModelZGitVisionModelGPT2DoubleHeadsModelZSpeech2Text2DecoderZTrOCRDecoderPeftModelForCausalLMPeftModelForSeq2SeqLMZVJEPA2ForVideoClassificationc                 C   s*   t jg |j| jjd R d| jjdS Nmeta)devicedtype)torchemptyshapeweightrK   selfinputr>   r>   r?   torch_nn_embedding   s    rS          @Fc                 C   s&   t jg | j|jd R d|jdS rG   )rL   rM   rN   rK   )rR   rO   Zpadding_idxZmax_normZ	norm_typeZscale_grad_by_freqsparser>   r>   r?   torch_nn_functional_embedding   s    rV   c                 C   s   |S Nr>   rP   r>   r>   r?   torch_nn_layernorm   s    rX   c                 C   s   |S rW   r>   rP   r>   r>   r?   torch_nn_groupnorm   s    rY   c                 C   s    t j|jd d | jf ddS )NrH   rI   rJ   )rL   rM   rN   Zout_featuresrP   r>   r>   r?   torch_nn_linear   s    r[   c                 C   s   | S rW   r>   xr>   r>   r?   
torch_relu   s    r^   c                 C   s   |S rW   r>   )rQ   r]   r>   r>   r?   torch_nn_relu   s    r_   c                 C   s   |st d| S )Nz>Don't support in-place functional.relu for MetaTensor analysis
ValueError)r]   Zinplacer>   r>   r?   torch_nn_functional_relu   s    rb   c                 C   s$   | j dd|j dd |j dd S NrI   rZ   to)	conditionr]   yr>   r>   r?   torch_where   s    rh   outc                C   s   |d urt d| S )Nz2Don't support in-place abs for MetaTensor analysisr`   )rR   rj   r>   r>   r?   	torch_abs   s    rk   c                  O   s   t | }d}|dkr"d}| d }n|dkr4| \}}n
| \}}}t|trPt|}t|trbt|}t|trtt|}|d|}|d}tj|| | |ddS )Nr.   r   r   steprK   rI   rK   rJ   )lenr8   floatintr:   rL   rM   )argskwargsnrl   startendrK   r>   r>   r?   torch_arange  s"    






rv   c                  O   sR   t | } t| dkrd| d< nd|d< t|}|dd  tj| i |ddiS )Nr.   Z
fill_valuerJ   rI   )listrn   dictpoprL   full)rq   rr   Zkwargs_without_devicer>   r>   r?   
torch_full  s    
r{   c                   s    d u r|d u rd  d u r(|d ur(|  dk r@| d      dd | D }t|d }t fdd|D }|d   |g | d d   }tj|ddS )	Nr   c                 S   s   g | ]
}|j qS r>   )rN   ).0tr>   r>   r?   
<listcomp>)      ztorch_cat.<locals>.<listcomp>c                 3   s   | ]}|  V  qd S rW   r>   )r|   rN   dimr>   r?   	<genexpr>+  r   ztorch_cat.<locals>.<genexpr>r.   rI   rZ   )r   rw   sumrL   rM   )tensorsr   axisrj   ZshapesrN   Zconcatenated_dimZfinal_shaper>   r   r?   	torch_cat"  s    "r   c                C   sp   |d u r|d u rd}|d u r(|d ur(|}|dk rD| d   d | }t| d j}||t|  tj|ddS Nr   r.   rI   rZ   )r   rw   rN   insertrn   rL   rM   )r   r   r   rj   rN   r>   r>   r?   torch_stack0  s    r   )alpharj   c          	      C   s   t | tjstj|ddS t |tjs4tj| ddS t|  | }t| jdg||     }t|jdg||    }g }t|D ]}|	t|| ||  qtj
|ddS )NrI   rZ   r.   )r8   rL   Tensor
empty_likemaxr   rw   rN   ranger;   rM   )	rR   otherr   rj   
max_lengthZinput_shapeZother_shaperN   ir>   r>   r?   	torch_add<  s    r   c                C   s   t | ||dS )Nri   )r   )rR   r   rj   r>   r>   r?   	torch_mulJ  s    r   c                 C   s
   t | |S rW   )r   )rQ   r   r>   r>   r?   torch_tensor_mulN  s    r   c          
      C   s  |   }|  }d }|dkr,|dkr,d }nL|dkrT|dkrT| d|df}n$|dkrt|dkrt|df}n|dkr|dkr| df}nt|   |  }t| j}t|j}|dkrdg| }|dkr|d dg||  t| j }dg||  t|j }g }t|D ]}	|t||	 ||	  q|d |d< |d |d< |dkrd|d |dkrx|d |d u rtj	dddS tj
|d	diS )
Nr.   r   r   rH           rI   rZ   rJ   )r   sizer   rw   rN   r;   r   ry   rL   tensorrM   )
rR   r   rj   Zd1Zd2rN   r   Zshape1Zshape2r   r>   r>   r?   torch_matmulR  s@    








r   c                C   s:   |d urt d| j\}}}|j\}}}tj|||ddS )Nz2Don't support in-place bmm for MetaTensor analysisrI   rZ   )ra   rN   rL   rM   )rR   Zmat2rj   
batch_sizers   m_pr>   r>   r?   	torch_bmmv  s
    r   betar   rj   c                C   s   |d urt dt||S )Nz6Don't support in-place baddbmm for MetaTensor analysis)ra   r   )rR   batch1batch2r   r   rj   r>   r>   r?   torch_baddbmm~  s    r   c                C   s   t | |||||dS )Nr   )r   )rQ   r   r   r   r   rj   r>   r>   r?   torch_tensor_baddbmm  s    r   c                 G   s&   dd |D }t j| g|R  dS )Nc                 s   s   | ]}t j|d dV  qdS )cpurZ   N)rL   r   )r|   operandr>   r>   r?   r     r   ztorch_einsum.<locals>.<genexpr>rI   )rL   einsumre   )ZequationZoperandsZconcrete_operandsr>   r>   r?   torch_einsum  s    r   c                 G   s:   t | j}t|D ]\}}||  |9  < qtj|ddS rc   )rw   rN   	enumeraterL   rM   )rQ   sizesrN   r   r]   r>   r>   r?   torch_tensor_repeat  s    
r   )r   output_sizec                 G   s   t |}|dkr,|d ur|n
|d  g}nt|d j}| d u rb|dkrT|d } nt|g}d} |d }t|tst|dkr||   t|9  < n|d ur|n| || < tj|ddiS )Nr.   r   r   rJ   rI   )	rn   r   rw   rN   r8   rp   rL   ZnumelrM   )r   r   rq   num_argsrN   Zrepeatsr>   r>   r?   torch_repeat_interleave  s    

r   c                C   s&   t | j}t|||< tj|ddiS NrJ   rI   )rw   rN   rn   rL   rM   )rR   r   indexrj   rN   r>   r>   r?   torch_index_select  s    
r   c                 C   s   t | ||S rW   )r   rQ   r   r   r>   r>   r?   torch_tensor_index_select  s    r   )sparse_gradrj   c                C   s(   t | j}|j| ||< tj|ddiS r   )rw   rN   rL   rM   )rR   r   r   r   rj   rN   r>   r>   r?   torch_gather  s    
r   c                 C   s   t | ||S rW   )r   r   r>   r>   r?   torch_tensor_gather  s    r   c                 C   s   | S rW   r>   )rR   Zshiftsdimsr>   r>   r?   
torch_roll  s    r   c                 C   s   | S rW   r>   )rR   r   r>   r>   r?   
torch_flip  s    r   c                 C   s   | S rW   r>   )rQ   r   r>   r>   r?   torch_tensor_flip  s    r   c                 C   s   |j d }d }| j}|dkr d}|dkr2t|j }|d u rt|j }t|d|d   | jd | jd d   d | jd  d }||d< | j|d< t	j
|d	d
S )NrH   validr   r   samer   r   r.   r   rI   rZ   rN   paddingrw   mathfloorZdilationZkernel_sizeZstrideZout_channelsrL   rM   )rQ   rR   Zl_inrN   r   Zl_outr>   r>   r?   torch_nn_conv1d  s    


8
r   c                 C   s   |j dd  \}}d }| j}|dkr(d}|dkr:t|j }|d u rt|j }t|d|d   | jd | jd d   d | jd  d }t|d|d   | jd | jd d   d | jd  d }||g|dd < | j|d< t	j
|d	d
S )Nr   r   r   r   r   r   r.   rI   rZ   r   )rQ   rR   Zh_inZw_inrN   r   Zh_outZw_outr>   r>   r?   torch_nn_conv2d  s$    

88
r   c                 C   sr   t | j}|d ur>|dk r&|  | }|| dkrd|| n&g }|D ]}|dkrTqF|| qF|}tj|ddS r   )rw   rN   r   ry   r;   rL   rM   )rR   r   rN   Z	new_shapeZ	dim_valuer>   r>   r?   torch_squeeze  s    
r   c                 C   s
   t | |S rW   )r   rQ   r   r>   r>   r?   torch_tensor_squeeze  s    r   c                 C   s<   t | j}|dk r"|  d | }||d tj|ddS r   )rw   rN   r   r   rL   rM   )rR   r   rN   r>   r>   r?   torch_unsqueeze  s
    
r   c                 C   s
   t | |S rW   )r   r   r>   r>   r?   torch_tensor_unsqueeze  s    r   c                 K   sH   t jt j| ddfi |}t|t jr2|dS tt|dd S d S )Nr   rZ   rI   c                 S   s
   |  dS NrI   rd   r\   r>   r>   r?   <lambda>  r   z*torch_unique_consecutive.<locals>.<lambda>)rL   unique_consecutiveZ
zeros_liker8   r   re   tuplemap)rR   rr   outputr>   r>   r?   torch_unique_consecutive  s    
r   rH   c                 C   s.   |dk rt dt| j|g }tj|ddS )Nr   zEDon't support automatic num_classes inference for MetaTensor analysisrI   rZ   )ra   rw   rN   rL   rM   )r   Znum_classesrN   r>   r>   r?   torch_nn_functional_one_hot  s    r   r   c           	      C   s:   | j d }|j d }tjg | j d d ||R ddS )Nr   rH   rI   rZ   )rN   rL   rM   )	querykeyvalueZ	attn_maskZ	dropout_pZ	is_causalscaleZtarget_lengthhead_dimr>   r>   r?   0torch_nn_functional_scaled_dot_product_attention   s    

r   c                 C   s$   | j dkr|j}nd}tj|ddS Nnone)r.   rI   rZ   Z	reductionrN   rL   rM   rQ   rR   targetrN   r>   r>   r?   torch_nn_mseloss(  s    
r   c                 C   s$   | j dkr|j}nd}tj|ddS r   r   r   r>   r>   r?   torch_nn_crossentropyloss0  s    
r   c                 C   s$   | j dkr|j}nd}tj|ddS r   r   r   r>   r>   r?   torch_nn_bcewithlogitsloss8  s    
r   c                 C   s^   dd }t | tjrRt |tr.tt||}n||}ttj| dd|dS t| |S )Nc                 S   sH   t | tjrDtj| dd}|jtjtjtjtjfv r@|	tj
}|S | S )Nr   rZ   )r8   rL   r   Z	ones_likerK   Zfloat16float32Zfloat64Zint32re   Zint64)r}   Zconcreter>   r>   r?   to_concreteA  s    z%operator_getitem.<locals>.to_concreter   rZ   rI   )	r8   rL   r   r   r   operatorgetitemr   re   )abr   r>   r>   r?   operator_getitem@  s    
r   _MANUAL_META_OVERRIDESc                       sh   e Zd ZdZdd Zedd Zedd Z fdd	Z fd
dZ	dd Z
dd Z fddZ  ZS )HFProxyzI
    Proxy that uses metadata to handle data-dependent control-flow.
    c                 C   s
   || _ d S rW   )	_metadata)rQ   metadatar>   r>   r?   install_metadata  s    zHFProxy.install_metadatac                 C   s   | j dd| fi S )Ncall_methodr   )tracercreate_proxyrQ   r>   r>   r?   rN     s    zHFProxy.shapec                 C   s
   t | dS )NrJ   )MetaDeviceAttributer   r>   r>   r?   rJ     s    zHFProxy.devicec                    s(   t | dr| jd urt| jS t  S Nr   )hasattrr   rn   super__len__r   	__class__r>   r?   r     s    
zHFProxy.__len__c                    s$   t | dr| jd ur| jS t  S r   )r   r   r   __bool__r   r   r>   r?   r     s    zHFProxy.__bool__c                 C   s   |dkr|  |S t| |S r   )__getattribute__HFAttribute)rQ   kr>   r>   r?   __getattr__  s    
zHFProxy.__getattr__c                 C   s   | j dtj| ||fi S Ncall_function)r   r   r   setitem)rQ   indicesvaluesr>   r>   r?   __setitem__  s    zHFProxy.__setitem__c                    s*   t | dr| jd ur|| jv S t |S r   )r   r   r   __contains__)rQ   r   r   r>   r?   r    s    
zHFProxy.__contains__)__name__
__module____qualname____doc__r   propertyrN   rJ   r   r   r   r  r  __classcell__r>   r>   r   r?   r     s   

r   c                   @   s.   e Zd ZedddZedd Zdd ZdS )	r   )attrc                 C   s>   || _ || _|j| _d | _t| j dr:| t| j j| d S r   )rootr	  r   _noder   r   getattrr   )rQ   r
  r	  r>   r>   r?   __init__  s    zHFAttribute.__init__c                 C   s0   | j d u r*| jdtj| j| jfi j| _ | j S r   )r  r   r   builtinsr  r
  r	  noder   r>   r>   r?   r    s    
 zHFAttribute.nodec                 O   s   | j d| j| jf| |S )Nr   )r   r   r	  r
  )rQ   rq   rr   r>   r>   r?   __call__  s    zHFAttribute.__call__N)r  r  r  r9   r  r  r  r  r>   r>   r>   r?   r     s   	
r   c                   @   s   e Zd ZdS )r   N)r  r  r  r>   r>   r>   r?   r     s   r   c                   @   s.   e Zd ZdZee dddZedd ZdS )HFCacheProxyzP
    Proxy that represents an instance of `transformers.cache_utils.Cache`.
    orig_cache_clsc                 C   s
   || _ d S rW   )_orig_cache_cls)rQ   r  r>   r>   r?   install_orig_cache_cls  s    z#HFCacheProxy.install_orig_cache_clsc                 C   s    t | dstd| jj| j S )Nr  z?The original Cache class must be installed to the HFCacheProxy.)r   RuntimeErrorr   _CLASSES_TO_PATCHr  r   r>   r>   r?   r     s    
zHFCacheProxy.__class__N)	r  r  r  r  typer   r  r  r   r>   r>   r>   r?   r    s   r  r   r   get_attr)functionop_typeproxy_factory_fnr5   c                    s   t   fdd}|S )Nc                     s   t  s| i |S g   fdd}tjj| | tjj|| t dkr d j}dkrh}n(dksxdkrj}ntd d|j	|| |d	S | i |S d S )
Nc                    s   t | tr |  d S rW   )r8   r   r;   )r   Zfound_proxiesr>   r?   check_proxy  s    
z4create_wrapper.<locals>.wrapper.<locals>.check_proxyr   r   r   r  zop_type z not supported.r  )
r   rL   fxr  map_aggregatern   r   r  ra   r   )rq   rr   r  r   r   r  r  r  r  r?   wrapper  s    
zcreate_wrapper.<locals>.wrapper)	functoolswraps)r  r  r  r#  r>   r"  r?   create_wrapper  s    r&  c                       sL   e Zd ZdZdeeedf eeef e	e
egef  d fddZ  ZS )HFProxyableClassMetazW
    Metaclass that creates a class with its main methods wrapped to be proxyable.
    N.)namebasesattrsr  c              	      s   t  | |||} t| D ]z}t| |d }|d u r4q|dkrBd}n4|drRd }n$t|rbd}nt|rrd}nd }|d urt| |t	|||d q| S )Nr  r   __r   r  )
r   __new__dirr  
startswithinspectismethod
isfunctionsetattrr&  )clsr(  r)  r*  r  	attr_namer	  r  r   r>   r?   r,    s"    


zHFProxyableClassMeta.__new__)N)r  r  r  r  r9   r   r  rx   r   r   r   r
   r   r,  r  r>   r>   r   r?   r'    s   	 

r'  )r   r5   c                 C   s   t | d}|| fS )zo
    Wraps `target` to be proxyable. Used for tensor creators like `torch.ones`, `torch.arange` and so on.
    r   )r&  )r   r#  r>   r>   r?   gen_constructor_wrapper  s    
r5  c                 C   sH   t | trdS t | tjjrDt | tr0t| ds>td|  | jS | S )z\Returns the underlying metadata for HFProxies, and behaves like the identity for the others.rI   r   zNo metadata was found for )	r8   r   rL   r   r   r   r   r  r   )vr>   r>   r?   _proxies_to_metas%  s    
r7  )r  r5   c                    s   t td fdd}|S )N)rs   r5   c                    s*   t ttstdt| t}|  |S )NzJCannot create HFCacheProxy because there is no HFTracer currently tracing.)r8   _CURRENT_TRACERHFTracerr  r  r  )rs   Zcache_proxyr  r>   r?   cache_proxy_factory_fn1  s
    


z=create_cache_proxy_factory_fn.<locals>.cache_proxy_factory_fn)r
   r  )r  r:  r>   r  r?   create_cache_proxy_factory_fn0  s    r;  ProxyableCacher  ProxyableDynamicCacheProxyableStaticCache
      )lowhighforbidden_valuesc                 C   s2   |d u rg }t | |}||v r.t | |}q|S rW   )randomrandint)rA  rB  rC  r   r>   r>   r?   _generate_random_intM  s    rF  c                       s  e Zd ZU dZdZeed< dZeed< g dZe	e
eeeeiZe sJefneefZefdf fdd	Zd	eee ee eeejf d
ddZd/ fdd	Zdd Zeeeeef dddZ  fddZ!dd Z"e#j$e%ej&j'e(def f dddZ)d0e%ej&j'e(def f e*eeef  e*eeef  ee+d fddZ,e&j'ed d!d"Z-e&j'ed d#d$Z.e&j'ed  fd%d&Z/ej&j'eed' fd(d)Z0e1dd*d+ed,d-d.Z2  Z3S )1r9  z
    Tracer that is able to symbolically trace models from the library. To do that, it uses the HFProxy instead of the
    regular PyTorch torch.fx.Proxy.
    Tproxy_buffer_attributesallow_insert_stateless_mods)arangezerosZonesrz   Z	full_likeeyerM   r   clampZfinfoZtrilr>   c                    s   t  j||d d S )N)autowrap_modulesautowrap_functions)r   r  )rQ   rM  rN  r   r>   r?   r  t  s    zHFTracer.__init__r   )model
input_namerN   input_namesr5   c                    s  t |d|jj}|ji }d}|dv r*|d }|g tttttttttt	tt
v rtj|tjd|d< q|g ttttdv rtj|tjd|d< tj|tjd|d	< q|ttv rt|jd
r|jjdu rtd|jjdkr||jjf}	tj}
nR|jjdkr:|f}	tj}
n6|jjdkr\||jjf}	tj}
ntd|jj dtj|	|
d|d< n|g ttttttttttttdddv rtj|tjd|d< n@|g ttv rtj|tjd|d< ntd| d| dntd|v r|d }t |jdd}|du rt|jdrn|jjj }n&t|jdr|jj!j }nt" t" f}t |jdd}t#|t$j%j&s||f}|\}}tj||||tjd||< nd|v rtjg |dR tj'd||< nd |v rFtjg ||jj(R tj'd||< nXd!|v r|d }t |jd"ddur|jj)d#kr|jj*}n|jj+}t,|dkr||d$ |d% |f}n||d$ |f}tj|tj'd||< nd&|v rtj||jj-g tj'd||< nd'|v r4tj||jj.g tj'd||< njd(|v rZtj|tj'd||< nDd)|v r|\}}t"d*d+d,}tj||tj'd||< n
d-|v rd.|v r|d |d$ | g}n|}tj|tjd||< nd/|v rtj|tjd||< nd.|v rz|jj)t/vr(td0|jj) d1|jj0}|jj+|jj0 }|d |||f t1 fd2d3t2|jj3D }|||< n$||jj+g }tj|tj'd||< |S )4z4Generates dummy input for model inference recording.class_for_deserialization   )labelsstart_positionsend_positionsr   rm   rT  ZXLNetForQuestionAnsweringrU  rV  problem_typeNzCould not retrieve the problem type for the sequence classification task, please set model.config.problem_type to one of the following values: "regression", "single_label_classification", or "multi_label_classification".Z
regressionZsingle_label_classificationZmulti_label_classificationzExpected model.config.problem_type to be either: "regression", "single_label_classification", or "multi_label_classification", but "z" was provided.rD   rE   rF   z!Generating the dummy input named z for z is not supported yet.Zpixel_values
image_sizevision_configencodernum_channels   Zbbox   Zinput_featuresZinputs_embedsembedding_sizerB   r.   r   Zvisual_featsZ
visual_posinputsZinput_valuesi'  i N  rA  rB  maskpast_key_valuesZidszMSymbolic trace with past_key_values input is not supported yet for the model ze. Please open an issue or a PR in Transformers repository if you would like to see the support added.c                 3   s2   | ]*}t j t jd t j t jd fV  qdS )rm   N)rL   Zrandro   )r|   r   Zcache_shaperJ   r>   r?   r     s   z1HFTracer._generate_dummy_input.<locals>.<genexpr>)4r  r   r  rJ   r   r#   r"   r   r+   r   r   rL   rJ  longr%   r   r(   r   configrW  ra   Z
num_labelsr   r$   r*   r   r!   r'   r&   r   NotImplementedErrorrY  rX  rZ  rF  r8   collectionsabcIterablero   Zinput_feat_per_channelZ
model_typer^  Zhidden_sizern   Zvisual_feat_dimZvisual_pos_dim"_FX_SUPPORTED_MODELS_WITH_KV_CACHEZnum_attention_headsr   r   Znum_hidden_layers)rQ   rO  rP  rN   rQ  Zmodel_class_nameZinputs_dictZkv_cache_lengthr   Zlabels_shapeZlabels_dtyperX  r[  heightwidthr^  Zembedding_shaper   Z
seq_lengthZ
mask_shapeZ	num_headsr   ZpkvZshape_with_hidden_sizer>   rc  r?   _generate_dummy_inputw  s<   
	


&













zHFTracer._generate_dummy_inputNc                    sB  t  |||||||}|dkr>|| jv r>|| j|  |S || jv rXd|v rXd|d< ztjj|t	}	tjj|t	}
d}d| _
d| _|dkrt||}||	i |
}t|tjr|jdd}n|dkrt|	d j|}t||}||	i |
}n|d	krlt| d
s t|  d| j|}t|}|tv rZt| |g|	R i |
}n| j|	i |
}nV|dkr| j}|d}|D ]}t||}qt|tjr|jdd}n|}nd}|rt|tstd|| W nH ty0 } z.trtd| d| d|  W Y d }~n
d }~0 0 d| _
d| _|S )NplaceholderrJ   rI   Tr   rZ   r   r   call_moduleorig_forwardz/ does not have an attribute called orig_forwardr  .Fz"Don't support composite output yetzCould not compute metadata for z target z: ) r   r   	meta_argsr   orig_fnsrL   r   r  r!  r7  _disable_module_getattr_disable_call_moduler   r:   r8   r   re   r  r   r   AttributeErrorr
  Zget_submoduler  rp  splitr   ra   	Exception_IS_IN_DEBUG_MODEwarningswarn)rQ   kindr   rq   rr   r(  Z	type_exprr  rvZ
args_metasZkwargs_metasZshould_install_metadataZmeta_targetZmeta_outmethodmodmod_typeZattr_itrZatomsZatomer   r>   r?   r   '  sb    




2zHFTracer.create_proxyc                    s   t  ddr|S  fdd}t|tjjrH|| j |}|d urH|S  jrxt|tjrx|| j	 |}|d urx|S |S d S )Nrt  Fc                    s   |D ]x\} |u r|vrpi }dt jjv rPjs<d n fdd|d< jddi fi |}||< |   S qd S )Nr  c                    s   t |  S rW   r   )r  )attr_valrs   rQ   r>   r?   r   {  r   zLHFTracer._module_getattr.<locals>.maybe_get_proxy_for_attr.<locals>.<lambda>r  r>   )r/  	signaturer   
parametersZparam_shapes_constant)r  Zcollection_to_searchparameter_proxy_cacher   rr   Z	val_proxyr   )r  rs   r?   maybe_get_proxy_for_attrr  s    z:HFTracer._module_getattr.<locals>.maybe_get_proxy_for_attr)
r  r8   rL   r   	Parameterr
  Znamed_parametersrG  r   Znamed_buffers)rQ   r	  r  r  r  Zmaybe_parameter_proxyZmaybe_buffer_proxyr>   r   r?   _module_getattrm  s     zHFTracer._module_getattr)r	  r  r  c                 C   s   |  |||S rW   )r  )rQ   r	  r  r  r>   r>   r?   r    s    zHFTracer.getattrc                    s2   t | ddr||i |S || _t ||||S )Nru  F)r  rp  r   ro  )rQ   r   forwardrq   rr   r   r>   r?   ro    s    zHFTracer.call_modulec                 C   s
   t || S rW   )r   )rQ   r  r>   r>   r?   proxy  s    zHFTracer.proxy.)r
  c                 c   s0  dd | j D | _t | _| j D ]$\}\}}tt|| | j| q$g }t	|}t
j D ]r\}}|d ur|||ur|qb|dsqb| j D ]@\}}	|j D ],\}
}||u r|||
|f t||
|	 qqqbd V  | j D ]\}\}}tt|| qi | _t | _|D ]\}}
}t||
| qd S )Nc                 S   s   i | ]}|t tt|qS r>   )r5  r  rL   )r|   r   r>   r>   r?   
<dictcomp>  s   z.HFTracer.patch_for_tracing.<locals>.<dictcomp>Ztransformers)_TORCH_METHODS_TO_PATCHZpatched_torch_methodssetrs  itemsr2  rL   addr/  	getmodulesysmodulesr.  r  __dict__r;   )rQ   r
  r(  r#  origZpatchedZmodule_of_modelr  Zorig_clsZpatched_clsr4  r	  r   r>   r>   r?   patch_for_tracing  s4    

zHFTracer.patch_for_tracing)r
  concrete_argsdummy_inputs6complete_concrete_args_with_inputs_not_in_dummy_inputsr5   c              	      s  t t|tjjr|jn|} du r*i  dur|r|j D ]0}|j	v rPq@|j
t jju r@td|j	 dq@  fdd|j D  |j    }t }t }	||	g}
|jjttv rtddd}|
d	| durtni }|D ]Z}||v rqt|| js(t|jd
rB|| j|||
|d qtd| dqdd }t||}|j D ]2}|jt jj krr|j	|vrri |d|j	 < qr|| _!| a"| #|2 zt$ j%| d| _&W da"nda"0 W d   n1 s0    Y  | j&j'D ]}|j(dkr|j)|v r2d|_*tj+|_n\|g}t,- }|rn|.d}d||< |t/|j0 7 }q@t1| D ]}| j&2| qz|j(dkrd|_q| j&S )a  
        Traces `root` and returns the corresponding FX `torch.fx.Graph` representation. `root` can either be a
        `torch.nn.Module` instance or a Python callable. Note that after this call, `self.root` may be different from
        the `root` passed in here. For example, when a free function is passed to `trace()`, we will create a
        `torch.nn.Module` instance to use as the root and add embedded constants to.

        Args:
            root (`torch.nn.Module` or  `Callable`):
                Either a `torch.nn.Module`` or a function to be traced through. If root is not a
                [`~transformers.PreTrainedModel`], then `dummy_inputs` must be passed, otherwise tracing will fail.
            concrete_args (`dict[str, Any], *optional*):
                Concrete arguments that should not be treated as Proxies
            dummy_inputs (`dict[str, Any]`, *optional*):
                The dummy inputs needed to handle data-dependent control-flow if `root` is not a
                [`~transformers.PreTrainedModel`]. It can also be used when `root` is a
                [`~transformers.PreTrainedModel`] to specify custom dummy inputs for a subset or all the model inputs.
            complete_concrete_args_with_inputs_not_in_dummy_inputs (`bool`, *optional*, defaults to `True`):
                If `True`, and `dummy_inputs` is specified, every argument that `root` can take that is not in
                `dummy_inputs` and not in `concrete_args` will be added to `concrete_args`, otherwise does nothing.

        Returns:
            `torch.fx.Graph`:
                A FX `torch.fx.Graph` representing the semantics of the passed-in `root`.

        Nz6You need to specify a default value for the parameter rq  c                    s*   i | ]"}|j vr|j  vr|j |jqS r>   r(  r6   r|   r   r  r  r>   r?   r    s   z"HFTracer.trace.<locals>.<dictcomp>r   rS  r`  r.   )Z_deserialize_graph_moduleZ_CodeOnlyModulerQ  zCould not generate input named z8 for because root is not a transformers.PreTrainedModel.c                 S   s   t | tjr| dS | S r   )r8   rL   r   re   )r   r>   r>   r?   to_meta  s    
zHFTracer.trace.<locals>.to_meta**r  rn  r>   r   r   )3r/  r  r8   rL   r   Moduler  r  r   r(  r6   r  rM   ra   updater7   rF  r   r  r   r"   r   rx   supported_archsr  r  r.  rm  r  pytreeZtree_mapr|  VAR_KEYWORDrr  r8  r  r   tracegraphnodesopr   rq   r   rg  OrderedDictry   rw   ZusersreversedZ
erase_node)rQ   r
  r  r  r  sigparamrQ  r   Zsequence_lengthrN   Znum_choicesr_  rP  r  Zconcrete_metasr  Zto_visitZ	to_deleters   userr   r  r?   r    sv     


,


zHFTracer.trace)r  r5   c                 C   s   t dd |j D S )z
        Whether the module was instantiated with Proxies. If that is the case, such module cannot be a leaf module
        because its attributes are input-dependent.
        c                 s   s   | ]}t |tV  qd S rW   )r8   r   )r|   r	  r>   r>   r?   r   H  r   zKHFTracer._stateless_mod_instanciation_depends_on_proxies.<locals>.<genexpr>)anyr  r   )rQ   r  r>   r>   r?   /_stateless_mod_instanciation_depends_on_proxiesC  s    z8HFTracer._stateless_mod_instanciation_depends_on_proxiesc                 C   s   |  |rdS d}|jj }| d| }d}t| j|rjt| j||u rRd}qj| d| }|d7 }q0|s|| j|| |S )zb
        Helper method which tries to insert a module that was not declared as submodule.
        r2   r   r   FTr.   )r  r   r  lowerr   r
  r  Z
add_module)rQ   r  idxmod_namepathZalready_insertedr>   r>   r?   _insert_module_as_submoduleJ  s    

z$HFTracer._insert_module_as_submodulec              
      s   zt  |W S  ty~ } zX| jrftt| dkrftt| dkrf| |}|W  Y d}~S |W Y d}~n
d}~0 0 dS )ag  
        Helper method to find the qualified name of `mod` in the Module hierarchy of `root`. For example, if `root` has
        a submodule named `foo`, which has a submodule named `bar`, passing `bar` into this function will return the
        string "foo.bar".

        Args:
            mod (str): The `Module` to retrieve the qualified name for.
        r   N)	r   path_of_module	NameErrorrH  rn   rw   r  buffersr  )rQ   r  r  r  r   r>   r?   r  b  s    	.
zHFTracer.path_of_module)r   module_qualified_namer5   c                    s   |  | ot ||S rW   )r  r   is_leaf_module)rQ   r   r  r   r>   r?   r  s  s    zHFTracer.is_leaf_module)Zis_backward_compatibler   )objr5   c                 C   s$   t |d }|jjdr |jS |S )zCalled when a proxy object is has the keys() method called.
        This is what happens when ** is called on a proxy. This should return an iterator if ** is supposed to work in
        your custom tracer.
        r7   r  )r   r  r   r.  r   )rQ   r  	attributer>   r>   r?   r7   x  s    zHFTracer.keys)NNN)NNT)4r  r  r  r  rG  bool__annotations__rH  r  r   r<  r   r=  r   r>  r  r0   r   r1   r  r   r  r9   rw   rp   rx   rL   r   rm  r   r  r   r  ro  r  
contextlibcontextmanagerr   r   r  r   r  r   r   r  r  r  r  r  r   r7   r  r>   r>   r   r?   r9  V  sJ   
 1F&$'   r9  )rO  rQ  c                    s|   t | j}t t|j ksdt dkr6 d nd }d|j }td| d|  fdd|j	 D S )Nr.   r   , z(The model does not have input(s) named: z&, expected a subset of the following: c                    s    i | ]}|j  vr|j |jqS r>   r  r  r  r>   r?   r    r   z%get_concrete_args.<locals>.<dictcomp>)
r/  r  r  r  r  r7   rn   joinra   r   )rO  rQ  r  Zformatted_input_namesZformatted_allowed_input_namesr>   r  r?   get_concrete_args  s    r  r   rO  c                 C   s   | j jtv S rW   )r   r  _SUPPORTED_MODELSr  r>   r>   r?   is_model_supported  s    r  c                 C   s.   t | s*dt}td| jj d| d S )Nr  zModel z) is not supported yet, supported models: )r  r  r  rf  r   r  )rO  Zsupported_model_namesr>   r>   r?   check_if_model_is_supported  s
    
r  )rO  rQ  disable_check
tracer_clsr5   c                 C   s   |du r| j  }t|}t| |}|s0t|  d|v rPt| jddsPtd d|vrxt| jddrxtd d| j_	| }|j
| |d}tj| |}| j|_| j|_| j|_|S )a  
    Performs symbolic tracing on the model.

    Args:
        model ([`PretrainedModel`]):
            The model to trace.
        input_names (`list[str]`, *optional*):
            The names of the inputs of the traced model. If unset, model.dummy_inputs.keys() are used instead.
        disable_check (`bool`, *optional*, defaults to `False`):
            If `True`, no check is done before trying to trace the model, this is mostly usesul for debugging purposes.
        tracer_cls (`Type[HFTracer]`, *optional*, defaults to `HFTracer`):
            The tracer class to use for instantiating the tracer. If unset, `HFTracer` is used instead.

    Returns:
        `torch.fx.GraphModule`: A GraphModule constructed by recording operations seen while tracing the model.

    Example:

        ```python
        from transformers.utils.fx import symbolic_trace

        traced_model = symbolic_trace(model, input_names=["input_ids", "attention_mask", "token_type_ids"])
        ```
    Nrb  	use_cacheFz|`past_key_values` were specified as input names, but model.config.use_cache = False, this might lead to unexpected behavior.z`past_key_values` were not specified as input names, but model.config.use_cache = True. Setting model.config.use_cache = False.r  )r  r7   rw   r  r  r  re  loggerwarningr  r  rL   r   r	   r   rR  rJ   )rO  rQ  r  r  r  r   Ztraced_graphZtracedr>   r>   r?   symbolic_trace  s,    

r  )N)NNrT   FF)F)NN)NN)N)N)N)rH   )Nr   FN)N)r?  r@  N)r  rg  r  r$  r/  r   r   osrD  r  rz  typingr   r   r   r   r   rL   Ztorch.utils._pytreeutilsZ_pytreer  r   Ztorch.fxr   r	   r
   r   r   Ztorch.fx._compatibilityr   Ztorch.fx._symbolic_tracer   Ztorch.fx.proxyr   r2   r   Zcache_utilsr   r   r   Zmodeling_utilsr   r   Zmodels.autor   Zmodels.auto.modeling_autor   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Zimport_utilsr/   r0   Zpeftr1   Z
get_loggerr  r  environr:   upperry  r  r9   rw   r@   Z(_REGULAR_SUPPORTED_MODEL_NAMES_AND_TASKSrj  Z_REGULAR_SUPPORTED_MODELSitemr8   rx   extendZ_SPECIAL_SUPPORTED_MODELSr   sortedr  r  r8  rS   rV   rX   rY   r[   r^   r_   rb   rh   rk   rv   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z	EmbeddingZ
functionalZ	embeddingZ	LayerNormZ	GroupNormZLinearZreluZReLUwhereabsrI  rz   catstackr  mulr   matmulZbmmZbaddbmmr   repeatZrepeat_interleaveZrollflipZindex_selectZgatherZConv1dZConv2dZsqueezeZ	unsqueezer   Zone_hotZMSELossZCrossEntropyLossZBCEWithLogitsLossr   r   r  Zscaled_dot_product_attentionr   r   r   r  r&  r'  r5  r7  r;  r<  r=  r>  rp   rF  r9  r  r  r  r  r  r  r>   r>   r>   r?   <module>   sr  
\
 )< 

$



 



/, " 	    2

