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

Hyperopt の概念

注記

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

Hyperopt は、次のメジャー DBR ML バージョンで削除されます。 Databricks、単一ノードの最適化にはOptunaを使用するか、非推奨の分散ハイパーパラメーターチューニング機能と同様のエクスペリエンスのためにRayTuneHyperoptを使用することをお勧めします。Databricks での RayTune の使用の詳細については、こちらをご覧ください。

この記事では、分散 Hyperopt を使用するために知っておく必要があるいくつかの概念について説明します。

このセクションの内容:

Databricks で Hyperopt を使用する方法を示す例については、「 Hyperopt」を参照してください。

fmin()

Hyperopt の実行を実行するには、 fmin() を使用します。 fmin()の引数を表に示します。詳細については 、 Hyperopt のドキュメント を参照してください。 各引数の使用方法の例については 、ノートブックの例を参照してください。

引数名

説明

fn

目的関数。 Hyperopt は、space 引数で指定されたハイパーパラメーター空間から生成された値を使用して、この関数を呼び出します。 この関数は、損失をスカラー値として、またはディクショナリで返すことができます (詳細については、 Hyperopt のドキュメント を参照してください)。 通常、この関数には、モデルのトレーニングと損失計算のコードが含まれています。

space

検索するハイパーパラメータ空間を定義します。 Hyperopt では、この空間の定義方法に大きな柔軟性があります。 アルゴリズムなどのカテゴリ別オプション、または一様や対数などの数値の確率的分布を選択できます。

algo

ハイパーパラメータ空間の検索に使用する Hyperopt 検索アルゴリズム。 最も一般的に使用されるのは、ランダム検索の hyperopt.rand.suggest とTPEの hyperopt.tpe.suggest です。

max_evals

試すハイパーパラメータ設定の数(適合するモデルの数)。

max_queue_len

Hyperopt が事前に生成する必要があるハイパーパラメーター設定の数。 Hyperopt TPE 生成アルゴリズムには時間がかかる場合があるため、これをデフォルト値の 1 より大きくすると便利ですが、通常は SparkTrials 設定 の parallelismより大きくはなりません。

trials

TrialsまたはSparkTrialsオブジェクト。目的関数で scikit-learn メソッドなどの単一マシン アルゴリズムを呼び出す場合は、 SparkTrials を使用します。 Trials は、目的関数で MLlib メソッドや Horovod などの分散トレーニング アルゴリズムを呼び出す場合に使用します。

early_stop_fn

max_evalsに達する前に停止する必要があるかどうかを判断するためのオプションの早期停止関数fmin。デフォルトは Noneです。 関数の入力シグネチャは Trials, *args で、出力シグネチャは bool, *argsです。 出力ブール値は、停止するかどうかを示します。 *args は、 early_stop_fn への呼び出しの出力が次の呼び出しへの入力として機能する任意の状態です。 TrialsSparkTrials オブジェクトにすることができます。 SparkTrialsを使用する場合、早期停止関数は試行のたびに実行されるとは限らず、代わりにポーリングされます。早期停止機能の例

SparkTrialsクラス

SparkTrials は、Databricks によって開発された API であり、Hyperopt コードに他の変更を加えずに Hyperopt 実行を配布できます。 SparkTrials は、試用版を Spark ワーカーに配布することで、単一マシンのチューニングを高速化します。

注記

SparkTrials は、scikit-learn などの単一マシンの ML モデルの計算を並列化するように設計されています。 MLlib や Horovod などの分散 ML アルゴリズムで作成されたモデルの場合は、 SparkTrialsを使用しないでください。 この場合、モデル構築プロセスはクラスターで自動的に並列化されるため、デフォルト Hyperopt クラス Trialsを使用する必要があります。

このセクションでは、SparkTrials に渡す引数の設定方法と SparkTrials の実装について説明します。

引数

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

  • parallelism: 同時に評価する試行の最大数。 数値が大きいほど、より多くのハイパーパラメータ設定のテストをスケールアウトできます。 Hyperopt は過去の結果に基づいて新しい試行を提案するため、並列処理と適応性の間にはトレードオフがあります。 固定 max_evalsの場合、並列処理が大きいほど計算が高速化されますが、並列処理を低くすると、各反復処理でより多くの過去の結果にアクセスできるため、より良い結果が得られる可能性があります。

    デフォルト: Number of Spark エグゼキューター available 最大値: 128。 値がクラスター構成で許可されている並列タスクの数より大きい場合、 SparkTrials は並列処理をこの値に減らします。

  • timeout: fmin() 通話にかかる時間の最大秒数。 この数を超えると、すべての実行が終了し、 fmin() が終了します。 完了した実行に関する情報が保存されます。

実装

fmin()に渡される目的関数を定義するときfn、およびクラスター設定を選択するときは、SparkTrials がチューニング タスクをどのように分散するかを理解しておくと役立ちます。

Hyperopt では、試行は通常、ハイパーパラメーターの 1 つの設定に 1 つのモデルを適合することに対応します。 Hyperopt は、試行を反復的に生成し、評価し、繰り返します。

SparkTrialsを使用すると、クラスターのドライバー ノードが新しい試行を生成し、ワーカー ノードがそれらの試行を評価します。各試用版は、1 つのタスクを持つ Spark ジョブで生成され、ワーカー マシン上のタスクで評価されます。 クラスターがワーカーごとに複数のタスクを実行するように設定されている場合、そのワーカーで複数の試行が一度に評価される可能性があります。

SparkTrials と MLflow

Databricks Runtime ML では、ワーカーから MLflow へのログ記録がサポートされています。 Hyperopt に渡す目的関数にカスタム ログ コードを追加できます。

SparkTrials 入れ子になった MLflow が次のように実行されると、チューニング結果がログに記録されます。

  • メインまたは親の実行: fmin() の呼び出しは、メインの実行としてログに記録されます。 アクティブな実行がある場合は、このアクティブな実行に SparkTrials ログを記録し、 fmin() が戻っても実行を終了しません。 アクティブな実行がない場合、 SparkTrials は新しい実行を作成し、ログを記録し、 fmin() 戻る前に実行を終了します。
  • 子実行: テストされた各ハイパーパラメータ設定 ("試用版") は、メイン実行の下に子実行としてログに記録されます。 ワーカーからの MLflow ログ レコードも、対応する子実行の下に格納されます。

fmin()を呼び出す場合、Databricks ではアクティブな MLflow 実行管理をお勧めします。つまり、fmin() への呼び出しを with mlflow.start_run(): ステートメント内にラップします。これにより、各fmin()呼び出しが個別の MLflow メイン実行に記録され、その実行に追加のタグ、パラメーター、またはメトリクスを簡単にログに記録できます。

注記

同じアクティブな MLflow 実行内で fmin() を複数回呼び出すと、MLflow はそれらの呼び出しを同じメイン実行に記録します。 ログに記録されたパラメーターとタグの名前の競合を解決するために、MLflow は競合する名前に UUID を追加します。

ワーカーからログを記録する場合、目的関数で実行を明示的に管理する必要はありません。 目的関数で mlflow.log_param("param_from_worker", x) を呼び出して、子実行にパラメーターをログに記録します。 パラメーター、メトリクス、タグ、アーティファクトを目的関数に記録できます。