o
    *j                     @   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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	ZG d
d deZG dd dejjZe
jejejdG dd deZdS )    N)
AutoConfig)Models)
TorchModel)MODELS)T5ForConditionalGeneration)TextGenerationModelOutputTokenGeneratorOutput)Taskszpytorch_model.binc                       s2   e Zd Z fddZdefddZdd Z  ZS )T5Chatc                    s  t  j|g|R i | t|}t|| _tj|t	}t
|d}td tj|dddd  D td | j   t D ]D}|drb|dd	}||< |}|d
ry|d
ddd}||< qL|dr||dd d  }||< qLfdd D }	 fddD }
fdd D }|D ]}|= q| jjdd td| jjj d| d |	rtdd|	  |
rtdd|
  |rtdd|  W d    d S W d    d S 1 sw   Y  d S )Nrbzbefore torch.load..cpu)Zmap_locationc                 S   s   i | ]\}}| d d|qS )module. )replace).0kv r   m/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/fid_T5/text_generation.py
<dictcomp>   s    z#T5Chat.__init__.<locals>.<dictcomp>zafter torch.load..r   r   zbackbone.encoder.encoderencoderzmodule.layerlayerbackbone.   c                       g | ]}| vr|qS r   r   r   key)
state_dictr   r   
<listcomp>7   s    z#T5Chat.__init__.<locals>.<listcomp>c                    r   r   r   r   )
model_keysr   r   r   8   s    c                    s,   g | ]}|v r| j  | j kr|qS r   )shaper   )model_state_dictr   r   r   r   ;   s
    
F)strictz| Weights loaded for z from zMissing keys:
|	z
|	zUnexpected keys:
|	zMismatched keys:
|	)super__init__r   Zfrom_pretrainedr   r   ospathjoinWEIGHTS_NAMEioopenprinttorchloaditemsr   keyslist
startswithr   popindexZload_state_dict	__class____name__)self	model_dirargskwargsconfigpretrained_model_pathfZold_namenew_nameZmissing_keysZunexpected_keysZmismatched_keysr   r5   )r    r"   r   r   r%      sn   








."zT5Chat.__init__returnc                 O   sR   | j   t  | j j|g|R i |}W d    |S 1 s"w   Y  |S N)r   evalr-   no_gradgenerate)r7   	input_idsr9   r:   responser   r   r   rD   N   s   


zT5Chat.generatec                 O   s(   | d }| jj||||d|S )Nr   rE   attention_masklabels)nelongr   forward)r7   rE   decoder_input_idsr9   r:   rH   r   r   r   rL   T   s   zT5Chat.forward)r6   
__module____qualname__r%   r   rD   rL   __classcell__r   r   r?   r   r
      s    9r
   c                       s6   e Zd ZdZ fddZdd Z		d	ddZ  ZS )
EncoderWrapperzM
    Encoder Wrapper for T5 Wrapper to obtain a Fusion-in-Decoder model.
    c                    s    t    d| _|| _d | _d S )NrE   )r$   r%   Zmain_input_namer   
n_passages)r7   r   r?   r   r   r%   c   s   

zEncoderWrapper.__init__c                 C   s
   || _ d S rA   )rR   )r7   rR   r   r   r   set_n_passagesi   s   
zEncoderWrapper.set_n_passagesNc           	      O   s   |j \}}|| j }||| j |}|d ur ||| j |}| j||g|R i |}t|trG|d || j| df|dd   }|S |j|| j| d|_|S )Nr   r   )r!   rR   viewr   
isinstancetupleZlast_hidden_state)	r7   rE   rH   r9   r:   Zbsztotal_lengthZpassage_lengthZoutputsr   r   r   rL   l   s&   



zEncoderWrapper.forward)NN)r6   rN   rO   __doc__r%   rS   rL   rP   r   r   r?   r   rQ   ^   s    rQ   )module_namec                       sZ   e Zd ZdZ fddZdd Zdd Z	d fd	d
	Zdef fddZ	dd Z
  ZS )	FIDT5Chatz
    T5 model with FID(fuse-in-decoder) structure, mainly for dialogue tasks

    Parameters:
        model_dir: A path to a `directory` containing a configuration files to build model
    c                    s&   t  j|g|R i | |   d S rA   )r$   r%   wrap_encoder)r7   r8   r9   r:   r?   r   r   r%      s   zFIDT5Chat.__init__c                 C   s   t | jj| j_dS )zF
        Wrap T5 encoder to obtain a Fusion-in-Decoder model.
        N)rQ   r   r   )r7   r   r   r   r\      s   zFIDT5Chat.wrap_encoderc                 C   sH   | j jj| j _g }| j jjD ]}||j qtj|}|| j j_dS )zN
        Unwrap Fusion-in-Decoder encoder, useful to load T5 weights.
        N)r   r   blockappendmoduler-   nnZ
ModuleList)r7   r]   modr   r   r   unwrap_encoder   s   zFIDT5Chat.unwrap_encoderFc                    s    |    t | |   d S rA   )rb   r$   r.   r\   )r7   r<   Zfrom_tfr?   r   r   r.      s   zFIDT5Chat.loadr@   c                    s   | d}|d}| j  t & | jj| ||dd}t	 j
|g|R i |}W d    |S 1 s<w   Y  |S )NrE   r   r   rT   )getsizer   rB   r-   rC   r   rS   rU   r$   rD   )r7   Zinputsr9   r:   rE   rR   rF   r?   r   r   rD      s   




zFIDT5Chat.generatec                 O   s   | d }|dur-| dkr| jj|d ||dd}||dd}| jj||||d|}t	|j
|jdS )a&  
        The forward function of the model.

        Args:
           input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`
           or `(batch_size, n_passages, sequence_length)`):
            Indices of input sequence tokens in the vocabulary.
           decoder_input_ids (`torch.LongTensor` of shape `(batch_size,target_sequence_length)`, *optional*):
            Indices of decoder input sequence tokens in the vocabulary.
        Returns:
           Returns `modelscope.outputs.nlp_outputs.TextGenerationModelOutput`
        r   N   r   rT   rG   )losslogits)rJ   rK   dimr   r   rS   rd   rU   rL   r   rf   rg   )r7   rE   rM   r9   r:   rH   Zseq2seq_lm_outputr   r   r   rL      s"   zFIDT5Chat.forward)F)r6   rN   rO   rY   r%   r\   rb   r.   r   rD   rL   rP   r   r   r?   r   r[      s    r[   )r*   r&   r-   Ztransformersr   Zmodelscope.metainfor   Zmodelscope.models.baser   Zmodelscope.models.builderr   Zmodelscope.models.nlp.T5r   Zmodelscope.outputsr   r   Zmodelscope.utils.constantr	   r)   r
   r`   ModulerQ   Zregister_moduleZfid_dialogueZfid_T5r[   r   r   r   r   <module>   s   K&