Hyperopt概念

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

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

fmin ()

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

參數名稱

描述

fn

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

空間

定義要搜索的超參數空間。Hyperopt在如何定義這個空間方麵提供了很大的靈活性。您可以選擇一個分類選項,如算法,或數值的概率分布,如均勻和對數。

算法

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 executor數量。最大:128。如果該值大於集群配置允許的並發任務數,SparkTrials減少對該值的並行性。

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

實現

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

在Hyperopt中,一個試驗通常對應於在一個超參數設置上擬合一個模型。Hyperopt迭代地生成試驗,評估它們,並重複。

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

SparkTrials和MLflow

Databricks Runtime ML支持從worker記錄到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)在目標函數中記錄參數到子運行。您可以在目標函數中記錄參數、度量、標記和工件。