共用方式為


Hyperopt 概念

注意

不再維護 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 TrialsSparkTrials 物件。 當您在目標函式中呼叫單一電腦演算法,例如 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 請將平行處理原則縮減為此值。

  • timeoutfmin() 呼叫所能持續的最大秒數。 超過此數目時,所有程式執行都會終止並 fmin() 結束。 已完成的執行資訊會被儲存。

實施

在定義傳遞至fn的目標函數,並選擇叢集設定時,瞭解SparkTrials如何分配調整任務會很有幫助。

在 Hyperopt 中,一次試驗通常對應到在某個超參數設定下訓練一個模型。 Hyperopt 反覆地生成試驗、評估試驗並重複執行。

使用SparkTrials時,叢集的驅動節點會產生新的嘗試,而工作節點則負責評估這些嘗試。 每個試驗都會使用具有一項工作的Spark作業來產生,並在工作電腦上的任務中進行評估。 如果您的叢集設定可以讓每個工作節點執行多個任務,那麼該工作節點可能會同時評估多個試驗。

SparkTrials 和 MLflow

Databricks Runtime ML 支援從工作節點記錄到 MLflow。 您可以在傳遞至 Hyperopt 的目標函式中新增自訂記錄程式代碼。

SparkTrials 將微調結果記錄為巢狀的 MLflow 運行,如下所示:

  • 主要或父執行:對的呼叫 fmin() 會記錄為主要執行。 如果有作用中的執行, SparkTrials 則會記錄到此作用中的執行,而不會在傳回時 fmin() 結束執行。 如果沒有作用中的執行,SparkTrials 將建立新的執行,記錄到該執行,並在 fmin() 傳回前結束該執行。
  • 子執行:每個測試的超參數設定(「試驗」)都會記錄為在主執行之下的子執行。 工作者的 MLflow 日誌記錄也會儲存在對應的子執行程序之下。

呼叫 時,Databricks 建議積極進行 MLflow 執行管理,也就是說,請將呼叫 封裝在 語句內。 這可確保每個 fmin() 呼叫都會記錄到個別的 MLflow 主要執行,並讓您更輕鬆地將額外的標記、參數或計量記錄至該執行。

注意

當您在相同的作用中 MLflow 執行中多次呼叫 fmin() 時,MLflow 會將這些呼叫記錄至相同的主要執行。 若要解決已記錄參數和標籤的名稱衝突,MLflow 會將 UUID 附加至發生衝突的名稱。

當從工作者記錄時,您不需要在目標函數中明確管理執行。 在 objective 函式中呼叫 mlflow.log_param("param_from_worker", x) ,將參數記錄至子回合。 您可以在目標函數中記錄參數、度量、標籤和工件。