| | |
| | |
| | """ PyTorch CodeT5+ mbedding models. |
| | The implementation is based on transformers.models.t5.modeling_t5 by adding a projection layer on T5EncoderModel |
| | """ |
| |
|
| | from typing import Optional, Tuple, Union |
| | import torch |
| | from torch import nn |
| | import torch.nn.functional as F |
| | from transformers import T5EncoderModel |
| | from transformers.modeling_outputs import ( |
| | BaseModelOutput, |
| | ) |
| | from .configuration_codet5p_embedding import CodeT5pEmbeddingConfig |
| |
|
| |
|
| | class CodeT5pEmbeddingModel(T5EncoderModel): |
| | config_class = CodeT5pEmbeddingConfig |
| |
|
| | authorized_missing_keys = [ |
| | r"encoder.embed_tokens.weight", |
| | ] |
| |
|
| | def __init__(self, config: CodeT5pEmbeddingConfig): |
| | super().__init__(config) |
| | self.proj = nn.Linear(config.d_model, config.embed_dim) |
| |
|
| | def forward( |
| | self, |
| | input_ids: Optional[torch.LongTensor] = None, |
| | attention_mask: Optional[torch.FloatTensor] = None, |
| | head_mask: Optional[torch.FloatTensor] = None, |
| | inputs_embeds: Optional[torch.FloatTensor] = None, |
| | output_attentions: Optional[bool] = None, |
| | output_hidden_states: Optional[bool] = None, |
| | return_dict: Optional[bool] = None, |
| | ) -> Union[Tuple[torch.FloatTensor], BaseModelOutput]: |
| | return_dict = return_dict if return_dict is not None else self.config.use_return_dict |
| |
|
| | encoder_outputs = self.encoder( |
| | input_ids=input_ids, |
| | attention_mask=attention_mask, |
| | inputs_embeds=inputs_embeds, |
| | head_mask=head_mask, |
| | output_attentions=output_attentions, |
| | output_hidden_states=output_hidden_states, |
| | return_dict=return_dict, |
| | ) |
| |
|
| | embedding = F.normalize(self.proj(encoder_outputs.last_hidden_state[:, 0, :]), dim=-1) |
| |
|
| | return embedding |
| |
|