CUDA上深度学习模型量化的自动化优化
CUDA上深度學習模型量化的自動化優化
深度學習已成功應用于各種任務。在諸如自動駕駛汽車推理之類的實時場景中,模型的推理速度至關重要。網絡量化是加速深度學習模型的有效方法。在量化模型中,數據和模型參數都用諸如int8和float16低精度數據類型表示。降低的數據帶寬減少了推理時間和存儲器/存儲要求,以及功耗。在適當的量化方案下,可以最小化量化模型的精度下降。因此,量化模型特別適合研究人員和開發人員,使大型模型適合在各種設備(例如GPU,CPU和移動設備)上部署。
通常通過手工微內核,針對不同的工作量來優化量化算子,或者依賴于cuDNN和TensorRT等黑盒專有解決方案。在集成中編寫高性能微內核,可能非常困難,通常需要大量的工程工作。此外,很難使這些臨時微內核,適應新興的工作負載和新設備。
圖1. TVM,TensorRT和MXNet上不同模型的推理時間
TVM通過全棧編譯器和基于機器學習的優化器,自動生成計算內核,從而解決了這一難題。TVM可以通過在人為設計的搜索空間,進行自動搜索來生成有效的內核。在VGG和ResNet等標準工作負載中,TVM與其它最新框架相比具有競爭優勢。在諸如ResNeXt和Deformable ConvNets之類的新興模型中,自動優化使TVM可以輕松適應這些新工作負載并顯著提高性能。
本文將展示如何使用TVM在CUDA上自動優化量化深度學習模型。
在TVM中表達量化的CUDA內核
通過張量化利用張量本征
許多平臺都為特殊的計算模式,提供了特定于體系結構的指令,例如x86上的SIMD指令dp4a以及hfmaCUDA上的指令。這些內部指令針對特定設備進行了高度優化。通過利用硬件內部函數,可以為量化算子帶來顯著的性能提升。
目前,dp4a已被CUDA上的TVM int8 算子廣泛使用。dp4a是Compute Capability 6.1設備上固有的CUDA。這是一種混合精度指令,可以高效地計算兩個4元素8位整數向量之間的點積,并以32位格式累加結果。使用dp4a,可以在8位整數向量之間實現點積,其元素數可以被4整除。使用高效的點積算子,可以實現高級算子,例如2D卷積和密集層,這些算子通常由點積支持。
為了說明這一點,在二維卷積中,沿著內核的通道,寬度和高度進行累積。這是的典型用例dp4a。TVM使用張量化來支持調用外部內部函數。不需要修改原始的計算聲明;使用調度原語tensorize,用dp4a張量內部函數代替累加。
數據布局重排
張量化的挑戰之一,可能需要設計特殊的計算邏輯,適應張量本征的要求。盡管在密集算子中沿張量的內軸累積是很自然的,conv2d但可能更具挑戰性。在conv2d期望采取切片作為輸入端的通道尺寸dp4a,因為信道數目通常是4的倍數(否則回落到原來conv2d在NCHW布局)。為了實現內存局部性,先沿最內軸減小。考慮到這些因素,使用自定義數據布局來應對這一挑戰。
在CUDA int8 2d卷積中,根據經驗選擇NCHW4c作為數據布局和OIHW4o4i權重布局。模板可以很容易地推廣到NCHW[x]c和OIHW[x]o[x]i,其中x是可以被4整除的任意正整數。選擇數據布局中,通道切片位于打包的最里面維度中。同樣,在權重的輸入和輸出通道尺寸中打包切片,以使輸出與輸入具有一致的數據布局,從而防止了圖層之間的多余布局轉換。
在圖2中顯示了2d卷積輸出的一個元素的計算。超尺寸(包含打包元素的塊狀布局的外部尺寸)每個位置的元素NCHW和OIHW分別是打包的輸入和內核。打包內核的每一列都來自不同的過濾器。使用dp4a來計算壓縮輸入和壓縮內核中每一行之間的點積,將結果累加到輸出張量。
圖2. NCHW4c中的數據布局和OIHW4o4i中的權重布局的二維卷積。 左:NCHW4c布局中的輸入張量。內核的一個移動的過濾器被染成藍色。輸入和內核的一個元素以灰色顯示。 中:灰色塊中的打包輸入和內核。 右:NCHW4c布局中的輸出。所示一個元素內,通道子維度中有四個壓縮元素。
在指定卷積層的布局之后,其它算子(例如add和激活),可以在Relay的AlterOpLayout傳遞期間,自動適應所選的布局。權重的布局轉換,可以離線進行預先計算。可以在相同的布局中,運行整個模型而無需額外的開銷。
設計搜索空間以進行自動優化
在量化算子中獲得良好性能的關鍵是與基于機器學習的自動優化相集成。一個問題是如何設計有效的調度搜索空間。有效的調度模板意味著在自動調整中,可以通過合理的迭代次數獲得良好的性能。一般而言,努力定義一個靈活的模板,覆蓋搜索空間中的不同配置。另一方面,利用性能優化方面的先驗知識。例如,由于在CUDA編程中將數據緩存在共享內存中是一種常見的做法,利用共享內存,使用機器學習來選擇最佳的圖塊大小。還進行了一些手動平鋪,例如將軸分割為4或16,以便于向量化內存訪問。
在量化的2d卷積中,設計了一個搜索空間,其中包括一組可調選項,例如圖塊大小,要融合的軸,循環展開和雙緩沖的配置。在CUDA上注冊了量化模板conv2d和denseCUDA模板int8。在自動調整期間,可以通過設置template_key參數來為這些量化算子創建調整任務。
一般工作流程
圖3.運行量化模型的工作流程
TVM提供了一個簡單的工作流程,可以從其它框架量化訓練后的模型,自動優化算子(使用AutoTVM),部署到其它設備。
首先,使用Relay前端導入現有模型。在這里,以帶有(1, 3, 224, 224)輸入形狀的MXNet模型為例。
sym, arg_params, aux_params = mxnet.model.load_checkpoint(model_path, epoch)
net, params = relay.from_mxnet(sym, shape={‘data’: (1, 3, 224, 224)}, arg_params=arg_params, aux_params=aux_params)
接下來,使用Relay量化API將其轉換為量化模型。
net = relay.quantize.quantize(net, params=params)
然后,使用AutoTVM為模型中的算子,提取調整任務并執行自動優化。
最后,建立模型并以量化模式運行推理。
with relay.build_config(opt_level=3):
graph, lib, params = relay.build(net, target)
結果relay.build是可部署的庫。可以直接在GPU上運行推理,也可以通過RPC部署在遠程設備上。
基準
為了驗證TVM中量化算子的性能,對幾種流行的網絡模型(包括VGG-19,ResNet-50和Inception V3)的性能進行了基準測試。還對來自可變形卷積網絡的DRN-C-26,ResNeXt-50和DCN-ResNet-101進行基準測試,以顯示新興模型的性能,其中包含較少的常規算子,例如膨脹卷積,組卷積和可變形卷積。選擇NVIDIA TensorRT作為基準。據報道,在float32模式下MXNet 1.4 + cuDNN 7.3的結果顯示了量化的加快。實驗是在NVIDIA GTX 1080上進行的。當以批處理大小=1和16運行時,報告每個圖像的推理時間。
如圖1所示,TVM使用量化實現了高達8倍的加速。在VNG和ResNet等標準CNN模型中,TVM與TensorRT的最新結果保持一致。
在對新興模型進行基準測試時,TVM取得了令人印象深刻的結果。在ResNeXt和DCN-ResNet-101上獲得了可觀的性能提升。TensorRT的DCN-ResNet-101的結果不可用,因為尚無可變形卷積的正式實現。TVM中的自動優化,可以輕松靈活地支持和優化新興的工作負載。
總結
以上是生活随笔為你收集整理的CUDA上深度学习模型量化的自动化优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将TVM集成到PyTorch
- 下一篇: AI 芯片的分类及技术