メインコンテンツまでスキップ

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

Python
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 追跡サーバーをストレージ バックエンドとして使用できます。
Python
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 エグゼキューターを用いてOptunaの並列試験 PySpark 立ち上げて実行できます。

以下は 、Optunaのドキュメントの例です。

  • スタディを作成し、8 回の試行 (xの異なる値を持つ 8 回の objective 関数の呼び出し) で objective 関数を最適化します。
  • スタディの最適なパラメーターを取得する
Python
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によるハイパーパラメーターチューニングのスケールアップ

Open notebook in new tab

MLFlow Optuna 統合 API

mlflowストレージ

MlflowStorage は、REST APIスロットリングを回避するためのバッチ処理を備えたOptuna用のMLflowベースのストレージクラスです。

Class パラメーター名

Type

説明

experiment_id

str

ストレージのエクスペリメント ID MLflow

name

str

ストレージの名前

batch_flush_interval

float

Time in seconds between automatic batch flushes (デフォルト: 1.0)

batch_size_threshold

float

フラッシュをトリガーする前のバッチ内のアイテムの最大数 (デフォルト: 100)

Mlflowスパークスタディ

MlflowSparkStudy は、Optunaを組み込むためのクラス ~optuna.study.Study のラッパーです Spark MLflow エクスペリメント経由。

Class パラメーター名

Type

説明

study_name

str

研究の名前

storage

mlflow.optuna.MlflowStorage

MLflow ベースのストレージ クラス

sampler

samplers.BaseSampler

値の提案のためのバックグラウンド アルゴリズムを実装するサンプラー オブジェクト。optuna.samplers.TPESampler が使用されます をデフォルトとして使用します。

pruner

float

見込みのない試行の早期停止を決定する剪定ばさみオブジェクト。optuna.pruners.MedianPruner が使用されます をデフォルトとして使用します。