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のワークフローのステップです。
-
最適化する目的関数を定義します。目的関数内で、ハイパーパラメーター探索空間を定義します。詳細については、 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
エグゼキューターを用いてOptunaの並列試験 PySpark 立ち上げて実行できます。
以下は 、Optunaのドキュメントの例です。
- スタディを作成し、8 回の試行 (
x
の異なる値を持つ 8 回のobjective
関数の呼び出し) でobjective
関数を最適化します。 - スタディの最適なパラメーターを取得する
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によるハイパーパラメーターチューニングのスケールアップ
MLFlow Optuna 統合 API
mlflowストレージ
MlflowStorage
は、REST APIスロットリングを回避するためのバッチ処理を備えたOptuna用のMLflowベースのストレージクラスです。
Class パラメーター名 | Type | 説明 |
---|---|---|
|
| ストレージのエクスペリメント ID MLflow |
|
| ストレージの名前 |
|
| Time in seconds between automatic batch flushes (デフォルト: 1.0) |
|
| フラッシュをトリガーする前のバッチ内のアイテムの最大数 (デフォルト: 100) |
Mlflowスパークスタディ
MlflowSparkStudy
は、Optunaを組み込むためのクラス ~optuna.study.Study
のラッパーです Spark
MLflow エクスペリメント経由。
Class パラメーター名 | Type | 説明 |
---|---|---|
|
| 研究の名前 |
|
| MLflow ベースのストレージ クラス |
|
| 値の提案のためのバックグラウンド アルゴリズムを実装するサンプラー オブジェクト。 |
|
| 見込みのない試行の早期停止を決定する剪定ばさみオブジェクト。 |