Hyperopt のベスト プラクティスとトラブルシューティング
注記
おすすめの方法
- ベイジアンのアプローチは、グリッド検索やランダム検索よりもはるかに効率的です。 したがって、パルゼン推定量の Hyperopt Tree of Parzen Estimators (TPE) アルゴリズムを使用すると、より多くのハイパーパラメータとより広い範囲を探索できます。 ドメイン知識を使用して検索ドメインを制限すると、チューニングを最適化し、より良い結果を得ることができます。
hp.choice()
を使用すると、Hyperopt は選択リストのインデックスを返します。したがって、MLflow に記録されるパラメーターもインデックスです。hyperopt.space_eval()
を使用してパラメーター値を取得します。- トレーニング時間が長いモデルの場合は、小さなデータセットと多くのハイパーパラメーターを使用してエクスペリメントを開始します。 MLflow を使用して、最もパフォーマンスの高いモデルを特定し、修正できるハイパーパラメーターを決定します。 このようにして、大規模なチューニングの準備をするときにパラメーターのスペースを減らすことができます。
- 条件付きディメンションとハイパーパラメーターの Hyperopt サポートを利用します。 たとえば、グラデーション降下法の複数のフレーバーを評価する場合、ハイパーパラメーター空間を一般的なハイパーパラメーターだけに制限するのではなく、Hyperopt に条件付きハイパーパラメーター (フレーバーのサブセットにのみ適切なもの) を含めることができます。 conditional パラメーターの使用について詳しくは、 検索スペースの定義を参照してください。
SparkTrials
を使用する場合は、CPU のみのクラスターと GPU 対応のクラスターで並列処理を適切に構成します。Databricksでは、CPU と GPU のクラスターは、ワーカー ノードごとに異なる数のエグゼキューター スレッドを使用します。CPU クラスターでは、ノードごとに複数のエグゼキューター スレッドを使用します。 GPU クラスターは、ノードごとに 1 つのエグゼキューター スレッドのみを使用して、同じ GPU を使用しようとする複数の Spark タスク間の競合を回避します。 これは一般的に GPU 用に記述されたライブラリに最適ですが、GPU クラスターでは最大並列処理が減少するため、GPU インスタンスタイプを選択する際には、各トライアルで使用できる GPU の数に注意してください。 詳細については、「 GPU 対応クラスター 」を参照してください。- オートスケール クラスターで
SparkTrials
を使用しないでください。 Hyperopt は、実行の開始時に並列処理の値を選択します。 クラスターが後でオートスケールになると、 Hyperopt 新しいクラスターサイズを利用できなくなります。
トラブルシューティング
- NaN の損失 (数値ではない) が報告された場合は、通常、目的関数が
fmin()
に渡され、返された NaN を意味します。 これは他の実行には影響しないため、無視しても問題ありません。 この結果を防ぐには、ハイパーパラメーター空間を調整するか、目的関数を変更してみてください。 - Hyperopt では確率的探索アルゴリズムが使用されるため、通常、損失は実行ごとに単調に減少することはありません。 ただし、これらの方法では、多くの場合、他の方法よりも迅速に最適なハイパーパラメーターを見つけることができます。
- HyperoptとSparkの両方でオーバーヘッドが発生し、短い試用期間 (数十秒未満) の試用期間を支配する可能性があります。観察されるスピードアップは、小さい場合もあれば、ゼロになる場合もあります。
ノートブックの例: さまざまなサイズのデータセットのベスト プラクティス
SparkTrials
Spark ワーカー ノードで試用版を実行します。 このノートブックでは、 SparkTrials
を使用する際に、さまざまな桁数のデータセットをワーカーノードに移動する方法についてのガイドラインを提供します。