MLPerf是一套衡量機器學習系統(tǒng)性能的權(quán)威標準,于2018年由谷歌、哈佛、斯坦福、百度等機構(gòu)聯(lián)合發(fā)起成立,每年定期公布榜單成績,它將在標準目標下訓練或推理機器學習模型的時間,作為一套系統(tǒng)性能的測量標準。MLPerf訓練任務包括圖像分類(ResNet50)、目標物體檢測(SSD)、目標物體檢測(Mask R-CNN)、智能推薦(DLRM)、自然語言處理(BERT)以及強化機器學習(Minigo)等。最新的1.0版本增加了兩項新的測試項目:語音識別(RNN-T)和醫(yī)學影像分割(U-Net3D)。
本文將著重討論其中的圖像分類模型Resnet50。
ResNet是殘差網(wǎng)絡,該系列網(wǎng)絡被廣泛用于目標分類等領域,并作為計算機視覺任務主干經(jīng)典神經(jīng)網(wǎng)絡的一部分,是一個典型的卷積網(wǎng)絡。ResNet50網(wǎng)絡結(jié)構(gòu)如下圖,首先對輸入做卷積操作,之后經(jīng)過4個殘差模塊,最后進行一個全連接操作用于分類任務,ResNet50包含50個卷積操作。
圖1 ResNet網(wǎng)絡結(jié)構(gòu)▲
圖2 ResNet34網(wǎng)絡結(jié)構(gòu)▲
來源:Deep Residual Learning for Image Recognition
作者:何愷明等
在MLPerf最早版本V0.5中,就包含Resnet50訓練任務。下圖是歷次MLPerf 訓練競賽Resnet50的單機最優(yōu)性能。在MLPerf V0.7訓練基準測試中,浪潮AI服務器NF5488A5在33.37分鐘內(nèi)完成ResNet50訓練,在所有提交的單服務器性能成績中名列榜首,比同類配置服務器快16.1%。而在最新的MLPerf 訓練V1.0榜單中,浪潮AI服務器NF5688M6進一步將Resnet50單機訓練提速到27.38分鐘,耗時較V0.7縮短了17.95%。
圖3 歷次MLPerf訓練測試Resnet50單機最優(yōu)性能▲
性能的一次次突破,得益于硬件的發(fā)展和軟件的更新及優(yōu)化。本文將深度解析取得這一成績背后的原因,談談Resnet50對計算平臺的需求以及如何提升訓練速度。
ResNet50訓練流程簡介
在MLPerf訓練V1.0測試中,Resnet50使用的數(shù)據(jù)集是包含128萬圖片的ImageNet2012(注:數(shù)據(jù)下載需要注冊),訓練的目標精度是75.9%,共需運行5次。廠商提交的成績是訓練模型達到目標精度所花費的時間(以分鐘為單位),值越小則表示性能越好。去掉一個最差性能和一個最優(yōu)性能,其余3次的平均值為最終成績。
我們來看看Resnet50模型訓練的流程。首先,需要從硬盤上讀取訓練集,進行解碼,然后對圖像進行預處理,處理后的數(shù)據(jù)送入訓練框架進行訓練,經(jīng)過若干個epoch后得到滿足精度要求的模型。
圖4 Resnet50模型訓練流程▲
硬件平臺選取
在Resnet50訓練中,硬件及設備平臺的選取至關重要。其中磁盤讀取性能、CPU運算性能、內(nèi)存到顯存的傳輸性能以及GPU運算性能對訓練速度的影響都比較大:磁盤讀取性能直接決定訓練數(shù)據(jù)供給的速度;在引入DALI后,CPU的性能、CPU到GPU的傳輸帶寬以及GPU的性能共同決定了數(shù)據(jù)前處理的速度;而訓練中的前向推理和反向傳播由GPU的性能及GPU之間的數(shù)據(jù)傳輸帶寬決定。上述幾個硬件就如同工廠流水線上的幾名工人,任何一名工人的處理速度跟不上就會導致堆積,成為性能瓶頸,影響最終結(jié)果。因此這幾個重要部分不能有明顯的短板。
此次MLPerf評測浪潮選取了NF5688M6和NF5488A5服務器作為Resnet50的訓練平臺,不僅保證上述關鍵部件性能十分強勁,而且把它們很好地整合在一起,能更好地發(fā)揮它們的性能,滿足了模型訓練對硬件的性能要求,從而能快速地完成訓練任務。
NF5688M6在6U空間內(nèi)支持2顆Intel最新的Ice Lake CPU和8顆NVIDIA最新的NVSwitch全互聯(lián)GPU。支持PCIe Gen4.0高速互聯(lián),實現(xiàn)CPU和GPU之間數(shù)據(jù)高速傳輸。同時采用完全風道獨立,有效避免回流產(chǎn)生,實現(xiàn)風冷支持8顆 GPU高環(huán)溫下穩(wěn)定工作。在本次MLPerf V1.0訓練測試中,NF5688M6獲得了ResNet50、DLRM和SSD三項任務的單機訓練性能第一。
NF5488A5在4U空間內(nèi)實現(xiàn)8顆高性能NVIDIA GPU液冷散熱,搭載2顆支持PCIe4.0的AMD EPYC 7742 處理器,能夠為AI 用戶提供超強單機訓練性能和超高數(shù)據(jù)吞吐。NF5488A5在MLPerf V0.7基準測試中創(chuàng)下Resnet50訓練任務最佳單服務器性能成績,在MLPerf V1.0榜單中獲得了BERT任務的單機訓練性能第一。
訓練調(diào)優(yōu)方法
Resnet50模型的訓練時長主要受兩大因素的影響:一是訓練模型到目標精度的步數(shù),也就是需要多少輪可以達到目標精度,在其它性能相同的情況下步數(shù)越短則訓練時間越短,這部分需要找出一組超參數(shù)讓步數(shù)足夠少;二是圖4所示的數(shù)據(jù)讀取、數(shù)據(jù)預處理、訓練等各個步驟的處理速度。Resnet50的訓練數(shù)據(jù)為128萬張ImageNet2012圖片數(shù)據(jù)集,訓練過程對傳輸帶寬和計算能力的要求都很高。正如木桶理論所說,模型訓練速度是由流水線上最慢的部分決定,因此需要對流水線上的每一個步驟做分析,特別是著重分析整個流水線上的瓶頸,有針對性地去做優(yōu)化。
從這兩大因素入手,浪潮主要采用了以下調(diào)優(yōu)方法:
對學習率、batch size、優(yōu)化器等超參數(shù)進行調(diào)試,將ResNet50模型收斂的步數(shù)從41降為35,帶來了15%左右的性能提升;
通過優(yōu)化DALI,使用GPU資源加速解碼和數(shù)據(jù)處理環(huán)節(jié),實現(xiàn)了1%左右的性能提升;
使用NCCL提升多GPU卡之間通信效率,加速訓練環(huán)節(jié),性能提升0.1%左右。
下面分別按照訓練流程進行詳述。
| 訓練集讀取
訓練集是官方指定的。需要注意是讀取圖像帶來的開銷,如前所述,這個取決于磁盤讀取的速度和傳輸帶寬。好的磁盤自然能帶來更快的速度,另外通過組Raid 0 磁盤陣列也能帶來讀取速度的提升。我們曾在兩種不同的磁盤上使用同樣的Raid 0磁盤陣列,測試結(jié)果的訓練時長差異達到5‰左右,所以磁盤的選擇是很重要的。
| 解碼和數(shù)據(jù)處理
讀取數(shù)據(jù)后便是解碼和數(shù)據(jù)處理,通常它們是一起進行的。圖像解碼會比較耗時,常常會成為性能瓶頸,一般的處理方式只能利用CPU資源來進行圖像解碼,性能會受到極大的制約,我們選擇的是DALI(NVIDIA Data Loading Library)框架,這是一款高度優(yōu)化用來加速計算機視覺深度學習應用的執(zhí)行引擎,可以利用GPU的資源來做圖像解碼和預處理,號稱可以比原框架帶來4倍的性能提升。使用DALI來做預處理處理是個不錯的選擇,大家可以試試。
選定預處理的方法后,需要對其做優(yōu)化,充分利用它的優(yōu)勢,使之適用于我們的系統(tǒng)和數(shù)據(jù)。首先,我們先找出預處理數(shù)據(jù)的極限,通過設置訓練數(shù)據(jù)為模擬的擬合數(shù)據(jù),這樣可以拋開數(shù)據(jù)讀取以及預處理的開銷,評測只有訓練開銷時的吞吐率,后面要做的就是調(diào)整DALI參數(shù),讓真實數(shù)據(jù)的吞吐率接近擬合數(shù)據(jù)的吞吐率。
我們可以從以下幾個方面入手:
1. DALI的計算分配:DALI可以把預處理的計算按指定的比例分配到CPU和GPU上,如果分配給GPU的比例小了則不能充分利用GPU的性能,如果大了則會擠占后面的訓練資源;
2. DALI的處理線程:這個值大了,會占用資源,并讓一些線程處于等待狀態(tài),這個值小了,不能充分利用資源;
3. ALI的數(shù)據(jù)預取量:值過小會讓后面的處理等待,值過大會占用過多顯存存儲和計算資源,甚至會耗盡顯存;
4. 使用融合函數(shù):采用ImageDecoderRandomCrop函數(shù),把解碼和隨機裁剪放在一起做,通常會比分開做性能提升不少。
前3個參數(shù)值的選取需要針對不同硬件設備和模型進行測試,找出一個最優(yōu)組合,通過這個部分的優(yōu)化,可以帶來大概7‰左右的性能提升。而采用融合函數(shù)通常能帶來1%左右的性能提升。
上述DALI代碼關鍵就是實現(xiàn)一個自己的Pipeline類,ResNet50的數(shù)據(jù)前處理關鍵代碼參考如下:
圖6 ResNet50數(shù)據(jù)前處理關鍵代碼▲
| 訓練框架選取
目前訓練框架有很多,如tensorflow、pytorch、mxnet等。不同的模型在不同的框架下有不一樣的性能表現(xiàn),通過比較,我們發(fā)現(xiàn)mxnet框架在處理resnet50模型的訓練上有較大的優(yōu)勢。
另外,使用多塊GPU進行訓練時,各卡之間有大量的數(shù)據(jù)傳輸,各個框架會采用horovod或者直接采用NCCL來進行分布式的訓練,而horovod本質(zhì)上也是調(diào)用NCCL進行的數(shù)據(jù)傳輸。在MLPerf的示例代碼中有的框架會提供默認的NCCL參數(shù)選擇,這在不同的硬件設備中可能會有所不同,例如在最新的NVSWITCH架構(gòu)中MAXCHANNEL數(shù)為32,而在之前的NVLINK架構(gòu)中默認值為16最佳。在大部分的情況下,NCCL內(nèi)部的默認值即可滿足其要求, 但仍要注意其傳入?yún)?shù)對傳輸速度的影響。另外經(jīng)測試最新的NCCL版本,對于不同的硬件設備可能不是速度最快的版本,可通過NCCL_TEST進行測試選擇,這里不再展開說明。
| 超參數(shù)調(diào)優(yōu)
訓練中的一個關鍵因素就是超參數(shù)的調(diào)試,一組好的超參數(shù)能讓模型經(jīng)過更少的epoch就收斂,自然會讓性能提升。試想一下如果兩個廠商的訓練吞吐率一樣,但其中一家的模型要10個epoch才能收斂到目標精度,而另一家的模型可以8個epoch就收斂,相當于2位選手以同樣的速度下山,其中一位選手找到的路需要走10公里,另一位找到的路只需要走8公里,那毫無疑問走8公里路的占有明顯優(yōu)勢,能更快到達終點。所以挑選一組合適的超參數(shù)能事半功倍。實際上,MLPerf Training為了避免走“錯路”帶來的不公平,特意制定了超參數(shù)借用規(guī)則,讓大家借一條“路”再跑一次,在同一個賽道下的結(jié)果才公平。
當然,要找這樣一條“路”是不容易的,下面給出一些超參數(shù)調(diào)試的小技巧:
學習率(learning rate):學習率對收斂速度和精度都有影響。而調(diào)整學習率也是讓人抓狂的事情,經(jīng)常出現(xiàn)梯度不收斂。一般對于學習率等超參數(shù)采用先粗調(diào)、再微調(diào)的策略。其中在粗調(diào)過程中學習率先以10的倍數(shù)進行調(diào)整,如選取0.01、0.1、1等值進行嘗試,等學習率基本固定后,再進行精調(diào),可以在基準值上每次以10%的變化量進行調(diào)整。
batch size:一般來講增大batch size可以提高訓練速度,同時也可以提高AI加速器的利用率,但稍有不慎來個out of memory就可以終止你增大該值的念想,另外過大的batch size也會帶來精度的下降。那么選一個小batch size是否就可以了呢?經(jīng)實驗驗證,過小的batch size也會導致精度下降,所以該值的選取,也需要調(diào)試。此外,batch size和learning rate也會相互影響,一般操作是,在增大batch size的同時,也應對應的增大learning rate。
優(yōu)化器:一般在分類模型中,最常用的優(yōu)化器為隨機梯度下降SGD。雖然adam等優(yōu)化器可以獲取到更快的速度,但是經(jīng)常會出現(xiàn)精度下降的問題。除此之外還有LARS(Layer-wise Adaptive Rate Scaling:https://arxiv.org/abs/1708.03888)優(yōu)化器,這是MLPerf中各個參賽廠家普遍使用的優(yōu)化器。LARS的優(yōu)化器的公式如下:
LARS是SGD 的有動量擴展,可以適應每層的學習率,核心是讓網(wǎng)絡的每個層根據(jù)自己的情況動態(tài)的調(diào)整學習率,作用是可以有效緩解在較大batch size訓練的前期由于學習率太大導致的不穩(wěn)定問題。
按照上述的方法調(diào)試超參數(shù),最終我們將ResNet50模型收斂的epoch次數(shù)從41降為35,帶來了15%左右的性能提升,看來正確的“路”效果很明顯,超參數(shù)帶來的性能提升不容小覷。
總之,影響訓練性能的因素有很多。本文主要從硬件平臺和軟件優(yōu)化的角度,以MLPerf訓練V1.0榜單中的ResNet50模型為例,從數(shù)據(jù)處理、訓練框架、超參數(shù)等方面來提升訓練速度,取得了不錯的效果。浪潮優(yōu)化代碼已共享至Github(附1)。如果各位有興趣可以試一試,希望能幫助你提升模型訓練速度。
展望
MLPerf競賽經(jīng)過3年多時間的發(fā)展,已經(jīng)逐漸進入成熟期,其模型的選取也緊跟時代潮流,為評估各類AI計算平臺在實際應用場景中的性能提供了權(quán)威有效的基準。MLPerf是一個開放社區(qū),很多廠商將優(yōu)化方法回饋至社區(qū),推動AI技術(shù)的共同進步。如浪潮已將在MLPerf V0.7中用到的ResNet收斂性優(yōu)化方案共享給社區(qū)成員,得到廣泛采納并應用到本次V1.0測試中。可以預見,隨著谷歌、英偉達、英特爾、浪潮、戴爾等眾多主流芯片及系統(tǒng)廠商持續(xù)參與MLPerf,并貢獻軟硬件系統(tǒng)優(yōu)化方法,未來AI計算平臺的性能將會得到進一步提升,為AI技術(shù)在更多應用場景的落地打下堅實的基礎。
* 附:
1.浪潮代碼:
https://github.com/mlcommons/training_results_v1.0/tree/master/Inspur/benchmarks/resnet/implementations/mxnet
按照下面的步驟來搭建環(huán)境:
a. 下載以上代碼
b. 按照代碼中README.MD中的描述下載所需數(shù)據(jù),并參考附2里的方法對數(shù)據(jù)進行預處理,生成Mxnet格式的數(shù)據(jù)集
c. 進入mxnet目錄,通過docker構(gòu)建所需的image,可參考以下代碼:
cd ./benchmarks/resnet/implementations/mxnet/docker build --pull -t image_name:image_version .
d. Image構(gòu)建完成后,修改設置參數(shù)的配置文件config_NF5688M6.sh,修改參數(shù)為適合你的系統(tǒng)的值(填入按照后面的調(diào)優(yōu)方法去找出優(yōu)化后的值)
e. 至此軟件環(huán)境構(gòu)建完成,可以開始執(zhí)行訓練, 比如我們使用的系統(tǒng)是“NF5688M6”:
source config_5688M6.sh
DGXSYSTEM="NF5688M6"
CONT=image_name:image_version
DATADIR=/path/to/preprocessed/data
LOGDIR=/path/to/logfile ./run_with_docker.sh
接下來等著訓練結(jié)束,通過查找日志里的“run_stop”和“run_start”記錄的時間點就可以計算出整個訓練時間(單位是秒)。
2.數(shù)據(jù)預處理:
https://github.com/NVIDIA/DeepLearningExamples/blob/master/MxNet/Classification/RN50v1.5/README.md#prepare-dataset
審核編輯:湯梓紅
-
服務器
+關注
關注
12文章
9123瀏覽量
85322 -
浪潮
+關注
關注
1文章
458瀏覽量
23850 -
機器學習
+關注
關注
66文章
8406瀏覽量
132558 -
MLPerf
+關注
關注
0文章
35瀏覽量
636
原文標題:深度解析MLPerf競賽Resnet50訓練單機最佳性能
文章出處:【微信號:浪潮AIHPC,微信公眾號:浪潮AIHPC】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論