全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
全文翻譯(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
摘要
人們?cè)絹?lái)越需要將機(jī)器學(xué)習(xí)應(yīng)用到各種各樣的硬件設(shè)備中。現(xiàn)在的框架依賴于特定于供應(yīng)商的算子庫(kù),針對(duì)窄帶的服務(wù)器級(jí)GPU進(jìn)行優(yōu)化。將工作負(fù)荷部署到新平臺(tái),如移動(dòng)電話,嵌入式設(shè)備和加速算子(如FPGA,ASIC)-需要大量手動(dòng)操作。
提出了TVM,一個(gè)開(kāi)源圖形級(jí)別的編譯器和算子級(jí)優(yōu)化,提供高效跨多個(gè)應(yīng)用程序移植到深度學(xué)習(xí)工作負(fù)荷硬件后端。TVM解決了深度學(xué)習(xí)特有的優(yōu)化難題,如高級(jí)算子融合,映射到任意硬件原語(yǔ),內(nèi)存延遲隱藏。
通過(guò)以下方式自動(dòng)優(yōu)化底層程序,適配硬件特性:
采用一種自定義的,基于學(xué)習(xí)的成本模型方法,用于快速探索代碼優(yōu)化。實(shí)驗(yàn)結(jié)果表明,TVM可在不同的領(lǐng)域,提供高性能硬件后端,可與最先進(jìn)的低功耗CPU,mobile GPU,server-class GPUs的手動(dòng)調(diào)優(yōu)庫(kù)抗衡。展示了TVM面向加速算子后端的能力,如作為基于FPGA的通用深度學(xué)習(xí)加速算子。TVM系統(tǒng)是開(kāi)源的,在幾家大公司提供量產(chǎn)服務(wù)。
1.引言
深度學(xué)習(xí)(DL)模型,可以識(shí)別圖像,處理自然語(yǔ)言,在挑戰(zhàn)性戰(zhàn)略游戲中擊敗人類。智能應(yīng)用部署的需求日益增長(zhǎng),從云服務(wù)器,自動(dòng)駕駛汽車和嵌入式設(shè)備,廣泛應(yīng)用于各種設(shè)備。由于硬件特性的多樣性,包括嵌入式CPU,GPU,FPGA和ASIC(如TPU),將DL工作負(fù)荷,映射到這些設(shè)備非常重要。這些硬件目標(biāo)包括內(nèi)存組織,計(jì)算功能單元,如圖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.
當(dāng)前的DL框架,如TensorFlow,MXNet,Caffe和Pytorch,依靠計(jì)算圖實(shí)現(xiàn)優(yōu)化,如自動(dòng)微分和動(dòng)態(tài)內(nèi)存管理。圖形級(jí)優(yōu)化,通常太深?yuàn)W,無(wú)法處理硬件后端特定的算子級(jí)轉(zhuǎn)換。大部分框架專注于一個(gè)狹窄的服務(wù)器類GPU設(shè)備,特定于目標(biāo)的優(yōu)化高度工程化和特定于供應(yīng)商的算子libraries。這些算子庫(kù),過(guò)于專業(yè)化和不透明,不易于跨硬件設(shè)備進(jìn)行移植,需要大量的手動(dòng)調(diào)諧數(shù)據(jù)。提供在各種DL框架中,支持各種硬件后端,目前需要大量的工程效率。即使對(duì)于受支持的后端,框架也必須在以下兩者間,做出艱難的選擇:
(1) 避免產(chǎn)生預(yù)定義運(yùn)算子庫(kù)中,沒(méi)有的新運(yùn)算符算子的圖形優(yōu)化
(2)使用這些新算子的未優(yōu)化實(shí)現(xiàn)。
不同的硬件后端,實(shí)現(xiàn)圖形級(jí)和算子級(jí)優(yōu)化,采用了一種有趣的,完全不同的端到端方法。構(gòu)建TVM,一種采用高級(jí)規(guī)范的編譯器,從現(xiàn)有框架支持不同的代碼生成,低級(jí)優(yōu)化代碼硬件后端。為了吸引用戶,TVM需要提供與跨di-verse硬件后端的多種手動(dòng)優(yōu)化算子庫(kù)相競(jìng)爭(zhēng)的性能。這一目標(biāo)需要解決下文介紹的主要挑戰(zhàn)。
利用特定的硬件功能和限制。
DL加速算子引入了優(yōu)化的張量計(jì)算原語(yǔ),GPU和CPU不斷改進(jìn)處理元素。一個(gè)重大的挑戰(zhàn),客戶生成優(yōu)化的代碼給定的算子描述。硬件指令的輸入是多維的,可以是固定的,也可以是可變的長(zhǎng)度;規(guī)定了不同的數(shù)據(jù)布局;有內(nèi)存層次結(jié)構(gòu)的特殊要求。系統(tǒng)必須利用加速算子,有效地處理這些復(fù)雜的原語(yǔ)。加速算子的設(shè)計(jì)也是如此,通常傾向于更精簡(jiǎn)的控制和load更多編譯器堆棧復(fù)雜調(diào)度。對(duì)于專門(mén)化的加速算子,系統(tǒng)需要生成顯式控制管道,針對(duì)CPU和GPU的硬件,優(yōu)化隱藏內(nèi)存訪問(wèn)延遲關(guān)系的代碼。
優(yōu)化的大搜索空間另一個(gè)挑戰(zhàn),在不手動(dòng)調(diào)整算子的情況下,生成高效代碼。內(nèi)存訪問(wèn),線程模式和新型硬件原語(yǔ)的組合選擇,為生成的代碼創(chuàng)建巨大的配置空間(例如,循環(huán)布局和排序,緩存,展開(kāi))。如果實(shí)施blackbox黑盒自動(dòng)調(diào)諧,將產(chǎn)生巨大的搜索成本。可以采用預(yù)先確定的成本模型,指導(dǎo)搜索,由于模型的復(fù)雜性越來(lái)越高,構(gòu)建準(zhǔn)確成本模型,很難建立模型現(xiàn)代硬件。此外,要求為每種硬件類型,建立單獨(dú)的成本模型。
TVM通過(guò)三個(gè)關(guān)鍵模塊解決了這些挑戰(zhàn)。
(1)引入一種張量表達(dá)式語(yǔ)言。
構(gòu)建算子提供程序轉(zhuǎn)換,通過(guò)各種優(yōu)化生成不同版本的program原語(yǔ)。這一層開(kāi)展Halid的計(jì)算/調(diào)度分離概念,將目標(biāo)硬件本質(zhì)與轉(zhuǎn)換原語(yǔ)分離,支持新型加速算子及相應(yīng)的新intrinsics。此外,引入了新的轉(zhuǎn)換原語(yǔ),應(yīng)對(duì)與GPU相關(guān)的挑戰(zhàn),使部署能夠特定于加速算子。可以應(yīng)用不同的程序轉(zhuǎn)換序列,為給定的算子聲明,形成豐富的有效程序空間。
(2) 引入了一個(gè)自動(dòng)程序優(yōu)化框架,用于尋找優(yōu)化的張量算子。
優(yōu)化算子是在基于ML的成本模型的指導(dǎo)下,從硬件后端收集更多數(shù)據(jù),該模型會(huì)不斷調(diào)整和改進(jìn)。
(3)在自動(dòng)代碼生成上,引入一個(gè)充分利用高級(jí)和算子級(jí)優(yōu)化。
通過(guò)結(jié)合這三個(gè)模塊,TVM可以將現(xiàn)有深度學(xué)習(xí)框架的模型描述,工作,執(zhí)行高級(jí)和低級(jí)優(yōu)化,為后端(如CPU,GPU和基于FPGA的專用處理器)生成特定于硬件的優(yōu)化代碼加速算子。
本文主要貢獻(xiàn):
?確定了在不同硬件后端為深度學(xué)習(xí)工作負(fù)荷,提供性能可移植性方面的主要優(yōu)化挑戰(zhàn)。
?引入了自定義的調(diào)度原語(yǔ),充分利用了跨線程內(nèi)存重用,創(chuàng)新的硬件本質(zhì)和延遲隱藏。
?提出實(shí)施基于機(jī)器學(xué)習(xí)的自動(dòng)探索和優(yōu)化系統(tǒng)搜索的張量算子。
?構(gòu)建了一個(gè)端到端的編譯和優(yōu)化堆棧,在高級(jí)框架(包括TensorFlow,MXNet,PyTorch,Keras,CNTK)中,多種硬件后端(包括CPU,服務(wù)器GPU,移動(dòng)GPU和基于FPGA的加速算子)特定的工作負(fù)荷,部署深度學(xué)習(xí)。
開(kāi)源TVM在幾家大公司內(nèi)部量產(chǎn)使用。在服務(wù)器級(jí)GPU,嵌入式GPU,嵌入式CPU和一個(gè)定制的基于FPGA的通用加速器上,使用真實(shí)的工作負(fù)荷,對(duì)TVM進(jìn)行了評(píng)估。
實(shí)驗(yàn)結(jié)果表明,TVM具有便攜性跨后端的性能實(shí)現(xiàn)加速,在現(xiàn)有框架的基礎(chǔ)上,由手工優(yōu)化的庫(kù)支持,從1.2×到3.8×不等。
2.概述
通過(guò)使用示例,介紹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總結(jié)了TVM中的執(zhí)行步驟及相應(yīng)部分。該系統(tǒng)首先將現(xiàn)有框架中的模型作為輸入,轉(zhuǎn)換為計(jì)算圖形表示。然后執(zhí)行高級(jí)數(shù)據(jù)流重寫(xiě),生成優(yōu)化的圖。操作員級(jí)優(yōu)化模塊必須生成efficient代碼-此圖中每個(gè)融合運(yùn)算符的。運(yùn)算符是用聲明性張量表達(dá)式語(yǔ)言指定的;未指定執(zhí)行細(xì)節(jié)。TVM為給定的目標(biāo)識(shí)別一組可能的代碼優(yōu)化
硬件目標(biāo)的算子。可能的優(yōu)化形成了一個(gè)很大的空間,使用基于ML的成本模型,尋找優(yōu)化的算子。最后,系統(tǒng)將生成的代碼,打包到可部署模塊中。
最終用戶示例。在以下幾行代碼中,用戶可以從現(xiàn)有的深度學(xué)習(xí)框架中獲取模型,調(diào)用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)
這個(gè)編譯后的運(yùn)行時(shí)模塊,包含三個(gè)組件:
最終優(yōu)化的計(jì)算圖(graph)、生成的算子(lib)和模塊參數(shù)(params)。可以使用這些組件,將模型部署到目標(biāo)后端:
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支持局域網(wǎng)中的多個(gè)部署后端,如C++、java和Python。本文的其余部分描述了TVM的體系結(jié)構(gòu),及系統(tǒng)程序員如何擴(kuò)展,支持新的后端。
3.優(yōu)化計(jì)算圖
計(jì)算圖是在DL框架中表示程序的常用方法。圖3顯示了兩層卷積神經(jīng)網(wǎng)絡(luò)的計(jì)算圖表示示例。這種高級(jí)表示與低級(jí)編譯器中間表示(IR,如LLVM)間的主要區(qū)別,中間數(shù)據(jù)項(xiàng)是大型多維張量。計(jì)算圖提供了算子的全局視圖,但避免指定每個(gè)算子必須如何實(shí)現(xiàn)。與LLVM IRs一樣,計(jì)算圖可以轉(zhuǎn)換為功能等效圖優(yōu)化。利用常見(jiàn)DL工作負(fù)載中的形狀特異性,優(yōu)化一組固定的輸入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利用計(jì)算圖表示應(yīng)用高級(jí)優(yōu)化:節(jié)點(diǎn)表示對(duì)張量或程序輸入的算子,邊表示算子間的數(shù)據(jù)依賴關(guān)系。實(shí)現(xiàn)多級(jí)圖形優(yōu)化,包括:算子fusion,將多個(gè)小算子融合在一起;常量折疊,預(yù)先計(jì)算可靜態(tài)確定的圖形部分,節(jié)省執(zhí)行成本;靜態(tài)內(nèi)存調(diào)度過(guò)程,預(yù)先分配內(nèi)存,保存每個(gè)中間張量;數(shù)據(jù)布局轉(zhuǎn)換,將內(nèi)部數(shù)據(jù)布局轉(zhuǎn)換為后端友好的形式。
現(xiàn)在討論算子融合和數(shù)據(jù)布局轉(zhuǎn)換。
算子融合
算子融合將多個(gè)算子組合到單個(gè)內(nèi)核中,無(wú)需將中間結(jié)果保存在內(nèi)存中。這種優(yōu)化可以大大減少執(zhí)行時(shí)間,特別是在GPU和專用加速器中。具體來(lái)說(shuō),認(rèn)識(shí)到四類圖算子:
(1)內(nèi)射(一對(duì)一映射,如add)
(2)歸約(如sum)
(3)復(fù)雜輸出可融合(將元素映射融合到輸出,如conv2d)
(4)不透明(不能融合,如sort)。
提供了融合這些算子的通用規(guī)則,如下所示。
多個(gè)內(nèi)射算子可以融合成另一個(gè)內(nèi)射算子。歸約算子可以與輸入內(nèi)射算子融合(例如,融合scale和sum)。如conv2d類的算子是復(fù)雜的可外fusion的,可以將元素算子fusion到輸出中。可以應(yīng)用這些規(guī)則,將計(jì)算圖轉(zhuǎn)換為融合版本。
Figure 4: Performance comparison between fused and non-fused operations. TVM generates both operations. Tested on NVIDIA Titan X.
圖4演示了對(duì)不同工作負(fù)載的影響的優(yōu)化。通過(guò)減少內(nèi)存訪問(wèn),融合算子可以產(chǎn)生高達(dá)1.2倍到2倍的加速比。
數(shù)據(jù)布局轉(zhuǎn)換。在計(jì)算圖中存儲(chǔ)給定張量有多種方法。最常見(jiàn)的數(shù)據(jù)布局選擇是列主視圖和行主視圖。實(shí)際上,可能喜歡使用復(fù)雜的數(shù)據(jù)布局。例如,DL accelerator可能利用4×4矩陣運(yùn)算,需要將數(shù)據(jù)平鋪到4×4塊中,優(yōu)化局部訪問(wèn)。
Figure 5: Example schedule transformations that optimize a matrix multiplication on a specialized accelerator.
數(shù)據(jù)布局優(yōu)化,可以使用更好的內(nèi)部數(shù)據(jù)布局,轉(zhuǎn)換計(jì)算圖形,在目標(biāo)硬件上執(zhí)行圖形。先指定每個(gè)算子的首選數(shù)據(jù)布局,給定內(nèi)存層次結(jié)構(gòu)指定的約束。然后,如果生產(chǎn)者和消費(fèi)者的首選數(shù)據(jù)布局不匹配,將在兩者間執(zhí)行適當(dāng)?shù)牟季洲D(zhuǎn)換。
雖然高級(jí)圖優(yōu)化可以極大地提高DL工作負(fù)載的效率,但效率僅與operator library提供的一樣高。目前,支持算子融合的少數(shù)DL框架,要求算子庫(kù)提供融合模式的實(shí)現(xiàn)。隨著更多的網(wǎng)絡(luò)算子定期推出,可能的融合內(nèi)核數(shù)量可能會(huì)大幅增加。當(dāng)針對(duì)越來(lái)越多的硬件后端時(shí),這種方法不再具有可持續(xù)性,因?yàn)樗璧娜诤夏J綄?shí)現(xiàn)數(shù)量,隨著必須支持的數(shù)據(jù)布局,數(shù)據(jù)類型和加速器內(nèi)部結(jié)構(gòu)的數(shù)量,組合增長(zhǎng)。接下來(lái)提出一種代碼生成方法,可以為給定模型的算子生成各種可能的實(shí)現(xiàn)。
4.生成張量運(yùn)算
TVM通過(guò)在每個(gè)硬件后端,生成許多有效的實(shí)現(xiàn),選擇優(yōu)化的實(shí)現(xiàn),為每個(gè)算子生成高效的代碼。
該過(guò)程基于Halide,將描述與計(jì)算規(guī)則(或調(diào)度優(yōu)化)分離,將支持新的優(yōu)化(嵌套并行,張量化和延遲隱藏)和大量硬件后端。重點(diǎn)介紹TVM的特定功能。
4.1 張量表達(dá)式和表空間
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.
引入了一種支持自動(dòng)代碼生成的張量表達(dá)式語(yǔ)言。與高級(jí)計(jì)算圖表示不同,張量算子的實(shí)現(xiàn)是不透明的,每個(gè)算子都用索引公式表達(dá)式語(yǔ)言描述。以下代碼顯示了用于計(jì)算轉(zhuǎn)置矩陣乘法的張量表達(dá)式示例:
如何計(jì)算每個(gè)元素的表達(dá)式,每個(gè)計(jì)算算子都指定輸出張量的形狀和描述。張量表達(dá)式語(yǔ)言支持常見(jiàn)的算術(shù)和數(shù)學(xué)運(yùn)算,涵蓋常見(jiàn)的DL算子模式。該語(yǔ)言沒(méi)有指定循環(huán)結(jié)構(gòu)和許多其它執(zhí)行細(xì)節(jié),為各種后端添加硬件感知優(yōu)化。采用Halide的解耦計(jì)算/調(diào)度原理,從張量表達(dá)式到低級(jí)代碼的特定映射,使用調(diào)度表示。
許多可能的調(diào)度,都可以執(zhí)行此功能。
通過(guò)增量應(yīng)用基本轉(zhuǎn)換(調(diào)度原語(yǔ))構(gòu)建調(diào)度,持程序的邏輯等價(jià)性。圖5顯示了在專用加速器上,調(diào)度矩陣乘法的示例。在內(nèi)部,TVM使用一個(gè)數(shù)據(jù)結(jié)構(gòu),跟蹤循環(huán)結(jié)構(gòu)和其它信息,因?yàn)閼?yīng)用了調(diào)度轉(zhuǎn)換。然后,這些信息可以為給定的最終調(diào)度生成低級(jí)代碼。
Figure 7: Performance comparison between TVM with and without cooperative shared memory fetching on matrix multiplication workloads. Tested on an NVIDIA Titan X.
張量表達(dá)式從Halide,Darkroom,TACO中獲取線索。主要增強(qiáng)功能,包括支持下面討論的新調(diào)度優(yōu)化。為了在許多后端上實(shí)現(xiàn)高性能,必須支持足夠多的調(diào)度原語(yǔ),覆蓋不同硬件后端上的各種優(yōu)化。圖6總結(jié)了TVM支持的算子代碼生成過(guò)程和調(diào)度原語(yǔ)。重用有用的原語(yǔ)和來(lái)自Halide的低級(jí)循環(huán)程序AST,引入新的原語(yǔ),優(yōu)化GPU和加速器性能。新原語(yǔ)是實(shí)現(xiàn)最佳GPU性能所必需的,也是加速器所必需的。CPU、GPU、TPU類加速器是深度學(xué)習(xí)的三種重要硬件類型。
本節(jié)介紹了CPU、GPU和TPU類加速器的新優(yōu)化原語(yǔ),第5節(jié)說(shuō)明了如何自動(dòng)導(dǎo)出有效的調(diào)度。
4.2嵌套并行與協(xié)作
并行性是提高DL工作負(fù)載中,計(jì)算密集型內(nèi)核效率的關(guān)鍵。現(xiàn)代GPU提供了巨大的并行性,要求將所有并行模式bake到調(diào)度轉(zhuǎn)換中。大多數(shù)現(xiàn)有的解決方案,都采用了一種稱為嵌套并行(一種fork-join形式)的模型。該模型需要一個(gè)并行schedule原語(yǔ),并行化數(shù)據(jù)并行任務(wù);每個(gè)任務(wù)可以進(jìn)一步遞歸細(xì)分為子任務(wù),利用目標(biāo)體系結(jié)構(gòu)的多級(jí)線程層次結(jié)構(gòu)(例如,GPU中的線程組)。稱此模型為無(wú)共享嵌套并行,因?yàn)橐粋€(gè)工作線程,無(wú)法在同一并行計(jì)算階段,查看同級(jí)的數(shù)據(jù)。
無(wú)共享方法的另一種替代方法是協(xié)同獲取數(shù)據(jù)。具體來(lái)說(shuō),線程組可以協(xié)作獲取所有需要的數(shù)據(jù),放入共享內(nèi)存空間。此優(yōu)化可以利用GPU內(nèi)存層次結(jié)構(gòu),通過(guò)共享內(nèi)存區(qū)域跨線程重用數(shù)據(jù)。TVM支持這種眾所周知的GPU優(yōu)化,使用調(diào)度原語(yǔ)實(shí)現(xiàn)最佳性能。下面的GPU代碼示例優(yōu)化了矩陣乘法。
圖7展示了這種優(yōu)化的影響。將內(nèi)存作用域的概念引入調(diào)度空間,以便將計(jì)算階段(代碼中的AS和BS)標(biāo)記為共享。沒(méi)有顯式存儲(chǔ)范圍,自動(dòng)范圍推斷,將計(jì)算階段標(biāo)記為線程本地。共享任務(wù)必須計(jì)算組中,所有工作線程的依賴關(guān)系。
必須正確插入內(nèi)存同步屏障,確保共享加載的數(shù)據(jù)對(duì)用戶可見(jiàn)。最后,除了對(duì)GPU有用之外,內(nèi)存作用域標(biāo)記特殊的內(nèi)存緩沖區(qū),在針對(duì)專用DL加速器時(shí),創(chuàng)建特殊的降低規(guī)則。
4.3 張量化
DL工作負(fù)載具有很高的運(yùn)算強(qiáng)度,通常可以分解為張量算子,如矩陣乘法或一維卷積。這些自然分解導(dǎo)致了最近的添加張量計(jì)算原語(yǔ)。這些新原語(yǔ)為基于調(diào)度的編譯,帶來(lái)了機(jī)遇和挑戰(zhàn);雖然這些使用可以提高性能,但編譯框架必須無(wú)縫集成。稱為張量化:類似于SIMD體系結(jié)構(gòu)的矢量化,但有顯著差異。指令輸入是多維的,具有固定或可變的長(zhǎng)度,每個(gè)都有不同的數(shù)據(jù)布局。無(wú)法支持一組固定的原語(yǔ),因?yàn)樾碌募铀倨饔米远x的張量指令變體出現(xiàn)。
需要一個(gè)可擴(kuò)展的解決方案。
通過(guò)使用張量?jī)?nèi)在聲明機(jī)制,將目標(biāo)硬件結(jié)構(gòu)從調(diào)度中分離出來(lái),使張量化具有可擴(kuò)展性。使用相同的張量表達(dá)式語(yǔ)言,聲明每個(gè)新硬件內(nèi)在的行為,以及與之相關(guān)的降低規(guī)則。下面的代碼顯示了如何定義8×8張量硬件的內(nèi)在特性。
引入了一個(gè)tensorize調(diào)度原則,用相應(yīng)的內(nèi)部函數(shù)替換計(jì)算單元。編譯器使用硬件聲明匹配計(jì)算模式,降低到相應(yīng)的硬件本身。
Tensorization將調(diào)度與特定的硬件原語(yǔ)分離,易于擴(kuò)展TVM支持新的硬件體系結(jié)構(gòu)。Tensorization調(diào)度生成的代碼,符合高性能計(jì)算的實(shí)踐:將復(fù)雜算子分解為一系列微內(nèi)核調(diào)用。可以使用tensorize原語(yǔ),進(jìn)行手工制作的微內(nèi)核的優(yōu)點(diǎn),這在某些平臺(tái)形式中可能是有益的。例如,為移動(dòng)CPU實(shí)現(xiàn)超低精度算子,這些CPU通過(guò)利用位串行數(shù)據(jù)算子1或2位寬的數(shù)據(jù)類型矩陣向量乘法微內(nèi)核。該微內(nèi)核將結(jié)果累加為越來(lái)越大的數(shù)據(jù)類型,以最小化內(nèi)存占用。將微內(nèi)核作為T(mén)VM固有的張量表示,可產(chǎn)生高達(dá)1.5倍于非張量化的加速比。
4.4顯式內(nèi)存延遲隱藏
延遲隱藏將內(nèi)存算子與計(jì)算重疊的過(guò)程,最大限度地利用內(nèi)存和計(jì)算資源。根據(jù)目標(biāo)硬件后端的不同,需要不同的策略。
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上,內(nèi)存延遲隱藏通過(guò)同步多線程或硬件預(yù)取隱式實(shí)現(xiàn)的。GPU依賴于許多線程的快速上下文切換。相反,像TPU這樣的專用DL加速器,通常支持使用解耦訪問(wèn)執(zhí)行(DAE)的精簡(jiǎn)控制架構(gòu)和卸載細(xì)粒度的問(wèn)題與軟件同步。
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顯示了一個(gè)減少運(yùn)行時(shí)延遲的DAE硬件管道。與單片硬件設(shè)計(jì)相比,該管道可以將大部分內(nèi)存訪問(wèn)隱藏在頭上,幾乎充分利用計(jì)算資源。要為了獲得更高的利用率,必須使用細(xì)粒度同步算子,擴(kuò)充指令流。如果沒(méi)有這些算子,依賴關(guān)系將無(wú)法強(qiáng)制執(zhí)行,導(dǎo)致錯(cuò)誤的執(zhí)行。因此,DAE硬件管道,需要細(xì)粒度依賴排隊(duì),在管道階段間均衡操作,保證正確執(zhí)行,如圖9的指令流所示。
編程需要顯式低級(jí)同步的DAE加速器很困難。為了減輕編程負(fù)擔(dān),引入了虛擬線程調(diào)度原語(yǔ),讓程序員指定一個(gè)高級(jí)數(shù)據(jù)并行程序,就像指定一個(gè)支持多線程的硬件后端一樣。TVM會(huì)自動(dòng)降低program,轉(zhuǎn)換為具有低級(jí)顯式同步的單個(gè)指令流,如圖8所示。該算法從高級(jí)多線程程序調(diào)度開(kāi)始,插入必要的低級(jí)同步算子,確保在每個(gè)線程內(nèi)正確執(zhí)行。接下來(lái),將所有虛擬線程的算子交錯(cuò)到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. 自動(dòng)化優(yōu)化
考慮到一組豐富的調(diào)度原語(yǔ),剩下的問(wèn)題是為DL模型的每一層,找到最佳的算子實(shí)現(xiàn)。在這里,TVM為與每個(gè)層關(guān)聯(lián)的特定輸入shape和布局,創(chuàng)建一個(gè)專門(mén)的算子。這種專門(mén)化提供了顯著的性能優(yōu)勢(shì)(與針對(duì)較小shape和布局多樣性的手工代碼相比),但也帶來(lái)了自動(dòng)化挑戰(zhàn)。系統(tǒng)需要選擇調(diào)度優(yōu)化,如修改循環(huán)排序或優(yōu)化內(nèi)存層次結(jié)構(gòu),以及調(diào)度特定參數(shù),如平鋪大小和循環(huán)展開(kāi)系數(shù)。
這樣的組合選擇為每個(gè)硬件后端的算子實(shí)現(xiàn),構(gòu)建了一個(gè)巨大的搜索空間。為了應(yīng)對(duì)這一挑戰(zhàn),構(gòu)建了一個(gè)自動(dòng)化的進(jìn)度優(yōu)化器,有兩個(gè)主要組件:一個(gè)是提出有前途的新配置的調(diào)度管理器,另一個(gè)是預(yù)測(cè)給定配置性能的機(jī)器學(xué)習(xí)成本模型。本節(jié)描述了這些組件和TVM的自動(dòng)優(yōu)化流程(圖11)。
5.1調(diào)度空間規(guī)格
構(gòu)建了一個(gè)調(diào)度模板規(guī)范API,讓開(kāi)發(fā)人員在調(diào)度空間中聲明knobs。模板規(guī)范允許在指定可能的調(diào)度時(shí),根據(jù)需要結(jié)合開(kāi)發(fā)人員的領(lǐng)域特定知識(shí)。還為每個(gè)硬件后端,創(chuàng)建了一個(gè)通用主模板,該模板根據(jù)使用張量表達(dá)式語(yǔ)言表示的計(jì)算描述,自動(dòng)提取可能的knobs。在高層次上,希望考慮盡可能多的配置,讓優(yōu)化器管理選擇負(fù)載。因此,優(yōu)化器必須搜索數(shù)十億種可能的配置,查找實(shí)驗(yàn)中使用的真實(shí)世界DL工作負(fù)載。
5.2 基于ML的成本模型
從大型配置空間中,通過(guò)黑盒優(yōu)化,即自動(dòng)調(diào)整,找到最佳調(diào)度的一種方法。此方法用于調(diào)整高性能計(jì)算庫(kù)。然而,自動(dòng)調(diào)整需要許多實(shí)驗(yàn),確定良好的配置。
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.
另一種方法是建立一個(gè)預(yù)定義的成本模型,指導(dǎo)對(duì)特定硬件后端的搜索,不是運(yùn)行所有的可能性,測(cè)量性能。理想情況下,一個(gè)完美的成本模型,會(huì)考慮影響性能的所有因素:內(nèi)存訪問(wèn)模式,數(shù)據(jù)重用,管道依賴性和線程連接模式等。不幸的是,由于現(xiàn)代硬件越來(lái)越復(fù)雜,這種方法很麻煩。此外,每個(gè)新的硬件目標(biāo),都需要一個(gè)新的(預(yù)定義的)成本模型。
Table 1: Comparison of automation methods. Model bias refers to inaccuracy due to modeling.
相反,采用統(tǒng)計(jì)方法,解決成本建模問(wèn)題。在這種方法中,調(diào)度資源管理器提出的配置,可能會(huì)提高算子的性能。對(duì)于每個(gè)調(diào)度配置,使用一個(gè)ML模型,該模型將降低的循環(huán)程序作為輸入,預(yù)測(cè)在給定硬件后端上的運(yùn)行時(shí)間。該模型使用搜索期間收集的運(yùn)行時(shí),測(cè)量數(shù)據(jù)進(jìn)行訓(xùn)練,不需要用戶輸入詳細(xì)的硬件信息。在優(yōu)化過(guò)程中,隨著探索更多配置,會(huì)定期更新模型,提高準(zhǔn)確性。
對(duì)于其它相關(guān)的工作負(fù)載也是如此。通過(guò)這種方式,ML模型的質(zhì)量隨著更多的實(shí)驗(yàn)提高。表1總結(jié)了自動(dòng)化方法之間的主要差異。基于ML的成本模型,在自動(dòng)調(diào)整和預(yù)定義的成本建模間,取得了平衡,可以從相關(guān)工作負(fù)載的歷史性能數(shù)據(jù)中獲益。
機(jī)器學(xué)習(xí)模型設(shè)計(jì)選擇。必須考慮兩個(gè)關(guān)鍵因素,選擇調(diào)度管理器,將使用的ML模型:質(zhì)量和速度。
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經(jīng)常查詢成本模型,由于模型預(yù)測(cè)時(shí)間和模型重新安裝時(shí)間產(chǎn)生開(kāi)銷。為了發(fā)揮作用,這些開(kāi)銷必須小于在實(shí)際硬件上,測(cè)量性能所需的時(shí)間,根據(jù)具體的工作負(fù)載/硬件目標(biāo),實(shí)際硬件上的性能可以達(dá)到秒級(jí)。這種速度要求將問(wèn)題與傳統(tǒng)的超參數(shù)調(diào)優(yōu)問(wèn)題區(qū)分,在超參數(shù)調(diào)優(yōu)問(wèn)題中,執(zhí)行測(cè)量的成本,相對(duì)于模型開(kāi)銷非常高,可以使用更昂貴的模型。除了選擇模型外,需要選擇一個(gè)目標(biāo)函數(shù)訓(xùn)練模型,如配置的預(yù)測(cè)運(yùn)行時(shí)間中的誤差。
由于資源管理器,僅根據(jù)預(yù)測(cè)的相對(duì)順序(A的運(yùn)行速度比B快),選擇排名靠前的候選對(duì)象,因此不需要直接預(yù)測(cè)絕對(duì)執(zhí)行時(shí)間。相反,使用排名目標(biāo),預(yù)測(cè)運(yùn)行時(shí)成本的相對(duì)順序。
在ML Optimizer中實(shí)現(xiàn)了幾種類型的模型。采用了一個(gè)梯度樹(shù)推進(jìn)模型(基于XGBoost),該模型根據(jù)從循環(huán)程序中提取的特征進(jìn)行預(yù)測(cè);這些特性包括每個(gè)循環(huán)級(jí)別上,每個(gè)內(nèi)存緩沖區(qū)的內(nèi)存訪問(wèn)計(jì)數(shù)和重用率,以及循環(huán)注釋的一次熱編碼,如“矢量化”,“展開(kāi)”和“并行”。評(píng)估了一個(gè)神經(jīng)網(wǎng)絡(luò)模型,該模型使用TreeRNN,在無(wú)需特性工程的情況下,評(píng)測(cè)循環(huán)程序的AST。圖13總結(jié)了成本模型的工作流程。發(fā)現(xiàn)treeboosting和TreeRNN具有相似的預(yù)測(cè)質(zhì)量。然而,前者的預(yù)測(cè)速度是后者的兩倍,訓(xùn)練時(shí)間也少得多。因此,在實(shí)驗(yàn)中選擇了梯度樹(shù)推進(jìn)作為默認(rèn)的成本模型。盡管如此,相信這兩種方法都是有價(jià)值的,期望今后對(duì)這個(gè)問(wèn)題進(jìn)行更多的研究。
平均而言,樹(shù)推進(jìn)模型的預(yù)測(cè)時(shí)間為0.67毫秒,比實(shí)際測(cè)量快數(shù)千倍。圖12比較了基于ML的優(yōu)化器和blackbox自動(dòng)調(diào)優(yōu)方法;前者發(fā)現(xiàn)更好的配置比后者快得多。
5.3進(jìn)度計(jì)劃
一旦選擇了一個(gè)成本模型,就可以選擇有希望的配置,在這些配置上迭代地運(yùn)行真正的度量。在每次迭代中,瀏覽器使用ML模型的預(yù)測(cè),選擇一批候選對(duì)象,在這些候選對(duì)象上運(yùn)行度量。然后將收集的數(shù)據(jù),用作更新模型的訓(xùn)練數(shù)據(jù)。如果不存在初始訓(xùn)練數(shù)據(jù),資源管理器會(huì)隨機(jī)挑選候選對(duì)象進(jìn)行測(cè)量。
最簡(jiǎn)單的探索算法,通過(guò)成本模型枚舉,運(yùn)行每個(gè)配置,選擇前k名預(yù)測(cè)執(zhí)行者。然而,這種策略在較大的搜索空間中,變得難以處理。
相反,運(yùn)行了一個(gè)并行模擬退火算法。資源管理器從隨機(jī)配置開(kāi)始,在每一步中,都會(huì)隨機(jī)轉(zhuǎn)到附近的配置。如果成本模型預(yù)測(cè)的成本降低,轉(zhuǎn)換是成功的。如果目標(biāo)配置成本較高,可能會(huì)失敗(拒絕)。隨機(jī)游動(dòng)傾向于收斂于具有較低速度的配置成本模型預(yù)測(cè)的成本。搜索狀態(tài)在成本模型更新期間持續(xù)存在;從這些更新之后的最后一個(gè)配置繼續(xù)。
5.4分布式設(shè)備池和RPC
分布式設(shè)備池可擴(kuò)展硬件測(cè)試的運(yùn)行,在多個(gè)優(yōu)化作業(yè)之間,實(shí)現(xiàn)細(xì)粒度資源共享。TVM實(shí)現(xiàn)了一個(gè)定制的,基于RPC的分布式設(shè)備池,使客戶端能夠在特定類型的設(shè)備上運(yùn)行程序。可以使用此接口,在主機(jī)編譯器上編譯程序,請(qǐng)求遠(yuǎn)程設(shè)備,遠(yuǎn)程運(yùn)行函數(shù),在主機(jī)上訪問(wèn)相同腳本中的結(jié)果。TVM的RPC支持動(dòng)態(tài)上載,使用運(yùn)行時(shí)約定運(yùn)行交叉編譯的模塊和函數(shù)。因此,相同的基礎(chǔ)結(jié)構(gòu),可以執(zhí)行單個(gè)工作負(fù)載優(yōu)化和端到端圖Inference。這種方法自動(dòng)化了跨多個(gè)設(shè)備的編譯,運(yùn)行和配置步驟。
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.
這種基礎(chǔ)架構(gòu)對(duì)于嵌入式設(shè)備尤其重要,因?yàn)閭鹘y(tǒng)上,嵌入式設(shè)備需要進(jìn)行繁瑣的手動(dòng)交叉編譯,代碼部署和測(cè)量。
6.評(píng)價(jià)
TVM核心是用C++實(shí)現(xiàn)的(~50k LoC)。提供Python和Java的語(yǔ)言綁定。本文前面的部分評(píng)估了TVM的幾個(gè)獨(dú)立優(yōu)化和組件的影響,即,圖4中的算子融合,圖10中的延遲隱藏,以及圖12中基于ML的成本模型。
現(xiàn)在重點(diǎn)關(guān)注端到端評(píng)估,旨在回答以下問(wèn)題:
?TVM能否在多個(gè)平臺(tái)上優(yōu)化DL工作負(fù)載?
?TVM與每個(gè)后端上現(xiàn)有的DL frame works(依賴高度優(yōu)化的庫(kù))相比如何?
?TVM能否支持新出現(xiàn)的DL工作負(fù)載(例如,深度卷積,低精度算子)?
?TVM能否支持優(yōu)化新的專用加速器?
為了回答這些問(wèn)題,在四種平臺(tái)上評(píng)估了TVM:
(1) 服務(wù)器級(jí)GPU
(2) 嵌入式GPU
(3) 嵌入式CPU
(4) 在低功耗FPGA SoC上實(shí)現(xiàn)的DL加速計(jì)。
Figure 14: GPU end-to-end evaluation for TVM, MXNet, Tensorflflow, and Tensorflflow XLA. Tested on the NVIDIA Titan X.
基準(zhǔn)測(cè)試基于現(xiàn)實(shí)世界的DL推理工作負(fù)載,包括ResNet,MobileNet,LSTM語(yǔ)言模型,深度Q網(wǎng)絡(luò)(DQN)和深度卷積生成對(duì)抗網(wǎng)絡(luò)(DCGAN)。將方法與現(xiàn)有的DL框架進(jìn)行比較,包括MxNet和TensorFlow,依賴于高度工程化的,特定于供應(yīng)商的庫(kù)。TVM執(zhí)行端到端的自動(dòng)優(yōu)化和代碼生成,無(wú)需外部算子庫(kù)。
6.1 服務(wù)器級(jí)GPU評(píng)估
首先比較端到端的深度神經(jīng)網(wǎng)絡(luò)TVM,MXNet(V1.1),Tensorflow(V1.7)和Tensorflow XLA的NVIDIA TITIX。MXNet和Tensorflow都使用cuDNN v7作為卷積算子;實(shí)現(xiàn)了版本的深度卷積,因?yàn)橄鄬?duì)較新,還沒(méi)有得到最新庫(kù)的支持。還使用cuBLAS v8進(jìn)行矩陣乘法。另一方面,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優(yōu)于基線,由于聯(lián)合圖優(yōu)化和生成高性能融合算子的自動(dòng)優(yōu)化器,其加速比從1.6×到3.8×不等。DQN的3.8倍加速是由于其使用了未經(jīng)cuDNN優(yōu)化的非常規(guī)算子(4×4 conv2d,步長(zhǎng)=2);ResNet工作負(fù)載更為傳統(tǒng)。TVM會(huì)在這兩種情況下自動(dòng)找到優(yōu)化的。
Figure 16: ARM A53 end-to-end evaluation of TVM and TFLite.
為了評(píng)估算子級(jí)優(yōu)化的有效性,還對(duì)ResNet和MobileNet中的每個(gè)張量算子,進(jìn)行了細(xì)分比較,如圖15所示。將TensorComprehension(TC,commit:ef644ba)作為一個(gè)額外的基線,是最近引入的自動(dòng)調(diào)優(yōu)框架。2 TC結(jié)果包括在10代×100群體×每個(gè)算子2個(gè)隨機(jī)種子中發(fā)現(xiàn)的最佳seeds(即每個(gè)算子2000次試驗(yàn))。二維卷積是最重要的DL算子之一,cuDNN進(jìn)行了大量?jī)?yōu)化。然而,TVM仍然可以為大多數(shù)層,生成更好的GPU內(nèi)核。深度卷積是一種結(jié)構(gòu)簡(jiǎn)單的新算子。
在這種情況下,TVM和TC都可以找到比MXNet手工制作的內(nèi)核更快的內(nèi)核。TVM的改進(jìn)主要?dú)w功于,對(duì)大調(diào)度空間的探索和有效的基于ML的搜索算法。
6.2嵌入式CPU評(píng)估
在ARM Cortex A53(四核1.2GHz)上,評(píng)估了TVM的性能。使用Tensorflow Lite(TFLite,commit:7558b085)作為基線系統(tǒng)。
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的手工優(yōu)化算子進(jìn)行了比較。TVM生成的算子,在兩種神經(jīng)網(wǎng)絡(luò)工作負(fù)載方面,都優(yōu)于手動(dòng)優(yōu)化的TFLite版本。該結(jié)果還證明了TVM能夠快速優(yōu)化新興的張量算子,如深度卷積算子。最后,圖16顯示了三種工作負(fù)載的端到端比較,TVM優(yōu)于TFLite基線。
3個(gè)超低精度算子,通過(guò)為小于8位的定點(diǎn)數(shù)據(jù)類型,生成高度優(yōu)化的算子,展示了TVM支持超低精度推理的能力。低精度網(wǎng)絡(luò)用矢量化位串行乘法,代替昂貴的乘法,矢量化位串行乘法,由按位和pop計(jì)數(shù)減少組成。實(shí)現(xiàn)高效的低精度推理,需要將量化數(shù)據(jù)類型打包為更廣泛的標(biāo)準(zhǔn)數(shù)據(jù)類型,如int8或int32。
TVM系統(tǒng)生成的代碼性能優(yōu)于Caffe2的手動(dòng)優(yōu)化庫(kù)。實(shí)現(xiàn)了一個(gè)特定于ARM的tensorization內(nèi)核,利用ARM指令構(gòu)建一個(gè)高效,低精度的矩陣向量微內(nèi)核。然后,使用TVM的自動(dòng)優(yōu)化器,搜索調(diào)度空間。
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超低精度庫(kù)進(jìn)行了比較,用于2位激活,1位權(quán)重推理。由于基線是單線程的,還將與單線程TVM版本進(jìn)行比較。
單線程TVM優(yōu)于基線,尤其是C5,C8和C11層;這些是內(nèi)核大小為1×1,步長(zhǎng)為2的卷積層,超低精度基線庫(kù)未對(duì)此進(jìn)行優(yōu)化。此外,還利用額外的TVM功能,生成一個(gè)并行庫(kù)實(shí)現(xiàn),該實(shí)現(xiàn)顯示出比基線更好的性能。除了2位+1位配置,TVM可以生成優(yōu)化基線庫(kù)不支持的其它精度配置,提高靈活性。
6.3 嵌入式GPU評(píng)估
對(duì)于移動(dòng)GPU實(shí)驗(yàn),在配備ARM Mali-T860MP4 GPU的Firefly-RK3399板上,運(yùn)行端到端管道。基線是供應(yīng)商提供的庫(kù),即ARM計(jì)算庫(kù)(v18.03)。
Figure 19: End-to-end experiment results on Mali-T860MP4. Two data types, flfloat32 and flfloat16, were evaluated.
如圖19所示,對(duì)于float16和float32,在三種可用模型上的表現(xiàn),都優(yōu)于基線(基線尚不支持DCGAN和LSTM)。加速比范圍為1.2×到1.6×6.4 FPGA加速器,評(píng)估Vanilla深度學(xué)習(xí)加速器,介紹TVM如何在在FPGA上原型化的通用推理加速器設(shè)計(jì)上,處理特定于加速器的代碼生成。
在本次評(píng)估中使用了Vanilla DeepLearning Accelerator(VDLA)——將以前加速器提案中的特征,提取到一個(gè)最低限度的硬件架構(gòu)中——展示TVM生成高效調(diào)度的能力,該調(diào)度可以針對(duì)專門(mén)的加速器。圖20顯示了VDLA體系結(jié)構(gòu)的高級(jí)硬件組織。VDLA編程為張量處理器,高效執(zhí)行高計(jì)算強(qiáng)度的算子(例如,矩陣乘法,高維卷積)。可以執(zhí)行加載/存儲(chǔ)操作,將阻塞的三維張量,從DRAM帶到SRAM的相鄰區(qū)域。為網(wǎng)絡(luò)參數(shù),層輸入(窄數(shù)據(jù)類型)和層輸出(寬數(shù)據(jù)類型),提供專門(mén)的片上存儲(chǔ)器。最后,VDLA提供了對(duì)連續(xù)加載,計(jì)算和存儲(chǔ)的顯式同步控制,最大化內(nèi)存和計(jì)算算子間的重疊。
Figure 20: VDLA Hardware design overview.
在低功耗PYNQ板上,實(shí)現(xiàn)了VDLA設(shè)計(jì),該板集成了時(shí)鐘頻率為667MHz的ARM Cortex A9雙核CPU和基于Artix-7的FPGA結(jié)構(gòu)。在這些有限的FPGA資源上,實(shí)現(xiàn)了一個(gè)時(shí)鐘頻率為200MHz的16×16矩陣向量單元,執(zhí)行8位值的乘積,在每個(gè)周期累加到32位寄存器中。此VDLA設(shè)計(jì)的理論峰值吞吐量約為102.4GOPS/s。為激活存儲(chǔ)分配了32kB的資源,為參數(shù)存儲(chǔ)分配了32kB的資源,為microcode緩沖區(qū)分配了32kB的資源,為寄存器文件分配了128kB的資源。這些片上緩沖區(qū)決不足以為單層ResNet,提供足夠的片上存儲(chǔ),無(wú)法對(duì)有效的內(nèi)存重用和延遲隱藏,進(jìn)行案例研究。
使用C Runtime API為VDLA構(gòu)建了一個(gè)驅(qū)動(dòng)程序庫(kù),該API構(gòu)造指令,推送到目標(biāo)加速器執(zhí)行。代碼生成算法將加速器程序轉(zhuǎn)換為一系列調(diào)用,轉(zhuǎn)換為Runtime API。添加專門(mén)的加速器后端,需要~Python中的2k LoC。
端到端ResNet評(píng)估。使用TVM在PYNQ平臺(tái)上,生成ResNet推理內(nèi)核,將盡可能多的層卸載到VDLA。
生成僅CPU和CPU+FPGA實(shí)現(xiàn)的調(diào)度。由于卷積深度較低,第一個(gè)ResNet卷積層,無(wú)法在FPGA上有效卸載,而是在CPU上計(jì)算。然而,ResNet中的所有其它卷積層,都適合于高效的floading。由于VDLA不支持支持這些操作,因此CPU上執(zhí)行了諸如剩余層和激活類的操作。
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推理時(shí)間分解為僅CPU執(zhí)行和CPU+FPGA執(zhí)行。大部分計(jì)算都花費(fèi)在卷積層上,這些卷積層可以卸載到VDLA。對(duì)于這些卷積層,實(shí)現(xiàn)的加速比為40×。不幸的是,由于阿姆達(dá)爾定律,FPGA加速系統(tǒng)的整體性能,受到必須在CPU上執(zhí)行的部分工作負(fù)載的制約。擴(kuò)展VDLA設(shè)計(jì),支持這些其它算子,將有助于進(jìn)一步降低成本。
這個(gè)基于FPGA的實(shí)驗(yàn),展示了TVM適應(yīng)新體系結(jié)構(gòu)和所暴露的硬件本質(zhì)的能力。
7.相關(guān)工作
深度學(xué)習(xí)框架為用戶提供了方便的界面,表達(dá)DL工作負(fù)載,輕松部署到不同的硬件后端。雖然現(xiàn)有框架目前依賴于供應(yīng)商特定的tensor算子庫(kù),執(zhí)行工作負(fù)載,但可以利用TVM的堆棧為大量硬件設(shè)備,生成優(yōu)化的代碼。
高級(jí)計(jì)算圖DSL是表示和執(zhí)行高級(jí)優(yōu)化的典型方式。Tensorflow的XLA和最近推出的DLVM屬于這一類。這些工作中計(jì)算圖的表示是相似的,本文使用了高級(jí)計(jì)算圖DSL。雖然圖級(jí)表示非常適合高級(jí)優(yōu)化,但級(jí)別太高,無(wú)法在一組不同的硬件后端下優(yōu)化張量算子。以前的工作依賴于特定的降低規(guī)則,直接生成低級(jí)LLVM,或者求助于供應(yīng)商定制的庫(kù)。這些方法需要對(duì)每個(gè)硬件后端和變型算子組合,進(jìn)行大量工程設(shè)計(jì)。
Halide引入了分離計(jì)算和調(diào)度的思想。采用Halide的思想,在編譯器中重用現(xiàn)有的有用調(diào)度原語(yǔ)。
張量算子調(diào)度與GPU DSL和基于多面體的循環(huán)變換的其它工作有關(guān)。TACO介紹了一種在CPU上生成稀疏張量算子的通用方法。Weld是用于數(shù)據(jù)處理任務(wù)的DSL。特別關(guān)注解決GPU和專用加速器的DL工作負(fù)載的新調(diào)度挑戰(zhàn)。新原語(yǔ)可能被這些工作中的優(yōu)化管道所采用。
ATLAS和FFTW等高性能庫(kù),使用自動(dòng)調(diào)優(yōu)獲得最佳性能。張量理解應(yīng)用黑盒自動(dòng)調(diào)諧和多面體優(yōu)化CUDA內(nèi)核。OpenTuner和現(xiàn)有的超參數(shù)優(yōu)化算法,采用域無(wú)關(guān)搜索。預(yù)定義的成本模型,用于自動(dòng)調(diào)度Halid中的圖像處理管道。TVM的ML模型,使用有效的領(lǐng)域感知成本模型,該模型考慮了項(xiàng)目結(jié)構(gòu)。
基于分布式的調(diào)度優(yōu)化器,可以擴(kuò)展到更大的搜索空間,可以在大量受支持的后端上,找到最先進(jìn)的內(nèi)核。提供了一個(gè)端到端堆棧,可以直接從DL框架中獲取描述,與圖形級(jí)堆棧一起進(jìn)行聯(lián)合優(yōu)化。
盡管用于深度學(xué)習(xí)的加速器越來(lái)越流行,但如何有效地針對(duì)這些設(shè)備,構(gòu)建編譯堆棧仍不清楚。評(píng)估中使用的VDLA設(shè)計(jì),提供了一種總結(jié)類TPU加速器特性的通用方法,提供了一個(gè)關(guān)于如何為加速器編譯代碼的具體案例研究。
可能有利于將深度學(xué)習(xí)編譯為FPGA的現(xiàn)有系統(tǒng)。本文提供了一個(gè)通用的解決方案,通過(guò)張量化和編譯器驅(qū)動(dòng)的延遲隱藏,有效定位加速器。
8.結(jié)論
提出了一個(gè)端到端編譯堆棧,解決跨不同硬件后端的深度學(xué)習(xí)的基本優(yōu)化挑戰(zhàn)。系統(tǒng)包括自動(dòng)端到端優(yōu)化,這是從歷史上看,這是一項(xiàng)勞動(dòng)密集型和高度專業(yè)化的任務(wù)。
希望這項(xiàng)工作將鼓勵(lì)對(duì)端到端編譯方法的進(jìn)一步研究,為DL系統(tǒng)軟硬件協(xié)同設(shè)計(jì)技術(shù)打開(kāi)新的機(jī)會(huì)。
參考文獻(xiàn):
TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
總結(jié)
以上是生活随笔為你收集整理的全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 全文翻译(四) TVM An Autom
- 下一篇: 如何在 GPU 上优化卷积