o
    *j!                     @   s   d dl mZm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mZmZ d dlmZ d	gZejeje	jd
G dd	 d	eeZdddZdd Zdd ZdS )    )AnyDictN)PreTrainedModel)
TaskModels)MODELS)SingleBackboneTaskModelBase)
OutputKeysTextGenerationModelOutputTokenGeneratorOutput)TasksModelForTextGeneration)module_namec                       sR   e Zd Zdef fddZdeeejf f fddZddd	Z	dddZ
  ZS )r   	model_dirc                    sv   t  j|g|R i | d|v r|d | _| | j | | j | jddr9| j	
 }| j }|j|_dS dS )zinitialize the text generation model from the `model_dir` path.

        Args:
            model_dir (str): the model path.
        Zbase_model_prefixZshared_embeddingFN)super__init__Z_base_model_prefixZbuild_backboneZbackbone_cfgZ
build_headhead_cfgconfiggetZbackboneZget_input_embeddingsheadZget_output_embeddingsweight)selfr   argskwargsZinput_embeddingsZoutput_embeddings	__class__ r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/task_models/text_generation.pyr      s   


zModelForTextGeneration.__init__returnc                    s\   | tjd }t |}|d }| j|}d }|d ur(||tj< | ||}t||dS )Nr   )logitsloss)popr   ZLABELSr   forwardr   Zcompute_lossr	   )r   inputslabelsZbackbone_outputsZhidden_statesr   r   r   r   r   r!   (   s   
zModelForTextGeneration.forwardNc                 K   s   |r|d d df  d}|dd }|dd }|d ur@|d u r@| dd }||dkd |r?|d d df  d}nd }|||d||dS )Nattention_maskposition_ids   r   	use_cache)	input_idsZpast_key_valuesr(   r&   r%   )Z	unsqueezer   longcumsummasked_fill_)r   r)   Zpastr   r%   r&   r   r   r   prepare_inputs_for_generation6   s"   z4ModelForTextGeneration.prepare_inputs_for_generation      ?c              	   K   s  t |tr	|d n|}|dd| jv r| jjnd}|dd| jv r&| jjnd}|d| jj}|d}|dtj	|dg|j
d	}	|	  }
|}|
|krVtd
||d }|dkrutj|||j
d	 }tj||fdd}| jj}tj|tj|j
d}t Y t|
|D ]K}|d d d |f }| |dj}|d d dd d f }t||||| jjd}|	|k}|| |||f< ||k | @ }||B }t|}|r nqW d    n1 sw   Y  |d d d |d f }t|dS )Nr)   top_kr'   top_p        
max_lengthr   Zprompt_length)devicezcontext length too larger$   dim)Zdtyper3   )r)   )r/   r0   temperature
vocab_size)	sequences)
isinstancer   r    r   r/   r0   r2   sizetorchZtensorr3   minitem
ValueErrorZzerosr*   catZeos_token_idZuint8Zno_gradranger   sampler   r7   byteallr
   )r   r"   r6   r   tokensr/   r0   r2   Z
batch_sizelengthsZmin_prompt_lengthZmax_sequence_lengthZ
pad_lengthZpadsZtermination_idZis_generation_doneZcontext_lengthZ
tokens2user   Zlast_token_logitsZ
new_samplestartedZ
done_tokendoner   r   r   generateN   sr   


	

"
zModelForTextGeneration.generate)N)r.   )__name__
__module____qualname__strr   r   npZndarrayr!   r-   rH   __classcell__r   r   r   r   r      s
    
r1   r.   c                 C   s   | j dks	J d|dkr|dksJ dtj| dd}nQ|  } |dkr*| | |dkrM|dk || dks=J d	|rG||k sGJ d
t| | n|dkr^|dksYJ dt| | | jdd}tj	|dd
d}|rztj|d|d d}|S )a9   Sample and generate a token.
    Note: logits has the dimension [b, v] where b is the batch size
          and v is the vocabulary size.
    If vocab_size is provided, we will make sure the sample that is
    generated is in [0, vocab-size). This will avoid out of vocabulary
    generations due to padding.
       z*expected the logits to be of [b, v] shape.r'   r1   z+cannot set both greedy and top-p samplings.r$   r4   r.   z top-k is larger than logit size.z top-k is larger than vocab size.ztop-p should be in (0, 1].)Znum_samplesr   )r<   max)ndimr;   ZargmaxcloneZdiv_r:   !modify_logits_for_top_k_filtering!modify_logits_for_top_p_filteringsoftmaxZmultinomialviewclamp)r   r/   r0   r6   r7   ZsamplesZprobsr   r   r   rA      s*   


rA   c                 C   s,   | t | |d d k }| |td dS )z-Set the logits for none top-k values to -inf.r   ).r$   N-InfN)r;   Ztopkr,   float)r   r/   filter_r   r   r   rS      s   rS   c                 C   s   t j| dd\}}|jddjdd}||k}|ddddf  |ddddf< d|d< |d||}| |td	 dS )
z-Set the logits for none top-p values to -inf.T)Z
descendingr$   r4   Nr'   r   ).r   rX   )r;   sortrU   r+   rR   Zscatterr,   rY   )r   r0   Zsorted_logitsZsorted_indicesZcumulative_probsrZ   r   r   r   rT      s   (rT   )r   r1   r.   N)typingr   r   numpyrM   r;   Ztransformers.modeling_utilsr   Zmodelscope.metainfor   Zmodelscope.models.builderr   Z,modelscope.models.nlp.task_models.task_modelr   Zmodelscope.outputsr   r	   r
   Zmodelscope.utils.constantr   __all__Zregister_moduleZtext_generationr   rA   rS   rT   r   r   r   r   <module>   s$    
0