基於NVIDIA GPUs的深度學習訓練新優化

基於NVIDIA GPUs的深度學習訓練新優化算法

New Optimizations To Accelerate Deep Learning Training on NVIDIA GPUs網絡

不一樣行業採用人工智能的速度取決於最大化數據科學家的生產力。NVIDIA每個月都會發布優化的NGC容器,爲深度學習框架和庫提升性能,幫助科學家最大限度地發揮潛力。英偉達持續投資於全數據科學堆棧,包括GPU架構、系統和軟件堆棧。這一總體方法爲深度學習模型訓練提供了最佳性能,正如NVIDIA贏得了提交給MLPerf的全部六個基準,MLPerf是第一個全行業的人工智能基準所證實的那樣。NVIDIA在最近幾年引入了幾代新的GPU架構,最終在Volta和Turing GPU上實現了Tensor核心架構,其中包括對混合精度計算的本地支持。NVIDIA在MXNet和PyTorch框架上完成了這些記錄,展現了平臺的多功能性。流行的深度學習框架中的自動混合精度經過嚮應用程序中添加一行或兩行代碼,在張量核心上提供3倍的更快的訓練性能。在「自動混合精度」頁上了解更多信息。              架構

事實證實,NeurIPS 2018大會是深刻學習科學家瞭解NVIDIA優化容器最近的一些重大性能改進的好時機,這些改進能夠加速各類深度學習模型。讓看看對NVIDIA GPU Cloud(NGC)deep learning framework容器和關鍵庫的最新18.11版本的改進。新版本創建在早期的加強之上,能夠在Volta Tensor Core GPU中閱讀到,實現了新的AI性能里程碑。框架

Optimized Frameworks

MXNet

這一最新版本提升了大規模訓練深度學習模型的性能,其中GPU訓練性能在大批量範圍內優化是相當重要的。如研究所示,在最終達到的訓練精度開始降低以前,全部處理器的總訓練批大小都存在限制。所以,當擴展到大量GPU時,一旦達到總的批大小限制,添加更多的GPU將減小每一個GPU處理的批大小。所以,對18.11 NGC容器中的MXNet框架進行了一些改進,以優化各類訓練批大小的性能,尤爲是較小的,而不只僅是較大的批大小:              dom

隨着批處理大小的減少,每次訓練迭代與CPU同步的開銷也隨之增長。之前,MXNet框架在每次操做後都會將GPU與CPU同步。當使用每一個GPU的小批量訓練時,這種重複同步的開銷會對性能產生不利影響。改進了MXNet,在與CPU同步以前將多個連續的GPU操做積極地組合在一塊兒,減小了這一開銷。              分佈式

引入了新的融合運算符,如BatchNorm ReLU和BatchNorm Add ReLU,消除了沒必要要的GPU內存往返。這經過在執行批處理規範化的同一內核中執行簡單的操做(例如elementwise Add或ReLU)來提升性能,而不須要額外的內存傳輸。這些特別適用於大多數現代卷積網絡架構的圖像任務。              佈局

之前,SGD優化器更新步驟是調用單獨的內核來更新每一個層的參數。新的18.11容器將多個層的SGD更新聚合到單個GPU內核中,以減小開銷。當使用Horovod運行MXNet進行多GPU和多節點訓練時,MXNet運行時會自動應用此優化。              性能

NVIDIA經過對MXNet進行這些改進,實現了世界上最快的解決方案時間,ResNet50 v1.5的MLPerf爲6.3分鐘。              學習

當使用18.11 MXNet容器在單個Tesla V100 GPU上使用Tensor Core混合精度訓練批大小爲32的ResNet-50時,這些優化使吞吐量達到1060個圖像/秒,而使用18.09 MXNet容器時,吞吐量爲660個圖像/秒。              優化

能夠在這裏找到最新的性能結果。             

Amazon和MXNet開發社區密切合做,集成了流行的Horovod通訊庫,以提升在大量gpu上運行時的性能。Horovod庫使用NVIDIA集合通訊庫(NCCL),包含了處理分佈式參數的allreduce方法。這就消除了本機MXNet分佈式kvstore方法的性能瓶頸。             

目前正在合併對上游MXNet和Horovod存儲庫的改進,以便用戶社區可以從這些改進中受益。

TensorFlow

TensorFlow NGC容器包含最新版本的TensorFlow 1.12。這爲實驗性XLA編譯器實現的GPU性能提供了重大改進。谷歌在最近的博客中概述了XLA,包括如何啓用說明。XLA經過將多個操做融合到一個GPU內核中,消除了對多個內存傳輸的須要,顯著提升了性能,從而顯著提升了速度。XLA編譯器在這個時候是實驗性的,在Google博客文章中概述了一些注意事項。然而,谷歌的內部模型與gpu相比,性能有望提升3倍。             

此外,18.11 NGC Tensorflow容器集成了最新的TensorRT 5.0.2,使數據科學家可以輕鬆地部署訓練模型和優化的推理性能。TensorRT解決了推理性能的具體挑戰。高效地執行具備低延遲的小批量,直到批量大小爲1。TensorRT 5.0.2支持低精度數據類型,如16位浮點或8位整數。             

另外一方面,NVIDIA爲分析器提供了對CUDA應用程序性能的強大洞察。然而,雖然這些概要文件提供了大量關於應用程序低級性能的數據,可是對於TensorFlow用戶來講,每每很難解釋。這是由於概要文件不會將其輸出與TensorFlow用戶構建的原始圖關聯起來。加強了TensorFlow的圖形執行器(使用NVIDIA profiler NVTX擴展)以將標記發送到用CUDA profiler(如nvprof)收集的配置文件中,簡化了性能分析。             

這些標記顯示了每一個圖操做符所花費的時間範圍,而且能夠被高級用戶用來輕鬆地識別計算內核及其相關的TensorFlow層。之前,概要文件只顯示內核啓動和主機/設備內存操做(運行時API行)。如今,TensorFlow將標記添加到概要文件中,並使用與TensorFlow圖相關的有意義的名稱,如圖1所示。這容許用戶將GPU執行概要文件事件映射到其模型圖中的特定節點。

Figure 1. Screenshot of profiler showing annotated ranges for GPU operations

PyTorch

英偉達與Pythorch開發社區密切合做,不斷提升在Volta Tensor Core GPU上訓練深度學習模型的性能。Apex是Pythorch的一組輕量擴展,由NVIDIA維護以加速訓練。目前正在對這些擴展進行評估,以便直接合併到主PyTorch存儲庫中。然而,PyTorch NGC容器是由Apex實用程序預先構建的,所以數據科學家和研究人員能夠很容易地開始使用。在這個博客中瞭解更多關於Apex功能的信息。除了Apex最初附帶的自動混合精度實用程序和分佈式訓練包裝器以外,最近還添加了一些面向性能的實用程序。             

首先,添加了一個新的Adam優化器的融合實現。現有的默認PyTorch實現須要多個進出GPU設備內存的冗餘通道。這些冗餘的傳遞會產生很大的開銷,特別是在以數據並行方式跨多個gpu擴展訓練時。Apex中的融合Adam優化器消除了這些冗餘通道,提升了性能。例如,使用fused Apex實現的NVIDIA優化版變壓器網絡比PyTorch中的現有實現提供了5%到7%之間的端到端訓練加速。對於谷歌神經機器翻譯(GNMT)的優化版本,所觀察到的端到端加速比從6%到高達45%(對於小批量大小)。             

接下來,添加了層規範化的優化實現。對於相同的轉換網絡,Apex的層規範化在訓練性能上提供了4%的端到端加速。             

最後,擴展了分佈式數據並行包裝器,用於多GPU和多節點訓練。這包括顯著的引擎蓋下性能調整,以及新的面向用戶的選項,以提升性能和準確性。一個例子是「delay_allreduce」選項。此選項緩衝全部要在GPU上累積的層的全部漸變,而後在完成反向傳遞後將連接在一塊兒。             

雖然此選項忽略了將已計算梯度的通訊與其模型層的梯度計算重疊的機會,但能夠在使用持久內核實現(包括批處理規範化和某些cuDNN rnn)的狀況下提升性能。「delay_allreduce」選項以及其面向用戶的選項的詳細信息能夠在Apex文檔中找到。             

這些PyTorch優化使NVIDIA可以在MLPerf上提供多個速度記錄,能夠在這裏閱讀。

Performance Libraries

cuDNN

cuDNN 7.4.1的最新版本包含了NHWC數據佈局、持久RNN數據梯度計算、跨步卷積激活梯度計算的顯著性能改進,以及在CUDNNGETConvertion<*>(一組API)中改進的啓發式。              提升Volta張量核性能的一個關鍵是減小訓練模型時所需的張量換位次數,如前一篇博文所述。與張量核卷積的天然張量數據佈局是NHWC佈局。在cuDNN的最後幾個版本中,還添加了高度優化的內核,這些內核對NHWC數據佈局執行一系列內存綁定操做,如add tensor、op tensor、activation、average pooling和batch normalization。這些都在最新的cuDNN 7.4.1版本中提供。             

這些新的實現使得更有效的內存訪問成爲可能,而且在許多典型的用例中能夠達到接近峯值的內存帶寬。此外,新的擴展批處理規範化API還支持可選的fused-element-wise-add激活,節省了屢次往返全局內存,顯著提升了性能。這些融合操做將加快訓練具備批量規範化和跳過鏈接的網絡。這包括大多數現代圖像網絡,用於分類、檢測、分割等任務。              

例如,與使用NCHW數據佈局和不使用融合批規範化的狀況相比,使用cuDNN的新NHWC和融合批規範化支持在DGX-1V上使用8臺Tesla V100 GPU訓練固態硬盤網絡(使用ResNet-34主幹網)時,性能提升了20%以上。             

正如本博客前面所討論的,大規模訓練深層神經網絡須要處理比每一個GPU所能處理的最大批量更小的數據。這爲優化提供了一個新的機會,特別是使用遞歸神經網絡(RNNs)的模型。當批處理大小很小時,cuDNN庫可使用RNN實現,在某些狀況下使用持久算法。             

(這篇文章解釋了RNN實現中持久算法的性能優點)雖然cuDNN在多個版本中支持持久RNN,但最近針對Tensor核心對進行了大量優化。圖2中的圖顯示了一個性能改進的示例,對在TeslaV100上運行批處理大小爲32的GNMTLanguage翻譯模型所用的持久RNN進行了改進。如圖所示,許多RNN調用的性能都有了顯著的提升。

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顯著提升了計算激活梯度的性能。之前,單元增量的狀況是由高度專業化和快速的內核處理的,而非單元增量的狀況則退回到更通用但速度較慢的內核實現。最新的cuDNN解決了這一差距,並在非單位步幅狀況下有很大的改進性能。經過這種加強,在諸如Deep Speech 2和Inception v3等網絡中的相關激活梯度計算操做被改進了高達25倍。

DALI

視覺任務(如分類、目標檢測、分割等)模型的訓練和推理須要一個重要的、涉及的數據輸入和擴充管道,當使用優化的代碼大規模運行時,當多個gpu必須等待CPU時,該管道會很快成爲總體性能的瓶頸準備數據。即便在使用多個CPU內核進行此處理時,CPU也很難爲gpu提供足夠快的數據。這會致使在等待CPU完成其任務時花費空閒GPU時間。將這些數據管道從CPU移動到GPU是有利的。DALI是一個開源的、與框架無關的GPU加速數據輸入和擴充管道庫,已經開發出來解決這個問題,將工做從CPU遷移到GPU。             

讓以流行的單點探測器(SSD)模型爲例。數據輸入管道有多個階段,如圖3所示。

Figure 3. DALI Data pipeline for SSD model

除了SSD Random(IoU-Intersection over Union-based)裁剪是SSD特定的以外,全部這些流水線階段在計算機視覺任務中看起來都至關標準。DALI中新添加的操做符經過提供對COCO數據集(COCOReader)、基於IoU的裁剪(SSDRandomCrop)和邊界框翻轉(BbFlip)的訪問,爲整個工做流提供了一個基於GPU的快速管道。

Conclusion

研究人員能夠利用討論的最新性能加強,以最小的努力加速深度學習訓練。訪問NVIDIA GPU Cloud(NGC)下載通過充分優化的深度學習框架容器、通過預先訓練的人工智能模型和模型腳本,讓能夠訪問世界上性能最高的深度學習解決方案,從而啓動人工智能研究。此外,在cuDNN和dali中還提供了單獨的庫和加強功能。

相關文章
相關標籤/搜索