Поделиться через


Настройка гиперпараметров с помощью Optuna

Optuna — это библиотека Python с открытым исходным кодом для настройки гиперпараметра, которую можно масштабировать горизонтально в нескольких вычислительных ресурсах.

MLflow 3.0 предоставляет мощные новые возможности для оптимизации гиперпараметров путем интеграции с Optuna.

  • MlflowStorage класс позволяет Optuna использовать сервер отслеживания MLflow в качестве серверной части своего хранилища.
  • MlflowSparkStudy класс позволяет запускать параллельные исследования Optuna с помощью исполнителей PySpark.

Установка Optuna

MLflow 3.0 предварительно установлен в Databricks Runtime 17.0 ML и выше. В более старых средах выполнения используйте следующие команды, чтобы установить последнюю версию Optuna и MLFlow.

%pip install mlflow --upgrade
%pip install optuna

Параллельное выполнение оптимизации Optuna

Ниже приведены действия в рабочем процессе Optuna:

  1. Определите целевую функцию для оптимизации. В целевой функции определите пространство поиска гиперпараметров. Дополнительные сведения см. в документации Optuna.

    Ниже приведен пример выбора модели и настройки гиперпараметра с помощью sckit-learn. В примере определяется целевая функция objective, и вызывается функция suggest_float для определения области поиска для параметра 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. Создайте общее хранилище для распределенной оптимизации. С помощью MlflowStorage можно использовать сервер отслеживания MLflow в качестве серверной части хранилища.
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. Создайте объект Optuna Study и запустите алгоритм настройки, вызвав optimize функцию объекта Study. MlflowSparkStudy может запускать параллельные исследования Optuna с помощью исполнителей PySpark.

Ниже приведен пример из документации Optuna.

  • Создайте исследование и оптимизируйте objective функцию с 8 пробными версиями (8 вызовов objective функции с различными значениями x).
  • Получение лучших параметров исследования
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

Пример записной книжки

Этот ноутбук содержит пример использования Optuna для выбора модели scikit-learn и набора гиперпараметров для набора данных Iris.

Масштабирование настройки гиперпараметров с помощью Optuna и MLflow

Получить блокнот

API интеграции MLFlow Optuna

MlflowStorage

MlflowStorage — это класс хранилища на основе MLflow для Optuna с пакетной обработкой, чтобы избежать регулирования REST API.

Имя параметра класса Тип Описание
experiment_id str Идентификатор эксперимента MLflow для хранилища
name str Имя хранилища
batch_flush_interval float Время в секундах между автоматическими сбросами пакетов (по умолчанию: 1.0)
batch_size_threshold float Максимальное количество элементов в пакете перед активацией очистки (по умолчанию: 100)

MlflowSparkStudy

MlflowSparkStudy — это оболочка для класса ~optuna.study.Study для интеграции Optuna со Spark посредством эксперимента MLflow.

Имя параметра класса Тип Описание
study_name str Имя исследования
storage mlflow.optuna.MlflowStorage Класс хранилища на основе MLflow
sampler samplers.BaseSampler Объект sampler, реализующий фоновый алгоритм для предложения значений. optuna.samplers.TPESampler используется
значение по умолчанию.
pruner float Объект pruner, который решает раннюю остановку непроверчивых пробных версий. optuna.pruners.MedianPruner используется
значение по умолчанию.