天天看點

NNI 自動調參

本文是深度之眼NNI (Neural Network Intelligent)課程筆記。

NNI 介紹

調參方法:窮舉法,TPE 調參方法,ppo tuner 強化學習

特征工程:找到特征的組合

NNI 自動調參

NNI 使用方法

NNI 自動調參

定制搜尋空間:

啟動 NNI

生成超參(Tuner)

評估結果(Assessor)

執行試驗:

create a new experiment with specified port 8088 and debug mode

nnictl create --config nni/examples/trials/mnist-tfv1/config.yml --port 8088 --debug

其他 nnictl方法: https://nni.readthedocs.io/en/latest/Tutorial/Nnictl.html#create

分析結果:

  • Step 1: Define search space (用先驗知識)
  • Step 2:Update Codes (在training.py檔案裡)

    * 上報名額有中間值和最終結果?

  • Step 3: 配置

    * 搜尋空間檔案(.json)

    * 系統配置檔案(config.yml)

    ![在這裡插入圖檔描述](https://img-blog.csdnimg.cn/20201229033505186.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80OTU1NzE4Ng==,size_16,color_FFFFFF,t_70#pic_center)
               

NNI 結合 Baseline

  • 安裝
  • 結合 baseline 修改
  1. 可以改的東西:
    • transformer (要找來細看)
    • 優化器
  2. 修改的方法:

    使用函數 tuner_params = nni.get_next_parameter(), 然後把超參數傳入到後面需要的地方。

    Assesor:具體介紹

  • 建立 .json, config.yml
  1. 配置。j’son

    例:

    {

    “lr”:{"_type":“choice”, “_value”:[0.1, 0.01, 0.001, 0.0001]},

    “optimizer”:{"_type":“choice”, “_value”:[“SGD”, “Adadelta”, “Adagrad”, “Adam”, “Adamax”]},

    “model”:{"_type":“choice”, “_value”:[“vgg”, “resnet18”, “googlenet”, “densenet121”, “mobilenet”, “dpn92”, “senet18”]}

    }

    ”choice“ 表示其中選一個

上報:nni.report——intermediate, ni.report_terminal

  1. 配置.yml

    trialCurrrency: Gpu 數量

    maxEexcDuration: 24h

    platform: Gpu還是cpu

    searchspacepath:配置檔案名字(search——space.json)

    tuner:選擇模型的組合方法: builtinTunerName:選擇的名額(TPE)。optimize_mode:想要名額小還是大為好

    trial command:python training.py

NNI的三個重要概念:

1. Trial: 根據tiral向nni報告的最終結果,取下一組參數進行實驗。

2. Tuner: 參數搜尋算法。目前内置的有TPE, Random, Anneal, Evolution, BatchTuner等,具體可以參見doc。在config.yml中定義

3. Assessor: early stop algorothm。根據trial向nni報告的中間結果,用于優化實驗,可以提前結束搜尋,内置的有Medianstop和Curvefitting兩種,具體可以參見doc。在config.yml中定義

NNI 調參結果分析

其中包括以下功能子產品:

Overview:experiment的相關資訊顯示;

Trails Detail:浏覽部分trial資訊(包括trial時長、參數配置等)。

Hyper Parameter:熱度顯示不同超參配置的訓練結果;

Trial Duration:訓練時長柱狀圖

簡明的進行控制指令。利用nnictl指令行工具,用來控制NNI Experiment,如啟動、停止、繼續experiment,啟動、停止NNIBoard等等。

然後分析:

技巧:

1.訓練集弄小一點

2.epoch: 5 個

3. 多個環境,多個實驗切換1

G4ubmV0L3dlaXhpbl80OTU1NzE4Ng==,size_16,color_FFFFFF,t_70)

4. 其中最好用的就是它的WebUI和Annotation機制。

WebUI可以随時檢視實驗進度,各種超參數組合的性能排名。

Annotation機制更是神器,支援以注釋的方式加入超參數搜尋空間,在安裝了NNI的環境中可以快速開始實驗,在沒有安裝NNI的環境中也可以按照原邏輯運作,友善共享檔案。

NNI 自動調參

5. 在使用webUI的時候,出錯資訊都是在stdder裡面,希望可以直接在web界面顯示,而不用在輸入nnictl log stdder或者去路徑下尋找

debug技巧

  1. 先要保證不嵌入nni的python程式可以執行。這裡使用注釋形式生成search space.json比較好。如果是自己寫的search space.json,調試時在主程式還需要注釋掉嵌入的nni代碼
  2. 如果trial fail,可以輸入nnictl log stdder,或者打開log檢視出錯資訊,一般是在/home/directory/nni/experiments/實驗ID/trial/每組參數實驗id下的stdder中
  3. 注意程式裡,要把 python3 改成 python,不然會出錯

在本地跑實驗可能還會遇到這些坑:

與其他 training service 不同,本地跑實驗是共享目錄,是以要 keep log 和 checkpoint 的話,用 get_experiment_id 和 get_trial_id 在 output_dir 下建立子目錄可能會幫到你。

如果你 GPU 上有東西在跑,一定要清掉或者 useActiveGpu: true(issue 裡被問了一萬遍)。

據我的觀察,在本地跑實驗的,經常是 GPU 還沒滿,CPU 就已經爆炸了(可能是我所見到的機器 CPU 核都比較少?)。有空可以優化一下你的 code,讓你的 code 打滿 GPU(比如試試 DALI?)。

Local 模式下由于 import nni 會魔改你的 logger,是以如果你的代碼裡有别的 logger 或者你發現有東西明明打了但是失蹤了,可以報個 issue(不知道會出什麼問題但是看起來就很容易出問題)。

補充:

AutoDL 介紹:

例 1:

例 2:

具體操作介紹:

高階方法:

[參考文獻]

1.NNI 圖形界面分析結果

2.Assessor

繼續閱讀