Commit
·
024f027
1
Parent(s):
65e5e42
plus de bug metrics bonnes
Browse files
src/conf/config.yaml
CHANGED
@@ -5,7 +5,7 @@ defaults:
|
|
5 |
- _self_ # Applique les valeurs définies dans ce fichier
|
6 |
|
7 |
model:
|
8 |
-
type: "
|
9 |
# Interpolation directe : Récupère les paramètres depuis la structure 'models'
|
10 |
# (chargée via 'defaults: - model') en utilisant le 'type' défini ci-dessus.
|
11 |
params: ${models.${model.type}}
|
|
|
5 |
- _self_ # Applique les valeurs définies dans ce fichier
|
6 |
|
7 |
model:
|
8 |
+
type: "bert" # Définit quel modèle choisir
|
9 |
# Interpolation directe : Récupère les paramètres depuis la structure 'models'
|
10 |
# (chargée via 'defaults: - model') en utilisant le 'type' défini ci-dessus.
|
11 |
params: ${models.${model.type}}
|
src/cuml_trainer.py
CHANGED
@@ -5,6 +5,7 @@
|
|
5 |
from abc import ABC, abstractmethod
|
6 |
from typing import Optional, Union, Tuple
|
7 |
import cupy as cp
|
|
|
8 |
from scipy.sparse import csr_matrix
|
9 |
import cudf
|
10 |
from cuml.model_selection import train_test_split
|
@@ -69,6 +70,7 @@ class CuMLTrainer(BaseTrainer, ABC):
|
|
69 |
if self.X_train_text is not None: # Évite de recharger/resplitter
|
70 |
return
|
71 |
|
|
|
72 |
data = cudf.read_csv(self.data_path)
|
73 |
|
74 |
# Identification des features
|
@@ -83,20 +85,33 @@ class CuMLTrainer(BaseTrainer, ABC):
|
|
83 |
# Ajouter les autres colonnes avec un espace comme séparateur
|
84 |
for col in feature_columns[1:]:
|
85 |
texts_concatenated = texts_concatenated.str.cat(data[col].astype(str), sep=' ')
|
86 |
-
|
|
|
87 |
labels = data[self.target_column].astype(self._get_label_dtype()).values
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
# Premier split: 80% train, 20% temp (pour val+test)
|
90 |
-
|
91 |
-
|
92 |
)
|
93 |
-
|
94 |
# Deuxième split: 50% validation, 50% test sur l'ensemble temp
|
95 |
-
|
96 |
-
|
97 |
-
X_val, X_test, y_val, y_test = train_test_split(
|
98 |
-
X_temp, y_temp, test_size=val_size, random_state=random_state, stratify=y_temp
|
99 |
)
|
|
|
|
|
|
|
|
|
|
|
100 |
|
101 |
# Stockage des résultats
|
102 |
self.X_train_text = X_train
|
|
|
5 |
from abc import ABC, abstractmethod
|
6 |
from typing import Optional, Union, Tuple
|
7 |
import cupy as cp
|
8 |
+
import numpy as np
|
9 |
from scipy.sparse import csr_matrix
|
10 |
import cudf
|
11 |
from cuml.model_selection import train_test_split
|
|
|
70 |
if self.X_train_text is not None: # Évite de recharger/resplitter
|
71 |
return
|
72 |
|
73 |
+
# Charger les données
|
74 |
data = cudf.read_csv(self.data_path)
|
75 |
|
76 |
# Identification des features
|
|
|
85 |
# Ajouter les autres colonnes avec un espace comme séparateur
|
86 |
for col in feature_columns[1:]:
|
87 |
texts_concatenated = texts_concatenated.str.cat(data[col].astype(str), sep=' ')
|
88 |
+
|
89 |
+
# Convertir les labels en format compatible avec cuML
|
90 |
labels = data[self.target_column].astype(self._get_label_dtype()).values
|
91 |
+
|
92 |
+
# Créer une copie des textes pour le stockage
|
93 |
+
texts_for_storage = texts_concatenated.copy()
|
94 |
+
|
95 |
+
# Convertir les textes en indices numériques pour le split
|
96 |
+
# Cette étape est nécessaire car cuML ne peut pas gérer directement les objets string
|
97 |
+
# Nous utilisons une représentation numérique simple pour le split uniquement
|
98 |
+
# Les textes originaux seront stockés pour la vectorisation ultérieure
|
99 |
+
indices = cp.arange(len(texts_concatenated))
|
100 |
+
|
101 |
# Premier split: 80% train, 20% temp (pour val+test)
|
102 |
+
train_indices, temp_indices, y_train, y_temp = train_test_split(
|
103 |
+
indices, labels, test_size=test_size, random_state=random_state, stratify=labels
|
104 |
)
|
105 |
+
|
106 |
# Deuxième split: 50% validation, 50% test sur l'ensemble temp
|
107 |
+
val_indices, test_indices, y_val, y_test = train_test_split(
|
108 |
+
temp_indices, y_temp, test_size=val_size, random_state=random_state, stratify=y_temp
|
|
|
|
|
109 |
)
|
110 |
+
|
111 |
+
# Récupérer les textes correspondant aux indices
|
112 |
+
X_train = texts_for_storage.iloc[train_indices.get()]
|
113 |
+
X_val = texts_for_storage.iloc[val_indices.get()]
|
114 |
+
X_test = texts_for_storage.iloc[test_indices.get()]
|
115 |
|
116 |
# Stockage des résultats
|
117 |
self.X_train_text = X_train
|
src/trainers/huggingface/huggingface_transformer_trainer.py
CHANGED
@@ -159,16 +159,28 @@ class HuggingFaceTransformerTrainer(BaseTrainer):
|
|
159 |
texts = features_df[features_df.columns[0]]
|
160 |
for col in features_df.columns[1:]:
|
161 |
texts = texts.str.cat(features_df[col], sep=' ')
|
162 |
-
|
163 |
-
#
|
164 |
-
|
165 |
-
|
166 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
167 |
)
|
168 |
-
|
169 |
-
|
170 |
-
|
|
|
171 |
)
|
|
|
|
|
|
|
|
|
|
|
172 |
|
173 |
# Fonction pour créer un dataset Hugging Face à partir de cudf.Series et cp.ndarray
|
174 |
def create_hf_dataset(text_series: cudf.Series, label_array: cp.ndarray) -> HFDataset:
|
@@ -246,18 +258,15 @@ class HuggingFaceTransformerTrainer(BaseTrainer):
|
|
246 |
params = self.config.model.params
|
247 |
return TrainingArguments(
|
248 |
output_dir=params.get("output_dir", "./results"),
|
249 |
-
num_train_epochs=params.get("epochs"),
|
250 |
-
per_device_train_batch_size=params.get("batch_size"),
|
251 |
-
per_device_eval_batch_size=params.get("batch_size"),
|
252 |
-
learning_rate=params.get("learning_rate"),
|
253 |
-
warmup_steps=params.get("warmup_steps"),
|
254 |
-
weight_decay=params.get("weight_decay"),
|
255 |
-
|
256 |
-
#
|
257 |
-
|
258 |
-
|
259 |
-
|
260 |
-
metric_for_best_model="f1", # Utiliser F1 pour déterminer le meilleur modèle (ou 'accuracy')
|
261 |
-
logging_dir=params.get("logging_dir", "./logs"), # Pour les logs TensorBoard
|
262 |
-
logging_steps=params.get("logging_steps", 10), # Fréquence des logs
|
263 |
)
|
|
|
159 |
texts = features_df[features_df.columns[0]]
|
160 |
for col in features_df.columns[1:]:
|
161 |
texts = texts.str.cat(features_df[col], sep=' ')
|
162 |
+
|
163 |
+
# Créer une copie des textes pour le stockage
|
164 |
+
texts_for_storage = texts.copy()
|
165 |
+
|
166 |
+
# Utiliser des indices numériques pour le split au lieu des textes directement
|
167 |
+
# Cette approche évite les problèmes de conversion des objets string en tableaux CUDA
|
168 |
+
indices = cp.arange(len(texts))
|
169 |
+
|
170 |
+
# Premier split: 80% train, 20% temp en utilisant les indices
|
171 |
+
train_indices, temp_indices, y_train, y_temp = train_test_split(
|
172 |
+
indices, labels, test_size=0.2, random_state=42, stratify=labels
|
173 |
)
|
174 |
+
|
175 |
+
# Deuxième split: 50% validation, 50% test sur temp
|
176 |
+
val_indices, test_indices, y_val, y_test = train_test_split(
|
177 |
+
temp_indices, y_temp, test_size=0.5, random_state=42, stratify=y_temp
|
178 |
)
|
179 |
+
|
180 |
+
# Récupérer les textes correspondant aux indices
|
181 |
+
X_train_text = texts_for_storage.iloc[train_indices.get()]
|
182 |
+
X_val_text = texts_for_storage.iloc[val_indices.get()]
|
183 |
+
X_test_text = texts_for_storage.iloc[test_indices.get()]
|
184 |
|
185 |
# Fonction pour créer un dataset Hugging Face à partir de cudf.Series et cp.ndarray
|
186 |
def create_hf_dataset(text_series: cudf.Series, label_array: cp.ndarray) -> HFDataset:
|
|
|
258 |
params = self.config.model.params
|
259 |
return TrainingArguments(
|
260 |
output_dir=params.get("output_dir", "./results"),
|
261 |
+
num_train_epochs=float(params.get("epochs", 3)),
|
262 |
+
per_device_train_batch_size=int(params.get("batch_size", 8)),
|
263 |
+
per_device_eval_batch_size=int(params.get("batch_size", 8)),
|
264 |
+
learning_rate=float(params.get("learning_rate", 5e-5)),
|
265 |
+
warmup_steps=int(params.get("warmup_steps", 0)),
|
266 |
+
weight_decay=float(params.get("weight_decay", 0.0)),
|
267 |
+
# Paramètres d'évaluation simplifiés pour compatibilité
|
268 |
+
eval_steps=100, # Évaluer tous les 100 pas
|
269 |
+
save_steps=100, # Sauvegarder tous les 100 pas
|
270 |
+
logging_dir=params.get("logging_dir", "./logs"),
|
271 |
+
logging_steps=int(params.get("logging_steps", 10))
|
|
|
|
|
|
|
272 |
)
|