硬件平台上深度学习自动内核优化
硬件平臺上深度學(xué)習(xí)自動內(nèi)核優(yōu)化
對于AI開發(fā)人員來說,在各種硬件平臺上優(yōu)化深度神經(jīng)網(wǎng)絡(luò)的性能仍然是一個難題。在系統(tǒng)支持方面,在這里面臨著許多問題:將訓(xùn)練有素的模型從多個前端(例如Tensorflow,ONNX,MXNet)部署到多個硬件平臺(例如CPU,GPU,加速器)。此問題最關(guān)鍵的性能部分,為不斷增長的模型體系結(jié)構(gòu)和硬件平臺獲得高性能的內(nèi)核實現(xiàn)。
為了應(yīng)對這一挑戰(zhàn),TVM采用了全棧編譯器方法。TVM結(jié)合了代碼生成和自動程序優(yōu)化功能,以生成可與經(jīng)過大量手動優(yōu)化的庫相媲美的內(nèi)核,從而在包括ARM CPU,Intel CPU,Mali GPU,NVIIDA GPU和AMD GPU在內(nèi)的硬件平臺上獲得了最新的推理性能。
本文展示了TVM編譯器堆棧中自動內(nèi)核優(yōu)化的工作流程,以及幾種硬件平臺上的基準(zhǔn)測試結(jié)果。
系統(tǒng)總覽
圖1.系統(tǒng)概述
TVM中的內(nèi)核優(yōu)化以迭代循環(huán)的方式完成。如圖1所示,自動內(nèi)核優(yōu)化將來自前端框架的神經(jīng)網(wǎng)絡(luò)(通常以計算圖表示形式)作為輸入,并為該網(wǎng)絡(luò)中的所有算子生成內(nèi)核。
內(nèi)部循環(huán)使用可伸縮的RPC運行時,基于機器學(xué)習(xí)的調(diào)諧器和張量編譯器。在循環(huán)的每一輪中,調(diào)諧器都會從較大的搜索空間中,選擇一批有前途的候選內(nèi)核實現(xiàn),將其配置在實際硬件上。然后,調(diào)諧器將獲得性能分析結(jié)果。這些分析結(jié)果用作訓(xùn)練數(shù)據(jù),以適合預(yù)測模型。擬合預(yù)測模型后,調(diào)諧器根據(jù)預(yù)測,選擇下一個有前途的候選者,然后循環(huán)繼續(xù)進行。這樣,迭代地快速搜索內(nèi)核。
下圖比較了傳統(tǒng)的自動調(diào)諧和AutoTVM。主要區(qū)別在于AutoTVM
? 可擴展到異構(gòu)設(shè)備集群
? 學(xué)習(xí)使用可轉(zhuǎn)移的機器學(xué)習(xí)成本模型優(yōu)化張量程序
、
圖2.傳統(tǒng)自動調(diào)整和AutoTVM的比較
開始調(diào)整
為了演示,在ARM開發(fā)板RK3399上對resnet-18進行了優(yōu)化。本文篇幅限制,省略了詳細(xì)說明。本文結(jié)尾處均提供了有關(guān)ARM CPU,Mali GPU,NVIDIA GPU,AMD GPU幫助的鏈接。
首先,從MXNet模型庫中獲得了預(yù)訓(xùn)練的模型,然后從中提取調(diào)整任務(wù)。
from mxnet.gluon.model_zoo.vision import get_model
block = get_model(‘resnet18_v1’, pretrained=True)
net, params = nnvm.frontend.from_mxnet(block)
tasks = autotvm.extract_from_graph(net)
tune_tasks(tasks, **tuning_option)
resnet-18中有12個不同的conv2d層,因此啟動了12個調(diào)整任務(wù)。調(diào)諧器針對它們中的每一個進行數(shù)百次試驗,并挑選最佳試驗。完成所有調(diào)整任務(wù)后,將編譯整個網(wǎng)絡(luò)并生成一個可部署的最小庫。一個樣本輸出是
Extract tasks…
Tuning…
[Task 1/12] Current/Best: 22.37/ 52.19 GFLOPS | Progress: (544/1000) | 406.59 s Done.
[Task 2/12] Current/Best: 6.51/ 18.77 GFLOPS | Progress: (608/1000) | 325.05 s Done.
[Task 3/12] Current/Best: 4.67/ 24.87 GFLOPS | Progress: (480/1000) | 372.31 s Done.
[Task 4/12] Current/Best: 11.35/ 46.83 GFLOPS | Progress: (736/1000) | 602.39 s Done.
[Task 5/12] Current/Best: 1.01/ 19.80 GFLOPS | Progress: (448/1000) | 262.16 s Done.
[Task 6/12] Current/Best: 2.47/ 23.76 GFLOPS | Progress: (672/1000) | 563.85 s Done.
[Task 7/12] Current/Best: 14.57/ 33.97 GFLOPS | Progress: (544/1000) | 465.15 s Done.
[Task 8/12] Current/Best: 1.13/ 17.65 GFLOPS | Progress: (576/1000) | 365.08 s Done.
[Task 9/12] Current/Best: 14.45/ 22.66 GFLOPS | Progress: (928/1000) | 724.25 s Done.
[Task 10/12] Current/Best: 3.22/ 15.36 GFLOPS | Progress: (864/1000) | 564.27 s Done.
[Task 11/12] Current/Best: 11.03/ 32.23 GFLOPS | Progress: (736/1000) | 635.15 s Done.
[Task 12/12] Current/Best: 8.00/ 21.65 GFLOPS | Progress: (1000/1000) | 1111.81 s Done.
Compile…
Upload…
Evaluate inference time cost…
Mean inference time (std dev): 162.59 ms (0.06 ms)
如果模型具有一些奇怪的形狀或硬件是自定義的,則該調(diào)整特別有用,手動優(yōu)化的靜態(tài)庫無法考慮所有情況。
基準(zhǔn)結(jié)果
預(yù)先調(diào)整了設(shè)備群集上的一些流行網(wǎng)絡(luò),并發(fā)布了以下基準(zhǔn)測試。復(fù)制說明在本文的末尾。
由于具有統(tǒng)一的運行時界面,因此對TVM進行全面基準(zhǔn)測試很容易。但是,如果沒有許多其它項目的開發(fā)人員的專家協(xié)助,與所有其他平臺進行完整,最新和正確的比較是不可行的。因此,將所有數(shù)字都放在一個表中,然后與其它一些庫進行不完全的比較。
比較
通過與每個平臺上經(jīng)過高度優(yōu)化的傳統(tǒng)庫進行比較,驗證了自動優(yōu)化堆棧的有效性。
在ImageNet(3x224x224)數(shù)據(jù)集上測試了流行的圖像分類網(wǎng)絡(luò),批處理大小= 1,數(shù)據(jù)類型= float32。報告的數(shù)字是每張圖像的時間成本(以毫秒為單位)。
ARM CPU
選擇NCNN(一個廣泛使用的,手動優(yōu)化的內(nèi)核庫)作為基準(zhǔn)。大量使用NEON集成說明。例如,代碼庫僅針對3x3卷積層包含 13,000行代碼。項目存儲庫中引用基準(zhǔn)編號。如下圖所示,TVM在Rasbperry Pi 3B上的所有網(wǎng)絡(luò)上均勝過它。
馬里Mali GPU
ARM Compute Library是供應(yīng)商提供的庫,它很好地支持Mali GPU(OpenCL)。由于卷積層的優(yōu)勢,TVM在ResNet和MobileNet中提供了更強大的性能。TVM在vgg-16上落后一些,因為vgg-16是一個古老而龐大的網(wǎng)絡(luò),并且具有多個大型密集層。
NVIDIA GPU
在NVIDIA GPU上,CuDNN和TensorRT分別是兩個供應(yīng)商提供的用于訓(xùn)練和推理的庫。由于專注于推理,因此在無限制的環(huán)境中運行基準(zhǔn)測試。另一個張量編譯器PlaidML也被報告為基線,因為與AutoTVM之前的TVM版本相比,具有以前的基準(zhǔn)。從PlaidBench參考基準(zhǔn)測試結(jié)果。根據(jù)以下結(jié)果,TVM與TensorRT性能達(dá)到同等水平。
AMD GPU
還將快速介紹一下AMD GPU。TVM支持OpenCL和ROCm后端。發(fā)現(xiàn)ROCm更好,更專門用于AMD GPU。MIOpen是供應(yīng)商提供的內(nèi)核庫。TVM的圖形運行時可以直接調(diào)用MIOpen的內(nèi)核實現(xiàn),通過使用此集成來報告基線性能。
沒有對AMD GPU進行任何特定的優(yōu)化。NVIDIA GPU的所有計算定義和計劃代碼都可以直接重用。結(jié)果,在大多數(shù)情況下,TVM比MIOpen慢一些,仍有改進的空間。
所有的結(jié)果
在ImageNet(3x224x224)數(shù)據(jù)集上測試了以下網(wǎng)絡(luò),批處理大小= 1,數(shù)據(jù)類型= float32。報告的數(shù)字是每張圖像的時間成本(以毫秒為單位)。
? 注1:該板上的內(nèi)存不足。
? 注意2:由于時間限制,沒有在GPU上調(diào)整某些小型網(wǎng)絡(luò)。如果無法提供分析數(shù)據(jù),TVM可以使用后備代碼生成。但是在這種情況下,不能保證具有競爭性的性能。
結(jié)論
借助富有表現(xiàn)力的代碼生成器和高效的搜索算法,能夠生成與經(jīng)過手動優(yōu)化的內(nèi)核相當(dāng)?shù)膬?nèi)核。由于程序的時間很昂貴,而機器的時間也越來越便宜,因此相信在循環(huán)中使用實際硬件和數(shù)據(jù)進行自動優(yōu)化,將是推理部署的標(biāo)準(zhǔn)工作流程。TVM只是提供了這樣的解決方案。
參考鏈接
[1] benchmark: https://github.com/dmlc/tvm/tree/master/apps/benchmark
[2] Tutorial on tuning for ARM CPU: https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_arm.html
[3] Tutorial on tuning for Mobile GPU: https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_mobile_gpu.html
[4] Tutorial on tuning for NVIDIA/AMD GPU: https://tvm.apache.org/docs//tutorials/autotvm/tune_nnvm_cuda.html
[5] Paper about AutoTVM: Learning to Optimize Tensor Program
[6] Paper about Intel CPU (by AWS contributors) : Optimizing CNN Model Inference on CPUs
總結(jié)
以上是生活随笔為你收集整理的硬件平台上深度学习自动内核优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLPack构建跨框架的深度学习编译器
- 下一篇: CUDA上的量化深度学习模型的自动化优化