邱紅飛,李先緒,黃春光
(中國(guó)電信股份有限公司廣州研究院,廣東 廣州 510630)
機(jī)器學(xué)習(xí)是人工智能領(lǐng)域的關(guān)鍵技術(shù),主要是研究如何使計(jì)算機(jī)從給定的數(shù)據(jù)中學(xué)習(xí)規(guī)律。深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一種,典型的深度學(xué)習(xí)算法包括卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等。深度學(xué)習(xí)使用的神經(jīng)網(wǎng)絡(luò)訓(xùn)練樣本量巨大,參數(shù)量大,運(yùn)算主要集中在矩陣乘法和卷積上,所以采用GPU(Graphics Processing Unit,圖形處理器)加速網(wǎng)絡(luò)運(yùn)算。GPU芯片擁有數(shù)千計(jì)的核心,面向大規(guī)模并行運(yùn)算,浮點(diǎn)運(yùn)算能力強(qiáng),處理矩陣計(jì)算高效,因此GPU被運(yùn)用在深度學(xué)習(xí)領(lǐng)域之中。
基于GPU的基礎(chǔ)設(shè)施云是未來(lái)人工智能應(yīng)用與開(kāi)放智能云服務(wù)的重要基礎(chǔ)架構(gòu),是未來(lái)企業(yè)基礎(chǔ)架構(gòu)的技術(shù)高點(diǎn)和發(fā)展方向。目前GPU的使用場(chǎng)景主要有圖形圖像處理領(lǐng)域、高性能計(jì)算領(lǐng)域、深度學(xué)習(xí)領(lǐng)域等,同時(shí)GPU服務(wù)器在運(yùn)營(yíng)商也有廣泛的應(yīng)用場(chǎng)景,如5G無(wú)線大數(shù)據(jù)、高性能數(shù)據(jù)庫(kù)、智能CDN(Content Delivery Network,內(nèi)容分發(fā)網(wǎng)絡(luò))、語(yǔ)音識(shí)別等。但目前中國(guó)電信對(duì)GPU云建設(shè)及應(yīng)用研究落后于國(guó)內(nèi)外互聯(lián)網(wǎng)企業(yè),同時(shí)GPU及其計(jì)算框架是當(dāng)前人工智能重要的一環(huán),屬于企業(yè)高度關(guān)注領(lǐng)域。
CUDA(Compute Unified Device Architecture,統(tǒng)一計(jì)算設(shè)備架構(gòu))是NVIDIA公司設(shè)計(jì)的一個(gè)計(jì)算架構(gòu),針對(duì)異構(gòu)計(jì)算資源下的大規(guī)模并行計(jì)算。CUDA提供給開(kāi)發(fā)人員一個(gè)完整的接口,可以訪問(wèn)NVIDIA GPU的本地命令集、存儲(chǔ)器等并行計(jì)算元素,使它們變成像CPU(Central Processing Unit,中央處理器)一樣的開(kāi)放式架構(gòu)。目前NVIDIA的GPU產(chǎn)品包括GeForce、Quadro和Tesla產(chǎn)品,都支持CUDA。如圖1所示,CUDA模型的計(jì)算流程可以歸結(jié)為4步:
(1)把需要處理的數(shù)據(jù)從CPU內(nèi)存復(fù)制到GPU顯存中。
(2)CPU把程序指令發(fā)送給GPU,GPU開(kāi)始并發(fā)執(zhí)行。
(3)GPU的多處理器對(duì)顯存中的數(shù)據(jù)執(zhí)行相關(guān)指令,最后的計(jì)算結(jié)果存放在顯存中。
(4)從GPU顯存中把計(jì)算結(jié)果復(fù)制到GPU內(nèi)存里。
圖1 CUDA模型計(jì)算流程
GPU的強(qiáng)大計(jì)算能力得益于其多核的設(shè)計(jì),目前一般CPU的核心數(shù)量為4~18核,而GPU一般都擁有幾千個(gè)計(jì)算核心,如表1的Tesla產(chǎn)品參數(shù)所示,GPU可以作為CPU的協(xié)處理器與CPU做并行計(jì)算。在相同的時(shí)鐘頻率下,GPU的運(yùn)算效率與其計(jì)算核心的數(shù)量成正比,能同時(shí)運(yùn)行成千上萬(wàn)個(gè)線程。對(duì)于應(yīng)用程序符合大規(guī)模并行結(jié)構(gòu)的系統(tǒng),采用GPU服務(wù)器,其運(yùn)行效率會(huì)大幅提升。
(1)GPU服務(wù)器中的通信帶寬衡量及存在問(wèn)題
在深度學(xué)習(xí)訓(xùn)練過(guò)程中,GPU間需要大量地交換數(shù)據(jù),GPU通信性能是非常重要的指標(biāo)。如圖2所示,在GPU服務(wù)器中,GPU之間采用NVLINK或者PCIE連接,CPU和GPU之間采用PCIE連接,標(biāo)準(zhǔn)為32 GB。CPU之間采用QPI(QuickPath Interconnect,快速通道互聯(lián))連接。
不同機(jī)型的帶寬如表1所示,包括GPU互連帶寬,其中NVLINK鏈路總帶寬為300 GB/s,是PCIE帶寬的10倍。CPU和GPU之間采用PCIE連接,標(biāo)稱為32 GB/s。目前主流廠家都推出了基于GPU的異構(gòu)服務(wù)器,包括華為G560系列、烽火G系列產(chǎn)品等,由于CPU、GPU及GPU之間的實(shí)際通信帶寬與廠家的芯片架構(gòu)設(shè)計(jì)、操作系統(tǒng)和應(yīng)用軟件相關(guān),實(shí)際通信帶寬都會(huì)低于標(biāo)稱帶寬。
如圖2所示,鏈路設(shè)計(jì)導(dǎo)致通信帶寬差別。在對(duì)稱鏈路架構(gòu)中GPU通過(guò)多個(gè)PCIE(Peripheral Component Interconnect Express,高速串行計(jì)算機(jī)擴(kuò)展總線標(biāo)準(zhǔn))分別與兩顆CPU鏈接,數(shù)據(jù)交換繁瑣,延時(shí)高,性能損失大;在非對(duì)稱鏈路架構(gòu)中,GPU與同一顆CPU鏈接。根據(jù)實(shí)驗(yàn)室測(cè)試數(shù)據(jù),對(duì)稱鏈路中GPU1和GPU8延時(shí)為21.2 μ s,在非對(duì)稱鏈路結(jié)構(gòu)中GPU1和GPU8延時(shí)為10.6μ s,說(shuō)明不同鏈路結(jié)構(gòu)設(shè)計(jì)對(duì)通信帶寬影響巨大。
(2)GPU服務(wù)器中的性能衡量及存在的問(wèn)題
圖2 對(duì)稱與非對(duì)稱GPU鏈路架構(gòu)
浮點(diǎn)數(shù)是計(jì)算機(jī)上最常用的數(shù)據(jù)類型,主要有雙精度、單精度和半精度,雙精度64位,單精度32位,半精度16位。半精度能精確到3位小數(shù),單精度精確到7位小數(shù),雙精度可精確到15位小數(shù)。半精度由于使用字節(jié)少,計(jì)算精度低,所以會(huì)有很多數(shù)據(jù)存在誤差,其表示的數(shù)據(jù)范圍也比較低,最大能表示65 520。雙精度和單精度是為了計(jì)算,而半精度更多是為了降低數(shù)據(jù)傳輸和存儲(chǔ)成本。所以半精度適用于對(duì)精度要求不高,對(duì)帶寬或者對(duì)存儲(chǔ)空間要求高的場(chǎng)景,比如圖形圖像處理、深度學(xué)習(xí)等??紤]到深度學(xué)習(xí)的模型可能會(huì)有幾億個(gè)參數(shù),使用半精度傳輸可以大大降低帶寬。深度學(xué)習(xí)不需要高精度的原因是在于其統(tǒng)計(jì)學(xué)算法,這種算法是一種糾錯(cuò)過(guò)程,精度的損失也可以一同算入和現(xiàn)實(shí)的差距中,由算法過(guò)程來(lái)自行減少。
不同GPU型號(hào)的運(yùn)算性能如表1所示,其中包括雙精度、單精度、半精度、整數(shù)的運(yùn)算性能。如烽火G4010提供的標(biāo)稱性能指標(biāo)是10顆GPU,每秒187.5萬(wàn)億次FP16浮點(diǎn)運(yùn)算性能,該機(jī)型只是提供了半精度與單精度的性能,并沒(méi)有提供GPU服務(wù)器深度學(xué)習(xí)的性能。GPU服務(wù)器性能和廠商設(shè)備型號(hào)、CPU的類型、CPU內(nèi)存、GPU類型、GPU顯存容量等相關(guān)。所以需要在主流的框架上獲取各類GPU服務(wù)器的深度學(xué)習(xí)性能指標(biāo),從而驗(yàn)證其設(shè)備處理能力。
表1 NVIDIA TESLA系列產(chǎn)品關(guān)鍵參數(shù)
測(cè)試環(huán)境主要包括硬件環(huán)境、軟件環(huán)境和測(cè)試數(shù)據(jù)。
(1)硬件環(huán)境中GPU服務(wù)器測(cè)試采用8個(gè)NVIDIA Tesla P100節(jié)點(diǎn),具體參數(shù)見(jiàn)表1,Tesla P100采用Pascal架構(gòu),其特點(diǎn)為適用于總計(jì)速率為720 GB/s帶寬的16 GB顯存。CPU采用英特爾Purley平臺(tái)的金牌5118,CPU配置為2顆,2路12核心,主頻為2.30 GHz;內(nèi)存DDR4-2666MHz,單條16 G,共24條。
(2)在軟件環(huán)境中操作系統(tǒng)為RedHat7.3,深度學(xué)習(xí)框架采用Tensorflow1.3和Caffe 0.16.3,GPU運(yùn)算平臺(tái)采用CUDA 8.0。
(3)在Tensorflow框架基準(zhǔn)測(cè)試使用的是構(gòu)造數(shù)據(jù)集,與ImageNet一致,不需要額外準(zhǔn)備數(shù)據(jù)集。Caffe框架測(cè)試使用的是真實(shí)數(shù)據(jù)集,其中驗(yàn)證數(shù)據(jù)集為6.28 G,訓(xùn)練數(shù)據(jù)集為137 G。
(1)GPU與CPU之間通信帶寬測(cè)試
在GPU服務(wù)器中,CPU和GPU之間采用PCIE鏈接,標(biāo)稱帶寬為32 GB/s,測(cè)試的主要目的是檢測(cè)GPU與CPU之間的實(shí)際通信帶寬。CPU和GPU之間的通信帶寬包括下行帶寬和上行帶寬,下行帶寬是指CPU到GPU的帶寬,上行帶寬是指GPU到CPU的帶寬。
1)測(cè)試前置條件:確保服務(wù)器電源供電正常、設(shè)備為穩(wěn)定商用BIOS版本、預(yù)裝Linux系統(tǒng)并且各驅(qū)動(dòng)程序安裝正常,先確保安裝CUDA環(huán)境和GPU驅(qū)動(dòng)。
2)參考測(cè)試步驟如下:
(a)從github上下載SHOC(Scalable HeterOgeneous Computing)源碼包,SHOC是一個(gè)針對(duì)異構(gòu)系統(tǒng)性能的可延伸性測(cè)試工具。
(b)解壓下載的源碼包:#unzip shoc-master.zip。
(c)配置編譯環(huán)境:確保安裝CUDA,確保CUDA環(huán)境變量配置正確,多節(jié)點(diǎn)執(zhí)行SHOC需要MPI支持,確保MPI環(huán)境變量配置正確。
(d)編譯安裝:
# cd shoc-master
#CUDA_CPPFLAGS=’-gencode=arch=comput e_20,code=sm_20 -gencode=arch=compute_30,code=sm_30-gencode=arch=compute_32,code=sm_32-genco de=arch=compute_35,code=compute_35 -gencode=arc h=compute_53,code=compute_53-gencode=arch=comp ute_52,code=compute_52-gencode=arch=compute_50,code=compute_50’ ./configure
# make && make install
注:注意-gencode前均有空格。
(e)測(cè)試運(yùn)行:
# perl ./tools/driver.pl–help
注:查看help命令,查看運(yùn)行參數(shù)。
如:# perl ./tools/driver.pl -cuda-s 4-d 0-benchmark BusSpeedDownload;
# perl./tools/driver.pl -cuda-s 4-d 0-benchmark BusSpeedReadback。
說(shuō)明:執(zhí)行cuda模式,-s表示規(guī)模,-d表示在哪個(gè)device上運(yùn)行程序,-benchmark表示只運(yùn)行BusSpeedDownload/ BusSpeedReadback。
3)測(cè)試結(jié)果及分析
標(biāo)稱下行帶寬為16 GB/s,實(shí)際帶寬BusSpeed Download=12.4 GB/s;
標(biāo)稱上行帶寬為16 GB/s,實(shí)際帶寬BusSpeed Readback=13.1 GB/s。
從測(cè)試數(shù)據(jù)中可以得出CPU和GPU的實(shí)際帶寬均低于標(biāo)稱的16 GB/s,另外不同廠商設(shè)備的測(cè)試結(jié)果也有區(qū)別。
(2)GPU與GPU之間通信帶寬測(cè)試
GPU互連帶寬,其中NVLINK鏈路標(biāo)稱帶寬為300 GB/s,PCIE鏈接標(biāo)稱帶寬為32 GB/s。帶寬測(cè)試目的是獲取GPU之間的實(shí)際通信帶寬。測(cè)試包括單向的GPU通信帶寬和雙向的GPU通信帶寬測(cè)試。
1)測(cè)試前置條件:確保服務(wù)器電源供電正常、設(shè)備為穩(wěn)定商用BIOS版本、預(yù)裝Linux系統(tǒng)并且各驅(qū)動(dòng)程序安裝正常,先確保安裝CUDA環(huán)境和GPU驅(qū)動(dòng)。
2)參考測(cè)試步驟如下:
(a)安裝并配置好CUDA-8.0;
(b)執(zhí)行:# cd /usr/local/cuda-8.0/samples/1_Utilities/p2pBandwidthLatencyTest;
(c)執(zhí)行:# nvidia-smi -pm 1;#./p2pBandwidth LatencyTest。
3)測(cè)試結(jié)果及分析
測(cè)試結(jié)果如表2所示,其中A廠商為非對(duì)稱架構(gòu),B廠商為對(duì)稱架構(gòu)。測(cè)試數(shù)據(jù)為雙向的GPU通信帶寬:Bidirectional P2P為Enabled Bandwidth Matrix(GB/s)和GPU之間的平均時(shí)延。GPU通信帶寬和時(shí)延包括同區(qū)(如GPU1和GPU4)和跨區(qū)(如GPU1和GPU8)的測(cè)試數(shù)據(jù)。
表2 GPU間通信帶寬及時(shí)延
從測(cè)試結(jié)果分析,A廠商(非對(duì)稱架構(gòu))的GPU間帶寬性能強(qiáng)于B廠商(對(duì)稱架構(gòu)),時(shí)延數(shù)據(jù)卻是對(duì)稱架構(gòu)強(qiáng)于非對(duì)稱架構(gòu)。原因是最新測(cè)試數(shù)據(jù)都是采用英特爾Purly平臺(tái),以前測(cè)試數(shù)據(jù)都是基于英特爾上一代處理器平臺(tái)。因此在新一代英特爾Purly平臺(tái)中,目前常用于GPU間鏈接的非對(duì)稱架構(gòu)還需要進(jìn)一步調(diào)整。
(1)卷積神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)框架介紹
Image Net是進(jìn)行大規(guī)模物體識(shí)別和檢測(cè)時(shí)經(jīng)常用到的視覺(jué)大數(shù)據(jù)來(lái)源。卷積神經(jīng)網(wǎng)絡(luò)CNN(Convolutional Neural Network,卷積神經(jīng)網(wǎng)絡(luò))的幾個(gè)經(jīng)典模型,包括AlexNet、VGG Network和GoogLeNet。其中AlexNet網(wǎng)絡(luò)的出現(xiàn)對(duì)于計(jì)算機(jī)視覺(jué)在深度學(xué)習(xí)上的應(yīng)用具有里程碑意義,它證明了CNN在分類問(wèn)題上的有效性,該模型一共分為8層。VGG Network通過(guò)訓(xùn)練11到19層的卷積神經(jīng)網(wǎng)絡(luò)證明了深度對(duì)于圖像識(shí)別任務(wù)的重要性,其中VGG16分為16層。GoogLeNet是由22層卷積神經(jīng)網(wǎng)絡(luò)構(gòu)成的模型,是由并行和串行的網(wǎng)絡(luò)進(jìn)行的級(jí)聯(lián)。
深度學(xué)習(xí)的主流框架包括TensorFlow、Caffe、Keras、CNTK、MXNet、Theano等。其中TensorFlow在關(guān)注度和用戶數(shù)上領(lǐng)先于其他框架,Caffe開(kāi)源深度學(xué)習(xí)框架有大量的訓(xùn)練好的經(jīng)典模型。鑒于時(shí)間和技術(shù)因素,本次選擇在TensorFlow和Caffe學(xué)習(xí)框架完成應(yīng)用性能測(cè)試。
(2)Caffe應(yīng)用性能測(cè)試
應(yīng)用性能的測(cè)試目是基于ImageNet數(shù)據(jù)集,測(cè)試GPU服務(wù)器在深度學(xué)習(xí)框架Caffe下,獲取各模型訓(xùn)練階段圖片的處理速度,以衡量服務(wù)器在深度學(xué)習(xí)方面的綜合性能。
1)測(cè)試前置條件:確保服務(wù)器電源供電正常、設(shè)備為穩(wěn)定商用BIOS版本、預(yù)裝Linux系統(tǒng)并且各驅(qū)動(dòng)程序安裝正常,先確保安裝CUDA環(huán)境和GPU驅(qū)動(dòng)。
2)參考測(cè)試步驟如下:
(a)安裝并配置好Caffe的運(yùn)行環(huán)境;
(b)測(cè)試模型準(zhǔn)備:
Alexnet的配置文件包括:models/bvlc_alexnet/solver.prototxt;models/bvlc_alexnet/train_val.prototxt;
Googlenet的配置文件包括:models/bvlc_googlenet/solver.prototxt,models/bvlc_googlenet/train_val.prototxt。
(c)數(shù)據(jù)集使用:統(tǒng)一使用提供的數(shù)據(jù)集文件,該數(shù)據(jù)集由部分ImageNet原始圖片集轉(zhuǎn)換而來(lái),由于關(guān)注的是訓(xùn)練階段體現(xiàn)的服務(wù)器性能,并且圖片量不足,所以準(zhǔn)確率和收斂性不具參考意義,可忽略;
(e)測(cè)試要求:Batchsize=128,max_iter=10,000,其他參數(shù)不可修改,保持默認(rèn);
(f)測(cè)試命令:
./build/tools/caffe train -solver=models/bvlc_googlenet/solver.prototxt –gpuX;./build/tools/caffe train -solver=models/bvlc_alexnet/solver.prototxt –gpu X(X表示測(cè)試GPU的編號(hào))。
3)測(cè)試結(jié)果分析
表3是Caffe應(yīng)用性能測(cè)試結(jié)果。從測(cè)試結(jié)果看出,由于GoogLeNet網(wǎng)絡(luò)層數(shù)達(dá)22層,只有8層的Alexnet的處理速度優(yōu)于GoogLeNet。同時(shí)GPU服務(wù)器1的性能超過(guò)GPU服務(wù)器2的性能,其網(wǎng)絡(luò)層測(cè)試結(jié)果可以作為衡量服務(wù)器性能的一個(gè)標(biāo)準(zhǔn)。GPU服務(wù)器2存在一個(gè)重要問(wèn)題是在8GPU時(shí)失去線性性能,最大功耗比GPU服務(wù)器1低很多,說(shuō)明GPU存在降低頻率使用的情況,導(dǎo)致的因素包括GPU架構(gòu)設(shè)計(jì)及測(cè)試環(huán)境溫度等。
表3 Caffe應(yīng)用性能測(cè)試結(jié)果
(3)tensorflow應(yīng)用性能測(cè)試
應(yīng)用性能的測(cè)試目是通過(guò)測(cè)試各廠商服務(wù)器在深度習(xí)tensorflow框架,對(duì)Vgg16模型訓(xùn)練階段圖片的處理速度來(lái)衡量GPU服務(wù)器性能。
1)測(cè)試前置條件:確保服務(wù)器電源供電正常,設(shè)備為穩(wěn)定商用BIOS版本,預(yù)裝Linux系統(tǒng)并且各驅(qū)動(dòng)程序安裝正常,先確保安裝CUDA環(huán)境和GPU驅(qū)動(dòng),cuDNN6庫(kù)等。
2)參考測(cè)試步驟如下:
(a)下載并且上傳tensorflow benchmark測(cè)試工具;
(b)通過(guò)nvidia-smi查看GPU狀態(tài);
(c)進(jìn)入目錄進(jìn)行訓(xùn)練,需要遍歷GPU的個(gè)數(shù)(1、2、4、8)和batch_size(128),執(zhí)行測(cè)試命令進(jìn)行測(cè)試;
(d)分析日志,獲取每秒處理圖片的性能數(shù)據(jù)。
3)測(cè)試結(jié)果及分析
表4是tensorflow應(yīng)用性能測(cè)試結(jié)果。首先從測(cè)試結(jié)果看出,Vgg16的處理數(shù)據(jù)性能低于Alexnet和GoogLeNet網(wǎng)絡(luò)模型,由于GoogLeNet采用了Inception網(wǎng)中網(wǎng)的結(jié)構(gòu),整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)的寬度和深度都擴(kuò)大,本次測(cè)試22層的GoogLeNet處理性能是16層的Vgg16的2~3倍左右。GPU服務(wù)器2的性能超過(guò)GPU服務(wù)器1的性能,所以Vgg16下測(cè)試結(jié)果也可以作為衡量服務(wù)器性能的一個(gè)標(biāo)準(zhǔn)。此外從服務(wù)器的功耗數(shù)據(jù)分析,在本次測(cè)試中GPU服務(wù)器2也存在8GPU時(shí)失去線性性能的問(wèn)題。
表4 tensorflow應(yīng)用性能測(cè)試結(jié)果
在深度學(xué)習(xí)領(lǐng)域,GPU服務(wù)器性能包括通信帶寬和整體處理性能。目前行業(yè)內(nèi)GPU服務(wù)器的通信帶寬和整體性能估算都只有廠家提供的標(biāo)稱值,無(wú)法準(zhǔn)確度量各廠商GPU服務(wù)器的性能指標(biāo)。本文針對(duì)這兩方面的性能估算問(wèn)題設(shè)計(jì)了GPU服務(wù)器通信帶寬和應(yīng)用性能的測(cè)試方法,解決了不同GPU服務(wù)器間性能對(duì)比的難題。
目前英偉達(dá)推出了基于Volta架構(gòu)的Tesla V100 GPU,通信帶寬更大,性能更強(qiáng)。另外Tensor Core是Volta架構(gòu)的特性,是專門(mén)針對(duì)深度學(xué)習(xí)應(yīng)用而設(shè)計(jì)的一種矩陣乘累加的計(jì)算單元。