Ray Tune: 煉丹師的調參新姿式

在機器學習的大多數漂亮的結果背後,是一個研究生(我)或工程師花費數小時訓練模型和調整算法參數。正是這種乏味無聊的工做使得自動化調參成爲可能。html

Image for post

RISELab 中,咱們發現愈來愈有必要利用尖端的超參數調整工具來跟上最早進的水平。深度學習性能的提升愈來愈依賴於新的和更好的超參數調整算法,如基於分佈的訓練(PBT) ,HyperBand,和 ASHA。python

Image for post

Source: 基於分佈的訓練大大提升了 DeepMind 在許多領域的算法。來源:https://deepmind.com/blog/population-based-training-neural-networks/git

這些算法提供了兩個關鍵的好處:github

然而,咱們看到,絕大多數研究人員和團隊沒有利用這種算法。算法

爲何?大多數現有的超參數搜索框架沒有這些新的優化算法。一旦達到必定的規模,大多數現有的並行超參數搜索解決方案可能會很難使用ーー您須要爲每次運行配置每臺機器,並常常管理一個單獨的數據庫。數據庫

實際上,實現和維護這些算法須要大量的時間和工程安全

但事實並不是如此。咱們相信,沒有理由說超參數調優須要如此困難。全部的人工智能研究人員和工程師都應該可以在8個 gpu 上無縫運行並行異步網格搜索,甚至能夠擴展到利用基於分佈的訓練或者雲上的任何貝葉斯優化算法。網絡

在這篇博客文章中,咱們將介紹 Tune, 一個基於 Ray 的強大的超參數調整庫,旨在消除艱辛、設置實驗執行和超參數調整過程當中的難度。框架

Image for post

在不更改代碼的狀況下,優化從單個機器到大型分佈式集羣的擴展訓練dom

Tune 是一個強大的 Python 庫,能夠加速超參數調整:

除了 Tune 的核心特性,研究人員和開發人員更喜歡 Tune 而不是其餘現有的超參數調優框架有兩個主要緣由: 規模靈活性

Image for post

搜索算法注意: 從2019年8月12日起,HpBandSter 支持 HyperBand、 Random Search 和 BOHB。支持隨機搜索、 HyperBand 和 Bayesian 優化。Optuna 支持中位數(百分位數)中止,ASHA,隨機搜索和貝葉斯優化(TPE)。HyperOpt 支持貝葉斯優化和隨機搜索。Tune 支持 PBT,BOHB,ASHA,HyperBand,Median Stopping,Random Search,Bayesian Optimization (TPE,等等) ,以及許多其餘因爲庫集成而產生的功能

Tune 簡化了擴展

經過添加少於10行的 Python 代碼,利用機器上的全部核心和 gpu 來執行並行異步超參數調優。

若是你遇到任何問題,請在評論中發表。

Image for post

https://twitter.com/MarcCoru/status/1080596327006945281

使用另外一個配置文件和4行代碼,在雲上啓動一個大規模分佈式超參數調優集羣,並自動關閉計算機(咱們將在下面向您展現如何作到這一點)。

經過 Tune 的內置容錯、試用遷移和集羣自動伸縮,您能夠安全地利用 spot (搶佔)實例,並將雲成本下降高達 90%.

Tune 是靈活的

Image for post

Tune 與 MLFlowTensorBoard 等實驗管理工具無縫集成。

Tune 爲優化算法提供了一個靈活的接口,容許您輕鬆地實現和擴展新的優化算法。

您可使用 Tune 來利用和擴展許多尖端優化算法和庫,好比 HyperOpt (下面)和 Ax,而無需修改任何模型訓練代碼。

使用 Tune 很簡單

如今讓咱們深刻到一個具體的例子中,它展現瞭如何利用一個流行的早期中止算法(ASHA)。咱們將首先在您的工做站上的全部核心上運行一個使用 Tune 的超參數調優腳本示例。而後,咱們將使用10行代碼使用 Ray 在雲上進行一樣的超參數優化實驗。

您能夠在這裏下載超參數調優代碼的完整版本(這裏是分佈式實驗配置)。

咱們將在這個例子中使用 PyTorch,可是咱們也有 Tensorflow 和 Keras可用的例子。

Tune 被包裝成 Ray 的一部分。要運行這個示例,您須要安裝如下命令:

pip install ray torch torchvision

讓咱們用 PyTorch 編寫一個神經網絡:

要開始使用 Tune,向下面的 PyTorch 培訓函數添加一個簡單的日誌記錄語句。

注意,在上面的培訓腳本中有一些輔助函數; 您能夠在這裏看到它們的定義

運行 Tune

讓咱們作一個試驗,從學習率和動量的均勻分佈中隨機抽取樣本。

如今,你已經跑完了你的第一個Tune!經過指定 GPU 資源 ,您能夠很容易地啓用 GPU 的使用ー參見文檔瞭解更多細節。而後咱們能夠繪製這個試驗的表現(須要 matplotlib)。

並行執行和提早中止

Image for post

ASHA 和提早中止

讓咱們集成 ASHA,一個可擴展的早期中止算法(博客文章論文)。ASHA 終止了不那麼有前途的試驗,併爲更有前途的試驗分配了更多的時間和資源。

使用 num_samples 在計算機上全部可用的核上並行搜索(額外的試驗將排隊)。

您可使用與前面的示例相同的 DataFrame 繪圖。運行後,若是安裝了 Tensorboard,還可使用 Tensorboard 來可視化結果: tensorboard --logdir ~/ray_results

Image for post

分佈式執行

啓動一個分佈式超參數搜索一般工做量太大。可是 Ray 和 Tune 使得一切變得簡單

使用簡單的配置文件在雲上啓動

Image for post

並在不更改代碼的狀況下啓動集羣分發超參數搜索

首先,咱們將建立一個配置 Ray 集羣的 YAML 文件。做爲 Ray 的一部分,Tune 與 Ray cluster launcher很是乾淨地互操做。下面顯示的相同命令將用於 GCP、 AWS 和本地私有集羣。除了頭節點以外,咱們還將使用3個工做節點,所以咱們應該在集羣上共有32個 vcpu,這樣咱們就能夠並行地評估32個超參數配置。

整合

要在整個 Ray 集羣中分佈超參數搜索,您須要在腳本的頂部附加如下內容:

考慮到計算量的大幅增加,咱們應該可以增長搜索空間和搜索空間中的樣本數量:

您能夠在這個博客中下載腳本的完整版本(做爲 tune_script.py)。

開始你的實驗

要啓動實驗,您能夠運行如下命令(假設目前爲止您的代碼在一個文件 tune_script.py 中) :

$ ray submit tune-default.yaml tune_script.py --start 
     --args="localhost:6379"

這將在 AWS 上啓動您的集羣,將 tune_script.py 上傳到 head 節點,並運行 python tune_script.py localhost: 6379,這是 Ray 爲啓用分佈式執行而打開的一個端口。

腳本的全部輸出都將顯示在控制檯上。請注意,集羣將首先設置頭節點,而後再設置任何工做節點,所以一開始您可能只看到4個 cpu 可用。一段時間後,您能夠看到24個實驗正在並行執行,其餘實驗將排隊等待執行,只要實驗是閒置的。

要關閉集羣,能夠運行:

$ ray down tune-default.yaml

瞭解更多:

Tune 有許多其餘特性,使研究人員和從業人員加速他們的發展。這篇博客文章中沒有提到的其餘 Tune 功能包括:

對於那些能夠訪問雲的用戶,Tune 和 Ray 提供了許多實用程序,能夠在筆記本電腦的開發和雲端的執行之間實現無縫的轉換。文件包括:

  • 在後臺進行實驗
  • 提交一個現有實驗
  • 在 TensorBoard 中可視化一個分佈式實驗的全部結果
調整的目的是規模實驗執行和超參數搜索與方便。若是您有任何意見或建議,或者有興趣爲 Tune 作貢獻,您能夠 聯繫我 或者 ray-dev 郵件列表

代碼: https://github.com/ray-project/ray/tree/master/python/ray/tune
文檔: http://ray.readthedocs.io/en/latest/tune.html

相關文章
相關標籤/搜索