1. 程式人生 > >微軟開源自動機器學習工具NNI安裝與使用

微軟開源自動機器學習工具NNI安裝與使用

微軟開源自動機器學習工具 – NNI安裝與使用

  在機器學習建模時,除了準備資料,最耗時耗力的就是嘗試各種超參組合,找到最佳模型的過程了。對於初學者來說,常常是無從下手。即使是對於有經驗的演算法工程師和資料科學家,也是很難把握所有的規律,只能多次嘗試,找到較好的超參組合。而自動機器學習這兩年成為了熱門領域,著力解決超參除錯過程的挑戰,通過超參選擇演算法和強大的算力來加速超參搜尋的過程。NNI (Neural Network Intelligence) 是微軟開源的自動機器學習工具包。與當前的各種自動機器學習服務或工具相比,有非常獨特的價值。本文作為系列文章的開篇,將首先介紹NNI 的特點和價值,然後用一個簡單的mnist樣例帶您開啟自動化機器學習之旅。

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?