Hyperopt概念

本文描述了使用分布式Hyperopt時需要了解的一些概念。

有關如何在Databricks中使用Hyperopt的示例,請參見使用Hyperopt進行超參數調優

fmin ()

你使用fmin ()執行Hyperopt運行。關於fmin ()表中所示;看到Hyperopt文檔更多信息。有關如何使用每個參數的示例,請參見筆記本的例子

參數名稱

描述

fn

目標函數。Hyperopt使用從space參數中提供的超參數空間生成的值調用該函數。此函數可以將損失作為標量值或在字典中返回(參見Hyperopt文檔詳情)。這個函數通常包含用於模型訓練和損失計算的代碼。

空間

定義要搜索的超參數空間。Hyperopt在如何定義這個空間方麵提供了很大的靈活性。您可以選擇分類選項(如algorithm),或者為數值(如uniform和log)選擇概率分布。

算法

Hyperopt搜索算法用於搜索超參數空間。最常用的是hyperopt.rand.suggest隨機搜索和hyperopt.tpe.suggest為TPE。

max_evals

要嚐試的超參數設置數量(要擬合的模型數量)。

max_queue_len

Hyperopt應該提前生成的超參數設置的數量。因為Hyperopt TPE生成算法可能需要一些時間,所以將其增加到超過默認值1的值是有幫助的,但通常不大於SparkTrials設置並行性

試用

一個試用SparkTrials對象。使用SparkTrials當您在目標函數中調用諸如scikit-learn方法的單機算法時。使用試用當你調用分布式訓練算法,如MLlib方法或目標函數中的Horovod時。

early_stop_fn

可選的早期停止功能,以確定是否fmin應該停止max_evals是達到了。默認是沒有一個.函數的輸入簽名為試用* args輸出簽名是保齡球* args.輸出布爾值指示是否停止。* args是任何狀態,輸出調用到哪裏early_stop_fn作為下一個調用的輸入。試用可以是SparkTrials對象。當使用SparkTrials,早期停止函數不保證每次嚐試後都運行,而是輪詢。早期停止函數的示例

SparkTrials

SparkTrials是一個由Databricks開發的API,它允許您分發運行的Hyperopt,而無需對您的Hyperopt代碼做其他更改。SparkTrials通過將試驗分配給Spark的工作人員來加速單機調試。

請注意

SparkTrials設計用於並行計算單機ML模型,如scikit-learn。對於使用分布式ML算法(如MLlib或Horovod)創建的模型,不要使用SparkTrials.在這種情況下,模型構建過程在集群上自動並行化,您應該使用默認的Hyperopt類試用

本節描述如何配置傳遞給的參數SparkTrials的實施方麵SparkTrials

參數

SparkTrials接受兩個可選參數:

  • 並行性:可同時評估的最大試驗次數。較高的數值允許擴展測試更多的超參數設置。因為Hyperopt提出了基於過去結果的新試驗,所以並行性和適應性之間需要權衡。對於一個固定的max_evals,更高的並行度可以加快計算速度,但較低的並行度可能會導致更好的結果,因為每次迭代都可以訪問更多的過去的結果。

    默認值:可用的Spark執行器數量。最大:128。如果該值大於集群配置允許的並發任務數,SparkTrials將並行度降低到此值。

  • 超時:最大秒數fmin ()電話可以接。當超過此值時,所有運行將被終止,並且fmin ()退出。保存關於已完成運行的信息。

實現

當定義目標函數時fn傳遞給fmin (),在選擇集群設置時,了解如何設置是有幫助的SparkTrials分配調優任務。

在Hyperopt中,試驗通常對應於在一組超參數上擬合一個模型。Hyperopt迭代生成試驗,計算它們,並重複。

SparkTrials,集群的驅動節點生成新的試驗,工作節點評估這些試驗。每個測試都是由一個Spark作業生成的,該作業有一個任務,並在工作機器上的任務中進行評估。如果您的集群設置為每個worker運行多個任務,那麼可以在該worker上同時評估多個試驗。

SparkTrials和MLflow

Databricks Runtime ML支持從工作者記錄到MLflow。您可以在傳遞給Hyperopt的目標函數中添加自定義日誌記錄代碼。

SparkTrials在嵌套MLflow運行時記錄調優結果,如下所示:

  • 主運行或父運行:調用fmin ()被記錄為主運行。如果有人主動跑,SparkTrials記錄到此活動運行,並且不會在fmin ()的回報。如果沒有主動運行,SparkTrials創建一個新的運行,記錄到它,並結束之前的運行fmin ()的回報。

  • 子運行:每個測試的超參數設置(一個“試用”)都被記錄為主運行下的子運行。來自工作者的MLflow日誌記錄也存儲在相應的子運行下。

當調用fmin (), Databricks推薦主動MLflow運行管理;也就是說,把電話轉到fmin ()在一個mlflow.start_run ():聲明。這確保了每個fmin ()調用被記錄到一個單獨的MLflow主運行中,並且更容易將額外的標記、參數或指標記錄到該運行中。

請注意

當你打電話時fmin ()在同一個活動MLflow運行中,MLflow多次記錄對同一個主運行的調用。為了解決日誌參數和標記的名稱衝突,MLflow將UUID附加到有衝突的名稱。

當從工作者記錄日誌時,您不需要顯式地在目標函數中管理運行。調用mlflow.log_param(“param_from_worker”,x)在目標函數中記錄一個參數到子運行。您可以在目標函數中記錄參數、度量、標記和工件。