Partager via


Réglage des hyperparamètres avec Optuna

Optuna est une bibliothèque Python open source pour le réglage des hyperparamètres qui peut être mise à l’échelle horizontalement sur plusieurs ressources de calcul.

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

  • MlflowStorage La classe permet à Optuna d’utiliser le serveur de suivi MLflow comme serveur principal 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 runtimes, utilisez les commandes suivantes pour installer la dernière version d’Optuna et MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Exécuter l’optimisation Optuna en parallèle

Voici les étapes d’un flux de travail Optuna :

  1. Définissez une fonction objective à optimiser. Dans la fonction objective, définissez l’espace de recherche d’hyperparamètre. Pour plus d’informations, consultez la documentation Optuna.

    Voici un exemple de sélection de modèle et d’optimisation des hyperparamètres avec sckit-learn. L’exemple définit la fonction objectiveobjective et appelle la suggest_float fonction pour définir l’espace de recherche du paramètre x.

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 de suivi MLflow comme back-end de stockage.
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 paramétrage en appelant la fonction optimize de l’objet Study. MlflowSparkStudy peut lancer l'exécution d'études Optuna parallèles à l’aide d’exécuteurs PySpark.

Vous trouverez ci-dessous un exemple de la documentation Optuna.

  • Créez une étude et optimisez la objective fonction avec 8 essais (8 appels de la objective fonction avec différentes valeurs de x).
  • Obtenir les meilleurs paramètres de l’étude
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 jeu de données Iris.

Mise à l’échelle du réglage des hyperparamètres avec Optuna et MLflow

Obtenir le notebook

API d’intégration MLFlow Optuna

MlflowStorage

MlflowStorage est une classe de stockage basée sur MLflow pour Optuna avec traitement par lots afin d’éviter la limitation des API REST.

Nom du paramètre de classe Type Descriptif
experiment_id str ID d’expérience MLflow pour le stockage
name str Nom du stockage
batch_flush_interval float Durée en secondes entre les vidages automatiques des lots (valeur par défaut : 1,0)
batch_size_threshold float Nombre maximal d’éléments par lots avant de déclencher un vidage (valeur par défaut : 100)

MlflowSparkStudy

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

Nom du paramètre de classe Type Descriptif
study_name str Nom de l’étude
storage mlflow.optuna.MlflowStorage Classe de stockage basée sur MLflow
sampler samplers.BaseSampler Objet sampler qui implémente l’algorithme d’arrière-plan pour la suggestion de valeur. optuna.samplers.TPESampler est utilisé
comme valeur par défaut.
pruner float Objet d'élagage qui décide de l’arrêt anticipé des essais non concluants. optuna.pruners.MedianPruner est utilisé
comme valeur par défaut.