Udostępnij przez


Dostrajanie hiperparametrów przy użyciu Optuna

Optuna to biblioteka języka Python typu open source umożliwiająca dostrajanie hiperparametrów, które można skalować w poziomie w wielu zasobach obliczeniowych.

MLflow 3.0 wprowadza zaawansowane nowe możliwości optymalizacji hiperparametrów dzięki integracji z optuna.

  • MlflowStorage klasa umożliwia Optunie korzystanie z serwera śledzenia MLflow jako backendu magazynu.
  • MlflowSparkStudy klasa umożliwia uruchamianie równoległych badań Optuna przy użyciu funkcji wykonawczych PySpark.

Instalowanie platformy Optuna

Środowisko MLflow 3.0 jest wstępnie zainstalowane w środowisku Databricks Runtime 17.0 ML lub nowszym. W starszych środowiskach wykonawczych użyj następujących poleceń, aby zainstalować najnowszą wersję Optuna i MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Uruchamianie optymalizacji Optuna równolegle

Poniżej przedstawiono kroki przepływu pracy Optuna:

  1. Zdefiniuj funkcję celu do optymalizacji. W ramach funkcji objective zdefiniuj przestrzeń wyszukiwania hiperparametrów. Aby uzyskać więcej informacji, zobacz dokumentację optuna.

    Poniżej przedstawiono przykład wyboru modelu i dostrajania hiperparametrów za pomocą biblioteki sckit-learn. W przykładzie zdefiniowano funkcję celu objective, oraz wywołuje funkcję suggest_float w celu zdefiniowania przestrzeni wyszukiwania dla parametru 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. Utwórz magazyn udostępniony na potrzeby optymalizacji rozproszonej. Za pomocą MlflowStorageprogramu można użyć serwera śledzenia MLflow jako zaplecza magazynu.
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. Utwórz obiekt Optuna Study i uruchom algorytm dostrajania, wywołując optimize funkcję obiektu Study. MlflowSparkStudy może uruchamiać równoległe badania Optuna przy użyciu funkcji wykonawczych PySpark.

Poniżej znajduje się przykład z dokumentacji Optuna.

  • Utwórz badanie i zoptymalizuj objective funkcję przy użyciu 8 prób (8 wywołań objective funkcji z różnymi wartościami x).
  • Uzyskiwanie najlepszych parametrów badania
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

Przykład notatnika

Ten notatnik zawiera przykład użycia Optuna do wybrania modelu scikit-learn i zestawu hiperparametrów dla zestawu danych Iris.

Zwiększanie optymalizacji hiperparametrów za pomocą Optuna i MLflow

Pobierz notatnik

Interfejs API integracji rozwiązania MLFlow Optuna

MlflowStorage

MlflowStorage jest klasą pamięci masowej opartą na MLflow dla Optuna z przetwarzaniem wsadowym, w celu uniknięcia ograniczeń interfejsu API REST.

Nazwa parametru klasy Typ Opis
experiment_id str Identyfikator eksperymentu MLflow dla przechowywania
name str Nazwa magazynu
batch_flush_interval float Czas w sekundach między automatycznymi czyszczeniami buforów wsadowych (wartość domyślna: 1.0)
batch_size_threshold float Maksymalna liczba przedmiotów w partii przed wyzwoleniem opróżnienia (wartość domyślna: 100)

MlflowSparkStudy

MlflowSparkStudy to opakowanie klasy ~optuna.study.Study dla integracji Optuna ze Spark za pomocą eksperymentu MLflow.

Nazwa parametru klasy Typ Opis
study_name str Nazwa badania
storage mlflow.optuna.MlflowStorage Klasa magazynu oparta na platformie MLflow
sampler samplers.BaseSampler Obiekt typu samplera, który implementuje algorytm działający w tle dla sugestii wartości. optuna.samplers.TPESampler jest używany
jako wartość domyślna.
pruner float Obiekt przycinający, który decyduje o wczesnym zatrzymaniu nieobiecujących eksperymentów. optuna.pruners.MedianPruner jest używany
jako wartość domyślna.