基于OpenCL的深度学习工具:AMD MLP及其使用详解
from:http://www.csdn.net/article/2015-08-05/2825390
【編者按】深度學習是近年來迅速發展和突破的機器學習領域,具有非常廣泛的應用前景。將服務器GPU應用到深度學習過程中,可以更好地推動深度學習技術研究和應用的發展。本文介紹AMD深度學習團隊開發的MLP學習工具軟件的使用,為深度學習研究人員和開發商提供一個高性能、高易用性的深度學習的軟硬件平臺方案。AMD-MLP基于OpenCL,支持不同類型的GPU平臺,并能通過多GPU擴展學習速度。
深度學習神經網絡簡介
深度學習是人工智能的學科—機器學習的一個研究領域,是多種學習方法的集合。深度學習的各種學習方法都采用類似于人腦中的生物神經網絡的結構建立模型,即較大層次和規模的人工神經網絡(DNN),模擬人腦神經系統的信息處理和交換過程,實現對數據的分析和處理。
深度學習是近年來機器學習研究中獲得最多關注的領域。業界一般認為,深度學習的快速發展和應用是以多倫多大學的Geoffrey Hinton教授發表在科學雜志上的一篇文章[1]開始的。自Hinton的文章以后,深度學習在語音識別、圖像分類、自然語言處理等領域取得了不斷的突破。尤其值得一提的是,由于采用深度學習技術,在ImageNet 圖像分類2012年度的挑戰賽中,top5 分類的最佳識別率達到了85%[2];并在最近,即2014年度的挑戰賽中,top5分類的最佳識別率超過了93%[3],可見深度學習對圖像識別領域的推動非常明顯,足以讓業界人心激動。
各種深度學習的模型結構讀者可從Google上搜索得到。典型的DNN結構都會包括一個輸入層,一個輸出層和若干隱含層,不通類型的DNN會有不同類型的隱含層類型、功能、連接方式及具體學習策略和算法。典型的DNN有用于采用監督式學習方法,常用于圖像分類的卷積神經網絡[4](CNN)和采用非監督式學習方法,用于對深度網絡模型參數進行預訓練的深度信念網絡(DBN)[4]。
MLP全稱Multi-layer Perceptron(即多層感知機),是一種前向觸發的人工神經網絡結構。MLP特點是相鄰兩層的節點之間全連接,同一層的節點之間無連接,跨層之間無連接。MLP屬于監督式學習技術,用誤差向后傳播的思想來學習神經網絡模型的參數。MLP對標簽數據進行學習的結果就是一個表示分類器或預測器的神經網絡,可用于解決分類或回歸問題。傳統的MLP概念并不特指深度的神經網絡,但由于實現技術的進步,目前我們所研究和采用的MLP網絡都是網絡層數比較多,節點規模比較大的網絡結構,同時MLP采用的誤差后向傳播的思想以及其網絡層中的非線性轉換過程和監督式的深度學習模型完全一致,所以我們認為MLP是深度學習的一種方式。
MLP已經被用于語言識別,圖像識別,機器翻譯等領域,也可用于一些結構化、離散型數值的數據的特征識別,如網絡包的類型識別[5]。
深度學習需要GPU加速
典型的深度神經網絡由于層數多,結構復雜,節點數多,訓練數據集大等特點,訓練過程所需的時間特別長,通常以數日,數周,甚至數月來計算。計算型獨立顯卡(GPU)由于其計算單元數量大,并行處理能力強,可部署密度大等特點,幾乎成為提高深度學習過程速度的一致選擇。
作為高性能計算專業顯卡提供商,AMD?長期致力于在高性能計算和大數據分析領域為用戶和開發商伙伴提供軟硬平臺。AMD中國深度學習團隊專門開發了AMD-MLP軟件,幫助用戶在AMD專業硬件平臺上完成各種深度學習任務。本文所述開發是在AMD S9150 高性能顯卡上開發的,S9150具有2816 個流處理器(44 個計算單元)、5.07 TFLOPS單精度負浮點計算能力、2.53 TFLOPS雙精度浮點計算能力、 16G GDDR5 內存、320 GB/S 內存帶寬,可以勝任大型DNN學習任務的運行。其16G內存完全足夠存放目前為此參加ImageNet圖像分類競賽的有公開的大規模CNN模型的網絡參數,避免了DNN學習過程中將網絡模型參數分散到多個GPU所帶來的算法復雜性。?
AMD-MLP?深度學習技術
AMD-MLP是AMD中國異構計算部門開發的私有軟件,其開發人員都是GPU計算和應用方面的專家,在使用異構計算技術提高軟件性能方面有豐富的理解和實現經驗,他們本著簡單、實效、方便用戶、注重性能的產品實現原則,為AMD-MLP帶來了如下特點:
1)??完全的C++實現
全部的代碼用C++類進行組織。用C++類的公共接口作為API,開發者用戶無論是利用AMD-MLP進行數據學習,建立數據分類器;還是使用已產生的數據分類器開發識別型應用,編程都非常簡單。
2)??基于開放標準實現
AMD- MLP 用OpenCL作為使用GPU進行通用計算的編程工具,來實現深度學習過程中的重要計算操作。由于OpenCL是開放標準的異構編程工具,其被AMD、Intel及Nvidia等多個廠家所實現,因此AMD-MLP 能在不同廠家的設備上運行,軟件的移植性很好。clBlas是基于OpenCL實現的矩陣運算操作庫,AMD-MLP中執行矩陣運算的地方直接用clBlas的接口實現,簡化了編程。由于clBlas是實現開放標準的開源軟件,其同樣保證了AMD-MLP的可移植性。
3)??模塊化,易于擴展,用戶只需要開發自己的數據接口C++類就可使用MLP學習自己的數據
用戶在用AMD-MLP開發自己的分類器、識別器或預測器時,通常都會有和自己的應用領域相關的數據,甚至是自己的企業特定的數據源,由于這些數據的文件格式不一樣,AMD-MLP不可能為所有用戶都開發好數據使用接口,但AMD-MLP采用了高度模塊化的設計,AMD-MLP通過實現一個DNNDataProvider對象提供了一個相對統一的數據訪問接口和數據在內存中的格式,基于這個統一的接口,用戶只需要做少量的開發工作(開發一個DNNDataProvider派生類) 識別其數據在文件中的格式并將其加載到內存即可,用戶不需要關心數據在學習過程中如何被組織,傳輸和使用。AMD-MLP已經為手寫數字識別數據源MNIST實現了一個數據接口,可作為用戶實現自己數據源接口的參考。AMD-MLP的模塊性還表現在其用分開的類實現了深度學習過程參數的配置的、神經網落狀態SnapShot的功能,理解和使用都非常方便。
4)??支持多種計算設備
大規模的深度網絡學習過程通常需要功能強大的獨立顯卡設備,但小型的神經網絡及小型數據集的學習完全可以在集成顯卡或CPU設備上進行,如作者本人就經常在AMD的A10 APU上進行MNIST數據集的學習。另外,使用學習好的分類器或預測器進行數據分類或函數數值預測時如果其對單個請求返回結果的實時性要求不高,分類或預測的神經網絡計算過程完全可以用集成GPU或CPU設備來計算。為了滿足這多種情況的需要,AMD-MLP 支持dGPU、iGPU、CPU三種設備,用戶在使用時可靈活根據需要進行選擇。
5)??支持靈活的網絡結構和學習參數配置
用戶使用AMD-MLP 進行神經網絡學習的配置過程非常簡單,只需要將網絡結構和學習過程的控制參數寫在一個文本文件中,每次學習時按需要進行修改即可。
6)??算法的靈活度
AMD-MLP對神經網絡算法的支持比較靈活,允許用戶按自己的需要進行選擇,如在神經網絡隱含層的激活(Activation)函數上,AMD MLP目前已經支持ReLu、TanH、Sigmoid和Softsign四種,允許用戶通過配置文件進行選擇,以滿足不同數據學習的需要。另外AMD-MLP也允許用戶通過配置文件對學習率參數進行動調整,并控制學習率調整的時機和速度。
7)??通過Checkpointing?支持對大規模數據的不間斷學習
大規模的數據集的學習通常需要花很長的時間(幾天,幾周甚至幾月),在這個過程中,如果計算機系統發生任何意外,學習過程就會從頭開始。AMD-MLP 實現了一個高效率的異步CheckPointing機制,來周期性(如每30分鐘)地對學習的中間結果進行Snapshot,保證當學習過程因計算機系統的故障而中斷時,系統恢復后學習過程能從最近的Snapshot狀態繼續進行避免了大量的時間浪費。
8)??用多GPU來提高對大規模數據的訓練速度
神經網絡結構和數據集的規模越大,解決的數據問題越復雜,所需的學習時間就越長。過長的學習時間周期,不僅影響創建一個分類或預測結果的時間,還不利于神經網絡學習過程中經常需要的參數調優工作。因此幾乎大多數高效的神經網絡學習軟件除充分利用業界最先進的GPU設備外,還采用了各種方法來加速神經網絡的學習過程。AMD-MLP實現了用多個GPU通過數據劃分進行并行深度神經網絡學習的訓練過程,極大提高了利用神經網絡技術能進行學習的數據的類型和規模。AMD中國異構計算部將在另外一篇文章中專門介紹AMD-MLP多GPU學習的實現方法。
使用AMD-MLP進行深度學習過程舉例
下面的內容以利用MNIST數據集學習手寫數字識別器為類,介紹怎樣用AMD-MLP進行編程,執行數據集學習和測試的過程:
1)??分類問題理解
MLP能解決的典型問題包括分類和回歸。分類包括二值分類和多類分類。手寫數字的識別就是一個多類分類問題。具體而言,其輸入是一個手寫數字的圖像,輸出是代表0~9共10個數字的類別值。MLP的訓練過程是監督式學習,其訓練的策略是在輸入數據集確定的條件下,用某種方法不斷調整神經網絡參數,使其標記在輸出端出現的概率最大。為了和神經網絡結構及訓練策略要求的計算過程一致,在實際使用MLP時,MNIST的28x28的輸入圖像要轉變成784-元的浮點向量;代表圖像類型的標簽也要轉換成10-元的浮點數組,如 4要換成(0,0,0,1,0,0,0,0,0)。MLP訓練的最后結果是輸出一個參數確定的神經網絡結構,這個神經網絡結構能將任何一個28x28大小的圖像,轉換為10-元的浮點數組,在實際應用這個學習好的神經網絡時,對任何一個28x28的輸入圖像,其對應的數字類別就是輸出的10-元浮點數組中數值最大的元素的索引(即概率最大的類別)。
2)??MNIST?手寫識別數據集
MNIST手寫識別數據集是網上可公開獲取的用于手寫體數字識別的數據集,其常常被用來測試深度學習軟件。該數據集包括60000個樣本規模的訓練集,10000個樣本規模的測試集,每個樣本的都是標準的28x28大小的手寫灰度數字圖像,數據集和樣本的格式有詳細的描述,具體參考http://yann.lecun.com/exdb/mnist/?。由于MNIST數據集簡單易用,對于深度學習軟件的開發者而言,用MNIST來初步檢驗測試自己軟件解決分類問題的功能是一個不錯的選擇。MNIST網站上還公開了用各種不同類型機器學習方法進行手寫識別在MNIST測試集上所達到的性能結果,其中的數據是很好的參考。
3)??代碼步驟講解
使用AMD-MLP的API進行神經網絡學習的代碼非常簡單,下面兩個截圖中代碼完整的展示了用AMD-MLP 進行MNIST數據集的學習和并測試學習后的識別率的過程。
對MNIST數據集進行學習的代碼步驟如下:
用戶的數據集及神經網絡規模比較大時,如果需要使用多個GPU進行學習,只需要將代碼中的MLPTrainerOCL替換成MLPTrainerMGpuMaster類即可,其中的一個構造參數指定GPU的數量。
使用MNIST測試集對訓練的結果進行評估的代碼步驟如下:
4)??神經網絡結構和參數配置
AMD-MLP 的訓練過程的配置非常簡單,當然這和MLP網絡結構本身相對簡單有關。配置文件是一個按行定義的文本文件,其中既包括對神經網絡結構的定義,也包括對訓練過程的控制參數的指定。說明如下:
- Network Type 指定MLP神經網絡要解決的問題的類型。這個參數通常影響神經網絡輸出層的計算方法。Network Type 的值可有 Multiple Classification, Binary Classification, Regression三種。
- Layers 指定MLP神經網絡總的層數,注意這個層數包括了輸入層。
- Input Layer, Hidden Layer, Output Layer 分別定義神經網絡輸入,隱含和輸出層的參數。Input Layer要指的只有該層的節點數;Hidden Layer 可以有多個,每個隱含層需要指定節點數,? 所用的激活方法以及該層的初始學習率;Output Layer的參數和Hidden Layer? 類似,我們將其用不同的關鍵字標識,是因為其激活方法的設定有不同的意義。在我們的MNIST學習例子中,只有一個隱含層,其節點數為800;輸入層的節點數為784,代表輸入數據大小為28x28的圖像;輸出層的大小為10,代表分類問題的類別總數為10。
- Cost Function 指定輸出層誤差的反向傳遞方式。對于多值分類問題,其應該指定為CE,對二值分類或回歸問題,其應該指定為SSE。
- Momentum 和Weight Decay 都是MLP學習的梯度下降法中,用來控制Weights和Biases參數更新的參數。
- Epochs 指定本次訓練要執行的輪數,即全部數據要學習多少遍。
- Dynamic Tuning 指是否要對學習率參數進行動態調整。當該參數值為 true時,Start Epoch和Interval Epoch參數分別代表進行調整的起點和間隔。
用?AMD-MLP學習出的手寫數字識別器演示
1)??演示程序
AMD設計了一個利用MLP做手寫數字識別的演示程序,包含GPU及CPU版本的識別演示程序(?源碼下載點擊這里),是在Fedora 19下用Gtk3開發的,需要在有Gtk3的Linux下運行,其中CPU版本的程序在AMD或Intel的CPU上都可運行。這個壓縮包中的二進制文件mlp_nnet.dat就是以前神經網絡學習的輸出,其中包含了神經網絡的全部參數信息,它就代表了一個手寫數字分類器。
2)??演示截圖
總結
AMD-MLP 是由AMD異構計算部門深度學習團隊開發的深度學習軟件,經過專業設計,它使用非常方便。AMD-MLP在AMD的GPU平臺上開發,但能幫助用戶在不同類型的GPU平臺上完成深度學習任務,并能通過多GPU擴展學習速度。AMD-MLP是目前不多的,基于OpenCL實現的深度學習軟件。同時AMD異構計算團隊正在在其他流行的深度學習框架如Torch7、Caffe等上進行工作,后續會推出自己的方案。
參考文獻
[1] Hinton, G. E. andSalakhutdinov, R. R. (2006) Reducing the dimensionality of data with neuralnetworks.??http://www.cs.toronto.edu/~hinton/science.pdf
[2] LSVRC 2012 result.?http://www.image-net.org/challenges/LSVRC/2012/results.html
[3] LSVRC 2014 result.?http://image-net.org/challenges/LSVRC/2014/results
[4] Deep Learning.?https://en.wikipedia.org/wiki/Deep_learning
[5] Chintan Trivedi and Mo-Yuen Chow etc. Classification of Internet Traffic using Artificial Neural Networks.?http://repository.lib.ncsu.edu/dr/bitstream/1840.4/1053/1/TR_2002_05.pdf
作者簡介:AMD中國異構計算部是AMD中國區負責構建異構計算系統應用技術和優化方案的部門,與學術和業界廣泛合作,研究方向主要面向高性能計算,大數據挖掘,視頻圖像應用,在系統和算法層面提供可實施級支持。?(編輯:周建丁)
總結
以上是生活随笔為你收集整理的基于OpenCL的深度学习工具:AMD MLP及其使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis命令——Keys相关
- 下一篇: redis集群(主从配置)