malek-messaoudii commited on
Commit
d9d9974
·
1 Parent(s): 9af5350

Update training script and model files

Browse files
services/label_model_manage.py CHANGED
@@ -3,7 +3,6 @@
3
  import os
4
  import torch
5
  from transformers import AutoTokenizer, AutoModelForSequenceClassification
6
- from huggingface_hub import hf_hub_download
7
  import logging
8
 
9
  logger = logging.getLogger(__name__)
@@ -21,7 +20,7 @@ class KpaModelManager:
21
  self.model_id = None
22
 
23
  def load_model(self, model_id: str, api_key: str = None):
24
- """Load model with weights from Hugging Face repository"""
25
  if self.model_loaded:
26
  logger.info("KPA model already loaded")
27
  return
@@ -39,35 +38,20 @@ class KpaModelManager:
39
  # Prepare token for authentication if API key is provided
40
  token = api_key if api_key else None
41
 
42
- # Load base tokenizer (distilbert-base-uncased)
43
- base_model_name = "distilbert-base-uncased"
44
- logger.info(f"Loading tokenizer from {base_model_name}...")
45
- self.tokenizer = AutoTokenizer.from_pretrained(base_model_name)
46
-
47
- # Load base model architecture
48
- logger.info(f"Loading base model architecture from {base_model_name}...")
49
- self.model = AutoModelForSequenceClassification.from_pretrained(
50
- base_model_name,
51
- num_labels=2
52
  )
53
 
54
- # Download and load fine-tuned weights from Hugging Face
55
- logger.info(f"Downloading fine-tuned weights from {model_id}...")
56
- weights_path = hf_hub_download(
57
- repo_id=model_id,
58
- filename="modele_appariement_rapide.pth",
59
- token=token
60
  )
61
-
62
- logger.info(f"Loading fine-tuned weights from {weights_path}...")
63
- checkpoint = torch.load(weights_path, map_location=self.device)
64
-
65
- # Load state dict
66
- if "model_state_dict" in checkpoint:
67
- self.model.load_state_dict(checkpoint["model_state_dict"])
68
- else:
69
- self.model.load_state_dict(checkpoint)
70
-
71
  self.model.to(self.device)
72
  self.model.eval()
73
 
@@ -118,6 +102,10 @@ class KpaModelManager:
118
  raise RuntimeError(f"KPA prediction failed: {str(e)}")
119
 
120
  def get_model_info(self):
 
 
 
 
121
  return {
122
  "model_name": self.model_id,
123
  "device": str(self.device),
@@ -127,5 +115,5 @@ class KpaModelManager:
127
  }
128
 
129
 
130
-
131
- kpa_model_manager = KpaModelManager()
 
3
  import os
4
  import torch
5
  from transformers import AutoTokenizer, AutoModelForSequenceClassification
 
6
  import logging
7
 
8
  logger = logging.getLogger(__name__)
 
20
  self.model_id = None
21
 
22
  def load_model(self, model_id: str, api_key: str = None):
23
+ """Load complete model and tokenizer directly from Hugging Face"""
24
  if self.model_loaded:
25
  logger.info("KPA model already loaded")
26
  return
 
38
  # Prepare token for authentication if API key is provided
39
  token = api_key if api_key else None
40
 
41
+ # Load tokenizer and model directly from Hugging Face
42
+ logger.info("Loading tokenizer...")
43
+ self.tokenizer = AutoTokenizer.from_pretrained(
44
+ model_id,
45
+ token=token,
46
+ trust_remote_code=True
 
 
 
 
47
  )
48
 
49
+ logger.info("Loading model...")
50
+ self.model = AutoModelForSequenceClassification.from_pretrained(
51
+ model_id,
52
+ token=token,
53
+ trust_remote_code=True
 
54
  )
 
 
 
 
 
 
 
 
 
 
55
  self.model.to(self.device)
56
  self.model.eval()
57
 
 
102
  raise RuntimeError(f"KPA prediction failed: {str(e)}")
103
 
104
  def get_model_info(self):
105
+ """Get model information"""
106
+ if not self.model_loaded:
107
+ return {"loaded": False}
108
+
109
  return {
110
  "model_name": self.model_id,
111
  "device": str(self.device),
 
115
  }
116
 
117
 
118
+ # Initialize singleton instance
119
+ kpa_model_manager = KpaModelManager()
services/stance_model_manager.py CHANGED
@@ -1,4 +1,4 @@
1
- """Model manager for keypoint–argument matching model"""
2
 
3
  import os
4
  import torch
@@ -8,39 +8,34 @@ import logging
8
  logger = logging.getLogger(__name__)
9
 
10
 
11
- class KpaModelManager:
12
- """Manages loading and inference for keypoint matching model"""
13
-
14
  def __init__(self):
15
  self.model = None
16
  self.tokenizer = None
17
  self.device = None
18
  self.model_loaded = False
19
- self.max_length = 256
20
- self.model_id = None
21
-
22
  def load_model(self, model_id: str, api_key: str = None):
23
- """Load complete model and tokenizer directly from Hugging Face"""
24
  if self.model_loaded:
25
- logger.info("KPA model already loaded")
26
  return
27
-
28
  try:
29
- logger.info(f"Loading KPA model from Hugging Face: {model_id}")
30
 
31
  # Determine device
32
  self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
33
  logger.info(f"Using device: {self.device}")
34
 
35
- # Store model ID
36
- self.model_id = model_id
37
-
38
  # Prepare token for authentication if API key is provided
39
  token = api_key if api_key else None
40
 
41
- # Load tokenizer and model directly from Hugging Face
42
  logger.info("Loading tokenizer...")
43
- self.tokenizer = AutoTokenizer.from_pretrained(
44
  model_id,
45
  token=token,
46
  trust_remote_code=True
@@ -54,66 +49,53 @@ class KpaModelManager:
54
  )
55
  self.model.to(self.device)
56
  self.model.eval()
57
-
58
  self.model_loaded = True
59
- logger.info("✓ KPA model loaded successfully from Hugging Face!")
60
-
61
  except Exception as e:
62
- logger.error(f"Error loading KPA model: {str(e)}")
63
- raise RuntimeError(f"Failed to load KPA model: {str(e)}")
64
-
65
- def predict(self, argument: str, key_point: str) -> dict:
66
- """Run a prediction for (argument, key_point)"""
67
  if not self.model_loaded:
68
- raise RuntimeError("KPA model not loaded")
69
-
70
- try:
71
- # Tokenize input
72
- encoding = self.tokenizer(
73
- argument,
74
- key_point,
75
- truncation=True,
76
- padding="max_length",
77
- max_length=self.max_length,
78
- return_tensors="pt"
79
- ).to(self.device)
80
-
81
- # Forward pass
82
- with torch.no_grad():
83
- outputs = self.model(**encoding)
84
- logits = outputs.logits
85
- probabilities = torch.softmax(logits, dim=-1)
86
-
87
- predicted_class = torch.argmax(probabilities, dim=-1).item()
88
- confidence = probabilities[0][predicted_class].item()
89
-
90
- return {
91
- "prediction": predicted_class,
92
- "confidence": confidence,
93
- "label": "apparie" if predicted_class == 1 else "non_apparie",
94
- "probabilities": {
95
- "non_apparie": probabilities[0][0].item(),
96
- "apparie": probabilities[0][1].item(),
97
- },
98
- }
99
-
100
- except Exception as e:
101
- logger.error(f"Error during prediction: {str(e)}")
102
- raise RuntimeError(f"KPA prediction failed: {str(e)}")
103
 
104
- def get_model_info(self):
105
- """Get model information"""
106
- if not self.model_loaded:
107
- return {"loaded": False}
108
-
109
  return {
110
- "model_name": self.model_id,
111
- "device": str(self.device),
112
- "max_length": self.max_length,
113
- "num_labels": 2,
114
- "loaded": self.model_loaded
115
  }
116
 
117
 
118
  # Initialize singleton instance
119
- kpa_model_manager = KpaModelManager()
 
 
1
+ """Model manager for stance detection model"""
2
 
3
  import os
4
  import torch
 
8
  logger = logging.getLogger(__name__)
9
 
10
 
11
+ class StanceModelManager:
12
+ """Manages stance detection model loading and predictions"""
13
+
14
  def __init__(self):
15
  self.model = None
16
  self.tokenizer = None
17
  self.device = None
18
  self.model_loaded = False
19
+
 
 
20
  def load_model(self, model_id: str, api_key: str = None):
21
+ """Load model and tokenizer from Hugging Face"""
22
  if self.model_loaded:
23
+ logger.info("Stance model already loaded")
24
  return
25
+
26
  try:
27
+ logger.info(f"Loading stance model from Hugging Face: {model_id}")
28
 
29
  # Determine device
30
  self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
31
  logger.info(f"Using device: {self.device}")
32
 
 
 
 
33
  # Prepare token for authentication if API key is provided
34
  token = api_key if api_key else None
35
 
36
+ # Load tokenizer and model from Hugging Face
37
  logger.info("Loading tokenizer...")
38
+ self.tokenizer = AutoTokenizer.from_pretrained(
39
  model_id,
40
  token=token,
41
  trust_remote_code=True
 
49
  )
50
  self.model.to(self.device)
51
  self.model.eval()
52
+
53
  self.model_loaded = True
54
+ logger.info("✓ Stance model loaded successfully from Hugging Face!")
55
+
56
  except Exception as e:
57
+ logger.error(f"Error loading stance model: {str(e)}")
58
+ raise RuntimeError(f"Failed to load stance model: {str(e)}")
59
+
60
+ def predict(self, topic: str, argument: str) -> dict:
61
+ """Make a single stance prediction"""
62
  if not self.model_loaded:
63
+ raise RuntimeError("Stance model not loaded")
64
+
65
+ # Format input
66
+ text = f"Topic: {topic} [SEP] Argument: {argument}"
67
+
68
+ # Tokenize
69
+ inputs = self.tokenizer(
70
+ text,
71
+ return_tensors="pt",
72
+ truncation=True,
73
+ max_length=512,
74
+ padding=True
75
+ ).to(self.device)
76
+
77
+ # Predict
78
+ with torch.no_grad():
79
+ outputs = self.model(**inputs)
80
+ probabilities = torch.nn.functional.softmax(outputs.logits, dim=-1)
81
+ predicted_class = torch.argmax(probabilities, dim=-1).item()
82
+
83
+ # Extract probabilities
84
+ prob_con = probabilities[0][0].item()
85
+ prob_pro = probabilities[0][1].item()
86
+
87
+ # Determine stance
88
+ stance = "PRO" if predicted_class == 1 else "CON"
89
+ confidence = probabilities[0][predicted_class].item()
 
 
 
 
 
 
 
 
90
 
 
 
 
 
 
91
  return {
92
+ "predicted_stance": stance,
93
+ "confidence": confidence,
94
+ "probability_con": prob_con,
95
+ "probability_pro": prob_pro
 
96
  }
97
 
98
 
99
  # Initialize singleton instance
100
+ stance_model_manager = StanceModelManager()
101
+