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