基于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框架進行了一些改進,以優化各種訓練批大小的性能,尤其是較小的,而不僅僅是較大的批大小:
隨著批處理大小的減小,每次訓練迭代與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容器包含最新版本的TensorFlow1.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優化器的融合實現?,F有的默認PyTorch實現需要多個進出GPU設備內存的冗余通道。這些冗余的傳遞會產生很大的開銷,特別是在以數據并行方式跨多個gpu擴展訓練時。Apex中的融合Adam優化器消除了這些冗余通道,提高了性能。例如,使用fused Apex實現的NVIDIA優化版變壓器網絡比PyTorch中的現有實現提供了5%到7%之間的端到端訓練加速。對于谷歌神經機器翻譯(GNMT)的優化版本,所觀察到的端到端加速比從6%到高達45%(對于小批量大小)。
接下來,添加了層規范化的優化實現。對于相同的轉換網絡,Apex的層規范化在訓練性能上提供了4%的端到端加速。
最后,擴展了分布式數據并行包裝器,用于多GPU和多節點訓練。這包括顯著的引擎蓋下性能調整,以及新的面向用戶的選項,以提高性能和準確性。一個例子是“delay_allreduce”選項。此選項緩沖所有要在GPU上累積的層的所有漸變,然后在完成反向傳遞后將鏈接在一起。
雖然此選項忽略了將已計算梯度的通信與其模型層的梯度計算重疊的機會,但可以在使用持久內核實現(包括批處理規范化和某些cuDNN rnn)的情況下提高性能?!癲elay_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中還提供了單獨的庫和增強功能。
總結
以上是生活随笔為你收集整理的基于NVIDIA GPUs的深度学习训练新优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适用于Linux 2的Windows子系
- 下一篇: 如何运行具有奇点的NGC深度学习容器