Commit
·
ed87211
1
Parent(s):
1a758de
correction config et yaml
Browse files- src/base_trainer.py +6 -3
- src/conf/config.yaml +10 -4
- src/main.py +32 -21
- src/mlflow_integration/mlflow_decorator.py +1 -1
src/base_trainer.py
CHANGED
@@ -121,9 +121,12 @@ class BaseTrainer(ABC):
|
|
121 |
if self.config.model.params:
|
122 |
mlflow.log_params(self.config.model.params)
|
123 |
|
124 |
-
#
|
125 |
-
|
126 |
-
|
|
|
|
|
|
|
127 |
|
128 |
def _prepare_input_for_fit(
|
129 |
self, X: Union[cp.ndarray,
|
|
|
121 |
if self.config.model.params:
|
122 |
mlflow.log_params(self.config.model.params)
|
123 |
|
124 |
+
# Les paramètres pertinents du modèle (ceux utilisés pour l'initialiser, ex: C, kernel pour SVM)
|
125 |
+
# sont déjà loggués via self.config.model.params ci-dessus, qui est correctement
|
126 |
+
# peuplé grâce à l'interpolation Hydra dans config.yaml.
|
127 |
+
# Éviter de logger self.classifier.get_params() car cela est redondant et
|
128 |
+
# inclut des objets internes non sérialisables comme le handle RAFT/GPU,
|
129 |
+
# causant l'apparition de "<pylibraft.common.handle.Handle object ...>" dans les logs MLflow.
|
130 |
|
131 |
def _prepare_input_for_fit(
|
132 |
self, X: Union[cp.ndarray,
|
src/conf/config.yaml
CHANGED
@@ -1,11 +1,17 @@
|
|
1 |
-
# conf/config.yaml
|
2 |
|
3 |
defaults:
|
4 |
-
- model
|
5 |
-
|
|
|
|
|
|
|
|
|
|
|
6 |
|
7 |
model:
|
8 |
-
type: "svm"
|
|
|
9 |
|
10 |
data:
|
11 |
path: "dataset/dataset.csv"
|
|
|
1 |
+
# src/conf/config.yaml
|
2 |
|
3 |
defaults:
|
4 |
+
- model # Charge src/conf/model.yaml (qui définit la clé 'models')
|
5 |
+
# La ligne suivante utilise l'interpolation Hydra:
|
6 |
+
# 1. ${model.type} récupère la valeur de 'type' dans la section 'model' (ex: "svm")
|
7 |
+
# 2. ${models.svm} récupère le dictionnaire sous la clé 'svm' dans la section 'models' (chargée depuis model.yaml)
|
8 |
+
# 3. 'override /model/params:' place ce dictionnaire dans la clé 'params' de la section 'model'
|
9 |
+
- override /model/params: ${models.${model.type}}
|
10 |
+
- _self_ # Applique les valeurs définies dans ce fichier en dernier
|
11 |
|
12 |
model:
|
13 |
+
type: "svm" # Définit quel modèle choisir
|
14 |
+
params: {} # Cible pour l'override, sera remplacé par les params de models.svm
|
15 |
|
16 |
data:
|
17 |
path: "dataset/dataset.csv"
|
src/main.py
CHANGED
@@ -97,11 +97,17 @@ def main(cfg: DictConfig) -> None:
|
|
97 |
Args:
|
98 |
cfg: Configuration Hydra sous forme de DictConfig
|
99 |
"""
|
100 |
-
#
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
105 |
|
106 |
# Création du trainer approprié
|
107 |
trainer = get_trainer(config)
|
@@ -109,31 +115,36 @@ def main(cfg: DictConfig) -> None:
|
|
109 |
# Construction des composants (vectorizer, classifier, etc.)
|
110 |
trainer.build_components()
|
111 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
112 |
|
|
|
|
|
113 |
|
|
|
|
|
|
|
114 |
mlflow_decorator = MLflowDecorator(
|
115 |
experiment_name=config.mlflow.experiment_name,
|
116 |
tracking_uri=config.mlflow.tracking_uri
|
117 |
)
|
118 |
-
# Appliquer le décorateur aux méthodes clés
|
119 |
-
train_with_mlflow = mlflow_decorator(trainer.train)
|
120 |
-
evaluate_with_mlflow = mlflow_decorator(trainer.evaluate)
|
121 |
-
log_params_with_mlflow = mlflow_decorator(trainer.log_parameters_to_mlflow)
|
122 |
-
optimize_if_needed_with_mlflow = mlflow_decorator(trainer.optimize_if_needed)
|
123 |
-
|
124 |
-
logger.info("Vérification et lancement de l'optimisation des hyperparamètres si nécessaire (avec MLflow)...")
|
125 |
-
optimize_if_needed_with_mlflow()
|
126 |
-
|
127 |
-
logger.info("Lancement de l'entraînement avec MLflow...")
|
128 |
-
train_with_mlflow()
|
129 |
|
130 |
-
|
131 |
-
|
132 |
|
133 |
-
|
134 |
-
|
|
|
135 |
|
136 |
-
logger.info("
|
137 |
|
138 |
|
139 |
if __name__ == "__main__":
|
|
|
97 |
Args:
|
98 |
cfg: Configuration Hydra sous forme de DictConfig
|
99 |
"""
|
100 |
+
# La configuration Hydra 'cfg' est maintenant correctement structurée grâce aux defaults dans config.yaml.
|
101 |
+
# Conversion directe en configuration Pydantic.
|
102 |
+
try:
|
103 |
+
# Convertit directement cfg en dict et l'utilise pour instancier Config
|
104 |
+
config = Config(**OmegaConf.to_container(cfg, resolve=True))
|
105 |
+
except Exception as e:
|
106 |
+
logger.error(f"Erreur lors de la validation Pydantic de la configuration: {e}")
|
107 |
+
logger.error(f"Configuration après fusion Hydra: \n{OmegaConf.to_yaml(cfg)}")
|
108 |
+
raise
|
109 |
+
|
110 |
+
logger.info(f"Configuration Pydantic finale chargée: {config}")
|
111 |
|
112 |
# Création du trainer approprié
|
113 |
trainer = get_trainer(config)
|
|
|
115 |
# Construction des composants (vectorizer, classifier, etc.)
|
116 |
trainer.build_components()
|
117 |
|
118 |
+
# Définir la séquence d'opérations à exécuter dans un seul run MLflow
|
119 |
+
def run_pipeline(trainer_instance):
|
120 |
+
logger.info("Vérification et lancement de l'optimisation des hyperparamètres si nécessaire...")
|
121 |
+
trainer_instance.optimize_if_needed()
|
122 |
+
|
123 |
+
logger.info("Lancement de l'entraînement...")
|
124 |
+
trainer_instance.train()
|
125 |
+
|
126 |
+
logger.info("Lancement de l'évaluation...")
|
127 |
+
trainer_instance.evaluate()
|
128 |
|
129 |
+
logger.info("Logging des paramètres...")
|
130 |
+
trainer_instance.log_parameters_to_mlflow()
|
131 |
|
132 |
+
logger.info("Pipeline complet (optimisation, entraînement, évaluation, logging) terminé.")
|
133 |
+
|
134 |
+
# Initialiser le décorateur MLflow
|
135 |
mlflow_decorator = MLflowDecorator(
|
136 |
experiment_name=config.mlflow.experiment_name,
|
137 |
tracking_uri=config.mlflow.tracking_uri
|
138 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
|
140 |
+
# Appliquer le décorateur à la fonction pipeline complète
|
141 |
+
run_pipeline_with_mlflow = mlflow_decorator(run_pipeline)
|
142 |
|
143 |
+
# Exécuter le pipeline complet sous un seul run MLflow
|
144 |
+
logger.info("Lancement du pipeline complet avec MLflow...")
|
145 |
+
run_pipeline_with_mlflow(trainer)
|
146 |
|
147 |
+
logger.info("Pipeline MLflow terminé avec succès.")
|
148 |
|
149 |
|
150 |
if __name__ == "__main__":
|
src/mlflow_integration/mlflow_decorator.py
CHANGED
@@ -46,7 +46,7 @@ class MLflowDecorator:
|
|
46 |
"""
|
47 |
Démarre explicitement un run MLflow.
|
48 |
"""
|
49 |
-
mlflow.start_run()
|
50 |
|
51 |
def _log_params(self, params: Dict[str, Any]) -> None:
|
52 |
"""
|
|
|
46 |
"""
|
47 |
Démarre explicitement un run MLflow.
|
48 |
"""
|
49 |
+
mlflow.start_run(log_system_metrics=True)
|
50 |
|
51 |
def _log_params(self, params: Dict[str, Any]) -> None:
|
52 |
"""
|