o
    ߥi                     @   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)map_locationc                 S   s   i | ]\}}| d d|qS )module. )replace).0kv r   `/home/ubuntu/.local/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   from_pretrainedr   r   ospathjoinWEIGHTS_NAMEioopenprinttorchloaditemsr   keyslist
startswithr   popindexload_state_dict	__class____name__)self	model_dirargskwargsconfigpretrained_model_pathfold_namenew_namemissing_keysunexpected_keysmismatched_keysr   r8   )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)r:   	input_idsr<   r=   responser   r   r   rK   N   s   


zT5Chat.generatec                 O   s(   | d }| jj||||d|S )Nr   rL   attention_masklabels)nelongr   forward)r:   rL   decoder_input_idsr<   r=   rO   r   r   r   rS   T   s   zT5Chat.forward)r9   
__module____qualname__r&   r   rK   rS   __classcell__r   r   rF   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 )NrL   )r%   r&   main_input_namer   
n_passages)r:   r   rF   r   r   r&   c   s   

zEncoderWrapper.__init__c                 C   s
   || _ d S rH   )rZ   )r:   rZ   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"   rZ   viewr   
isinstancetuplelast_hidden_state)	r:   rL   rO   r<   r=   bsztotal_lengthpassage_lengthoutputsr   r   r   rS   l   s&   



zEncoderWrapper.forward)NN)r9   rU   rV   __doc__r&   r[   rS   rW   r   r   rF   r   rX   ^   s    rX   )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 rH   )r%   r&   wrap_encoder)r:   r;   r<   r=   rF   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)rX   r   r   )r:   r   r   r   rh      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/   nn
ModuleList)r:   ri   modr   r   r   unwrap_encoder   s   zFIDT5Chat.unwrap_encoderFc                    s    |    t | |   d S rH   )ro   r%   r0   rh   )r:   r?   from_tfrF   r   r   r0      s   zFIDT5Chat.loadrG   c                    s   | d}|d}| j  t & | jj| ||dd}t	 j
|g|R i |}W d    |S 1 s<w   Y  |S )NrL   r   r   r\   )getsizer   rI   r/   rJ   r   r[   r]   r%   rK   )r:   inputsr<   r=   rL   rZ   rM   rF   r   r   rK      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   r\   rN   )losslogits)rQ   rR   dimr   r   r[   rr   r]   rS   r   ru   rv   )r:   rL   rT   r<   r=   rO   seq2seq_lm_outputr   r   r   rS      s"   zFIDT5Chat.forward)F)r9   rU   rV   re   r&   rh   ro   r0   r   rK   rS   rW   r   r   rF   r   rg      s    rg   )r,   r(   r/   transformersr   modelscope.metainfor   modelscope.models.baser   modelscope.models.builderr   modelscope.models.nlp.T5r   modelscope.outputsr   r   modelscope.utils.constantr	   r+   r
   rl   ModulerX   register_modulefid_dialoguefid_T5rg   r   r   r   r   <module>   s   K&