日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

發布時間:2023/11/28 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

全文翻譯(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
摘要
人們越來越需要將機器學習應用到各種各樣的硬件設備中?,F在的框架依賴于特定于供應商的算子庫,針對窄帶的服務器級GPU進行優化。將工作負荷部署到新平臺,如移動電話,嵌入式設備和加速算子(如FPGA,ASIC)-需要大量手動操作。
提出了TVM,一個開源圖形級別的編譯器和算子級優化,提供高效跨多個應用程序移植到深度學習工作負荷硬件后端。TVM解決了深度學習特有的優化難題,如高級算子融合,映射到任意硬件原語,內存延遲隱藏。
通過以下方式自動優化底層程序,適配硬件特性:
采用一種自定義的,基于學習的成本模型方法,用于快速探索代碼優化。實驗結果表明,TVM可在不同的領域,提供高性能硬件后端,可與最先進的低功耗CPU,mobile GPU,server-class GPUs的手動調優庫抗衡。展示了TVM面向加速算子后端的能力,如作為基于FPGA的通用深度學習加速算子。TVM系統是開源的,在幾家大公司提供量產服務。
1.引言
深度學習(DL)模型,可以識別圖像,處理自然語言,在挑戰性戰略游戲中擊敗人類。智能應用部署的需求日益增長,從云服務器,自動駕駛汽車和嵌入式設備,廣泛應用于各種設備。由于硬件特性的多樣性,包括嵌入式CPU,GPU,FPGA和ASIC(如TPU),將DL工作負荷,映射到這些設備非常重要。這些硬件目標包括內存組織,計算功能單元,如圖1所示。

Figure 1: CPU, GPU and TPU-like accelerators require different on-chip memory architectures and compute primitives. This divergence must be addressed when generating optimized code.
當前的DL框架,如TensorFlow,MXNet,Caffe和Pytorch,依靠計算圖實現優化,如自動微分和動態內存管理。圖形級優化,通常太深奧,無法處理硬件后端特定的算子級轉換。大部分框架專注于一個狹窄的服務器類GPU設備,特定于目標的優化高度工程化和特定于供應商的算子libraries。這些算子庫,過于專業化和不透明,不易于跨硬件設備進行移植,需要大量的手動調諧數據。提供在各種DL框架中,支持各種硬件后端,目前需要大量的工程效率。即使對于受支持的后端,框架也必須在以下兩者間,做出艱難的選擇:
(1) 避免產生預定義運算子庫中,沒有的新運算符算子的圖形優化
(2)使用這些新算子的未優化實現。
不同的硬件后端,實現圖形級和算子級優化,采用了一種有趣的,完全不同的端到端方法。構建TVM,一種采用高級規范的編譯器,從現有框架支持不同的代碼生成,低級優化代碼硬件后端。為了吸引用戶,TVM需要提供與跨di-verse硬件后端的多種手動優化算子庫相競爭的性能。這一目標需要解決下文介紹的主要挑戰。
利用特定的硬件功能和限制。
DL加速算子引入了優化的張量計算原語,GPU和CPU不斷改進處理元素。一個重大的挑戰,客戶生成優化的代碼給定的算子描述。硬件指令的輸入是多維的,可以是固定的,也可以是可變的長度;規定了不同的數據布局;有內存層次結構的特殊要求。系統必須利用加速算子,有效地處理這些復雜的原語。加速算子的設計也是如此,通常傾向于更精簡的控制和load更多編譯器堆棧復雜調度。對于專門化的加速算子,系統需要生成顯式控制管道,針對CPU和GPU的硬件,優化隱藏內存訪問延遲關系的代碼。
優化的大搜索空間另一個挑戰,在不手動調整算子的情況下,生成高效代碼。內存訪問,線程模式和新型硬件原語的組合選擇,為生成的代碼創建巨大的配置空間(例如,循環布局和排序,緩存,展開)。如果實施blackbox黑盒自動調諧,將產生巨大的搜索成本??梢圆捎妙A先確定的成本模型,指導搜索,由于模型的復雜性越來越高,構建準確成本模型,很難建立模型現代硬件。此外,要求為每種硬件類型,建立單獨的成本模型。
TVM通過三個關鍵模塊解決了這些挑戰。
(1)引入一種張量表達式語言。
構建算子提供程序轉換,通過各種優化生成不同版本的program原語。這一層開展Halid的計算/調度分離概念,將目標硬件本質與轉換原語分離,支持新型加速算子及相應的新intrinsics。此外,引入了新的轉換原語,應對與GPU相關的挑戰,使部署能夠特定于加速算子。可以應用不同的程序轉換序列,為給定的算子聲明,形成豐富的有效程序空間。
(2) 引入了一個自動程序優化框架,用于尋找優化的張量算子。
優化算子是在基于ML的成本模型的指導下,從硬件后端收集更多數據,該模型會不斷調整和改進。
(3)在自動代碼生成上,引入一個充分利用高級和算子級優化。
通過結合這三個模塊,TVM可以將現有深度學習框架的模型描述,工作,執行高級和低級優化,為后端(如CPU,GPU和基于FPGA的專用處理器)生成特定于硬件的優化代碼加速算子。
本文主要貢獻:
?確定了在不同硬件后端為深度學習工作負荷,提供性能可移植性方面的主要優化挑戰。
?引入了自定義的調度原語,充分利用了跨線程內存重用,創新的硬件本質和延遲隱藏。
?提出實施基于機器學習的自動探索和優化系統搜索的張量算子。
?構建了一個端到端的編譯和優化堆棧,在高級框架(包括TensorFlow,MXNet,PyTorch,Keras,CNTK)中,多種硬件后端(包括CPU,服務器GPU,移動GPU和基于FPGA的加速算子)特定的工作負荷,部署深度學習。
開源TVM在幾家大公司內部量產使用。在服務器級GPU,嵌入式GPU,嵌入式CPU和一個定制的基于FPGA的通用加速器上,使用真實的工作負荷,對TVM進行了評估。
實驗結果表明,TVM具有便攜性跨后端的性能實現加速,在現有框架的基礎上,由手工優化的庫支持,從1.2×到3.8×不等。
2.概述

通過使用示例,介紹TVM的組件。

Figure 2: System overview of TVM. The current stack supports descriptions from many deep learning frameworks and exchange formats, such as CoreML and ONNX, to target major CPU, GPU and specialized accelerators.
圖2總結了TVM中的執行步驟及相應部分。該系統首先將現有框架中的模型作為輸入,轉換為計算圖形表示。然后執行高級數據流重寫,生成優化的圖。操作員級優化模塊必須生成efficient代碼-此圖中每個融合運算符的。運算符是用聲明性張量表達式語言指定的;未指定執行細節。TVM為給定的目標識別一組可能的代碼優化
硬件目標的算子。可能的優化形成了一個很大的空間,使用基于ML的成本模型,尋找優化的算子。最后,系統將生成的代碼,打包到可部署模塊中。
最終用戶示例。在以下幾行代碼中,用戶可以從現有的深度學習框架中獲取模型,調用TVM API獲得可部署模塊:
import tvm as t

Use keras framework as example, import model

graph, params = t.frontend.from_keras(keras_model)
target = t.target.cuda()
graph, lib, params = t.compiler.build(graph, target, params)
這個編譯后的運行時模塊,包含三個組件:
最終優化的計算圖(graph)、生成的算子(lib)和模塊參數(params)??梢允褂眠@些組件,將模型部署到目標后端:
import tvm.runtime as t
module = runtime.create(graph, lib, t.cuda(0))
module.set_input(**params)
module.run(data=data_array)
output = tvm.nd.empty(out_shape, ctx=t.cuda(0))
module.get_output(0, output)
TVM支持局域網中的多個部署后端,如C++、java和Python。本文的其余部分描述了TVM的體系結構,及系統程序員如何擴展,支持新的后端。
3.優化計算圖
計算圖是在DL框架中表示程序的常用方法。圖3顯示了兩層卷積神經網絡的計算圖表示示例。這種高級表示與低級編譯器中間表示(IR,如LLVM)間的主要區別,中間數據項是大型多維張量。計算圖提供了算子的全局視圖,但避免指定每個算子必須如何實現。與LLVM IRs一樣,計算圖可以轉換為功能等效圖優化。利用常見DL工作負載中的形狀特異性,優化一組固定的輸入shape。

Figure 3: Example computational graph of a two-layer convolutional neural network. Each node in the graph represents an operation that consumes one or more tensors and produces one or more tensors. Tensor operations can be parameterized by attributes to confifigure their behavior (e.g., padding or strides).
TVM利用計算圖表示應用高級優化:節點表示對張量或程序輸入的算子,邊表示算子間的數據依賴關系。實現多級圖形優化,包括:算子fusion,將多個小算子融合在一起;常量折疊,預先計算可靜態確定的圖形部分,節省執行成本;靜態內存調度過程,預先分配內存,保存每個中間張量;數據布局轉換,將內部數據布局轉換為后端友好的形式。
現在討論算子融合和數據布局轉換。
算子融合
算子融合將多個算子組合到單個內核中,無需將中間結果保存在內存中。這種優化可以大大減少執行時間,特別是在GPU和專用加速器中。具體來說,認識到四類圖算子:
(1)內射(一對一映射,如add)
(2)歸約(如sum)
(3)復雜輸出可融合(將元素映射融合到輸出,如conv2d)
(4)不透明(不能融合,如sort)。
提供了融合這些算子的通用規則,如下所示。
多個內射算子可以融合成另一個內射算子。歸約算子可以與輸入內射算子融合(例如,融合scale和sum)。如conv2d類的算子是復雜的可外fusion的,可以將元素算子fusion到輸出中。可以應用這些規則,將計算圖轉換為融合版本。

Figure 4: Performance comparison between fused and non-fused operations. TVM generates both operations. Tested on NVIDIA Titan X.
圖4演示了對不同工作負載的影響的優化。通過減少內存訪問,融合算子可以產生高達1.2倍到2倍的加速比。
數據布局轉換。在計算圖中存儲給定張量有多種方法。最常見的數據布局選擇是列主視圖和行主視圖。實際上,可能喜歡使用復雜的數據布局。例如,DL accelerator可能利用4×4矩陣運算,需要將數據平鋪到4×4塊中,優化局部訪問。

Figure 5: Example schedule transformations that optimize a matrix multiplication on a specialized accelerator.
數據布局優化,可以使用更好的內部數據布局,轉換計算圖形,在目標硬件上執行圖形。先指定每個算子的首選數據布局,給定內存層次結構指定的約束。然后,如果生產者和消費者的首選數據布局不匹配,將在兩者間執行適當的布局轉換。
雖然高級圖優化可以極大地提高DL工作負載的效率,但效率僅與operator library提供的一樣高。目前,支持算子融合的少數DL框架,要求算子庫提供融合模式的實現。隨著更多的網絡算子定期推出,可能的融合內核數量可能會大幅增加。當針對越來越多的硬件后端時,這種方法不再具有可持續性,因為所需的融合模式實現數量,隨著必須支持的數據布局,數據類型和加速器內部結構的數量,組合增長。接下來提出一種代碼生成方法,可以為給定模型的算子生成各種可能的實現。
4.生成張量運算
TVM通過在每個硬件后端,生成許多有效的實現,選擇優化的實現,為每個算子生成高效的代碼。
該過程基于Halide,將描述與計算規則(或調度優化)分離,將支持新的優化(嵌套并行,張量化和延遲隱藏)和大量硬件后端。重點介紹TVM的特定功能。
4.1 張量表達式和表空間

Figure 6: TVM schedule lowering and code generation process. The table lists existing Halide and novel TVM scheduling primitives being used to optimize schedules for CPUs, GPUs and accelerator back-ends. Tensorization is essential for accelerators, but it can also be used for CPUs and GPUs. Special memory-scope enables memory reuse in GPUs and explicit management of onchip memory in accelerators. Latency hiding is specifific to TPU-like accelerators.

引入了一種支持自動代碼生成的張量表達式語言。與高級計算圖表示不同,張量算子的實現是不透明的,每個算子都用索引公式表達式語言描述。以下代碼顯示了用于計算轉置矩陣乘法的張量表達式示例:

如何計算每個元素的表達式,每個計算算子都指定輸出張量的形狀和描述。張量表達式語言支持常見的算術和數學運算,涵蓋常見的DL算子模式。該語言沒有指定循環結構和許多其它執行細節,為各種后端添加硬件感知優化。采用Halide的解耦計算/調度原理,從張量表達式到低級代碼的特定映射,使用調度表示。
許多可能的調度,都可以執行此功能。
通過增量應用基本轉換(調度原語)構建調度,持程序的邏輯等價性。圖5顯示了在專用加速器上,調度矩陣乘法的示例。在內部,TVM使用一個數據結構,跟蹤循環結構和其它信息,因為應用了調度轉換。然后,這些信息可以為給定的最終調度生成低級代碼。

Figure 7: Performance comparison between TVM with and without cooperative shared memory fetching on matrix multiplication workloads. Tested on an NVIDIA Titan X.
張量表達式從Halide,Darkroom,TACO中獲取線索。主要增強功能,包括支持下面討論的新調度優化。為了在許多后端上實現高性能,必須支持足夠多的調度原語,覆蓋不同硬件后端上的各種優化。圖6總結了TVM支持的算子代碼生成過程和調度原語。重用有用的原語和來自Halide的低級循環程序AST,引入新的原語,優化GPU和加速器性能。新原語是實現最佳GPU性能所必需的,也是加速器所必需的。CPU、GPU、TPU類加速器是深度學習的三種重要硬件類型。
本節介紹了CPU、GPU和TPU類加速器的新優化原語,第5節說明了如何自動導出有效的調度。
4.2嵌套并行與協作
并行性是提高DL工作負載中,計算密集型內核效率的關鍵?,F代GPU提供了巨大的并行性,要求將所有并行模式bake到調度轉換中。大多數現有的解決方案,都采用了一種稱為嵌套并行(一種fork-join形式)的模型。該模型需要一個并行schedule原語,并行化數據并行任務;每個任務可以進一步遞歸細分為子任務,利用目標體系結構的多級線程層次結構(例如,GPU中的線程組)。稱此模型為無共享嵌套并行,因為一個工作線程,無法在同一并行計算階段,查看同級的數據。
無共享方法的另一種替代方法是協同獲取數據。具體來說,線程組可以協作獲取所有需要的數據,放入共享內存空間。此優化可以利用GPU內存層次結構,通過共享內存區域跨線程重用數據。TVM支持這種眾所周知的GPU優化,使用調度原語實現最佳性能。下面的GPU代碼示例優化了矩陣乘法。

圖7展示了這種優化的影響。將內存作用域的概念引入調度空間,以便將計算階段(代碼中的AS和BS)標記為共享。沒有顯式存儲范圍,自動范圍推斷,將計算階段標記為線程本地。共享任務必須計算組中,所有工作線程的依賴關系。
必須正確插入內存同步屏障,確保共享加載的數據對用戶可見。最后,除了對GPU有用之外,內存作用域標記特殊的內存緩沖區,在針對專用DL加速器時,創建特殊的降低規則。
4.3 張量化
DL工作負載具有很高的運算強度,通常可以分解為張量算子,如矩陣乘法或一維卷積。這些自然分解導致了最近的添加張量計算原語。這些新原語為基于調度的編譯,帶來了機遇和挑戰;雖然這些使用可以提高性能,但編譯框架必須無縫集成。稱為張量化:類似于SIMD體系結構的矢量化,但有顯著差異。指令輸入是多維的,具有固定或可變的長度,每個都有不同的數據布局。無法支持一組固定的原語,因為新的加速器用自定義的張量指令變體出現。
需要一個可擴展的解決方案。
通過使用張量內在聲明機制,將目標硬件結構從調度中分離出來,使張量化具有可擴展性。使用相同的張量表達式語言,聲明每個新硬件內在的行為,以及與之相關的降低規則。下面的代碼顯示了如何定義8×8張量硬件的內在特性。

引入了一個tensorize調度原則,用相應的內部函數替換計算單元。編譯器使用硬件聲明匹配計算模式,降低到相應的硬件本身。
Tensorization將調度與特定的硬件原語分離,易于擴展TVM支持新的硬件體系結構。Tensorization調度生成的代碼,符合高性能計算的實踐:將復雜算子分解為一系列微內核調用??梢允褂胻ensorize原語,進行手工制作的微內核的優點,這在某些平臺形式中可能是有益的。例如,為移動CPU實現超低精度算子,這些CPU通過利用位串行數據算子1或2位寬的數據類型矩陣向量乘法微內核。該微內核將結果累加為越來越大的數據類型,以最小化內存占用。將微內核作為TVM固有的張量表示,可產生高達1.5倍于非張量化的加速比。

4.4顯式內存延遲隱藏
延遲隱藏將內存算子與計算重疊的過程,最大限度地利用內存和計算資源。根據目標硬件后端的不同,需要不同的策略。

Figure 8: TVM virtual thread lowering transforms a virtual thread-parallel program to a single instruction stream; the stream contains explicit low-level synchronizations that the hardware can interpret to recover the pipeline parallelism required to hide memory access latency.
在CPU上,內存延遲隱藏通過同步多線程或硬件預取隱式實現的。GPU依賴于許多線程的快速上下文切換。相反,像TPU這樣的專用DL加速器,通常支持使用解耦訪問執行(DAE)的精簡控制架構和卸載細粒度的問題與軟件同步。

Figure 9: Decoupled Access-Execute in hardware hides most memory access latency by allowing memory and computation to overlap. Execution correctness is enforced by low-level synchronization in the form of dependence token enqueueing/dequeuing actions, which the compiler stack must insert in the instruction stream.
圖9顯示了一個減少運行時延遲的DAE硬件管道。與單片硬件設計相比,該管道可以將大部分內存訪問隱藏在頭上,幾乎充分利用計算資源。要為了獲得更高的利用率,必須使用細粒度同步算子,擴充指令流。如果沒有這些算子,依賴關系將無法強制執行,導致錯誤的執行。因此,DAE硬件管道,需要細粒度依賴排隊,在管道階段間均衡操作,保證正確執行,如圖9的指令流所示。
編程需要顯式低級同步的DAE加速器很困難。為了減輕編程負擔,引入了虛擬線程調度原語,讓程序員指定一個高級數據并行程序,就像指定一個支持多線程的硬件后端一樣。TVM會自動降低program,轉換為具有低級顯式同步的單個指令流,如圖8所示。該算法從高級多線程程序調度開始,插入必要的低級同步算子,確保在每個線程內正確執行。接下來,將所有虛擬線程的算子交錯到single的指令流。

Figure 10: Rooflfline of an FPGA-based DL accelerator running ResNet inference. With latency hiding enabled by TVM, performance of the benchmarks is brought closer to the rooflfline, demonstrating higher compute and memory bandwidth effificiency.
5. 自動化優化
考慮到一組豐富的調度原語,剩下的問題是為DL模型的每一層,找到最佳的算子實現。在這里,TVM為與每個層關聯的特定輸入shape和布局,創建一個專門的算子。這種專門化提供了顯著的性能優勢(與針對較小shape和布局多樣性的手工代碼相比),但也帶來了自動化挑戰。系統需要選擇調度優化,如修改循環排序或優化內存層次結構,以及調度特定參數,如平鋪大小和循環展開系數。
這樣的組合選擇為每個硬件后端的算子實現,構建了一個巨大的搜索空間。為了應對這一挑戰,構建了一個自動化的進度優化器,有兩個主要組件:一個是提出有前途的新配置的調度管理器,另一個是預測給定配置性能的機器學習成本模型。本節描述了這些組件和TVM的自動優化流程(圖11)。
5.1調度空間規格
構建了一個調度模板規范API,讓開發人員在調度空間中聲明knobs。模板規范允許在指定可能的調度時,根據需要結合開發人員的領域特定知識。還為每個硬件后端,創建了一個通用主模板,該模板根據使用張量表達式語言表示的計算描述,自動提取可能的knobs。在高層次上,希望考慮盡可能多的配置,讓優化器管理選擇負載。因此,優化器必須搜索數十億種可能的配置,查找實驗中使用的真實世界DL工作負載。
5.2 基于ML的成本模型
從大型配置空間中,通過黑盒優化,即自動調整,找到最佳調度的一種方法。此方法用于調整高性能計算庫。然而,自動調整需要許多實驗,確定良好的配置。

Figure 11: Overview of automated optimization framework. A schedule explorer examines the schedule space using an ML-based cost model and chooses experiments to run on a distributed device cluster via RPC. To improve its predictive power, the ML model is updated periodically using collected data recorded in a database.
另一種方法是建立一個預定義的成本模型,指導對特定硬件后端的搜索,不是運行所有的可能性,測量性能。理想情況下,一個完美的成本模型,會考慮影響性能的所有因素:內存訪問模式,數據重用,管道依賴性和線程連接模式等。不幸的是,由于現代硬件越來越復雜,這種方法很麻煩。此外,每個新的硬件目標,都需要一個新的(預定義的)成本模型。

Table 1: Comparison of automation methods. Model bias refers to inaccuracy due to modeling.
相反,采用統計方法,解決成本建模問題。在這種方法中,調度資源管理器提出的配置,可能會提高算子的性能。對于每個調度配置,使用一個ML模型,該模型將降低的循環程序作為輸入,預測在給定硬件后端上的運行時間。該模型使用搜索期間收集的運行時,測量數據進行訓練,不需要用戶輸入詳細的硬件信息。在優化過程中,隨著探索更多配置,會定期更新模型,提高準確性。
對于其它相關的工作負載也是如此。通過這種方式,ML模型的質量隨著更多的實驗提高。表1總結了自動化方法之間的主要差異?;贛L的成本模型,在自動調整和預定義的成本建模間,取得了平衡,可以從相關工作負載的歷史性能數據中獲益。
機器學習模型設計選擇。必須考慮兩個關鍵因素,選擇調度管理器,將使用的ML模型:質量和速度。

Figure 12: Comparison of different automation methods for a conv2d operator in ResNet-18 on TITAN X. The ML-based model starts with no training data and uses
the collected data to improve itself. The Y-axis is the speedup relative to cuDNN. We observe a similar trend for other workloads.

Figure 13: Example workflflow of ML cost models. XGBoost predicts costs based on loop program features. TreeRNN directly summarizes the AST.
schedule explorer經常查詢成本模型,由于模型預測時間和模型重新安裝時間產生開銷。為了發揮作用,這些開銷必須小于在實際硬件上,測量性能所需的時間,根據具體的工作負載/硬件目標,實際硬件上的性能可以達到秒級。這種速度要求將問題與傳統的超參數調優問題區分,在超參數調優問題中,執行測量的成本,相對于模型開銷非常高,可以使用更昂貴的模型。除了選擇模型外,需要選擇一個目標函數訓練模型,如配置的預測運行時間中的誤差。
由于資源管理器,僅根據預測的相對順序(A的運行速度比B快),選擇排名靠前的候選對象,因此不需要直接預測絕對執行時間。相反,使用排名目標,預測運行時成本的相對順序。
在ML Optimizer中實現了幾種類型的模型。采用了一個梯度樹推進模型(基于XGBoost),該模型根據從循環程序中提取的特征進行預測;這些特性包括每個循環級別上,每個內存緩沖區的內存訪問計數和重用率,以及循環注釋的一次熱編碼,如“矢量化”,“展開”和“并行”。評估了一個神經網絡模型,該模型使用TreeRNN,在無需特性工程的情況下,評測循環程序的AST。圖13總結了成本模型的工作流程。發現treeboosting和TreeRNN具有相似的預測質量。然而,前者的預測速度是后者的兩倍,訓練時間也少得多。因此,在實驗中選擇了梯度樹推進作為默認的成本模型。盡管如此,相信這兩種方法都是有價值的,期望今后對這個問題進行更多的研究。
平均而言,樹推進模型的預測時間為0.67毫秒,比實際測量快數千倍。圖12比較了基于ML的優化器和blackbox自動調優方法;前者發現更好的配置比后者快得多。
5.3進度計劃
一旦選擇了一個成本模型,就可以選擇有希望的配置,在這些配置上迭代地運行真正的度量。在每次迭代中,瀏覽器使用ML模型的預測,選擇一批候選對象,在這些候選對象上運行度量。然后將收集的數據,用作更新模型的訓練數據。如果不存在初始訓練數據,資源管理器會隨機挑選候選對象進行測量。
最簡單的探索算法,通過成本模型枚舉,運行每個配置,選擇前k名預測執行者。然而,這種策略在較大的搜索空間中,變得難以處理。
相反,運行了一個并行模擬退火算法。資源管理器從隨機配置開始,在每一步中,都會隨機轉到附近的配置。如果成本模型預測的成本降低,轉換是成功的。如果目標配置成本較高,可能會失敗(拒絕)。隨機游動傾向于收斂于具有較低速度的配置成本模型預測的成本。搜索狀態在成本模型更新期間持續存在;從這些更新之后的最后一個配置繼續。
5.4分布式設備池和RPC
分布式設備池可擴展硬件測試的運行,在多個優化作業之間,實現細粒度資源共享。TVM實現了一個定制的,基于RPC的分布式設備池,使客戶端能夠在特定類型的設備上運行程序??梢允褂么私涌?#xff0c;在主機編譯器上編譯程序,請求遠程設備,遠程運行函數,在主機上訪問相同腳本中的結果。TVM的RPC支持動態上載,使用運行時約定運行交叉編譯的模塊和函數。因此,相同的基礎結構,可以執行單個工作負載優化和端到端圖Inference。這種方法自動化了跨多個設備的編譯,運行和配置步驟。

Table 2: Confifigurations of all conv2d operators in ResNet-18 and all depthwise conv2d operators in MobileNet used in the single kernel experiments. H/W denotes height and width, IC input channels, OC output channels, K kernel size, and S stride size. All ops use “SAME” padding. All depthwise conv2d operations have channel multipliers of 1.
這種基礎架構對于嵌入式設備尤其重要,因為傳統上,嵌入式設備需要進行繁瑣的手動交叉編譯,代碼部署和測量。
6.評價
TVM核心是用C++實現的(~50k LoC)。提供Python和Java的語言綁定。本文前面的部分評估了TVM的幾個獨立優化和組件的影響,即,圖4中的算子融合,圖10中的延遲隱藏,以及圖12中基于ML的成本模型。
現在重點關注端到端評估,旨在回答以下問題:
?TVM能否在多個平臺上優化DL工作負載?
?TVM與每個后端上現有的DL frame works(依賴高度優化的庫)相比如何?
?TVM能否支持新出現的DL工作負載(例如,深度卷積,低精度算子)?
?TVM能否支持優化新的專用加速器?
為了回答這些問題,在四種平臺上評估了TVM:
(1) 服務器級GPU
(2) 嵌入式GPU
(3) 嵌入式CPU
(4) 在低功耗FPGA SoC上實現的DL加速計。

Figure 14: GPU end-to-end evaluation for TVM, MXNet, Tensorflflow, and Tensorflflow XLA. Tested on the NVIDIA Titan X.
基準測試基于現實世界的DL推理工作負載,包括ResNet,MobileNet,LSTM語言模型,深度Q網絡(DQN)和深度卷積生成對抗網絡(DCGAN)。將方法與現有的DL框架進行比較,包括MxNet和TensorFlow,依賴于高度工程化的,特定于供應商的庫。TVM執行端到端的自動優化和代碼生成,無需外部算子庫。
6.1 服務器級GPU評估
首先比較端到端的深度神經網絡TVM,MXNet(V1.1),Tensorflow(V1.7)和Tensorflow XLA的NVIDIA TITIX。MXNet和Tensorflow都使用cuDNN v7作為卷積算子;實現了版本的深度卷積,因為相對較新,還沒有得到最新庫的支持。還使用cuBLAS v8進行矩陣乘法。另一方面,Tensorflow XLA使用JIT編譯。

Figure 15: Relative speedup of all conv2d operators in ResNet-18 and all depthwise conv2d operators in MobileNet. Tested on a TITAN X. See Table 2 for operator confifigurations. We also include a weight pretransformed Winograd for 3x3 conv2d (TVM PT).
圖14顯示,TVM優于基線,由于聯合圖優化和生成高性能融合算子的自動優化器,其加速比從1.6×到3.8×不等。DQN的3.8倍加速是由于其使用了未經cuDNN優化的非常規算子(4×4 conv2d,步長=2);ResNet工作負載更為傳統。TVM會在這兩種情況下自動找到優化的。

Figure 16: ARM A53 end-to-end evaluation of TVM and TFLite.
為了評估算子級優化的有效性,還對ResNet和MobileNet中的每個張量算子,進行了細分比較,如圖15所示。將TensorComprehension(TC,commit:ef644ba)作為一個額外的基線,是最近引入的自動調優框架。2 TC結果包括在10代×100群體×每個算子2個隨機種子中發現的最佳seeds(即每個算子2000次試驗)。二維卷積是最重要的DL算子之一,cuDNN進行了大量優化。然而,TVM仍然可以為大多數層,生成更好的GPU內核。深度卷積是一種結構簡單的新算子。
在這種情況下,TVM和TC都可以找到比MXNet手工制作的內核更快的內核。TVM的改進主要歸功于,對大調度空間的探索和有效的基于ML的搜索算法。
6.2嵌入式CPU評估
在ARM Cortex A53(四核1.2GHz)上,評估了TVM的性能。使用Tensorflow Lite(TFLite,commit:7558b085)作為基線系統。

Figure 17: Relative speedup of all conv2d operators in ResNet-18 and all depthwise conv2d operators in mobilenet. Tested on ARM A53. See Table 2 for the configurations of these operators.
圖17將TVM算子與ResNet和MobileNet的手工優化算子進行了比較。TVM生成的算子,在兩種神經網絡工作負載方面,都優于手動優化的TFLite版本。該結果還證明了TVM能夠快速優化新興的張量算子,如深度卷積算子。最后,圖16顯示了三種工作負載的端到端比較,TVM優于TFLite基線。
3個超低精度算子,通過為小于8位的定點數據類型,生成高度優化的算子,展示了TVM支持超低精度推理的能力。低精度網絡用矢量化位串行乘法,代替昂貴的乘法,矢量化位串行乘法,由按位和pop計數減少組成。實現高效的低精度推理,需要將量化數據類型打包為更廣泛的標準數據類型,如int8或int32。
TVM系統生成的代碼性能優于Caffe2的手動優化庫。實現了一個特定于ARM的tensorization內核,利用ARM指令構建一個高效,低精度的矩陣向量微內核。然后,使用TVM的自動優化器,搜索調度空間。

Figure 18: Relative speedup of single- and multithreaded low-precision conv2d operators in ResNet. Baseline was a single-threaded, hand-optimized implementation from Caffe2 (commit: 39e07f7). C5, C3 are 1x1 convolutions that have less compute intensity, resulting in less speedup by multi-threading.

圖18將TVM與ResNet上的Caffe2超低精度庫進行了比較,用于2位激活,1位權重推理。由于基線是單線程的,還將與單線程TVM版本進行比較。
單線程TVM優于基線,尤其是C5,C8和C11層;這些是內核大小為1×1,步長為2的卷積層,超低精度基線庫未對此進行優化。此外,還利用額外的TVM功能,生成一個并行庫實現,該實現顯示出比基線更好的性能。除了2位+1位配置,TVM可以生成優化基線庫不支持的其它精度配置,提高靈活性。
6.3 嵌入式GPU評估
對于移動GPU實驗,在配備ARM Mali-T860MP4 GPU的Firefly-RK3399板上,運行端到端管道。基線是供應商提供的庫,即ARM計算庫(v18.03)。

Figure 19: End-to-end experiment results on Mali-T860MP4. Two data types, flfloat32 and flfloat16, were evaluated.
如圖19所示,對于float16和float32,在三種可用模型上的表現,都優于基線(基線尚不支持DCGAN和LSTM)。加速比范圍為1.2×到1.6×6.4 FPGA加速器,評估Vanilla深度學習加速器,介紹TVM如何在在FPGA上原型化的通用推理加速器設計上,處理特定于加速器的代碼生成。
在本次評估中使用了Vanilla DeepLearning Accelerator(VDLA)——將以前加速器提案中的特征,提取到一個最低限度的硬件架構中——展示TVM生成高效調度的能力,該調度可以針對專門的加速器。圖20顯示了VDLA體系結構的高級硬件組織。VDLA編程為張量處理器,高效執行高計算強度的算子(例如,矩陣乘法,高維卷積)??梢詧绦屑虞d/存儲操作,將阻塞的三維張量,從DRAM帶到SRAM的相鄰區域。為網絡參數,層輸入(窄數據類型)和層輸出(寬數據類型),提供專門的片上存儲器。最后,VDLA提供了對連續加載,計算和存儲的顯式同步控制,最大化內存和計算算子間的重疊。

Figure 20: VDLA Hardware design overview.
在低功耗PYNQ板上,實現了VDLA設計,該板集成了時鐘頻率為667MHz的ARM Cortex A9雙核CPU和基于Artix-7的FPGA結構。在這些有限的FPGA資源上,實現了一個時鐘頻率為200MHz的16×16矩陣向量單元,執行8位值的乘積,在每個周期累加到32位寄存器中。此VDLA設計的理論峰值吞吐量約為102.4GOPS/s。為激活存儲分配了32kB的資源,為參數存儲分配了32kB的資源,為microcode緩沖區分配了32kB的資源,為寄存器文件分配了128kB的資源。這些片上緩沖區決不足以為單層ResNet,提供足夠的片上存儲,無法對有效的內存重用和延遲隱藏,進行案例研究。
使用C Runtime API為VDLA構建了一個驅動程序庫,該API構造指令,推送到目標加速器執行。代碼生成算法將加速器程序轉換為一系列調用,轉換為Runtime API。添加專門的加速器后端,需要~Python中的2k LoC。
端到端ResNet評估。使用TVM在PYNQ平臺上,生成ResNet推理內核,將盡可能多的層卸載到VDLA。
生成僅CPU和CPU+FPGA實現的調度。由于卷積深度較低,第一個ResNet卷積層,無法在FPGA上有效卸載,而是在CPU上計算。然而,ResNet中的所有其它卷積層,都適合于高效的floading。由于VDLA不支持支持這些操作,因此CPU上執行了諸如剩余層和激活類的操作。

Figure 21: We offlfloaded convolutions in the ResNet workload to an FPGA-based accelerator. The grayed-out bars correspond to layers that could not be accelerated by the FPGA and therefore had to run on the CPU. The FPGA provided a 40x acceleration on offlfloaded convolution layers over the Cortex A9.
圖21將ResNet推理時間分解為僅CPU執行和CPU+FPGA執行。大部分計算都花費在卷積層上,這些卷積層可以卸載到VDLA。對于這些卷積層,實現的加速比為40×。不幸的是,由于阿姆達爾定律,FPGA加速系統的整體性能,受到必須在CPU上執行的部分工作負載的制約。擴展VDLA設計,支持這些其它算子,將有助于進一步降低成本。
這個基于FPGA的實驗,展示了TVM適應新體系結構和所暴露的硬件本質的能力。
7.相關工作
深度學習框架為用戶提供了方便的界面,表達DL工作負載,輕松部署到不同的硬件后端。雖然現有框架目前依賴于供應商特定的tensor算子庫,執行工作負載,但可以利用TVM的堆棧為大量硬件設備,生成優化的代碼。
高級計算圖DSL是表示和執行高級優化的典型方式。Tensorflow的XLA和最近推出的DLVM屬于這一類。這些工作中計算圖的表示是相似的,本文使用了高級計算圖DSL。雖然圖級表示非常適合高級優化,但級別太高,無法在一組不同的硬件后端下優化張量算子。以前的工作依賴于特定的降低規則,直接生成低級LLVM,或者求助于供應商定制的庫。這些方法需要對每個硬件后端和變型算子組合,進行大量工程設計。
Halide引入了分離計算和調度的思想。采用Halide的思想,在編譯器中重用現有的有用調度原語。
張量算子調度與GPU DSL和基于多面體的循環變換的其它工作有關。TACO介紹了一種在CPU上生成稀疏張量算子的通用方法。Weld是用于數據處理任務的DSL。特別關注解決GPU和專用加速器的DL工作負載的新調度挑戰。新原語可能被這些工作中的優化管道所采用。
ATLAS和FFTW等高性能庫,使用自動調優獲得最佳性能。張量理解應用黑盒自動調諧和多面體優化CUDA內核。OpenTuner和現有的超參數優化算法,采用域無關搜索。預定義的成本模型,用于自動調度Halid中的圖像處理管道。TVM的ML模型,使用有效的領域感知成本模型,該模型考慮了項目結構。
基于分布式的調度優化器,可以擴展到更大的搜索空間,可以在大量受支持的后端上,找到最先進的內核。提供了一個端到端堆棧,可以直接從DL框架中獲取描述,與圖形級堆棧一起進行聯合優化。
盡管用于深度學習的加速器越來越流行,但如何有效地針對這些設備,構建編譯堆棧仍不清楚。評估中使用的VDLA設計,提供了一種總結類TPU加速器特性的通用方法,提供了一個關于如何為加速器編譯代碼的具體案例研究。
可能有利于將深度學習編譯為FPGA的現有系統。本文提供了一個通用的解決方案,通過張量化和編譯器驅動的延遲隱藏,有效定位加速器。
8.結論
提出了一個端到端編譯堆棧,解決跨不同硬件后端的深度學習的基本優化挑戰。系統包括自動端到端優化,這是從歷史上看,這是一項勞動密集型和高度專業化的任務。
希望這項工作將鼓勵對端到端編譯方法的進一步研究,為DL系統軟硬件協同設計技術打開新的機會。

參考文獻:
TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

總結

以上是生活随笔為你收集整理的全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。