Hyperopt 概念

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

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

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

このセクションの内容:

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

fmin()

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

引数名

説明

fn

目的関数。 Hyperopt は、スペース引数で指定されたハイパーパラメータ空間から生成された値を使用してこの関数を呼び出します。 この関数は、損失をスカラー値または辞書で返すことができます(詳細については、 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 を使用します。 目的関数で MLlib メソッドや Horovod などの分散トレーニング アルゴリズムを呼び出す場合は、 Trials を使用します。

early_stop_fn

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

SparkTrials クラス

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

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

このセクションでは、 SparkTrialsSparkTrials および実装の側面に渡す引数を構成する方法について説明します。

引数

SparkTrials 2 つの省略可能な引数を取ります。

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

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

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

実装

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

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

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

SparkTrials と MLflow

Databricks Runtime 機械学習では、ワーカーから機械学習フローへのログ記録がサポートされています。 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) を呼び出して、子実行にパラメーターを記録します。 パラメーター、メトリクス、タグ、およびアーティファクトを目的関数でログに記録できます。