共用方式為


Hyperopt 概念

注意

不再維護 Hyperopt 的開放原始碼版本。

Hyperopt 將在下一個主要 DBR ML 版本中移除。 Azure Databricks 建議針對類似的體驗使用 Optuna ,並存取更最新的超參數微調演算法。

本文說明您必須知道使用分散式 Hyperopt 的一些概念。

本節內容:

如需說明如何在 Azure Databricks 中使用 Hyperopt 的範例,請參閱 Hyperopt

fmin()

您可以使用 fmin() 來執行 Hyperopt 執行。 的自變數 fmin() 會顯示在數據表中;如需詳細資訊,請參閱 Hyperopt 檔 。 如需如何使用每個自變數的範例,請參閱 範例筆記本

引數名稱 描述
fn Objective 函式。 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 請將平行處理原則縮減為此值。

  • timeout:呼叫可接受的最大秒 fmin() 數。 超過此數目時,所有執行都會終止並 fmin() 結束。 已完成執行的相關信息會儲存。

實作

定義傳遞至 fmin()的目標函fn式,並在選取叢集設定時,瞭解微調工作的散發方式SparkTrials很有説明。

在 Hyperopt 中,試用版通常會對應至一個超參數設定上的一個模型。 超反覆產生試用版、評估試驗,並重複執行。

使用 SparkTrials時,叢集的驅動程序節點會產生新的試用版,而背景工作節點會評估這些試用版。 每個試用版都會使用具有一項工作的Spark作業產生,並在背景工作電腦上的工作中進行評估。 如果您的叢集設定為針對每個背景工作執行多個工作,則該背景工作角色可能會一次評估多個試用版。

SparkTrials 和 MLflow

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

SparkTrials 記錄微調結果,因為巢狀 MLflow 會執行,如下所示:

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

呼叫 fmin()時,Databricks 建議使用中的 MLflow 執行管理;也就是說,請將呼叫 fmin() 包裝在 語句內 with mlflow.start_run(): 。 這可確保每個 fmin() 呼叫都會記錄到個別的 MLflow 主要執行,並更輕鬆地將額外的標記、參數或計量記錄至該執行。

注意

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

從背景工作角色記錄時,您不需要在目標函式中明確管理執行。 在 objective 函式中呼叫 mlflow.log_param("param_from_worker", x) ,將參數記錄至子回合。 您可以在目標函式中記錄參數、計量、標記和成品。