感受Nvidia Jetson TX1的洪荒之力!
2023-07-08 19:20:17 1
從機器學習說起
從2015年起國內外就掀起了機器學習、深度學習的熱潮。以google、facebook、BAT等網際網路巨頭廣泛研究應用機器學習以及深度學習技術並在業務方面顯現出了良好的效果,尤其是在語音識別和圖像識別等領域,而AlphaGo戰勝李世石又將大家對機器學習、深度學習的關注推向了新的高峰。現在,在人臉識別、手寫識別、語音識別、語意理解、機器翻譯、無人駕駛騎車,無人機和智慧機器人等代表未來技術的各個領域都有機器學習、深度學習的身影。
「機器學習是研究讓計算機無需顯式編程即可具有學習能力的學科」(Arthur Samuel,1959)。機器學習以統計學,概率論,組合學和優化理論等為基礎,開發並利用算法來識別數據中的模式,由此來指引決策。以機器學習的分支神經網絡為例,訓練人工神經網絡可以看作尋找並確定最優網絡參數(例如內部網絡權重與傾向),以減小初始數據集上的誤差的函數優化問題。但使用數據來擬合模型是一個時間代價高昂的計算過程,它需要使用不同的參數組合反覆地調用目標函數,計算訓練數據中的每個樣本,其算法的時間複雜度約為O(N^2)或者更高(N表示數據的規模),如此一來反覆計算目標函數佔據了大量執行時間,在這種情況下,可以利用並行計算來縮減運行時間,而並行計算正是GPU的優勢,通過將目標函數的計算等過程映射到能執行上百個並行線程的GPU上,往往可以在不需要配置維護大規模伺服器機群或多機環境的情況下帶來數倍甚至數十倍的性能提升。
根據前文的介紹,Jetson TX1憑藉其Teraflops級的浮點計算能力和強大的軟體堆棧以及超低得能耗 和嬌小的身軀足以負載特定場合下的中小規模的機器學習的應用和開發,本文將運用神經網絡實現一個經典的異或邏輯來一探Jetson TX1在機器學習領域的洪荒之力。
異或邏輯的神經網絡實現
神經網絡是由具有適應性的簡單單元組成的廣泛並行互連的網絡,它的組織能夠模擬生物神經系統對真實世界物體所作出的交互反應。神經網絡中最基本的成分是神經元模型(Neural Model)(又稱Logistic unit)。對於人類而言,我們的視覺聽覺是由大腦的神經中樞產生。而神經中樞是由大量的神經元相互連接而成。一個神經元通過樹突接受其他神經元傳來的化學物質(信息),從而改變該神經元的電位,當電位到達某一闕值(threshold)時,該神經元被激活,即「興奮」起來,從而通過軸突向其他神經元發送化學物質,如圖1所示。
生物神經系統中的神經元模型
人工神經元模型便是模擬上述的神經元接受信息並傳遞信息的過程。如圖2所示,人工神經元接收來自n個其他人工神經元傳遞過來的輸入信號,這些輸入信號通過帶權重的連接進行傳遞,人工神經元將接收到的總輸入值與人工神經元的闕值進行比較,再通過激活函數(activation function)處理以產生神經元的輸出。
人工神經網絡中的神經元模型
由於我們需要實現的異或邏輯並不是線性可分的問題,所以為了實現異或邏輯,我們需要使用神經元搭建含有隱藏層的神經網絡,其由三部分組成,分別是輸入層(input layer),隱藏層(hide layer)和輸出層(output layer),如圖3所示。
一個含有隱藏層的神經網絡示意
如上圖所示,除了需要大量彼此連接的節點 (即神經元),神經網絡還需要具備以下特性:
1.激活函數,每個神經元根據激活函數,通過計算處理來自其它相鄰神經元的加權輸入值。
2.連接權重,它定義神經元之間的信息傳遞的強度,算法會依靠大量的數據來訓練,不斷自我調整連接權重。
3.成本函數,用來定量評估計算出來的輸出結果於真實值的偏離程度。
4.學習的算法,這是根據成本函數的結果, 自學, 糾錯, 最快地找到神經元之間最優化的加權值。
在學習算法方面,目前,有許多流行的庫、工具和算法可以用來計算針對多變量函數的最優擬合,同時網際網路上也有很多免費許可的數值工具和代碼供我們使用,本文將選擇使用Nelder-Mead方法,NM方法是一種常見的直接搜索型非線性優化方法,我們可以在網際網路上找到John Burkhardt創建的一個免費的C語言實現,在這裡,我們只需要進行一些細微的調整,就可以用在本次的代碼中。
編寫完代碼後,我們可以選擇直接在HOST電腦中編譯生成可執行文件,如下圖所示。
在HOST電腦上直接編譯生成可執行文件
或可以將源碼文件直接同步到Jetson TX1,然後在其命令行中通過命令編譯生成可執行文件,如下圖所示。
在Jetson TX1上直接編譯生成可執行文件
這裡需要注意的是,用戶開發的一些項目可能會用到第三方的庫或者工具,如Lapack和Levmar等,如果選擇在HOST電腦上完成編譯,只需要在HOST電腦上安裝配置所需的庫和工具,如果用戶需要在Jetson TX1上直接編譯生成項目,那麼同時也需要在Jetson TX1上安裝配置對應的庫和工具。
程序執行結果和性能
項目成功生成之後,使用「./」在Jetson TX1命令行中運行,得到如下結果:
Jetson TX1異或邏輯單精度運行結果
Jetson TX1異或邏輯雙精度運行結果
GeForce GT650M異或邏輯單精度運行結果
GeForce GT650M異或邏輯雙精度運行結果
Core i7-3630QM異或邏輯雙精度運行結果
Jetson TX1運行異或邏輯單精度共用時174.12秒,處理完成0.48GB數據;雙精度共用時636.05秒,處理完成0.96GB數據,而與此同時,筆者在筆記本電腦上使用GeForce GT650M運行異或邏輯處理相同數據量單精度共用時201.02秒,雙精度共用時435.69秒,而在Core i7-3630QM CPU上運行類似雙精度代碼共用時5204.50秒,由此也可以看出Jetson TX1與筆記本電腦相比帶來的性能的提升尤其是GPU與CPU相比帶來的性能提升;同時在這裡引用其他人在單路至強E5630上運行類似算法時的平均目標函數運行時間數據:單精度 0.45秒,雙精度 0.54秒;而對應的Jetson TX1的數據則為0.03秒和0.18秒,與單路至強E5630相比,分別由15倍和3倍的加速。僅使用一個嵌入式開發板就能達到這樣的性能水平還是十分令人驚訝。
異或邏輯總運行時間對比(單位:秒)
平均目標函數運行時間對比(單位:秒)
本次開發的一些體驗
Jetson TX1的性能令人驚訝
在本次的項目示例中,峰值功耗僅10W的Jetson TX1在性能上完勝了筆者搭載core i7處理器的筆記本電腦,並在類比的數據中,領先於單路E5630,令筆者更深刻的體會到了其1Teraflops計算能力帶來的時間效率提升。作為一塊嵌入式開發板,確實令人映像深刻。
NVIDIA CUDA提供的示例代碼對實際項目的開發幫助很大
由於本次項目中使用了OpenMP中的部分函數,所以在編譯時需要配置專門的參數,如-fopenmp等,而NVIDIA CUDA 示例代碼cudaOpenMP中的Makefile示例給筆者提供了極大的幫助,參考其修改本次項目中的Makefile以完成項目的成功編譯生成。■