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

Hyperopt ハイパーパラメーターチューニングの並列化

注記

Hyperopt のオープンソース バージョンは保守されなくなりました。

16.4 LTS ML 以降の Databricks Runtime for Machine Learning には Hyperopt は含まれません。Databricks 、単一ノードの最適化にはOptuna を使用するか、非推奨のHyperopt分散ハイパーチューニング機能と同様のエクスペリエンスにはRayTune を使用することをお勧めします。 Databricks でのRayTuneの使用について詳しく学びます。

このノートブックの例では、 HyperoptとSparkTrialsを使用して、単一マシンのハイパーチューニングをDatabricksクラスターにスケールする方法を示します。 Iris データセットでscikit-learn SVM 分類器を調整するには、まず単一マシンfmin()ワークフローを構築し、それをSparkワーカー全体で並列化して、 MLflowすべてのトライアルを自動的に追跡します。

必要なパッケージをインポートし、データセットをロードします。

Python
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

from hyperopt import fmin, tpe, hp, SparkTrials, STATUS_OK, Trials

# If you are running Databricks Runtime for Machine Learning, `mlflow` is already installed and you can skip the following line.
import mlflow
Python
# Load the iris dataset from scikit-learn
iris = iris = load_iris()
X = iris.data
y = iris.target

パート 1. 単一マシンのHyperoptワークフロー

Hyperoptワークフローのステップは次のとおりです。

  1. 最小化する関数を定義する。
  2. ハイパーパラメータに関する探索空間を定義する。
  3. 検索アルゴリズムを選択してください。
  4. Hyperopt fmin()を使用してチューニングアルゴリズムを実行します。

詳細については、 Hyperoptドキュメントを参照してください。

最小化する関数を定義する

この例では、サポートベクターマシン分類器を使用します。目的は、正則化の最適値を見つけることですC

Hyperoptワークフローのコードの大部分は目的関数内にあります。 この例では、scikit-learn のサポートベクター分類器を使用しています。

クラスターが Databricks Runtime 11.3 ML を使用している場合は、サポートベクター分類器を編集して位置引数clf = SVC(C)を受け取るようにします。

Python
def objective(C):
# Create a support vector classifier model
clf = SVC(C=C)

# Use the cross-validation accuracy to compare the models' performance
accuracy = cross_val_score(clf, X, y).mean()

# Hyperopt tries to minimize the objective function. A higher accuracy value means a better model, so you must return the negative accuracy.
return {'loss': -accuracy, 'status': STATUS_OK}

ハイパーパラメータに関する探索空間を定義する

検索スペースと問題式の定義の詳細については、 Hyperoptドキュメントを参照してください。

Python
search_space = hp.lognormal('C', 0, 1.0)

検索アルゴリズムを選択してください

主な選択肢は以下の2つです。

  • hyperopt.tpe.suggest: ツリー・オブ・パーゼン推定器は、過去の結果に基づいて探索する新しいハイパーパラメータ設定を反復的かつ適応的に選択するベイジアンのアプローチです。
  • hyperopt.rand.suggestランダムサーチは、探索空間をサンプリングする非適応的なアプローチです。
Python
algo=tpe.suggest

Hyperoptを使用してチューニングアルゴリズムを実行します。 fmin()

max_evals 、テストするハイパーパラメータ空間内の最大点数、つまり適合および評価するモデルの最大数に設定します。

Python
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16)
Python
# Print the best value found for C
print("Best value found: ", argmin)

パート2:Apache SparkとMLflowを使用した分散チューニング

チューニングを分散させるには、 fmin()に引数をもう 1 つ追加します。それはSparkTrialsと呼ばれるTrialsクラスです。

SparkTrials オプションの引数を2つ取ります。

  • parallelism:同時に適合および評価するモデルの数。余裕は、利用可能なSparkタスク スロットの数です。
  • timeout: fmin()が実行できる最大時間(秒単位)。デフォルトでは、最大時間制限はありません。

この例では、コマンド 7 で定義された非常に単純な目的関数を使用しています。この場合、関数はすぐに実行され、 Sparkの起動オーバーヘッドが計算時間の大部分を占めるため、分散処理の場合の計算にはより多くの時間がかかります。 実際の問題では、目的関数はより複雑になり、 SparkTrailsを使用して計算を分散させる方が、単一マシンでのチューニングよりも高速になります。

MLflowの自動追跡はデフォルトで有効になっています。使用するには、例に示すように、 fmin()を呼び出す前にmlflow.start_run()を呼び出します。

Python
from hyperopt import SparkTrials

# To display the API documentation for the SparkTrials class, uncomment the following line.
# help(SparkTrials)
Python
spark_trials = SparkTrials()

with mlflow.start_run():
argmin = fmin(
fn=objective,
space=search_space,
algo=algo,
max_evals=16,
trials=spark_trials)
Python
# Print the best value found for C
print("Best value found: ", argmin)

ノートブックに関連付けられたMLflowエクスペリメントを表示するには、右上のノートブック コンテキスト バーにある エクスペリメント アイコンをクリックします。 そこでは、すべての実行結果を見ることができます。MLflow UI で実行を表示するには、 「エクスペリメント 実行」 の右端にあるアイコンをクリックします。

チューニングCの効果を調べるには:

  1. 結果の実行結果を選択し、 「比較」 をクリックします。
  2. 散布図のページで、X軸に C 、Y軸に losthを 選択します。

ノートブックの最後のセルでアクションを実行すると、MLflow UI に次の情報が表示されます。

Hyperopt MLflow デモ

サンプルノートブック

Hyperopt ハイパーパラメーターチューニングの並列化

ノートブックを新しいタブで開く