基于NVIDIA GPUs的深度学习训练新优化
基于NVIDIA GPUs的深度學(xué)習(xí)訓(xùn)練新優(yōu)化
New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs
不同行業(yè)采用人工智能的速度取決于最大化數(shù)據(jù)科學(xué)家的生產(chǎn)力。NVIDIA每月都會發(fā)布優(yōu)化的NGC容器,為深度學(xué)習(xí)框架和庫提高性能,幫助科學(xué)家最大限度地發(fā)揮潛力。英偉達(dá)持續(xù)投資于全數(shù)據(jù)科學(xué)堆棧,包括GPU架構(gòu)、系統(tǒng)和軟件堆棧。這一整體方法為深度學(xué)習(xí)模型訓(xùn)練提供了最佳性能,正如NVIDIA贏得了提交給MLPerf的所有六個基準(zhǔn),MLPerf是第一個全行業(yè)的人工智能基準(zhǔn)所證明的那樣。NVIDIA在最近幾年引入了幾代新的GPU架構(gòu),最終在Volta和Turing GPU上實現(xiàn)了Tensor核心架構(gòu),其中包括對混合精度計算的本地支持。NVIDIA在MXNet和PyTorch框架上完成了這些記錄,展示了平臺的多功能性。流行的深度學(xué)習(xí)框架中的自動混合精度通過向應(yīng)用程序中添加一行或兩行代碼,在張量核心上提供3倍的更快的訓(xùn)練性能。在“自動混合精度”頁上了解更多信息。
事實證明,NeurIPS 2018大會是深入學(xué)習(xí)科學(xué)家了解NVIDIA優(yōu)化容器最近的一些重大性能改進的好時機,這些改進可以加速各種深度學(xué)習(xí)模型。讓看看對NVIDIA GPU Cloud(NGC)deep learning framework容器和關(guān)鍵庫的最新18.11版本的改進。新版本建立在早期的增強之上,可以在Volta Tensor Core GPU中閱讀到,實現(xiàn)了新的AI性能里程碑。
Optimized Frameworks
MXNet
這一最新版本提高了大規(guī)模訓(xùn)練深度學(xué)習(xí)模型的性能,其中GPU訓(xùn)練性能在大批量范圍內(nèi)優(yōu)化是至關(guān)重要的。如研究所示,在最終達(dá)到的訓(xùn)練精度開始下降之前,所有處理器的總訓(xùn)練批大小都存在限制。因此,當(dāng)擴展到大量GPU時,一旦達(dá)到總的批大小限制,添加更多的GPU將減少每個GPU處理的批大小。因此,對18.11 NGC容器中的MXNet框架進行了一些改進,以優(yōu)化各種訓(xùn)練批大小的性能,尤其是較小的,而不僅僅是較大的批大小:
隨著批處理大小的減小,每次訓(xùn)練迭代與CPU同步的開銷也隨之增加。以前,MXNet框架在每次操作后都會將GPU與CPU同步。當(dāng)使用每個GPU的小批量訓(xùn)練時,這種重復(fù)同步的開銷會對性能產(chǎn)生不利影響。改進了MXNet,在與CPU同步之前將多個連續(xù)的GPU操作積極地組合在一起,減少了這一開銷。
引入了新的融合運算符,如BatchNorm ReLU和BatchNorm Add ReLU,消除了不必要的GPU內(nèi)存往返。這通過在執(zhí)行批處理規(guī)范化的同一內(nèi)核中執(zhí)行簡單的操作(例如elementwise Add或ReLU)來提高性能,而不需要額外的內(nèi)存?zhèn)鬏敗_@些特別適用于大多數(shù)現(xiàn)代卷積網(wǎng)絡(luò)架構(gòu)的圖像任務(wù)。
以前,SGD優(yōu)化器更新步驟是調(diào)用單獨的內(nèi)核來更新每個層的參數(shù)。新的18.11容器將多個層的SGD更新聚合到單個GPU內(nèi)核中,以減少開銷。當(dāng)使用Horovod運行MXNet進行多GPU和多節(jié)點訓(xùn)練時,MXNet運行時會自動應(yīng)用此優(yōu)化。
NVIDIA通過對MXNet進行這些改進,實現(xiàn)了世界上最快的解決方案時間,ResNet50 v1.5的MLPerf為6.3分鐘。
當(dāng)使用18.11 MXNet容器在單個Tesla V100 GPU上使用Tensor Core混合精度訓(xùn)練批大小為32的ResNet-50時,這些優(yōu)化使吞吐量達(dá)到1060個圖像/秒,而使用18.09 MXNet容器時,吞吐量為660個圖像/秒。
可以在這里找到最新的性能結(jié)果。
與Amazon和MXNet開發(fā)社區(qū)密切合作,集成了流行的Horovod通信庫,以提高在大量gpu上運行時的性能。Horovod庫使用NVIDIA集合通信庫(NCCL),包含了處理分布式參數(shù)的allreduce方法。這就消除了本機MXNet分布式kvstore方法的性能瓶頸。
目前正在合并對上游MXNet和Horovod存儲庫的改進,以便用戶社區(qū)能夠從這些改進中受益。
TensorFlow
TensorFlow NGC容器包含最新版本的TensorFlow1.12。這為實驗性XLA編譯器實現(xiàn)的GPU性能提供了重大改進。谷歌在最近的博客中概述了XLA,包括如何啟用說明。XLA通過將多個操作融合到一個GPU內(nèi)核中,消除了對多個內(nèi)存?zhèn)鬏數(shù)男枰?#xff0c;顯著提高了性能,從而顯著提高了速度。XLA編譯器在這個時候是實驗性的,在Google博客文章中概述了一些注意事項。然而,谷歌的內(nèi)部模型與gpu相比,性能有望提高3倍。
此外,18.11 NGC Tensorflow容器集成了最新的TensorRT 5.0.2,使數(shù)據(jù)科學(xué)家能夠輕松地部署訓(xùn)練模型和優(yōu)化的推理性能。TensorRT解決了推理性能的具體挑戰(zhàn)。高效地執(zhí)行具有低延遲的小批量,直到批量大小為1。TensorRT 5.0.2支持低精度數(shù)據(jù)類型,如16位浮點或8位整數(shù)。
另一方面,NVIDIA為分析器提供了對CUDA應(yīng)用程序性能的強大洞察。然而,雖然這些概要文件提供了大量關(guān)于應(yīng)用程序低級性能的數(shù)據(jù),但是對于TensorFlow用戶來說,往往很難解釋。這是因為概要文件不會將其輸出與TensorFlow用戶構(gòu)建的原始圖關(guān)聯(lián)起來。增強了TensorFlow的圖形執(zhí)行器(使用NVIDIA profiler NVTX擴展)以將標(biāo)記發(fā)送到用CUDA profiler(如nvprof)收集的配置文件中,簡化了性能分析。
這些標(biāo)記顯示了每個圖操作符所花費的時間范圍,并且可以被高級用戶用來輕松地識別計算內(nèi)核及其相關(guān)的TensorFlow層。以前,概要文件只顯示內(nèi)核啟動和主機/設(shè)備內(nèi)存操作(運行時API行)。現(xiàn)在,TensorFlow將標(biāo)記添加到概要文件中,并使用與TensorFlow圖相關(guān)的有意義的名稱,如圖1所示。這允許用戶將GPU執(zhí)行概要文件事件映射到其模型圖中的特定節(jié)點。
Figure 1. Screenshot of profiler showing annotated ranges for GPU operations
PyTorch
英偉達(dá)與Pythorch開發(fā)社區(qū)密切合作,不斷提高在Volta Tensor Core GPU上訓(xùn)練深度學(xué)習(xí)模型的性能。Apex是Pythorch的一組輕量擴展,由NVIDIA維護以加速訓(xùn)練。目前正在對這些擴展進行評估,以便直接合并到主PyTorch存儲庫中。然而,PyTorch NGC容器是由Apex實用程序預(yù)先構(gòu)建的,因此數(shù)據(jù)科學(xué)家和研究人員可以很容易地開始使用。在這個博客中了解更多關(guān)于Apex功能的信息。除了Apex最初附帶的自動混合精度實用程序和分布式訓(xùn)練包裝器之外,最近還添加了一些面向性能的實用程序。
首先,添加了一個新的Adam優(yōu)化器的融合實現(xiàn)。現(xiàn)有的默認(rèn)PyTorch實現(xiàn)需要多個進出GPU設(shè)備內(nèi)存的冗余通道。這些冗余的傳遞會產(chǎn)生很大的開銷,特別是在以數(shù)據(jù)并行方式跨多個gpu擴展訓(xùn)練時。Apex中的融合Adam優(yōu)化器消除了這些冗余通道,提高了性能。例如,使用fused Apex實現(xiàn)的NVIDIA優(yōu)化版變壓器網(wǎng)絡(luò)比PyTorch中的現(xiàn)有實現(xiàn)提供了5%到7%之間的端到端訓(xùn)練加速。對于谷歌神經(jīng)機器翻譯(GNMT)的優(yōu)化版本,所觀察到的端到端加速比從6%到高達(dá)45%(對于小批量大小)。
接下來,添加了層規(guī)范化的優(yōu)化實現(xiàn)。對于相同的轉(zhuǎn)換網(wǎng)絡(luò),Apex的層規(guī)范化在訓(xùn)練性能上提供了4%的端到端加速。
最后,擴展了分布式數(shù)據(jù)并行包裝器,用于多GPU和多節(jié)點訓(xùn)練。這包括顯著的引擎蓋下性能調(diào)整,以及新的面向用戶的選項,以提高性能和準(zhǔn)確性。一個例子是“delay_allreduce”選項。此選項緩沖所有要在GPU上累積的層的所有漸變,然后在完成反向傳遞后將鏈接在一起。
雖然此選項忽略了將已計算梯度的通信與其模型層的梯度計算重疊的機會,但可以在使用持久內(nèi)核實現(xiàn)(包括批處理規(guī)范化和某些cuDNN rnn)的情況下提高性能。“delay_allreduce”選項以及其面向用戶的選項的詳細(xì)信息可以在Apex文檔中找到。
這些PyTorch優(yōu)化使NVIDIA能夠在MLPerf上提供多個速度記錄,可以在這里閱讀。
Performance Libraries
cuDNN
cuDNN 7.4.1的最新版本包含了NHWC數(shù)據(jù)布局、持久RNN數(shù)據(jù)梯度計算、跨步卷積激活梯度計算的顯著性能改進,以及在CUDNNGETConvertion<*>(一組API)中改進的啟發(fā)式。
提高Volta張量核性能的一個關(guān)鍵是減少訓(xùn)練模型時所需的張量換位次數(shù),如前一篇博文所述。與張量核卷積的自然張量數(shù)據(jù)布局是NHWC布局。在cuDNN的最后幾個版本中,還添加了高度優(yōu)化的內(nèi)核,這些內(nèi)核對NHWC數(shù)據(jù)布局執(zhí)行一系列內(nèi)存綁定操作,如add tensor、op tensor、activation、average pooling和batch normalization。這些都在最新的cuDNN 7.4.1版本中提供。
這些新的實現(xiàn)使得更有效的內(nèi)存訪問成為可能,并且在許多典型的用例中可以達(dá)到接近峰值的內(nèi)存帶寬。此外,新的擴展批處理規(guī)范化API還支持可選的fused-element-wise-add激活,節(jié)省了多次往返全局內(nèi)存,顯著提高了性能。這些融合操作將加快訓(xùn)練具有批量規(guī)范化和跳過連接的網(wǎng)絡(luò)。這包括大多數(shù)現(xiàn)代圖像網(wǎng)絡(luò),用于分類、檢測、分割等任務(wù)。
例如,與使用NCHW數(shù)據(jù)布局和不使用融合批規(guī)范化的情況相比,使用cuDNN的新NHWC和融合批規(guī)范化支持在DGX-1V上使用8臺Tesla V100 GPU訓(xùn)練固態(tài)硬盤網(wǎng)絡(luò)(使用ResNet-34主干網(wǎng))時,性能提高了20%以上。
正如本博客前面所討論的,大規(guī)模訓(xùn)練深層神經(jīng)網(wǎng)絡(luò)需要處理比每個GPU所能處理的最大批量更小的數(shù)據(jù)。這為優(yōu)化提供了一個新的機會,特別是使用遞歸神經(jīng)網(wǎng)絡(luò)(RNNs)的模型。當(dāng)批處理大小很小時,cuDNN庫可以使用RNN實現(xiàn),在某些情況下使用持久算法。 (這篇文章解釋了RNN實現(xiàn)中持久算法的性能優(yōu)勢)雖然cuDNN在多個版本中支持持久RNN,但最近針對Tensor核心對進行了大量優(yōu)化。圖2中的圖顯示了一個性能改進的示例,對在TeslaV100上運行批處理大小為32的GNMTLanguage翻譯模型所用的持久RNN進行了改進。如圖所示,許多RNN調(diào)用的性能都有了顯著的提高。
Figure 2. Speedup of GNMT unique cuDNN RNN calls in v7.4.1 vs. v7.0.5 for batch=32 using persistent algorithm
最新的cuDNN 7.4.1顯著提高了計算激活梯度的性能。以前,單元增量的情況是由高度專業(yè)化和快速的內(nèi)核處理的,而非單元增量的情況則退回到更通用但速度較慢的內(nèi)核實現(xiàn)。最新的cuDNN解決了這一差距,并在非單位步幅情況下有很大的改進性能。通過這種增強,在諸如Deep Speech 2和Inception v3等網(wǎng)絡(luò)中的相關(guān)激活梯度計算操作被改進了高達(dá)25倍。
DALI
視覺任務(wù)(如分類、目標(biāo)檢測、分割等)模型的訓(xùn)練和推理需要一個重要的、涉及的數(shù)據(jù)輸入和擴充管道,當(dāng)使用優(yōu)化的代碼大規(guī)模運行時,當(dāng)多個gpu必須等待CPU時,該管道會很快成為整體性能的瓶頸準(zhǔn)備數(shù)據(jù)。即使在使用多個CPU內(nèi)核進行此處理時,CPU也很難為gpu提供足夠快的數(shù)據(jù)。這會導(dǎo)致在等待CPU完成其任務(wù)時花費空閑GPU時間。將這些數(shù)據(jù)管道從CPU移動到GPU是有利的。DALI是一個開源的、與框架無關(guān)的GPU加速數(shù)據(jù)輸入和擴充管道庫,已經(jīng)開發(fā)出來解決這個問題,將工作從CPU遷移到GPU。
讓以流行的單點探測器(SSD)模型為例。數(shù)據(jù)輸入管道有多個階段,如圖3所示。
Figure 3. DALI Data pipeline for SSD model
除了SSD Random(IoU-Intersection over Union-based)裁剪是SSD特定的之外,所有這些流水線階段在計算機視覺任務(wù)中看起來都相當(dāng)標(biāo)準(zhǔn)。DALI中新添加的操作符通過提供對COCO數(shù)據(jù)集(COCOReader)、基于IoU的裁剪(SSDRandomCrop)和邊界框翻轉(zhuǎn)(BbFlip)的訪問,為整個工作流提供了一個基于GPU的快速管道。
Conclusion
研究人員可以利用討論的最新性能增強,以最小的努力加速深度學(xué)習(xí)訓(xùn)練。訪問NVIDIA GPU Cloud(NGC)下載經(jīng)過充分優(yōu)化的深度學(xué)習(xí)框架容器、經(jīng)過預(yù)先訓(xùn)練的人工智能模型和模型腳本,讓可以訪問世界上性能最高的深度學(xué)習(xí)解決方案,從而啟動人工智能研究。此外,在cuDNN和dali中還提供了單獨的庫和增強功能。
總結(jié)
以上是生活随笔為你收集整理的基于NVIDIA GPUs的深度学习训练新优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适用于Linux 2的Windows子系
- 下一篇: 如何运行具有奇点的NGC深度学习容器