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 워크플로의 단계는 다음과 같습니다.
최적화할 목표 함수를 정의합니다. 목표 함수 내에서 하이퍼 매개 변수 검색 공간을 정의합니다. 자세한 내용은 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
- 분산 최적화를 위한 공유 스토리지를 만듭니다. 를 사용하면
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)
- 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 가 사용됨기본값으로 지정합니다. |