微軟開源自動機器學習工具 – NNI安裝與使用
在機器學習建模時,除了准備數據,最耗時耗力的就是嘗試各種超參組合,找到最佳模型的過程了。對於初學者來說,常常是無從下手。即使是對於有經驗的算法工程師和數據科學家,也是很難把握所有的規律,只能多次嘗試,找到較好的超參組合。而自動機器學習這兩年成為了熱門領域,它將機器學習過程中包括自動特征提取、模型選擇、參數調節等過程自動化地學習,使學習過程在給定數據和任務上學習和泛化能力非常強大。NNI (Neural Network Intelligence) 是微軟開源的自動機器學習工具包,與當前的各種自動機器學習服務或工具相比,有非常獨特的價值。NNI着力解決超參調試過程的挑戰,通過內置的超參選擇算法、算力的強大支持和便捷的交互方式來加速和簡化超參搜索的過程。更多詳細內容和代碼可以參考NNI的github地址。
本篇是NNI (Neural Network Intelligence) 系列文章的開篇,將首先介紹NNI 的特點和價值,然后用一個簡單的mnist樣例帶您開啟自動化機器學習之旅。后續系列文章還將從NNI的高效率——能夠幫助節省時間和減少代碼、NNI的分布式——支持OpenPAI等多端部署、NNI的可擴展性——支持多種tuner和assessor等特點介紹NNI。
NNI的眾多特點
1. 安裝簡潔:通過pip命令就能完成安裝;
2. 支持私有部署,用自己的計算資源就能進行自動機器學習;
3. 支持分布式調度:NNI 可以在單機上進行試驗,還支持多種分布式調度平台,如通過 SSH 控制多台 GPU 服務器協同完成試驗,或通過OpenPAI, Azure, Kubernetes等在獨立的 Docker 中運行;
4. 對超參搜索的底層支持:大部分自動機器學習服務與工具的服務都是針對於圖片分類等特定的任務。而NNI通過讓用戶提供訓練代碼和超參搜索范圍, 依靠NNI內置算法和訓練服務來搜索最佳的超參和神經架構,NNI為有一定模型訓練經驗的用戶提供更加通用的調參方式,便於用戶做出更多嘗試、決策和加入思考,並完整參與整個訓練過程;
5. 隨庫自帶眾多實例和流行的調參算法;
6. 架構簡潔、對開發和擴展及其友好。
開啟你的第一次NNI之旅
這部分將以識別手寫字體mnist為例介紹NNI如何在本地機器使用注釋方式定義搜索空間提交訓練任務而提高效率,並介紹NNI的基礎功能與使用。要通過NNI進行實驗,用戶只需要三步即可完成實驗准備, (1)定義搜索空間(search space); (2)上傳代碼(codes); (3)定義實驗 ,用戶可以使用一行命令行即可開始實驗,並可使用webUI在網頁端實時查看實驗進程和結果。
讀完這部分,你將了解如何編寫配置文件和通過注釋形式定義搜索空間,你將了解如何使用NNI在本地機器上提交任務,並了解如何通過webUI清晰地檢查實驗結果和超參數的使用對結果的影響。nni提供的mnist代碼示例文件已開源至github,克隆后可在目錄~/nni/examples/mnist中查看,此外本例依賴tensorflow框架,還需要使用pip安裝tensorflow。
$ git clone https://github.com/Microsoft/nni.git
$ python3 -m pip install tensorflow
· 安裝
介紹例子之前首先安裝NNI,NNI提供簡單快速的源碼編譯或pip安裝方式,NNI目前支持在ubuntu 16.04及更高版本和Mac OS系統上進行安裝,用戶需要環境中安裝有python高於3.5的版本,本例在ubuntu16.04系統上通過一行pip命令安裝 :
$ python3 -m pip install --user --upgrade nni
· 三步准備實驗
用戶只需要三步即可完成實驗准備,(1)定義搜索空間(search space);(2)上傳代碼(codes);(3)定義實驗(experiment) 。

代碼結構非常簡單,其中文件search_space.json代表定義搜索空間,代碼mnist.py代表上傳代碼,配置文件config.yml代碼定義實驗,可在~/nni/example/trials/mnist目錄中看到目錄結構。
(1) 准備搜索空間
首先使用json文件定義超參數的搜索空間,搜索空間包括搜索的變量名、搜索的類型和搜索的值范圍。此例定義了網絡的卷積層尺寸(conv_size)在(2,3,5,7)的范圍中搜索,隱藏層的尺寸(hidden_size)在(124,512,1024)的范圍搜索,學習率(learning_rate)在(0.0001,0.1)的范圍搜索等等。
(2) 准備實驗代碼
在實驗代碼中引入nni包,並以幾行代碼加入nni的參數傳遞和結果回傳即可將nni與實驗代碼結合起來。
(3)定義實驗配置
通過yaml配置文件來定義實驗, 配置文件中包含實驗的基礎信息、訓練平台的選擇、搜索空間的使用注釋選擇、協調器的選擇和訓練任務的配置等。此處定義方式是:在本地訓練任務、使用注釋方式定義搜索空間、使用TPE算法, 其內容基本如下所示:
· 一行命令開始訓練
完成以上三步(定義搜索空間、上傳代碼、定義實驗)后,你已經有配置文件、搜索空間和訓練代碼,配置文件的訓練任務配置中連接了定義主代碼的路徑和執行命令、定義搜索空間定義方式及位置。此時,只需要一句命令即可提交任務。
$ nnictl create --config ~/nni/examples/trials/mnist-annotation/config.yml
· webUI查看結果
提交訓練任務之后終端會返回提交任務的索引ID及webUI的網址,在瀏覽器中打開url地址即可得到NNI解析出的實驗信息及實驗實時結果。
首頁可以所有訓練信息和具體的超參組合,並支持對回傳結果排序。
優化進度頁面可以看到按時序排列的精度或損失值(此圖為精度)。可以看到,時間越靠后(右側),精度高的越多,這說明選擇的超參探索算法隨着時間能找到一些好的超參空間繼續探索。
通過超參的分布圖來直觀地看到哪些超參值會明顯比較好,或者看出它們之間的關聯。通過下面的顏色圖就能直觀地看到紅色(即精度較高的超參組合)線條所表達的豐富信息。如:卷積核大一些會表現較好;學習率小一些,表現基本都不錯;Batch_size較大時變現更好等等。
第一次NNI之旅的體驗如何?本文通過闡述NNI 的特點、后續的安裝和如何使用簡單例程動手實踐對NNI做了一個簡單的介紹,但NNI的功能不止於此,它的多平台支持、多種配置方式、分布式調度模式、多種算法支持還等待你來發現和發掘,甚至你也可以作為NNI代碼的貢獻者來自己定義需求。
擴展閱讀
· 基礎定義
1.如何在你的機器上安裝nni?
2.如何使用nnictl工具命令?
3.如何使用web UI?
4.如何定義搜索空間?
5.如何配置定義實驗?
6.如何使用注釋定義搜索空間?
7.如何寫訓練實驗?
· 擴展訓練
1.如何在本地訓練任務?
2.如何在多個機器上訓練任務?
3.如何在OpenPAI上訓練任務?
4.如何在遠程服務器訓練任務?
5.嘗試更多不同的tuners和assessors
6.自己定義一個tuner
7.自己定義一個assessor
· 更多
1.如何創建NNI環境?
2.如何貢獻代碼?
3.如何debug?