硬件平台上深度学习自动内核优化
硬件平臺上深度學習自動內核優化
對于AI開發人員來說,在各種硬件平臺上優化深度神經網絡的性能仍然是一個難題。在系統支持方面,在這里面臨著許多問題:將訓練有素的模型從多個前端(例如Tensorflow,ONNX,MXNet)部署到多個硬件平臺(例如CPU,GPU,加速器)。此問題最關鍵的性能部分,為不斷增長的模型體系結構和硬件平臺獲得高性能的內核實現。
為了應對這一挑戰,TVM采用了全棧編譯器方法。TVM結合了代碼生成和自動程序優化功能,以生成可與經過大量手動優化的庫相媲美的內核,從而在包括ARM CPU,Intel CPU,Mali GPU,NVIIDA GPU和AMD GPU在內的硬件平臺上獲得了最新的推理性能。
本文展示了TVM編譯器堆棧中自動內核優化的工作流程,以及幾種硬件平臺上的基準測試結果。
系統總覽
圖1.系統概述
TVM中的內核優化以迭代循環的方式完成。如圖1所示,自動內核優化將來自前端框架的神經網絡(通常以計算圖表示形式)作為輸入,并為該網絡中的所有算子生成內核。
內部循環使用可伸縮的RPC運行時,基于機器學習的調諧器和張量編譯器。在循環的每一輪中,調諧器都會從較大的搜索空間中,選擇一批有前途的候選內核實現,將其配置在實際硬件上。然后,調諧器將獲得性能分析結果。這些分析結果用作訓練數據,以適合預測模型。擬合預測模型后,調諧器根據預測,選擇下一個有前途的候選者,然后循環繼續進行。這樣,迭代地快速搜索內核。
下圖比較了傳統的自動調諧和AutoTVM。主要區別在于AutoTVM
? 可擴展到異構設備集群
? 學習使用可轉移的機器學習成本模型優化張量程序
、
圖2.傳統自動調整和AutoTVM的比較
開始調整
為了演示,在ARM開發板RK3399上對resnet-18進行了優化。本文篇幅限制,省略了詳細說明。本文結尾處均提供了有關ARM CPU,Mali GPU,NVIDIA GPU,AMD GPU幫助的鏈接。
首先,從MXNet模型庫中獲得了預訓練的模型,然后從中提取調整任務。
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個調整任務。調諧器針對它們中的每一個進行數百次試驗,并挑選最佳試驗。完成所有調整任務后,將編譯整個網絡并生成一個可部署的最小庫。一個樣本輸出是
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)
如果模型具有一些奇怪的形狀或硬件是自定義的,則該調整特別有用,手動優化的靜態庫無法考慮所有情況。
基準結果
預先調整了設備群集上的一些流行網絡,并發布了以下基準測試。復制說明在本文的末尾。
由于具有統一的運行時界面,因此對TVM進行全面基準測試很容易。但是,如果沒有許多其它項目的開發人員的專家協助,與所有其他平臺進行完整,最新和正確的比較是不可行的。因此,將所有數字都放在一個表中,然后與其它一些庫進行不完全的比較。
比較
通過與每個平臺上經過高度優化的傳統庫進行比較,驗證了自動優化堆棧的有效性。
在ImageNet(3x224x224)數據集上測試了流行的圖像分類網絡,批處理大小= 1,數據類型= float32。報告的數字是每張圖像的時間成本(以毫秒為單位)。
ARM CPU
選擇NCNN(一個廣泛使用的,手動優化的內核庫)作為基準。大量使用NEON集成說明。例如,代碼庫僅針對3x3卷積層包含 13,000行代碼。項目存儲庫中引用基準編號。如下圖所示,TVM在Rasbperry Pi 3B上的所有網絡上均勝過它。
馬里Mali GPU
ARM Compute Library是供應商提供的庫,它很好地支持Mali GPU(OpenCL)。由于卷積層的優勢,TVM在ResNet和MobileNet中提供了更強大的性能。TVM在vgg-16上落后一些,因為vgg-16是一個古老而龐大的網絡,并且具有多個大型密集層。
NVIDIA GPU
在NVIDIA GPU上,CuDNN和TensorRT分別是兩個供應商提供的用于訓練和推理的庫。由于專注于推理,因此在無限制的環境中運行基準測試。另一個張量編譯器PlaidML也被報告為基線,因為與AutoTVM之前的TVM版本相比,具有以前的基準。從PlaidBench參考基準測試結果。根據以下結果,TVM與TensorRT性能達到同等水平。
AMD GPU
還將快速介紹一下AMD GPU。TVM支持OpenCL和ROCm后端。發現ROCm更好,更專門用于AMD GPU。MIOpen是供應商提供的內核庫。TVM的圖形運行時可以直接調用MIOpen的內核實現,通過使用此集成來報告基線性能。
沒有對AMD GPU進行任何特定的優化。NVIDIA GPU的所有計算定義和計劃代碼都可以直接重用。結果,在大多數情況下,TVM比MIOpen慢一些,仍有改進的空間。
所有的結果
在ImageNet(3x224x224)數據集上測試了以下網絡,批處理大小= 1,數據類型= float32。報告的數字是每張圖像的時間成本(以毫秒為單位)。
? 注1:該板上的內存不足。
? 注意2:由于時間限制,沒有在GPU上調整某些小型網絡。如果無法提供分析數據,TVM可以使用后備代碼生成。但是在這種情況下,不能保證具有競爭性的性能。
結論
借助富有表現力的代碼生成器和高效的搜索算法,能夠生成與經過手動優化的內核相當的內核。由于程序的時間很昂貴,而機器的時間也越來越便宜,因此相信在循環中使用實際硬件和數據進行自動優化,將是推理部署的標準工作流程。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
總結
以上是生活随笔為你收集整理的硬件平台上深度学习自动内核优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLPack构建跨框架的深度学习编译器
- 下一篇: CUDA上的量化深度学习模型的自动化优化