CoolFace
Apppublic

Aluode/PerceptionLabPortable

sourceHugging Faceupdated 9mo agoView on Hugging Face
0likes
modeling_ctrl.cpython-310.pyc306 linesDownload Raw Back to __pycache__
1o

2.�Yi�~�@sjdZddlmZmZddlZddlZddlmZddlm	Z	m3Z4mZddlm
Z
mZddlmZdd	lmZmZmZdd5lmZddlmZmZmZddlmZmZd
dlmZe� e!�Z"dd�Z#dd�Z$d'dd�Z%Gdd�dej&�Z'dd�Z(Gdd�dej&�Z)eGdd�de��Z*eGdd�de*��Z+edd �Gd!d"�d"e*e��Z,ed#d �Gd$d%�d%e*��Z-gd&�Z.dS)(zPyTorch CTRL model.�)�Optional�UnionN)�nn)�BCEWithLogitsLoss�CrossEntropyLoss�MSELoss�)�Cache�DynamicCache)�GenerationMixin)�BaseModelOutputWithPast�CausalLMOutputWithPast�SequenceClassifierOutput)�PreTrainedModel)�Conv1D� find_pruneable_heads_and_indices�prune_linear_layer)�auto_docstring�logging�)�6CTRLConfigcCs$dt�dd|d|�}||S)Nri'�)�torch�pow)�pos�i�d_model_sizeZangle_rates�r��E:\DocsHouse\542 percep lab latest\PerceptionLab\PerceptionLab_Portable\python_embed\Lib\site-packages\transformers/models/ctrl/modeling_ctrl.py�7angle_defn(srcCs�ttj|tjd��|��d�tj|tjd��|��d�|�}t�|dd�ddd�f�}t�|dd�ddd�f�}tj||gdd�}|S)N��dtyperrr�������dim)	rr�arangeZint64�to�	unsqueeze�sin�cos�cat)�positionrr!Z8angle_radsZsinesZcosines�pos_encodingrrr�positional_encoding-s�r-c
	Cs�t�||�dddd��}|jd}|t�|�}|dur7|�d�|�d�}	}9|||10|	|11�d|12�fd7}|dur?||}tj|dd�}|durN||}t�||�}||fS)	Nrrrrr"�����g���r#)r�matmul�permute�shape�np�sqrt�sizeZsoftmax)
�q�k�v�mask�attention_mask�	head_maskZ	matmul_qkZdkZscaled_attention_logits�nd�nsZattention_weights�outputrrr�scaled_dot_product_attention<s13 r>csDeZdZd�fdd�	Zdd�Zdd�Z						dd	d14�Z�ZS)
�MultiHeadAttentionNcspt���||_||_||_t||j�|_t�||�|_	t�||�|_15t�||�|_t�||�|_t
�|_dS�N)�super�__init__�	num_headsr�	layer_idx�int�depthr�Linear�Wq�Wk�Wv�dense�set�pruned_heads)�selfrrCrD��	__class__rrrBWs16zMultiHeadAttention.__init__cCs�|j|j}t|�dkrdSt||j||j�\}}t|j|�|_t|j|�|_t|j|�|_t|j	|dd�|_	|jt|�|_||j|_|j�17|�|_dS)Nrrr#)rrC�lenrrMrrHrIrJrK�union)rN�headsZattention_head_size�indexrrr�prune_headsfszMultiHeadAttention.prune_headscCs"|�|d|j|j�}|�gd��S)Nr"�rrrr)�reshaperCrFr0)rN�x�18batch_sizerrr�split_into_headswsz#MultiHeadAttention.split_into_headsFcCs�|jd}|�|�}|�|�}|�|�}|�||�}|�||�}|�||�}|dur7|�|||jd|19i�\}}t||||||�}|d�gd��}
|d}|
�	|d|j20�}|�|�}||fS)Nr�cache_positionrVrr")r1rHrIrJrZ�updaterDr>r0rWrrK)rNr7r6r5r8�21layer_pastr9r:�	use_cache�output_attentionsr[rYr=Zscaled_attentionZattnZoriginal_size_attentionrrr�forward{s22
23242526zMultiHeadAttention.forwardr@�NNNFFN)�__name__�27__module__�__qualname__rBrUrZr`�
__classcell__rrrOrr?Vs28�r?cCs"t�t�||�t��t�||��Sr@)rZ29SequentialrGZReLU)r�dffrrr�point_wise_feed_forward_network�s"rgcs4eZdZd�fdd�	Z						d	dd�Z�ZS)30�EncoderLayer皙�����?Ncsbt���t|||d�|_t||�|_tj|dd�|_tj|dd�|_	t�31|�|_t�32|�|_dS)N�rDg�����ư>��eps)
rArBr?�multi_head_attentionrg�ffnr�	LayerNorm�33layernorm1�34layernorm2�Dropout�dropout1�dropout2)rNrrCrfZraterDrOrrrB�s35zEncoderLayer.__init__Fc	Cs~|�|�}	|j|	|	|	|||||||d�36}37|38d}|�|�}||}|�|�}
|�|
�}|�|�}||}
|
f|39dd�}|S)N�r]r9r:r^r_r[rr)rprmrsrqrnrt)rNrXr8r]r9r:r^r_r[ZnormedZattn_outputsZattn_outputZout1Zout2Z40ffn_output�outputsrrrr`�s,41�42434445zEncoderLayer.forward)riNra)rbrcrdrBr`rerrrOrrh�s�rhc@s"eZdZUeed<dZdd�ZdS)�CTRLPreTrainedModel�config�transformercCs�t|tjtf�r"|jjjd|jjd�|j	dur |j	j�46�dSdSt|tj�rE|jjjd|jjd�|jdurC|jj|j�47�dSdSt|tj
�rZ|j	j�48�|jj�d�dSdS)zInitialize the weights.g)�meanZstdN��?)�49isinstancerrGr�weight�dataZnormal_rxZinitializer_range�biasZzero_�	EmbeddingZpadding_idxroZfill_)rN�modulerrr�
_init_weights�s50�51��z!CTRLPreTrainedModel._init_weightsN)rbrcrdr�__annotations__Zbase_model_prefixr�rrrrrw�s52rwcs�eZdZ�fdd�Zdd�Zdd�Zdd�Ze																								dd53ee	j54deedee	jd
ee	j55dee	j56dee	jdee	jdee
dee
dee
dee
dee	jdeee	jeffdd��Z�ZS)�	CTRLModelcs�t�����j|_�j|_t�j|jtj	�|_57t��j
�j�|_t��j�|_t��fdd�t�j�D��|_tj�j�jd�|_|��dS)Nc	s&g|]}t�j�j�j�j|d��qS)rj)rh�n_embdZn_headrfZresid_pdrop)�.0r�rxrr�58<listcomp>�s��z&CTRLModel.__init__.<locals>.<listcomp>rk)rArBr�r�n_layerZ59num_layersr-Zn_positionsr�floatr,rr��60vocab_size�wrrZ61embd_pdrop�dropoutZ62ModuleList�range�hroZlayer_norm_epsilon�	layernorm�	post_init�rNrxrOr�rrB�s63��zCTRLModel.__init__cCs|jSr@�r�)rNrrr�get_input_embeddingsszCTRLModel.get_input_embeddingscCs64||_dSr@r�)rNZnew_embeddingsrrr�set_input_embeddingss65zCTRLModel.set_input_embeddingscCs(|��D]
\}}|j|j�|�qdS)zv66        Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer}67        N)�itemsr�rmrU)rNZheads_to_prune�layerrSrrr�_prune_headss�zCTRLModel._prune_headsN�	input_ids�past_key_valuesr9�token_type_ids�position_idsr:�
inputs_embedsr^r_�output_hidden_states�return_dictr[�returnc
KsD|	dur|	n|jj}	|dur|n|jj}|68dur|69n|jj}70|dur$|n|jj}|dur4|dur4td��|durP|�||�|��}|�d|d�}|j	d}n|durb|��dd�}|j	d}ntd��|durm|j71n|j72}|r||dur|t|jd�}|r�t|t
�r�t�d�t�|�}|dur�|��nd}|dur�tj||d|tj|d�}|�d�}|dur�|dkr�td	��|�|d�}|�d73��d�}|j|jd�}d
|t�|j�j}|�||jj�}|dur�|�d|d�}|�|�}|t�|j�9}nd}|du�r|�|�}|d}t� t�!||||�d74��|�}|t�|j�9}|j"�|�|_"|j"|dd�f}|||}|�#|�}|75�rEdnd}|	�rLdnd}t$|j%�D])\}}|76�r_||f}|||||||||	|d�}|d}|	�r{||d77f7}�qS|�&|�}|78�r�||f}|�s�t
dd�||||fD��St'||||d�S)aE79        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):80            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values[0].shape[-2]`81            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.82 83            If `past_key_values` is used, only input IDs that do not have their past calculated should be passed as84            `input_ids`.85 86            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.__call__`] and87            [`PreTrainedTokenizer.encode`] for details.88 89            [What are input IDs?](../glossary#input-ids)90 91        Example:92 93        ```python94        >>> from transformers import AutoTokenizer, CTRLModel95        >>> import torch96 97        >>> tokenizer = AutoTokenizer.from_pretrained("Salesforce/ctrl")98        >>> model = CTRLModel.from_pretrained("Salesforce/ctrl")99 100        >>> # CTRL was trained with control codes as the first token101        >>> inputs = tokenizer("Opinion My dog is cute", return_tensors="pt")102        >>> assert inputs["input_ids"][0, 0].item() in tokenizer.control_codes.values()103 104        >>> outputs = model(**inputs)105 106        >>> last_hidden_states = outputs.last_hidden_state107        >>> list(last_hidden_states.shape)108        [1, 5, 1280]109        ```NzDYou cannot specify both input_ids and inputs_embeds at the same timer"rz5You have to specify either input_ids or inputs_embedsr�z�Passing a tuple of `past_key_values` is deprecated and will be removed in Transformers v4.58.0. You should pass an instance of `DynamicCache` instead, e.g. `past_key_values=DynamicCache.from_legacy_cache(past_key_values)`.)r!�devicez$batch_size has to be defined and > 0rrr r{rrucss�|]	}|dur|VqdSr@r)r�r7rrr�	<genexpr>�s��z$CTRLModel.forward.<locals>.<genexpr>)Zlast_hidden_stater��
hidden_states�110attentions)(rxr_r^r��use_return_dict�111ValueErrorZ%warn_if_padding_and_no_attention_maskr4�viewr1r�r112r|�tuple�logger�warning_onceZfrom_legacy_cache�get_seq_lengthrr%�longr'r&r!Zfinfo�minZ
get_head_maskr�r�r2r3rZtriuZonesr,r��	enumerater�r�r)rNr�r�r9r�r�r:r�r^r_r�r�r[�kwargsZinput_shaperYr��past_lengthZtoken_type_embedsZseq_lenr8Z113pos_embedsr�Zall_hidden_statesZall_attentionsrr�rvrrrr`s�1��114115116117118"119120�121�122123124��zCTRLModel.forward�NNNNNNNNNNNN)rbrcrdrBr�r�r�rrr�125LongTensorr	�FloatTensor�bool�Tensorrr�rr`rerrrOrr��sZ��������	�126���
��r�z�127    The CTRL Model transformer with a language modeling head on top (linear layer with weights tied to the input128    embeddings).129    )Zcustom_introc s�eZdZdgZ�fdd�Ze													ddeejdee	deej130deejd	eejd131eej132deej133deejd
eedeedeedeedeejde
eejeffdd��Zddd�Z�ZS)�CTRLLMHeadModelzlm_head.weightcs8t��|�t|�|_tj|j|jdd�|_|�	�dS)NT�r)134rArBr�ryrrGr�r��lm_headr�r�rOrrrB�s135zCTRLLMHeadModel.__init__Nr�r�r9r�r�r:r��labelsr^r_r�r�r[r�cKs�|dur|n|jj}|j||||||||	|136|||
d�}|d}|�|�}d}|dur8|j||fd|jji|��}|sN|f|dd�}|durL|f|S|St|||j|j|j	d�S)a137138        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):139            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values[0].shape[-2]`140            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.141 142            If `past_key_values` is used, only input IDs that do not have their past calculated should be passed as143            `input_ids`.144 145            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.__call__`] and146            [`PreTrainedTokenizer.encode`] for details.147 148            [What are input IDs?](../glossary#input-ids)149        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):150            Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set151            `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`152            are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`153 154        Example:155 156        ```python157        >>> import torch158        >>> from transformers import AutoTokenizer, CTRLLMHeadModel159 160        >>> tokenizer = AutoTokenizer.from_pretrained("Salesforce/ctrl")161        >>> model = CTRLLMHeadModel.from_pretrained("Salesforce/ctrl")162 163        >>> # CTRL was trained with control codes as the first token164        >>> inputs = tokenizer("Wikipedia The llama is", return_tensors="pt")165        >>> assert inputs["input_ids"][0, 0].item() in tokenizer.control_codes.values()166 167        >>> sequence_ids = model.generate(inputs["input_ids"])168        >>> sequences = tokenizer.batch_decode(sequence_ids)169        >>> sequences170        ['Wikipedia The llama is a member of the family Bovidae. It is native to the Andes of Peru,']171 172        >>> outputs = model(**inputs, labels=inputs["input_ids"])173        >>> round(outputs.loss.item(), 2)174        9.21175 176        >>> list(outputs.logits.shape)177        [1, 5, 246534]178        ```N)r�r9r�r�r:r�r^r_r�r�r[rr�r)�loss�logitsr�r�r�)179rxr�ryr�Z
loss_functionr�r
r�r�r�)rNr�r�r9r�r�r:r�r�r^r_r�r�r[r��transformer_outputsr�Z	lm_logitsr�r=rrrr`�sJ<�180����zCTRLLMHeadModel.forwardc181Ks�|dur#|��}|jd|kr|}n|jdd}|dd�|d�f}|||d�}|�dd�|��D]\}}	||vrGtd|�d��|	||<q3|S)Nr)r�r�r^r�z	Warning: z is not a recognized input.)r�r1�popr��print)182rNr�r�r^r�r�Zremove_prefix_lengthZmodel_inputs�key�valuerrr�prepare_inputs_for_generation-s�z-CTRLLMHeadModel.prepare_inputs_for_generation)
NNNNNNNNNNNNN�NN)rbrcrdZ_tied_weights_keysrBrrrr�r	r�r�r�rr�r
r`r�rerrrOrr��s^��������	�183���
���er�a�184    The CTRL Model transformer with a sequence classification head on top (linear layer).185    [`CTRLForSequenceClassification`] uses the last token in order to do the classification, as other causal models186    (e.g. GPT-2) do. Since it does classification on the last token, it requires to know the position of the last187    token. If a `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in188    each row. If no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot189    guess the padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last190    value in each row of the batch).191    cs�eZdZ�fdd�Ze												ddeejdeedeej	deejdeejd	eej	d192eej	deejdee193d
ee194dee195dee196deeej
effdd��Z�ZS)�CTRLForSequenceClassificationcs@t��|�|j|_t|�|_tj|j|jdd�|_|�	�dS)NFr�)197rArB�198num_labelsr�ryrrGr��199classifierr�r�rOrrrBVs200201z&CTRLForSequenceClassification.__init__Nr�r�r9r�r�r:r�r�r^r_r�r�r�c

CsJ|dur|n|jj}|j||||||||	|202||d�}
|
d}|�|�}|dur1|jdd�\}}n	|jdd�\}}|jjdurH|dkrHtd��|jjdurQd}n1|durv||jjk�|jt	j203�}t	j|jd|jt	j204d�}||�d�}nd}t
�|jj�d	��|t	j||jd205�|f}d}|du�r|jjdur�|jdkr�d|j_n|jdkr�|jt	jks�|jt	jkr�d|j_nd
|j_|jjdkr�t�}|jdkr�||��|���}n,|||�}n&|jjdkr�t�}||�d|j�|�d��}n|jjd
k�rt�}|||�}|�s|f|
dd�}|du�r|f|S|St|||
j|
jd�S)a2206        input_ids (`torch.LongTensor` of shape `(batch_size, input_ids_length)`):207            `input_ids_length` = `sequence_length` if `past_key_values` is `None` else `past_key_values[0].shape[-2]`208            (`sequence_length` of input past key value states). Indices of input sequence tokens in the vocabulary.209 210            If `past_key_values` is used, only input IDs that do not have their past calculated should be passed as211            `input_ids`.212 213            Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.__call__`] and214            [`PreTrainedTokenizer.encode`] for details.215 216            [What are input IDs?](../glossary#input-ids)217        labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):218            Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,219            config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If220            `config.num_labels > 1` a classification loss is computed (Cross-Entropy).221 222        Example of single-label classification:223 224        ```python225        >>> import torch226        >>> from transformers import AutoTokenizer, CTRLForSequenceClassification227 228        >>> tokenizer = AutoTokenizer.from_pretrained("Salesforce/ctrl")229        >>> model = CTRLForSequenceClassification.from_pretrained("Salesforce/ctrl")230 231        >>> # CTRL was trained with control codes as the first token232        >>> inputs = tokenizer("Opinion My dog is cute", return_tensors="pt")233        >>> assert inputs["input_ids"][0, 0].item() in tokenizer.control_codes.values()234 235        >>> with torch.no_grad():236        ...     logits = model(**inputs).logits237 238        >>> predicted_class_id = logits.argmax().item()239        >>> model.config.id2label[predicted_class_id]240        'LABEL_0'241        ```242 243        ```python244        >>> import torch245 246        >>> torch.manual_seed(42)  # doctest: +IGNORE_RESULT247        >>> # To train a model on `num_labels` classes, you can pass `num_labels=num_labels` to `.from_pretrained(...)`248        >>> num_labels = len(model.config.id2label)249        >>> model = CTRLForSequenceClassification.from_pretrained("Salesforce/ctrl", num_labels=num_labels)250 251        >>> labels = torch.tensor(1)252        >>> loss = model(**inputs, labels=labels).loss253        >>> round(loss.item(), 2)254        0.93255        ```256 257        Example of multi-label classification:258 259        ```python260        >>> import torch261        >>> from transformers import AutoTokenizer, CTRLForSequenceClassification262 263        >>> tokenizer = AutoTokenizer.from_pretrained("Salesforce/ctrl")264        >>> model = CTRLForSequenceClassification.from_pretrained(265        ...     "Salesforce/ctrl", problem_type="multi_label_classification"266        ... )267 268        >>> # CTRL was trained with control codes as the first token269        >>> inputs = tokenizer("Opinion My dog is cute", return_tensors="pt")270        >>> assert inputs["input_ids"][0, 0].item() in tokenizer.control_codes.values()271 272        >>> with torch.no_grad():273        ...     logits = model(**inputs).logits274 275        >>> predicted_class_id = logits.argmax().item()276        >>> model.config.id2label[predicted_class_id]277        'LABEL_0'278        ```279 280        ```python281        >>> # To train a model on `num_labels` classes, you can pass `num_labels=num_labels` to `.from_pretrained(...)`282        >>> num_labels = len(model.config.id2label)283        >>> model = CTRLForSequenceClassification.from_pretrained("Salesforce/ctrl", num_labels=num_labels)284 285        >>> num_labels = len(model.config.id2label)286        >>> labels = torch.nn.functional.one_hot(torch.tensor([predicted_class_id]), num_classes=num_labels).to(287        ...     torch.float288        ... )289        >>> loss = model(**inputs, labels=labels).loss290        >>> loss.backward()  # doctest: +IGNORE_RESULT291        ```N)292r�r9r�r�r:r�r^r_r�r�rrrz=Cannot handle batch sizes > 1 if no padding token is defined.r")r�r!z� will not detect padding tokens in `inputs_embeds`. Results may be unexpected if using padding tokens in conjunction with `inputs_embeds.`)r�Z293regressionZsingle_label_classificationZmulti_label_classification)r�r�r�r�)rxr�ryr�r1Zpad_token_idr�r&r�rZint32r%Zargmaxr�r�rPrbZproblem_typer�r!r�rErZsqueezerr�rrr�r�)rNr�r�r9r�r�r:r�r�r^r_r�r�r�r�r�rYZsequence_lengthZlast_non_pad_tokenZnon_pad_maskZ
token_indicesZ
pooled_logitsr�Zloss_fctr=rrrr`_sxh�294�295296297"298299300�z%CTRLForSequenceClassification.forwardr�)rbrcrdrBrrrr�r	r�r�rr�r�rr`rerrrOrr�JsT	��������	�301���
��r�)r�r�r�rwr�)/�__doc__�typingrr�numpyr2rrZtorch.nnrrrZcache_utilsr	r302Z303generationrZmodeling_outputsrr
rZmodeling_utilsrZ
pytorch_utilsrrr�utilsrrZconfiguration_ctrlrZ304get_loggerrbr�rr-r>�Moduler?rgrhrwr�r�r��__all__rrrr�<module>sH305306G2M��?