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 |
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()
結束。 已完成執行的相關信息會儲存。
實作
定義傳遞至 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)
,將參數記錄至子回合。 您可以在目標函式中記錄參數、計量、標記和成品。