Aller au contenu principal

Ajustement des hyperparamètres avec Optuna

Optuna est une bibliothèque Python open source pour l'optimisation des hyperparamètres qui peut être mise à l'échelle horizontalement sur plusieurs ressources compute.

MLflow 3.0 introduit de nouvelles capacités puissantes pour l'optimisation des hyperparamètres en s'intégrant à Optuna.

  • MlflowStorage class permet à Optuna d'utiliser le serveur MLflow Tracking comme backend de stockage.
  • MlflowSparkStudy La classe permet de lancer des études Optuna parallèles à l'aide d'exécuteurs PySpark.

Installer Optuna

MLflow 3.0 est préinstallé dans Databricks Runtime 17.0 ML et versions ultérieures. Sur les anciens environnements d'exécution, utilisez les commandes suivantes pour installer la dernière version d'Optuna et de MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Exécuter l'optimisation Optuna en parallèle

Voici les étapes d'un workflow Optuna :

  1. Définir une fonction objectif à optimiser. Dans la fonction objectif, définissez l'espace de recherche d'hyperparamètres. Pour plus de détails, consultez la documentation Optuna.

    Vous trouverez ci-dessous un exemple de sélection de modèles et d'ajustement des hyperparamètres avec sckit-learn. L'exemple définit la fonction objective objective et appelle la fonction suggest_float pour définir l'espace de recherche pour le paramètre x.

Python
import sklearn

def objective(trial):
# Invoke suggest methods of a Trial object to generate hyperparameters.
regressor_name = trial.suggest_categorical('classifier', ['SVR', 'RandomForest'])
if regressor_name == 'SVR':
svr_c = trial.suggest_float('svr_c', 1e-10, 1e10, log=True)
regressor_obj = sklearn.svm.SVR(C=svr_c)
else:
rf_max_depth = trial.suggest_int('rf_max_depth', 2, 32)
regressor_obj = sklearn.ensemble.RandomForestRegressor(max_depth=rf_max_depth)

X, y = sklearn.datasets.fetch_california_housing(return_X_y=True)
X_train, X_val, y_train, y_val = sklearn.model_selection.train_test_split(X, y, random_state=0)

regressor_obj.fit(X_train, y_train)
y_pred = regressor_obj.predict(X_val)

error = sklearn.metrics.mean_squared_error(y_val, y_pred)

return error # An objective value linked with the Trial object
  1. Créez un stockage partagé pour l’optimisation distribuée. Avec MlflowStorage, vous pouvez utiliser le serveur MLflow Tracking comme backend de stockage.
Python
import mlflow
from mlflow.optuna.storage import MlflowStorage

experiment_id = mlflow.get_experiment_by_name(dbutils.notebook.entry_point.getDbutils().notebook().getContext().notebookPath().get()).experiment_id

mlflow_storage = MlflowStorage(experiment_id=experiment_id)
  1. Créez un objet Optuna Study et exécutez l’algorithme de réglage en appelant la fonction optimize de l’objet Study. MlflowSparkStudy peut exécuter des études Optuna parallèles à l'aide d'exécuteurs PySpark.

Voici un exemple de la documentation Optuna.

  • Créez une étude, et optimisez la fonction objective avec 8 essais (8 appels de la fonction objective avec différentes valeurs de x).
  • Obtenez les meilleurs paramètres de l'étude.
Python
from mlflow.pyspark.optuna.study import MlflowSparkStudy

mlflow_study = MlflowSparkStudy(
study_name="spark-mlflow-tuning",
storage=mlflow_storage,
)

mlflow_study.optimize(objective, n_trials=8, n_jobs=4)

best_params = study.best_params

Exemple de Notebook

Ce notebook fournit un exemple d'utilisation d'Optuna pour sélectionner un modèle scikit-learn et un ensemble d'hyperparamètres pour le dataset Iris.

Mise à l'échelle de l'ajustement des hyperparamètres avec Optuna et MLflow

API d'intégration MLFlow Optuna

MlflowStorage

MlflowStorage est une classe de stockage basée sur MLflow pour Optuna avec traitement par batch pour éviter la limitation de l’API REST.

Nom du paramètre de classe

Type

Description

experiment_id

str

Identifiant de l'expérimentation MLflow pour le stockage

name

str

Nom du stockage

batch_flush_interval

float

Temps en secondes entre les vidages de batch automatiques (default : 1,0)

batch_size_threshold

float

Nombre maximal d'éléments dans le batch avant de Trigger un vidage (default : 100)

Nom du paramètre de classe

Type

Description

experiment_id

str

Identifiant de l'expérimentation MLflow pour le stockage

name

str

Nom du stockage

batch_flush_interval

float

Temps en secondes entre les vidages de batch automatiques (default : 1,0)

batch_size_threshold

float

Nombre maximal d'éléments dans le batch avant de Trigger un vidage (default : 100)

MlflowSparkStudy

MlflowSparkStudy est un wrapper de la classe ~optuna.study.Study pour incorporer Optuna avec Spark via l'expérimentation MLflow.

Nom du paramètre de classe

Type

Description

study_name

str

Nom de l'étude

storage

mlflow.optuna.MlflowStorage

Classe de stockage basée sur MLflow

sampler

samplers.BaseSampler

Un objet d'échantillonneur qui implémente un algorithme d'arrière-plan pour la suggestion de valeurs. optuna.samplers.TPESampler est utilisé default par défaut.

pruner

float

Un objet d'élagage qui décide l'arrêt précoce des essais non prometteurs. optuna.pruners.MedianPruner est utilisé default par défaut.

Nom du paramètre de classe

Type

Description

study_name

str

Nom de l'étude

storage

mlflow.optuna.MlflowStorage

Classe de stockage basée sur MLflow

sampler

samplers.BaseSampler

Un objet d'échantillonneur qui implémente un algorithme d'arrière-plan pour la suggestion de valeurs. optuna.samplers.TPESampler est utilisé default par défaut.

pruner

float

Un objet d'élagage qui décide l'arrêt précoce des essais non prometteurs. optuna.pruners.MedianPruner est utilisé default par défaut.