注意
不再維護 Hyperopt 的開放原始碼版本。
Hyperopt 將在下一個主要 DBR ML 版本中移除。 Azure Databricks 建議針對單一節點優化使用 Optuna,或 RayTune,以取得與已取代的 Hyperopt 分散式超參數微調功能類似的體驗。 深入瞭解如何在 Azure Databricks 上使用 RayTune。
本文說明您必須知道使用分散式 Hyperopt 的一些概念。
本節內容:
如需說明如何在 Azure Databricks 中使用 Hyperopt 的範例,請參閱 Hyperopt。
fmin()
您可以使用 fmin()
來執行 Hyperopt 執行。 數據表中會顯示 fmin()
的自變數;如需詳細資訊,請參閱 Hyperopt 檔。 如需如何使用每個自變數的範例,請參閱 範例筆記本。
引數名稱 | 描述 |
---|---|
fn |
目標函數。 Hyperopt 會使用space自變數中提供的超參數空間所產生的值來呼叫此函式。 此函式可以將遺失當做純量值或在字典中傳回(如需詳細資訊,請參閱 Hyperopt 檔 )。 此函式通常包含模型定型和損失計算的程序代碼。 |
space |
定義要搜尋的超參數空間。 Hyperopt 可大幅彈性地定義這個空間。 您可以選擇類別選項,例如演算法,或為數值選擇概率分佈,例如均勻分佈和對數分佈。 |
algo |
用來搜尋超參數空間的 Hyperopt 搜尋演算法。 最常用的是 hyperopt.rand.suggest 用於隨機搜尋和 hyperopt.tpe.suggest 用於TPE。 |
max_evals |
要嘗試的超參數設定數目(要配合的模型數目)。 |
max_queue_len |
Hyperopt 應該預先生成的超參數設定數目。 由於 Hyperopt TPE 產生演算法可能需要一些時間,因此將此值增加到超過預設值 1 可能會有所幫助,但通常不會大於 SparkTrials 設定 parallelism 。 |
trials |
Trials 或 SparkTrials 物件。 當您在目標函式中呼叫單一電腦演算法,例如 scikit-learn 方法時,請使用 SparkTrials 。 當您在目標函式中呼叫分散式定型演算法,例如 MLlib 方法或 Horovod 時,請使用 Trials 。 |
early_stop_fn |
可選的早期停止函式,用於判斷 fmin 是否應在到達 max_evals 之前停止。 預設值為 None 。 函式的輸入簽章是 Trials, *args ,輸出簽章為 bool, *args 。 輸出布爾值會指出是否要停止。
*args 是任何狀態,其中對 early_stop_fn 呼叫的輸出可作為下一個呼叫的輸入。
Trials 可以是 SparkTrials 物件。 使用SparkTrials 時,早期停止功能不保證會在每次試驗後執行,而是會被定期檢查。
早期停止函式的範例 |
SparkTrials
類別
SparkTrials
是由 Databricks 開發的 API,允許您分佈式執行 Hyperopt,而無需對現有的 Hyperopt 程式碼進行其他變更。
SparkTrials
將實驗分配給 Spark 執行者,以加速單機調整。
注意
SparkTrials
是設計來平行處理單一計算機 ML 模型的計算,例如 scikit-learn。 對於使用 MLlib 或 Horovod 等分散式 ML 演算法建立的模型,請勿使用 SparkTrials
。 在這裡情況下,模型建置程式會在叢集上自動平行處理,您應該使用預設 Hyperopt 類別 Trials
。
本節說明如何設定您傳遞至 SparkTrials
的自變數,以及的 SparkTrials
實作層面。
引數
SparkTrials
接受兩個選擇性自變數:
parallelism
:要同時評估的試用版數目上限。 较大的数字可让您扩展测试更多超参数设置。 由於 Hyperopt 根據過去的結果提出新的試驗,因此並行性與適應性之間有取捨。 對於固定的max_evals
,較大的平行度可以加速計算,但較低的平行度可能會帶來更好的結果,因為每次迭代都能存取更多過去的結果。預設值:可用的Spark執行程式數目。 最大值:128。 如果值大於叢集組態所允許的並行工作數目,
SparkTrials
請將平行處理原則縮減為此值。timeout
:fmin()
呼叫所能持續的最大秒數。 超過此數目時,所有程式執行都會終止並fmin()
結束。 已完成的執行資訊會被儲存。
實施
在定義傳遞至fn
的目標函數,並選擇叢集設定時,瞭解SparkTrials
如何分配調整任務會很有幫助。
在 Hyperopt 中,一次試驗通常對應到在某個超參數設定下訓練一個模型。 Hyperopt 反覆地生成試驗、評估試驗並重複執行。
使用SparkTrials
時,叢集的驅動節點會產生新的嘗試,而工作節點則負責評估這些嘗試。 每個試驗都會使用具有一項工作的Spark作業來產生,並在工作電腦上的任務中進行評估。 如果您的叢集設定可以讓每個工作節點執行多個任務,那麼該工作節點可能會同時評估多個試驗。
SparkTrials
和 MLflow
Databricks Runtime ML 支援從工作節點記錄到 MLflow。 您可以在傳遞至 Hyperopt 的目標函式中新增自訂記錄程式代碼。
SparkTrials
將微調結果記錄為巢狀的 MLflow 運行,如下所示:
- 主要或父執行:對的呼叫
fmin()
會記錄為主要執行。 如果有作用中的執行,SparkTrials
則會記錄到此作用中的執行,而不會在傳回時fmin()
結束執行。 如果沒有作用中的執行,SparkTrials
將建立新的執行,記錄到該執行,並在fmin()
傳回前結束該執行。 - 子執行:每個測試的超參數設定(「試驗」)都會記錄為在主執行之下的子執行。 工作者的 MLflow 日誌記錄也會儲存在對應的子執行程序之下。
呼叫 fmin()
呼叫都會記錄到個別的 MLflow 主要執行,並讓您更輕鬆地將額外的標記、參數或計量記錄至該執行。
注意
當您在相同的作用中 MLflow 執行中多次呼叫 fmin()
時,MLflow 會將這些呼叫記錄至相同的主要執行。 若要解決已記錄參數和標籤的名稱衝突,MLflow 會將 UUID 附加至發生衝突的名稱。
當從工作者記錄時,您不需要在目標函數中明確管理執行。 在 objective 函式中呼叫 mlflow.log_param("param_from_worker", x)
,將參數記錄至子回合。 您可以在目標函數中記錄參數、度量、標籤和工件。