o
    *j'&                     @   sd  d dl Z d dlmZmZmZmZmZmZ d dlZd dl	m
Z
 d dlm
  mZ d dlZd dl	mZ d dl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 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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 erd dl2m3Z3 e! Z4e#j5ej6ej7de#j5ej8ej7dG dd de&Z9dS )    N)TYPE_CHECKINGCallableListOptionalTupleUnion)CrossEntropyLoss)GenerationConfigPreTrainedTokenizerStoppingCriteriaList)LogitsProcessorList)GenerateOutput)CausalLMOutputWithPast)Models)
OutputKeys)Tasks)
get_logger   )MODELS   )	QWenModelQWenPreTrainedModel)
BatchTokensTypeHistoryTypeStopWordsLogitsProcessordecode_tokens	get_batchget_stop_words_idsmake_context	pad_batchswitchtop_k_logits)BaseStreamer)module_namec                !       s  e Zd ZdgZdgZ fddZdd Zdd Z				d3d
dZ																												d4de	e
j de	eee
j   de	e
j de	e
j de	e
j de	e
j de	e
j de	e
j de	e
j de	e
j de	e de	e de	e de	e deeef fddZedeee
j  de
jdeee
j  fddZ	 	!d5d"ed#ed$e	e d%ed&edeeef fd'd(Z														d6d)e	e
j d*e	e d+e	e d,e	e d-e	eee
jgee f  d.e	e d/e	d0 deee
jf f fd1d2Z   Z!S )7QWenForTextGenerationz"h\.\d+\.attn\.rotary_emb\.inv_freqzh\.\d+\.attn\.masked_biasc                    s   t  | t|| _tj|j|jdd| _|j	r |j
r J d|j	r-| j  | j  |j
r:| j  | j  |   d S )NF)Zbiasz,In config, bf16 and fp16 cannot both be true)super__init__r   transformernnZLinearZn_embdZ
vocab_sizelm_headZbf16Zfp16Zbfloat16ZhalfZ	post_init)selfconfig	__class__ k/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/nlp/qwen/text_generation.pyr&   ,   s   




zQWenForTextGeneration.__init__c                 C   s   | j S Nr)   )r*   r.   r.   r/   get_output_embeddings:   s   z+QWenForTextGeneration.get_output_embeddingsc                 C   s
   || _ d S r0   r1   )r*   Znew_embeddingsr.   r.   r/   set_output_embeddings=   s   
z+QWenForTextGeneration.set_output_embeddingsNc           	      K   s   | dd }|r"|d d df d}|d ur"|d d df d}| dd }| dd }|d urU|d u rU| dd }||dkd |rT|d d df d}nd }|d urd|d u rdd|i}nd|i}||| d	|||d
 |S )Ntoken_type_idsattention_maskposition_idsr   r   inputs_embeds	input_ids	use_cache)past_key_valuesr:   r7   r6   r4   )getZ	unsqueezelongZcumsumZmasked_fill_update)	r*   r9   r;   r8   kwargsr4   r6   r7   Zmodel_inputsr.   r.   r/   prepare_inputs_for_generation@   s2   
z3QWenForTextGeneration.prepare_inputs_for_generationr9   r;   r6   r4   r7   	head_maskr8   encoder_hidden_statesencoder_attention_masklabelsr:   output_attentionsoutput_hidden_statesreturn_dictreturnc                 C   s   |d ur|n| j j}| j|||||||||	||||d}|d }| |}d }|
d urZ|
|j}
|dd dd d f  }|
ddd f  }t }||d|	d|d}|sp|f|dd   }|d urn|f| S |S t
|||j|j|jdS )N)r;   r6   r4   r7   rA   r8   rB   rC   r:   rE   rF   rG   r   .r5   r   )lossZlogitsr;   hidden_states
attentions)r+   Zuse_return_dictr'   r)   todevice
contiguousr   viewsizer   r;   rJ   rK   )r*   r9   r;   r6   r4   r7   rA   r8   rB   rC   rD   r:   rE   rF   rG   Ztransformer_outputsrJ   Z	lm_logitsrI   Zshift_logitsZshift_labelsZloss_fctoutputr.   r.   r/   forwardd   sL   
zQWenForTextGeneration.forwardbeam_idxc                    s   t  fdd| D S )Nc                 3   s&    | ]}t  fd d|D V  qdS )c                 3   s$    | ]}| d  |jV  qdS )r   N)Zindex_selectrL   rM   ).0Z
past_staterS   r.   r/   	<genexpr>   s
    
zAQWenForTextGeneration._reorder_cache.<locals>.<genexpr>.<genexpr>Ntuple)rT   Z
layer_pastrU   r.   r/   rV      s    
z7QWenForTextGeneration._reorder_cache.<locals>.<genexpr>rW   )r;   rS   r.   rU   r/   _reorder_cache   s   z$QWenForTextGeneration._reorder_cacheYou are a helpful assistant.T	tokenizerqueryhistorysystemappend_historyc                 C   s   |d u rg }t ||||d| jjd\}}t| jj|}t|g| j}	| j|	|dd}
t	|
d |t
|t
|| jjdd}|rH|||f tj|tj|iS )Ni   )r]   r^   Zmax_window_sizechat_formatF)stop_words_idsZreturn_dict_in_generater   )Zraw_text_lenZcontext_lengthr`   verbose)r   generation_configr`   r   torchZtensorrL   rM   generater   lenappendr   ZRESPONSEZHISTORY)r*   r[   r\   r]   r^   r_   Zraw_textZcontext_tokensra   r9   Zoutputsresponser.   r.   r/   chat   s<   	
	zQWenForTextGeneration.chatinputsrc   logits_processorstopping_criteriaprefix_allowed_tokens_fnsynced_gpusstreamerr"   c                    s   | dd }	|	d u r|d urt|dd }	|	d u rt| jdd }	|	d ur:t|	| jjd}
|d u r5t|
g}n||
 t j||||||fd|i|S )Nra   )ra   eos_token_idro   )	popgetattrrc   r   rp   r   rg   r%   re   )r*   rj   rc   rk   rl   rm   rn   ro   r?   ra   Zstop_words_logits_processorr,   r.   r/   re      s:   
zQWenForTextGeneration.generate)NN)NNNNNNNNNNNNNN)rZ   T)NNNNNNN)"__name__
__module____qualname__Z_keys_to_ignore_on_load_missingZ"_keys_to_ignore_on_load_unexpectedr&   r2   r3   r@   r   rd   Z
LongTensorr   ZTensorZFloatTensorboolr   r   rR   staticmethodrY   r
   strr   ri   r	   r   r   r   intr   r   re   __classcell__r.   r.   r,   r/   r$   &   s    
&	


=

.	r$   ):warningstypingr   r   r   r   r   r   rd   Ztorch.nnr(   Ztorch.nn.functionalZ
functionalFZtorch.utils.checkpointr   Ztransformersr	   r
   r   Z&transformers.generation.logits_processr   Ztransformers.generation.utilsr   Ztransformers.modeling_outputsr   Zmodelscope.metainfor   Zmodelscope.outputsr   Zmodelscope.utils.constantr   Zmodelscope.utils.loggerr    r   Zbackboner   r   Zqwen_generation_utilsr   r   r   r   r   r   r   r   r    r!   Z!transformers.generation.streamersr"   loggerZregister_moduleZtext_generationZqwen_7bri   r$   r.   r.   r.   r/   <module>   s0    0