淺析自動機器學(xué)習(xí)(AutoML)工具NNI

NNI 簡介

NNI (Neural Network Intelligence) 是一個輕量級但功能強大的自動機器學(xué)習(xí)(AutoML)工具包,可幫助用戶自動化特征工程、神經(jīng)架構(gòu)搜索、超參數(shù)調(diào)優(yōu)和模型壓縮,并支持單機、本地多機、云等不同的運行環(huán)境。

nni架構(gòu).png

NNI 的主要特性

NNI 的特性主要包括:易于使用,可擴展,靈活,高效。

  • 易于使用:NNI 可通過 pip 安裝。 只需要在代碼中添加幾行,就可以利用 NNI 來調(diào)優(yōu)參數(shù)??墒褂妹钚泄ぞ呋?Web 界面來查看 Experiment
  • 可擴展:調(diào)優(yōu)超參或網(wǎng)絡(luò)結(jié)構(gòu)通常需要大量的計算資源。NNI 在設(shè)計時就支持了多種不同的計算資源,如遠程服務(wù)器組,訓(xùn)練平臺(如:OpenPAI,Kubernetes)等等。 根據(jù)您配置的訓(xùn)練平臺的能力,可以并行運行數(shù)百個 Trial 。
  • 靈活:除了內(nèi)置的算法,NNI 中還可以輕松集成自定義的超參調(diào)優(yōu)算法,神經(jīng)網(wǎng)絡(luò)架構(gòu)搜索算法,提前終止算法等等。 還可以將 NNI 連接到更多的訓(xùn)練平臺上,如云環(huán)境中的虛擬機集群,Kubernetes 服務(wù)等等。 此外,NNI 還可以連接到外部環(huán)境中的特殊應(yīng)用和模型上。
  • 高效:NNI 在系統(tǒng)及算法級別上不斷地進行優(yōu)化。 例如:通過早期的反饋來加速調(diào)優(yōu)過程。

NNI 的主要概念

  • Experiment(實驗): 表示一次任務(wù),例如,尋找模型的最佳超參組合,或最好的神經(jīng)網(wǎng)絡(luò)架構(gòu)等。它由 Trial自動機器學(xué)習(xí)算法所組成。
  • Search Space(搜索空間):是模型調(diào)優(yōu)的范圍。 例如,超參的取值范圍。
  • Configuration(配置):配置是搜索空間的實例化,從搜索空間中固定下來一定的超參數(shù),每個超參都會有特定的值。
  • Trial(嘗試):是一次獨立的嘗試,它會使用某組配置(例如,一組超參值,或者特定的神經(jīng)網(wǎng)絡(luò)架構(gòu))。 Trial 會基于提供的配置來運行。
  • Tuner(調(diào)優(yōu)器):一種自動機器學(xué)習(xí)算法,會為下一個 Trial 生成新的配置。 新的 Trial 會使用這組配置來運行。
  • Assessor(評估器):分析 Trial 的中間結(jié)果(例如,定期評估數(shù)據(jù)集上的精度),來確定 Trial 是否應(yīng)該被提前終止。
  • 訓(xùn)練平臺:是 Trial 的執(zhí)行環(huán)境。 根據(jù) Experiment 的配置,可以是本機,遠程服務(wù)器組,或其它大規(guī)模訓(xùn)練平臺(如OpenPAIKubernetes等)。

NNI 體系結(jié)構(gòu)

體系結(jié)構(gòu).png

NNI體系結(jié)構(gòu)如上圖所示,其中包括:

  • NNI Controller(nnictl): 這是個命令行工具,用于控制 Web 服務(wù)器,和其他管理功能,用戶可以使用這個命令來進行管理。比如,啟動 Experiment。
  • NNI Core: 這是 NNI 的核心,實現(xiàn)了Web UI, nnimanager,訓(xùn)練服務(wù)等核心功能。當 Experiment 出現(xiàn)嚴重錯誤時,從它的日志中才能找到原因。(例如,Web 界面無法打開,或者訓(xùn)練平臺失?。?/li>
  • Advisor: Advisor是 NNI 的超參數(shù)調(diào)整系統(tǒng),包括TunerAssessor,分別負責(zé)生成下一個trial和評估該trial。
  • 訓(xùn)練平臺:右側(cè)的訓(xùn)練平臺可以是本機/遠程服務(wù)器/OpenPAI/Kubernetes等,可以將許多 trial 進行分配到各個平臺中,完成一次嘗試(trial)。

從上圖中,我們也看到了 NNI Experiment 的運行過程如下:

  • Tuner 接收搜索空間并生成配置。
  • 這些配置將被提交到訓(xùn)練平臺,如本機,遠程服務(wù)器組或訓(xùn)練集群。
  • 執(zhí)行的性能結(jié)果會被返回給 Tuner。
  • 然后,再生成并提交新的配置。

每次 Experiment 執(zhí)行時,用戶只需要定義搜索空間,改動幾行代碼,就能利用 NNI 內(nèi)置的 Tuner/Assessor 和訓(xùn)練平臺來搜索最好的超參組合以及神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。 基本上分為三步:

  • 步驟一:定義搜索空間
  • 步驟二:改動模型代碼
  • 步驟三:定義實驗配置

NNI 的核心功能

NNI 提供了并行運行多個實例以查找最佳參數(shù)組合的能力。此功能可用于各種領(lǐng)域,例如,為深度學(xué)習(xí)模型查找最佳超參數(shù),或查找具有真實數(shù)據(jù)的數(shù)據(jù)庫和其他復(fù)雜系統(tǒng)的最佳配置。

NNI 還希望提供用于機器學(xué)習(xí)和深度學(xué)習(xí)的算法工具包,尤其是神經(jīng)體系結(jié)構(gòu)搜索(NAS)算法,模型壓縮算法和特征工程算法。

超參數(shù)調(diào)優(yōu)

這是 NNI 最核心、最基本的功能,其中提供了許多流行的自動調(diào)優(yōu)算法(即 Tuner) 以及提前終止算法(即 Assessor)。

NNI 內(nèi)置的 Tuner

NNI 能用簡單快速的方法來配置超參調(diào)優(yōu)算法,稱之為 Tuner

Tuner 從 Trial 中接收指標結(jié)果,來評估一組超參或網(wǎng)絡(luò)結(jié)構(gòu)的性能。 然后 Tuner 會將下一組超參或網(wǎng)絡(luò)結(jié)構(gòu)的配置發(fā)送給新的 Trial。

NNI 內(nèi)置的自動調(diào)優(yōu)算法如下表格所示:

概述 算法簡介
TPE Tree-structured Parzen Estimator (TPE) 是一種 sequential model-based optimization(SMBO,即基于序列模型優(yōu)化)的方法。 SMBO 方法根據(jù)歷史指標數(shù)據(jù)來按順序構(gòu)造模型,來估算超參的性能,隨后基于此模型來選擇新的超參。 參考論文
Random Search(隨機搜索) 在超參優(yōu)化時,隨機搜索算法展示了其驚人的簡單和效果。 建議當不清楚超參的先驗分布時,采用隨機搜索作為基準。 參考論文
Anneal(退火) 這種簡單的退火算法從先前的采樣開始,會越來越靠近發(fā)現(xiàn)的最佳點取樣。 此算法是隨機搜索的簡單變體,利用了反應(yīng)曲面的平滑性。 退火率不是自適應(yīng)的。
Na?ve Evolution(樸素進化) Na?ve Evolution(樸素進化算法)來自于 Large-Scale Evolution of Image Classifiers。 它會基于搜索空間隨機生成一個種群。 在每一代中,會選擇較好的結(jié)果,并對其下一代進行一些變異(例如,改動一個超參,增加或減少一層)。 樸素進化算法需要很多次的 Trial 才能有效,但它也非常簡單,也很容易擴展新功能。 參考論文
SMAC SMAC 基于 Sequential Model-Based Optimization (SMBO,即序列的基于模型優(yōu)化方法)。 它會利用使用過的突出的模型(高斯隨機過程模型),并將隨機森林引入到SMBO中,來處理分類參數(shù)。 SMAC 算法包裝了 Github 的 SMAC3。 注意:SMAC 需要通過 pip install nni[SMAC] 命令來安裝。 參考論文 代碼倉庫
Batch tuner(批處理) Batch Tuner 能讓用戶簡單的提供幾組配置(如,超參選項的組合)。 當所有配置都完成后,Experiment 即結(jié)束。 Batch Tuner 僅支持 choice 類型。
Grid Search(遍歷) 網(wǎng)格搜索會窮舉定義在搜索空間文件中的所有超參組合。 遍歷搜索可以使用的類型有 choice, quniform, randint。
Hyperband Hyperband 試圖用有限的資源來探索盡可能多的組合,并發(fā)現(xiàn)最好的結(jié)果。 基本思想是生成許多配置,并通過少量的 Trial 來運行一部分。 一半性能不好的配置會被拋棄,剩下的部分與新選擇出的配置會進行下一步的訓(xùn)練。 數(shù)量的多少對資源約束非常敏感(例如,分配的搜索時間)。 參考論文
Network Morphism 網(wǎng)絡(luò)模態(tài)(Network Morphism)提供自動搜索深度學(xué)習(xí)體系結(jié)構(gòu)的功能。 它會繼承父網(wǎng)絡(luò)的知識,來生成變形的子網(wǎng)絡(luò)。 包括深度、寬度、跳連接等變化。 然后使用歷史的架構(gòu)和指標,來估計子網(wǎng)絡(luò)的值。 然后會選擇最有希望的模型進行訓(xùn)練。 參考論文
Metis Tuner 大多數(shù)調(diào)參工具僅僅預(yù)測最優(yōu)配置,而 Metis 的優(yōu)勢在于有兩個輸出:(a) 最優(yōu)配置的當前預(yù)測結(jié)果, 以及 (b) 下一次 Trial 的建議。 它不進行隨機取樣。 大多數(shù)工具假設(shè)訓(xùn)練集沒有噪聲數(shù)據(jù),但 Metis 會知道是否需要對某個超參重新采樣。 參考論文
BOHB BOHB 是 Hyperband 算法的后續(xù)工作。 Hyperband 在生成新的配置時,沒有利用已有的 Trial 結(jié)果,而本算法利用了 Trial 結(jié)果。 BOHB 中,HB 表示 Hyperband,BO 表示貝葉斯優(yōu)化(Byesian Optimization)。 BOHB 會建立多個 TPE 模型,從而利用已完成的 Trial 生成新的配置。 參考論文
GP Tuner Gaussian Process(高斯過程) Tuner 是序列化的基于模型優(yōu)化(SMBO)的方法,并使用了高斯過程來替代。 參考論文, Github 倉庫
PPO Tuner PPO Tuner 是基于 PPO 算法的強化學(xué)習(xí) Tuner。 參考論文
PBT Tuner PBT Tuner 是一種簡單的異步優(yōu)化算法,在固定的計算資源下,它能有效的聯(lián)合優(yōu)化一組模型及其超參來最大化性能。 參考論文

NNI 內(nèi)置的 Assessor

為了節(jié)省計算資源,NNI 支持提前終止策略,并且通過叫做 Assessor 的接口來執(zhí)行此操作。

Assessor 從 Trial 中接收中間結(jié)果,并通過指定的算法決定此 Trial 是否應(yīng)該終止。 一旦 Trial 滿足了提前終止策略(這表示 Assessor 認為最終結(jié)果不會太好),Assessor 會終止此 Trial,并將其狀態(tài)標志為 ==EARLY_STOPPED==。

NNI 當前支持的提前終止算法如下表格:

Assessor 算法簡介
Medianstop Medianstop 是一個簡單的提前終止算法。 如果嘗試 X 的在步驟 S 的最好目標值比所有已完成嘗試的步驟 S 的中位數(shù)值明顯低,就會停止運行嘗試 X。 參考論文
Curvefitting Curve Fitting Assessor 是一個 LPA (learning, predicting, assessing,即學(xué)習(xí)、預(yù)測、評估) 的算法。 如果預(yù)測的 Trial X 在 step S 比性能最好的 Trial 要差,就會提前終止它。 此算法中采用了 12 種曲線來擬合精度曲線。 參考論文

通用 NAS 框架

此 NAS 框架可供用戶輕松指定候選的神經(jīng)體系結(jié)構(gòu),例如,可以為單個層指定多個候選操作(例如,可分離的 conv、擴張 conv),并指定可能的跳過連接。 NNI 將自動找到最佳候選。 另一方面,NAS 框架為其他類型的用戶(如,NAS 算法研究人員)提供了簡單的接口,以實現(xiàn)新的 NAS 算法。

NNI 通過 Trial SDK 支持多種 one-shot(一次性) NAS 算法,如:ENAS、DARTS。 使用這些算法時,不需要啟動 NNI Experiment。 在 Trial 代碼中加入算法,直接運行即可。 如果要調(diào)整算法中的超參數(shù),或運行多個實例,可以使用 Tuner 并啟動 NNI Experiment

除了 one-shot NAS 外,NAS 還能以 NNI 模式運行,其中每個候選的網(wǎng)絡(luò)結(jié)構(gòu)都作為獨立 Trial 任務(wù)運行。 在此模式下,與超參調(diào)優(yōu)類似,必須啟動 NNI Experiment 并為 NAS 選擇 Tuner。

模型壓縮

NNI 提供了一個易于使用的模型壓縮框架來壓縮深度神經(jīng)網(wǎng)絡(luò),壓縮后的網(wǎng)絡(luò)通常具有更小的模型尺寸更快的推理速度,模型性能也不會有明顯的下降。 NNI 上的模型壓縮包括剪枝量化算法。 這些算法通過 NNI Trial SDK 提供 。 可以直接在 Trial 代碼中使用,并在不啟動 NNI Experiment 的情況下運行 Trial 代碼。 用戶還可以使用 NNI 模型壓縮框架集成自定義的剪枝和量化算法。

自動特征工程

自動特征工程,可以為下游任務(wù)找到最有效的特征。 自動特征工程通過 NNI Trial SDK 支持,不必創(chuàng)建 NNI Experiment, 只需在 Trial 代碼中加入內(nèi)置的自動特征工程算法,然后直接運行 Trial 代碼。

自動特征工程算法通常有一些超參。 如果要自動調(diào)整這些超參,可以利用 NNI 的超參數(shù)調(diào)優(yōu),即選擇調(diào)優(yōu)算法(即 Tuner)并啟動 NNI Experiment。

安裝

通過pip安裝

python3 -m pip install --upgrade nni

通過源碼構(gòu)建

# 拉取NNI源碼并指定分支
git clone -b v2.0 https://github.com/Microsoft/nni.git

cd nni
# 設(shè)置環(huán)境變量
export NNI_RELEASE=2.0

# 構(gòu)建
python3 -m pip install --upgrade pip setuptools wheel
python3 setup.py clean --all
python3 setup.py build_ts
python3 setup.py bdist_wheel -p manylinux1_x86_64
python3 -m pip install dist/nni-2.0-py3-none-manylinux1_x86_64.whl

Docker安裝

# 拉取NNI鏡像
docker pull msranni/nni:v2.2

# 啟動NNI容器
docker run -i -t -p 9090:8080 msranni/nni:v2.0

備注:

在Docer中運行NNI的時候

如果直接使用 NNI 的官方鏡像 msranni/nni 來啟動 Experiment,可以直接使用 nnictl 命令。 NNI 官方鏡像有最基礎(chǔ)的 Python 環(huán)境和深度學(xué)習(xí)框架。

如果使用自己的 Docker 鏡像,需要首先安裝 NNI, 如python3 -m pip install --upgrade nni。

NNI 超參數(shù)調(diào)優(yōu)實驗的簡單示例

NNI 用來幫助超參調(diào)優(yōu)的偽代碼如下:

  • 輸入: 搜索空間, Trial 代碼, 配置文件
  • 輸出: 一組最優(yōu)的參數(shù)配置
 1: For t = 0, 1, 2, ..., maxTrialNum,
 2:      hyperparameter = 從搜索空間選擇一組參數(shù)
 3:      final result = run_trial_and_evaluate(hyperparameter)
 4:      返回最終結(jié)果給 NNI
 5:      If 時間達到上限,
 6:          停止實驗
 7: 返回最好的實驗結(jié)果

開發(fā)并啟動一個 NNI 實驗

啟動 Experiment 的包含如下三個步驟:

第一步 :編寫 JSON 格式的 搜索空間 文件,包括所有需要搜索的超參的 名稱分布 (離散和連續(xù)值均可)。

search_space.json

{
    "batch_size": {"_type":"choice", "_value": [16, 32, 64, 128]},
    "hidden_size":{"_type":"choice","_value":[128, 256, 512, 1024]},
    "lr":{"_type":"choice","_value":[0.0001, 0.001, 0.01, 0.1]},
    "momentum":{"_type":"uniform","_value":[0, 1]}
}

第二步 :修改 Trial 代碼來從 NNI 獲取超參,并返回 NNI 最終結(jié)果。

mnist.py

import nni

def main(args):
    # 下載數(shù)據(jù)
    train_loader = torch.utils.data.DataLoader(datasets.MNIST(...), batch_size=args['batch_size'], shuffle=True)
    test_loader = torch.tuils.data.DataLoader(datasets.MNIST(...), batch_size=1000, shuffle=True)
    # 構(gòu)造模型
    model = Net(hidden_size=args['hidden_size'])
    optimizer = optim.SGD(model.parameters(), lr=args['lr'], momentum=args['momentum'])
    # 訓(xùn)練
    for epoch in range(10):
        train(args, model, device, train_loader, optimizer, epoch)
        test_acc = test(args, model, device, test_loader)
        print(test_acc)
        nni.report_intermeidate_result(test_acc)    
    print('final accuracy:', test_acc)
    # 報告評估指標
    nni.report_final_result(test_acc)

if __name__ == '__main__':
    # 設(shè)置超參數(shù)默認值
    params = {'batch_size': 32, 'hidden_size': 128, 'lr': 0.001, 'momentum': 0.5}
    # 獲取一次Trail的超參數(shù)
    params = nni.get_next_parameter()
    main(params)

第三步: 定義 YAML 格式的 配置 文件,聲明搜索空間和 Trail 文件的 路徑 。 它還提供其他信息,例如調(diào)整算法,最大 Trial 運行次數(shù)和最大持續(xù)時間的參數(shù)。

config.yml

authorName: default
experimentName: example_mnist
trialConcurrency: 1
maxExecDuration: 1h
maxTrialNum: 10
trainingServicePlatform: local
# 搜索空間文件路徑
searchSpacePath: search_space.json
useAnnotation: false
tuner:
  builtinTunerName: TPE
# 運行的命令,以及 Trial 代碼的路徑
trial:
  command: python3 mnist.py
  codeDir: .
  gpuNum: 0

最后,從命令行使用 config.yml 文件啟動 MNIST Experiment 。

nnictl create --config config.yml

注意

如果要使用遠程服務(wù)器或集群作為訓(xùn)練平臺,為了避免產(chǎn)生過大的網(wǎng)絡(luò)壓力,NNI 限制了文件的最大數(shù)量為 2000,大小為 300 MB。 如果 codeDir 中包含了過多的文件,可添加 .nniignore 文件來排除部分,與 .gitignore 文件用法類似。

在命令行中等待輸出 INFO: Successfully started experiment! 。 此消息表明實驗已成功啟動。 期望的輸出如下:

INFO: Starting restful server...
INFO: Successfully started Restful server!
INFO: Setting local config...
INFO: Successfully set local config!
INFO: Starting experiment...
INFO: Successfully started experiment!
-----------------------------------------------------------------------
The experiment id is egchD4qy
The Web UI urls are: [Your IP]:8080
-----------------------------------------------------------------------

You can use these commands to get more information about the experiment
-----------------------------------------------------------------------
         commands                       description
1. nnictl experiment show        show the information of experiments
2. nnictl trial ls               list all of trial jobs
3. nnictl top                    monitor the status of running experiments
4. nnictl log stderr             show stderr log content
5. nnictl log stdout             show stdout log content
6. nnictl stop                   stop an experiment
7. nnictl trial kill             kill a trial job by id
8. nnictl --help                 get help information about nnictl
-----------------------------------------------------------------------

如果根據(jù)上述步驟準備好了相應(yīng) Trial,搜索空間配置 ,并成功創(chuàng)建的 NNI 任務(wù)。NNI 會自動開始通過配置的搜索空間來運行不同的超參集合,搜索最好的超參。 通過 Web 界面可看到 NNI 的進度。

通過Web UI 可視化實驗過程

啟動 Experiment 后,可以在命令行界面找到如下的 Web 界面地址

The Web UI urls are: [Your IP]:8080

在瀏覽器中打開 Web 界面地址 (即:[IP地址]:8080 ),就可以看到 Experiment 的詳細信息,以及所有的 Trial 任務(wù)。

查看概要頁面

Experiment 相關(guān)信息會顯示在界面上,如配置和搜索空間等。 NNI 還支持通過 Experiment summary 按鈕下載這些信息和參數(shù)。

nni-full-oview.png

查看 Trial 詳情頁面

可以在此頁面中看到最佳的嘗試指標和超參數(shù)圖。 當您單擊按鈕 Add/Remove columns 時,表格內(nèi)容包括更多列。 當您單擊按鈕 Add/Remove columns 時,表格內(nèi)容包括更多列。

嘗試詳情頁面.png

查看 Experiment 管理頁面

All experiments 頁面可以查看計算機上的所有實驗。

實驗管理頁面.png

到處為止,一次AutoML超參數(shù)調(diào)優(yōu)的實驗運行就已經(jīng)完成。

總結(jié)

本文簡單介紹了自動機器學(xué)習(xí)工具NNI的基本概念、主要功能特點以及如何使用NNI進行一個超參調(diào)優(yōu)實驗,希望能夠幫助到你。

參考文檔

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容