全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
全文翻譯(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
摘要
人們越來越需要將機(jī)器學(xué)習(xí)應(yīng)用到各種各樣的硬件設(shè)備中。現(xiàn)在的框架依賴于特定于供應(yīng)商的算子庫,針對窄帶的服務(wù)器級GPU進(jìn)行優(yōu)化。將工作負(fù)荷部署到新平臺,如移動電話,嵌入式設(shè)備和加速算子(如FPGA,ASIC)-需要大量手動操作。
提出了TVM,一個開源圖形級別的編譯器和算子級優(yōu)化,提供高效跨多個應(yīng)用程序移植到深度學(xué)習(xí)工作負(fù)荷硬件后端。TVM解決了深度學(xué)習(xí)特有的優(yōu)化難題,如高級算子融合,映射到任意硬件原語,內(nèi)存延遲隱藏。
通過以下方式自動優(yōu)化底層程序,適配硬件特性:
采用一種自定義的,基于學(xué)習(xí)的成本模型方法,用于快速探索代碼優(yōu)化。實驗結(jié)果表明,TVM可在不同的領(lǐng)域,提供高性能硬件后端,可與最先進(jìn)的低功耗CPU,mobile GPU,server-class GPUs的手動調(diào)優(yōu)庫抗衡。展示了TVM面向加速算子后端的能力,如作為基于FPGA的通用深度學(xué)習(xí)加速算子。TVM系統(tǒng)是開源的,在幾家大公司提供量產(chǎn)服務(wù)。
1.引言
深度學(xué)習(xí)(DL)模型,可以識別圖像,處理自然語言,在挑戰(zhàn)性戰(zhàn)略游戲中擊敗人類。智能應(yīng)用部署的需求日益增長,從云服務(wù)器,自動駕駛汽車和嵌入式設(shè)備,廣泛應(yīng)用于各種設(shè)備。由于硬件特性的多樣性,包括嵌入式CPU,GPU,FPGA和ASIC(如TPU),將DL工作負(fù)荷,映射到這些設(shè)備非常重要。這些硬件目標(biāo)包括內(nèi)存組織,計算功能單元,如圖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,依靠計算圖實現(xiàn)優(yōu)化,如自動微分和動態(tài)內(nèi)存管理。圖形級優(yōu)化,通常太深奧,無法處理硬件后端特定的算子級轉(zhuǎn)換。大部分框架專注于一個狹窄的服務(wù)器類GPU設(shè)備,特定于目標(biāo)的優(yōu)化高度工程化和特定于供應(yīng)商的算子libraries。這些算子庫,過于專業(yè)化和不透明,不易于跨硬件設(shè)備進(jìn)行移植,需要大量的手動調(diào)諧數(shù)據(jù)。提供在各種DL框架中,支持各種硬件后端,目前需要大量的工程效率。即使對于受支持的后端,框架也必須在以下兩者間,做出艱難的選擇:
(1) 避免產(chǎn)生預(yù)定義運(yùn)算子庫中,沒有的新運(yùn)算符算子的圖形優(yōu)化
(2)使用這些新算子的未優(yōu)化實現(xiàn)。
不同的硬件后端,實現(xiàn)圖形級和算子級優(yōu)化,采用了一種有趣的,完全不同的端到端方法。構(gòu)建TVM,一種采用高級規(guī)范的編譯器,從現(xiàn)有框架支持不同的代碼生成,低級優(yōu)化代碼硬件后端。為了吸引用戶,TVM需要提供與跨di-verse硬件后端的多種手動優(yōu)化算子庫相競爭的性能。這一目標(biāo)需要解決下文介紹的主要挑戰(zhàn)。
利用特定的硬件功能和限制。
DL加速算子引入了優(yōu)化的張量計算原語,GPU和CPU不斷改進(jìn)處理元素。一個重大的挑戰(zhàn),客戶生成優(yōu)化的代碼給定的算子描述。硬件指令的輸入是多維的,可以是固定的,也可以是可變的長度;規(guī)定了不同的數(shù)據(jù)布局;有內(nèi)存層次結(jié)構(gòu)的特殊要求。系統(tǒng)必須利用加速算子,有效地處理這些復(fù)雜的原語。加速算子的設(shè)計也是如此,通常傾向于更精簡的控制和load更多編譯器堆棧復(fù)雜調(diào)度。對于專門化的加速算子,系統(tǒng)需要生成顯式控制管道,針對CPU和GPU的硬件,優(yōu)化隱藏內(nèi)存訪問延遲關(guān)系的代碼。
優(yōu)化的大搜索空間另一個挑戰(zhàn),在不手動調(diào)整算子的情況下,生成高效代碼。內(nèi)存訪問,線程模式和新型硬件原語的組合選擇,為生成的代碼創(chuàng)建巨大的配置空間(例如,循環(huán)布局和排序,緩存,展開)。如果實施blackbox黑盒自動調(diào)諧,將產(chǎn)生巨大的搜索成本??梢圆捎妙A(yù)先確定的成本模型,指導(dǎo)搜索,由于模型的復(fù)雜性越來越高,構(gòu)建準(zhǔn)確成本模型,很難建立模型現(xiàn)代硬件。此外,要求為每種硬件類型,建立單獨(dú)的成本模型。
TVM通過三個關(guān)鍵模塊解決了這些挑戰(zhàn)。
(1)引入一種張量表達(dá)式語言。
構(gòu)建算子提供程序轉(zhuǎn)換,通過各種優(yōu)化生成不同版本的program原語。這一層開展Halid的計算/調(diào)度分離概念,將目標(biāo)硬件本質(zhì)與轉(zhuǎn)換原語分離,支持新型加速算子及相應(yīng)的新intrinsics。此外,引入了新的轉(zhuǎn)換原語,應(yīng)對與GPU相關(guān)的挑戰(zhàn),使部署能夠特定于加速算子。可以應(yīng)用不同的程序轉(zhuǎn)換序列,為給定的算子聲明,形成豐富的有效程序空間。
(2) 引入了一個自動程序優(yōu)化框架,用于尋找優(yōu)化的張量算子。
優(yōu)化算子是在基于ML的成本模型的指導(dǎo)下,從硬件后端收集更多數(shù)據(jù),該模型會不斷調(diào)整和改進(jìn)。
(3)在自動代碼生成上,引入一個充分利用高級和算子級優(yōu)化。
通過結(jié)合這三個模塊,TVM可以將現(xiàn)有深度學(xué)習(xí)框架的模型描述,工作,執(zhí)行高級和低級優(yōu)化,為后端(如CPU,GPU和基于FPGA的專用處理器)生成特定于硬件的優(yōu)化代碼加速算子。
本文主要貢獻(xiàn):
?確定了在不同硬件后端為深度學(xué)習(xí)工作負(fù)荷,提供性能可移植性方面的主要優(yōu)化挑戰(zhàn)。
?引入了自定義的調(diào)度原語,充分利用了跨線程內(nèi)存重用,創(chuàng)新的硬件本質(zhì)和延遲隱藏。
?提出實施基于機(jī)器學(xué)習(xí)的自動探索和優(yōu)化系統(tǒng)搜索的張量算子。
?構(gòu)建了一個端到端的編譯和優(yōu)化堆棧,在高級框架(包括TensorFlow,MXNet,PyTorch,Keras,CNTK)中,多種硬件后端(包括CPU,服務(wù)器GPU,移動GPU和基于FPGA的加速算子)特定的工作負(fù)荷,部署深度學(xué)習(xí)。
開源TVM在幾家大公司內(nèi)部量產(chǎn)使用。在服務(wù)器級GPU,嵌入式GPU,嵌入式CPU和一個定制的基于FPGA的通用加速器上,使用真實的工作負(fù)荷,對TVM進(jìn)行了評估。
實驗結(jié)果表明,TVM具有便攜性跨后端的性能實現(xiàn)加速,在現(xiàn)有框架的基礎(chǔ)上,由手工優(yōu)化的庫支持,從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總結(jié)了TVM中的執(zhí)行步驟及相應(yīng)部分。該系統(tǒng)首先將現(xiàn)有框架中的模型作為輸入,轉(zhuǎn)換為計算圖形表示。然后執(zhí)行高級數(shù)據(jù)流重寫,生成優(yōu)化的圖。操作員級優(yōu)化模塊必須生成efficient代碼-此圖中每個融合運(yùn)算符的。運(yùn)算符是用聲明性張量表達(dá)式語言指定的;未指定執(zhí)行細(xì)節(jié)。TVM為給定的目標(biāo)識別一組可能的代碼優(yōu)化
硬件目標(biāo)的算子。可能的優(yōu)化形成了一個很大的空間,使用基于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)
這個編譯后的運(yùn)行時模塊,包含三個組件:
最終優(yōu)化的計算圖(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)中的多個部署后端,如C++、java和Python。本文的其余部分描述了TVM的體系結(jié)構(gòu),及系統(tǒng)程序員如何擴(kuò)展,支持新的后端。
參考文獻(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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Tesla Model汽车架构与FSD供
- 下一篇: 全文翻译(二): TVM: An Aut