다음을 통해 공유


Optuna를 사용하여 하이퍼 매개 변수 튜닝

Optuna는 여러 컴퓨팅 리소스에서 수평으로 확장할 수 있는 하이퍼 매개 변수 튜닝을 위한 오픈 소스 Python 라이브러리입니다.

MLflow 3.0은 Optuna와 통합하여 하이퍼 매개 변수 최적화를 위한 강력한 새로운 기능을 도입했습니다.

  • MlflowStorage 클래스를 사용하면 Optuna가 MLflow 추적 서버를 스토리지 백 엔드로 사용할 수 있습니다.
  • MlflowSparkStudy 클래스를 사용하면 PySpark 실행기를 사용하여 병렬 Optuna 연구를 시작할 수 있습니다.

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. 분산 최적화를 위한 공유 스토리지를 만듭니다. 를 사용하면 MlflowStorageMLflow 추적 서버를 스토리지 백 엔드로 사용할 수 있습니다.
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 개체를 만들고 Study 객체의 optimize 함수를 호출하여 튜닝 알고리즘을 실행합니다. MlflowSparkStudy 는 PySpark 실행기를 사용하여 병렬 Optuna 연구 시작을 실행할 수 있습니다.

다음은 Optuna 설명서의 예입니다.

  • 스터디를 생성하고 objective 함수를 8번의 시도(x 값이 다른 상태로 objective 함수를 8회 호출)를 통해 최적화합니다.
  • 연구의 최상의 매개 변수 가져오기
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

Notebook 예제

이 노트북에서는 Optuna를 사용하여 scikit-learn 모델과 붓꽃 데이터 세트의 하이퍼 매개변수 집합을 선택하는 예를 제공합니다.

Optuna 및 MLflow를 사용하여 하이퍼 매개 변수 튜닝 확장

노트북 가져오기

MLFlow Optuna 통합 API

MlflowStorage

MlflowStorage 는 REST API 제한을 방지하기 위해 일괄 처리를 사용하는 Optuna용 MLflow 기반 스토리지 클래스입니다.

클래스 매개 변수 이름 유형 설명
experiment_id str 스토리지에 대한 MLflow 실험 ID
name str 스토리지의 이름
batch_flush_interval float 자동 일괄 처리 플러시 사이의 시간(초)(기본값: 1.0)
batch_size_threshold float 플러시를 트리거하기 전에 일괄 처리된 최대 항목 수(기본값: 100)

MlflowSparkStudy

MlflowSparkStudy는 Spark에서 Optuna를 MLflow 실험과 통합하기 위한 클래스 ~optuna.study.Study의 래퍼(wrapper)입니다.

클래스 매개 변수 이름 유형 설명
study_name str 연구 이름
storage mlflow.optuna.MlflowStorage MLflow 기반 스토리지 클래스
sampler samplers.BaseSampler 값 제안에 대한 백그라운드 알고리즘을 구현하는 샘플러 개체입니다. optuna.samplers.TPESampler 가 사용됨
기본값으로 지정합니다.
pruner float 시험에서 가능성이 없는 항목을 조기에 중지하도록 결정하는 가지치기 객체입니다. optuna.pruners.MedianPruner 가 사용됨
기본값으로 지정합니다.