Hyperopt 最佳做法和疑難排解
注意
不再維護 Hyperopt 的開放原始碼版本。
Hyperopt 將在下一個主要 DBR ML 版本中移除。 Azure Databricks 建議針對單一節點優化使用 Optuna,或 RayTune,以取得與已取代的 Hyperopt 分散式超參數微調功能類似的體驗。 深入瞭解如何在 Azure Databricks 上使用 RayTune。
最佳作法
- 貝氏方法比網格線搜尋和隨機搜尋更有效率。 因此,使用 Hyperopt 剖析估算器樹狀結構 (TPE) 演算法,您可以探索更多超參數和較大的範圍。 使用領域知識來限制搜尋定義域,optimize 微調併產生更好的結果。
- 當您使用
hp.choice()
時,Hyperopt 會傳回選擇的索引 list。 因此,在 MLflow 中記錄的參數也是索引。 使用hyperopt.space_eval()
擷取 參數 values。 - 對於訓練時間很長的模型,請開始實驗小型資料集和許多超參數。 使用 MLflow 來識別效能最佳的模型,並判定哪些超參數可以修正。 如此一來,您就可以在準備大規模微調時,減少參數空間。
- 利用條件式維度和超參數的 Hyperopt 支援。 例如,當您評估多個類別的梯度下降,而不是將超參數空間限制為只有一般超參數時,您可以讓 Hyperopt 包括條件式超參數,這些參數僅適用於變體子集。 如需使用條件式 parameters的詳細資訊,請參閱 定義搜尋空間。
- 使用
SparkTrials
時,請為僅 CPU 叢集和已啟用 GPU 的叢集適當設定平行處理原則。 在 Azure Databricks 中,CPU 和 GPU 叢集會為每個背景工作角色節點使用不同的執行程式執行緒數目。 CPU 叢集會為每個節點使用多個執行程式執行緒。 GPU 叢集在每個節點僅使用一個執行程式執行緒,以避免嘗試使用相同的 GPU 的多個 Spark 工作之間發生衝突。 雖然這對於為 GPU 撰寫的程式庫來說通常是最佳的,但這意味著 GPU 叢集上的最大平行處理原則會有所降低,因此在選擇 GPU 執行個體類型時,請注意每個試用可以使用多少個 GPU。 如需詳細資料,請參閱已啟用 GPU 的叢集。 - 請勿在自動調整叢集上使用
SparkTrials
。 Hyperopt 會在執行開始時選取平行處理原則值。 如果叢集稍後自動調整,Hyperopt 將無法利用新的叢集大小。
疑難排解
- 報告的 NaN(不是數字)遺失通常表示傳遞至
fmin()
的目標函式傳回 NaN。 這不會影響其他執行,而且您可以放心將其忽略。 若要防止此結果,請嘗試調整超參數空間或修改目標函式。 - 因為 Hyperopt 使用推測搜尋演算法,因此每次執行時,遺失通常不會單調減少。 不過,這些方法通常比其他方法更快找到最佳超參數。
- Hyperopt 和 Spark 都會產生額外負荷,可主導短期試用執行的試用持續時間 (低數十秒)。 您觀察到的加速可能很小,甚至為零。
範例筆記本:針對不同大小的資料集的最佳做法
SparkTrials
在 Spark 背景工作角色節點上執行試用版。 此筆記本提供在使用 SparkTrials
時,如何將不同大小順序的資料集移至背景工作角色節點的指導方針。