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.
MlflowStorageclass permet à Optuna d'utiliser le serveur MLflow Tracking comme backend de stockage.MlflowSparkStudyLa 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 :
-
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
objectiveet appelle la fonctionsuggest_floatpour définir l'espace de recherche pour le paramètrex.
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
- Créez un stockage partagé pour l’optimisation distribuée. Avec
MlflowStorage, vous pouvez utiliser le serveur MLflow Tracking comme backend 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)
- Créez un objet Optuna Study et exécutez l’algorithme de réglage en appelant la fonction
optimizede l’objet Study.MlflowSparkStudypeut 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
objectiveavec 8 essais (8 appels de la fonctionobjectiveavec différentes valeurs dex). - Obtenez 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 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 |
|---|---|---|
|
| Identifiant de l'expérimentation MLflow pour le stockage |
|
| Nom du stockage |
|
| Temps en secondes entre les vidages de batch automatiques (default : 1,0) |
|
| 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 |
|---|---|---|
|
| Nom de l'étude |
|
| Classe de stockage basée sur MLflow |
|
| Un objet d'échantillonneur qui implémente un algorithme d'arrière-plan pour la suggestion de valeurs. |
|
| Un objet d'élagage qui décide l'arrêt précoce des essais non prometteurs. |