在機器學習建模時,除了準備數據,最耗時耗力的就是嘗試各類超參組合,找到最佳模型的過程了。對於初學者來講,經常是無從下手。即便是對於有經驗的算法工程師和數據科學家,也是很難把握全部的規律,只能屢次嘗試,找到較好的超參組合。而自動機器學習這兩年成爲了熱門領域,它將機器學習過程當中包括自動特徵提取、模型選擇、參數調節等過程自動化地學習,使學習過程在給定數據和任務上學習和泛化能力很是強大。NNI (Neural Network Intelligence) 是微軟開源的自動機器學習工具包,與當前的各類自動機器學習服務或工具相比,有很是獨特的價值。NNI着力解決超參調試過程的挑戰,經過內置的超參選擇算法、算力的強大支持和便捷的交互方式來加速和簡化超參搜索的過程。更多詳細內容和代碼能夠參考NNI的github地址。
本篇是NNI (Neural Network Intelligence) 系列文章的開篇,將首先介紹NNI 的特色和價值,而後用一個簡單的mnist樣例帶您開啓自動化機器學習之旅。後續系列文章還將從NNI的高效率——可以幫助節省時間和減小代碼、NNI的分佈式——支持OpenPAI等多端部署、NNI的可擴展性——支持多種tuner和assessor等特色介紹NNI。python
1. 安裝簡潔:經過pip命令就能完成安裝;
2. 支持私有部署,用本身的計算資源就能進行自動機器學習;
3. 支持分佈式調度:NNI 能夠在單機上進行試驗,還支持多種分佈式調度平臺,如經過 SSH 控制多臺 GPU 服務器協同完成試驗,或經過OpenPAI, Azure, Kubernetes等在獨立的 Docker 中運行;
4. 對超參搜索的底層支持:大部分自動機器學習服務與工具的服務都是針對於圖片分類等特定的任務。而NNI經過讓用戶提供訓練代碼和超參搜索範圍, 依靠NNI內置算法和訓練服務來搜索最佳的超參和神經架構,NNI爲有必定模型訓練經驗的用戶提供更加通用的調參方式,便於用戶作出更多嘗試、決策和加入思考,並完整參與整個訓練過程;
5. 隨庫自帶衆多實例和流行的調參算法;
6. 架構簡潔、對開發和擴展及其友好。git
這部分將以識別手寫字體mnist爲例介紹NNI如何在本地機器使用註釋方式定義搜索空間提交訓練任務而提升效率,並介紹NNI的基礎功能與使用。要經過NNI進行實驗,用戶只須要三步便可完成實驗準備, (1)定義搜索空間(search space); (2)上傳代碼(codes); (3)定義實驗 ,用戶可使用一行命令行便可開始實驗,並可以使用webUI在網頁端實時查看實驗進程和結果。
讀完這部分,你將瞭解如何編寫配置文件和經過註釋形式定義搜索空間,你將瞭解如何使用NNI在本地機器上提交任務,並瞭解如何經過webUI清晰地檢查實驗結果和超參數的使用對結果的影響。nni提供的mnist代碼示例文件已開源至github,克隆後可在目錄~/nni/examples/mnist中查看,此外本例依賴tensorflow框架,還須要使用pip安裝tensorflow。github
$ 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命令安裝 :web
$ 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目錄中看到目錄結構。shell
首先使用json文件定義超參數的搜索空間,搜索空間包括搜索的變量名、搜索的類型和搜索的值範圍。此例定義了網絡的卷積層尺寸(conv_size)在(2,3,5,7)的範圍中搜索,隱藏層的尺寸(hidden_size)在(124,512,1024)的範圍搜索,學習率(learning_rate)在(0.0001,0.1)的範圍搜索等等。
json
在實驗代碼中引入nni包,並以幾行代碼加入nni的參數傳遞和結果回傳便可將nni與實驗代碼結合起來。
ubuntu
經過yaml配置文件來定義實驗, 配置文件中包含實驗的基礎信息、訓練平臺的選擇、搜索空間的使用註釋選擇、協調器的選擇和訓練任務的配置等。此處定義方式是:在本地訓練任務、使用註釋方式定義搜索空間、使用TPE算法, 其內容基本以下所示:
api
完成以上三步(定義搜索空間、上傳代碼、定義實驗)後,你已經有配置文件、搜索空間和訓練代碼,配置文件的訓練任務配置中鏈接了定義主代碼的路徑和執行命令、定義搜索空間定義方式及位置。此時,只須要一句命令便可提交任務。瀏覽器
$ nnictl create --config ~/nni/examples/trials/mnist-annotation/config.yml
提交訓練任務以後終端會返回提交任務的索引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?