本文是深度之眼NNI (Neural Network Intelligent)課程筆記。
NNI 介紹
調參方法:窮舉法,TPE 調參方法,ppo tuner 強化學習
特征工程:找到特征的組合
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 修改
- 可以改的東西:
- transformer (要找來細看)
- 優化器
-
修改的方法:
使用函數 tuner_params = nni.get_next_parameter(), 然後把超參數傳入到後面需要的地方。
Assesor:具體介紹
- 建立 .json, config.yml
-
配置。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
-
配置.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的環境中也可以按照原邏輯運作,友善共享檔案。
5. 在使用webUI的時候,出錯資訊都是在stdder裡面,希望可以直接在web界面顯示,而不用在輸入nnictl log stdder或者去路徑下尋找
debug技巧
- 先要保證不嵌入nni的python程式可以執行。這裡使用注釋形式生成search space.json比較好。如果是自己寫的search space.json,調試時在主程式還需要注釋掉嵌入的nni代碼
- 如果trial fail,可以輸入nnictl log stdder,或者打開log檢視出錯資訊,一般是在/home/directory/nni/experiments/實驗ID/trial/每組參數實驗id下的stdder中
- 注意程式裡,要把 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