|
|
|
|
|
""" 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 |
|
|