Clemylia commited on
Commit
24a8334
·
verified ·
1 Parent(s): aa0e308

Update modeling_sora.py

Browse files
Files changed (1) hide show
  1. modeling_sora.py +15 -4
modeling_sora.py CHANGED
@@ -1,6 +1,7 @@
1
  import torch
2
  import torch.nn as nn
3
  from transformers import PreTrainedModel, GenerationMixin
 
4
  from .configuration_sora import SoraConfig
5
 
6
  class SoraForSLM(PreTrainedModel, GenerationMixin):
@@ -25,29 +26,39 @@ class SoraForSLM(PreTrainedModel, GenerationMixin):
25
  self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
26
  self.post_init()
27
 
28
- # La méthode get_input_embeddings est requise par GenerationMixin
29
  def get_input_embeddings(self):
30
  return self.embeddings
31
 
32
- # La méthode set_input_embeddings est requise par GenerationMixin
33
  def set_input_embeddings(self, value):
34
  self.embeddings = value
35
 
 
 
 
 
36
  def forward(self, input_ids=None, labels=None, **kwargs):
37
  seq_length = input_ids.size(1)
38
  positions = torch.arange(seq_length, device=input_ids.device).unsqueeze(0)
39
 
 
40
  x = self.embeddings(input_ids) + self.position_embeddings(positions)
41
 
 
42
  for layer in self.layers:
43
  x = layer(x)
44
 
45
  logits = self.lm_head(x)
46
 
 
47
  loss = None
48
  if labels is not None:
49
  loss_fct = nn.CrossEntropyLoss()
50
  loss = loss_fct(logits.view(-1, self.config.vocab_size), labels.view(-1))
51
 
52
- # GenerationMixin attend un objet de type CausalLMOutput
53
- return {"loss": loss, "logits": logits} if loss is not None else {"logits": logits}
 
 
 
 
 
1
  import torch
2
  import torch.nn as nn
3
  from transformers import PreTrainedModel, GenerationMixin
4
+ from transformers.modeling_outputs import CausalLMOutput
5
  from .configuration_sora import SoraConfig
6
 
7
  class SoraForSLM(PreTrainedModel, GenerationMixin):
 
26
  self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
27
  self.post_init()
28
 
29
+ # Requis pour que GenerationMixin fonctionne
30
  def get_input_embeddings(self):
31
  return self.embeddings
32
 
 
33
  def set_input_embeddings(self, value):
34
  self.embeddings = value
35
 
36
+ def prepare_inputs_for_generation(self, input_ids, **kwargs):
37
+ # Nécessaire pour la génération en mode auto-régressif
38
+ return {"input_ids": input_ids}
39
+
40
  def forward(self, input_ids=None, labels=None, **kwargs):
41
  seq_length = input_ids.size(1)
42
  positions = torch.arange(seq_length, device=input_ids.device).unsqueeze(0)
43
 
44
+ # Embedding + Position
45
  x = self.embeddings(input_ids) + self.position_embeddings(positions)
46
 
47
+ # Passage dans les couches
48
  for layer in self.layers:
49
  x = layer(x)
50
 
51
  logits = self.lm_head(x)
52
 
53
+ # Calcul de la perte si les labels sont fournis
54
  loss = None
55
  if labels is not None:
56
  loss_fct = nn.CrossEntropyLoss()
57
  loss = loss_fct(logits.view(-1, self.config.vocab_size), labels.view(-1))
58
 
59
+ #
60
+ # Retourner un objet CausalLMOutput au lieu d'un simple dictionnaire
61
+ return CausalLMOutput(
62
+ loss=loss,
63
+ logits=logits
64
+ )