o
    ߥi5                     @   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 d	lmZ d
dlmZ d
dlmZ d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)Seq2SeqLMOutput)Models)Model)
TorchModel)MODELS)TextGenerationModelOutputTokenGeneratorOutput)logger)Tasks   )PlugForConditionalGeneration)
PlugConfigzconfig.jsonzpytorch_model.binc                       s2   e Zd Z fddZdddZ	dddZ  ZS )	
PlugV2Chatc                    s\  t  j|g|R i | tj|t}t|}t|| _	tj|t
}t|dy}tj|dd}d|v r;|d }t| D ]J}	|	drN||	 qA|	drb||	 ||	dd< ||	 |	drw||	 ||	dd	< ||	 qA|	d
r||	 ||	d
d< ||	 qA| j	jj|dd}
td|
  W d    d S 1 sw   Y  d S )Nrbcpu)map_locationmodel
translatorzmodule. zbackbone.plug.bert.bert.zbert.zbackbone.plug.F)strictz| )super__init__ospathjoinCONFIG_NAMEr   from_json_filer   backboneWEIGHTS_NAMEioopentorchloadlistkeys
startswithpopreplaceplugload_state_dictprint)self	model_dirargskwargsplug_config_fileplug_configpretrained_model_pathf
checkpointkeymsg	__class__ b/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/nlp/fid_plug/text_generation.pyr      s@   








"zPlugV2Chat.__init__Nc                 O   s8   | j j|||d|d }dd |D }t|}|S )N)	input_idstoken_type_idspredictionsc                 S   s   g | ]}|d    qS )r   )tolist).0xr8   r8   r9   
<listcomp>>   s    z'PlugV2Chat.generate.<locals>.<listcomp>)r   	translater!   tensor)r+   r:   r;   r-   r.   pred_resultresponser8   r8   r9   generate8   s   
zPlugV2Chat.generatec                 O   s.   | j jd|||d|}t|d |d dS )N)srctgtr;   r   r   losslogitsr8   )r   forwardr   )r+   r:   decoder_input_idsr;   r-   r.   rI   r8   r8   r9   rK   B   s   zPlugV2Chat.forwardN)__name__
__module____qualname__r   rE   rK   __classcell__r8   r8   r6   r9   r      s
    
r   c                       s4   e Zd Z fddZdd Z			dddZ  ZS )	PlugV2EncoderWrapperc                    s   t    || _d | _d S rM   )r   r   bert
n_passages)r+   rS   r6   r8   r9   r   R   s   

zPlugV2EncoderWrapper.__init__c                 C   s
   || _ d S rM   )rT   )r+   rT   r8   r8   r9   set_n_passagesX   s   
z#PlugV2EncoderWrapper.set_n_passagesNc           
      O   s   |j \}}|| j }||| j |}|d ur ||| j |}|d ur-||| j |}| j||g|R d|i|}	t|	trV|	d || j| df|	dd   }	|	S |	j|| j| d|	_|	S )Nr;   r   r   )shaperT   viewrS   
isinstancetuplelast_hidden_state)
r+   r:   attention_maskr;   r-   r.   bsztotal_lengthpassage_lengthoutputsr8   r8   r9   rK   [   s@   



zPlugV2EncoderWrapper.forward)NNN)rN   rO   rP   r   rU   rK   rQ   r8   r8   r6   r9   rR   P   s    rR   )module_namec                       sX   e Zd Z fddZdd Zdd Z	d fdd		Z fd
dZ	d fdd	Z  Z	S )PlugV2FidChatc                    s&   t  j|g|R i | |   d S rM   )r   r   wrap_encoder)r+   r,   r-   r.   r6   r8   r9   r   }   s   zPlugV2FidChat.__init__c                 C   s   t | jjj| jj_d S rM   )rR   r   r(   rS   r+   r8   r8   r9   rc      s   zPlugV2FidChat.wrap_encoderc                 C   s   | j jjj| j j_d S rM   )r   r(   rS   rd   r8   r8   r9   unwrap_encoder   s   zPlugV2FidChat.unwrap_encoderFc                    s    |    t | |   d S rM   )re   r   r"   rc   )r+   r1   from_tfr6   r8   r9   r"      s   zPlugV2FidChat.loadc                    s   | d}| dd }|d}| jjj| ||dd}|d ur.||dd}t j|g|R d|i|}t	|dS )Nr:   r;   r   r   rV   )	sequences)
getsizer   r(   rS   rU   rX   r   rE   r   )r+   inputsr-   r.   r:   r;   rT   rD   r6   r8   r9   rE      s"   


zPlugV2FidChat.generateNc                    s   |d ur-|  dkr|d}| jjj| ||dd}|d ur-||dd}t j|g|R ||d|}t	|j
|jdS )N   r   r   rV   )rL   r;   rH   )dimri   r   r(   rS   rU   rX   r   rK   r   rI   rJ   )r+   r:   rL   r;   r-   r.   rT   seq2seq_lm_outputr6   r8   r9   rK      s(   
zPlugV2FidChat.forward)FrM   )
rN   rO   rP   r   rc   re   r"   rE   rK   rQ   r8   r8   r6   r9   rb   z   s    rb   )#r   r   r!   transformers.modeling_outputsr   modelscope.metainfor   modelscope.modelsr   modelscope.models.baser   modelscope.models.builderr   modelscope.outputsr   r   modelscope.utilsr	   loggingmodelscope.utils.constantr
   r   r   configurationr   r   r   r   nnModulerR   register_modulefid_dialoguefid_plugrb   r8   r8   r8   r9   <module>   s&   9*