Spaces:
Sleeping
Sleeping
# =========================================== | |
# Fichier: utilities/cuml_pyfunc_wrapper.py | |
# =========================================== | |
from typing import Any, Dict, Optional | |
import pandas as pd | |
import numpy as np | |
import cudf | |
import cupy as cp | |
import pickle | |
import os | |
import mlflow | |
from interfaces.vectorizer import Vectorizer | |
class CuMLPyFuncWrapper(mlflow.pyfunc.PythonModel): | |
""" | |
Classe wrapper pour intégration de modèles cuML dans MLflow PyFunc, | |
permettant le chargement et l'inférence. | |
""" | |
def __init__(self, vectorizer: Vectorizer, classifier: object) -> None: | |
""" | |
Initialise le wrapper avec un vectorizer cuDF/cupy et le classifieur cuML. | |
:param vectorizer: Instance implémentant l'interface Vectorizer. | |
:param classifier: Modèle cuML déjà entraîné (ex. SVC, RandomForest, etc.). | |
""" | |
self.vectorizer: Vectorizer = vectorizer | |
self.classifier: object = classifier | |
def load_context(self, context: Dict[str, Any]) -> None: | |
""" | |
Chargé par MLflow PyFunc lors du rechargement du modèle, | |
par exemple pour initialiser l'environnement. | |
:param context: Contexte de chargement contenant d'éventuelles informations | |
sur l'environnement ou l'emplacement d'artefacts. | |
""" | |
# Charger le vectorizer depuis les artefacts | |
vectorizer_path = os.path.join(context.artifacts["vectorizer"]) | |
with open(vectorizer_path, "rb") as f: | |
self.vectorizer = pickle.load(f) | |
# Charger le classifier depuis les artefacts | |
classifier_path = os.path.join(context.artifacts["classifier"]) | |
with open(classifier_path, "rb") as f: | |
self.classifier = pickle.load(f) | |
def predict(self, context: Dict[str, Any], | |
model_input: pd.DataFrame) -> np.ndarray: | |
""" | |
Fonction de prédiction, appelée par MLflow PyFunc. | |
Convertit model_input en cudf, vectorise, puis appelle le modèle cuML. | |
:param context: Contexte d'exécution éventuel. | |
:param model_input: Données d'entrée sous forme de DataFrame pandas. | |
:return: Un vecteur numpy des prédictions. | |
""" | |
# Convertir le DataFrame pandas en DataFrame cuDF | |
cudf_input = cudf.DataFrame(model_input) | |
# Vectoriser les données d'entrée | |
X_vectorized = self.vectorizer.transform(cudf_input) | |
# Effectuer la prédiction avec le classifieur cuML | |
predictions_gpu = self.classifier.predict(X_vectorized) | |
# Convertir les prédictions GPU en array numpy pour MLflow | |
return cp.asnumpy(predictions_gpu) | |