陈天奇团队发布TVM:把深度学习部署到手机、树莓派等更多硬件
△?陳天奇,華盛頓大學(xué)計(jì)算機(jī)系博士生,此前畢業(yè)于上海交通大學(xué)ACM班。XGBoost、cxxnet等著名機(jī)器學(xué)習(xí)工具的作者,MXNet的主要貢獻(xiàn)者之一。
DMLC項(xiàng)目發(fā)起人陳天奇今天早間宣布推出TVM。
所謂TVM,按照正式說法:就是一種將深度學(xué)習(xí)工作負(fù)載部署到硬件的端到端IR(中間表示)堆棧。換一種說法,可以表述為一種把深度學(xué)習(xí)模型分發(fā)到各種硬件設(shè)備上的、端到端的解決方案。
陳天奇在微博上表示,TVM和之前發(fā)布的模塊化深度學(xué)習(xí)系統(tǒng)NNVM一起,“組成深度學(xué)習(xí)到各種硬件的完整優(yōu)化工具鏈”。
同在DMLC小組的劉洪亮(phunter_lau)進(jìn)一步在微博上解釋了這個(gè)工作的意義:“TVM可以把模型部署到不同硬件,比如群眾常問的能不能用AMD的GPU,用FPGA怎么搞,TVM提供這個(gè)中間層有效解決這個(gè)問題”。
隨后陳天奇也補(bǔ)充說:
除了比較明顯的多硬件支持,更重要的是支持比較方便的自動(dòng)調(diào)優(yōu)和輕量級部署。比如我們有同學(xué)可以在一些workload可以達(dá)到和cudnn差不多的效果,而且同樣的東西可以遷移到其它非cuda設(shè)備。
非常建議大家嘗試一下。
而在reddit上,劉洪亮形象的比喻稱:以后可以讓樹莓派來找貓~
關(guān)于TVM的官方介紹,量子位嘗試把主要內(nèi)容編譯如下。查看原文可以點(diǎn)擊頁面左下角“閱讀原文”按鈕。
作者:Tianqi Chen(project lead), Thierry Moreau(hardware stack), Ziheng Jiang(graph compilation), Haichen Shen(gpu optimization)
深度學(xué)習(xí)已經(jīng)變得無處不在、不可或缺。
此次變革的推手之一,是可擴(kuò)展的深度學(xué)習(xí)系統(tǒng),例如TensorFlow、MXNet、Caffe以及PyTorch等。大多數(shù)現(xiàn)有系統(tǒng)只對部分服務(wù)器級GPU進(jìn)行了優(yōu)化,如果想部署到手機(jī)、物聯(lián)網(wǎng)設(shè)備以及專用加速器(FPGA、ASIC)等平臺,還有大量的工作要做。
隨著深度學(xué)習(xí)框架和硬件后端數(shù)量的增加,我們提出一個(gè)統(tǒng)一的中間表示(IR)堆棧,用來彌合深度學(xué)習(xí)框架和硬件后端之間的距離。
我們很高興的宣布推出TVM來解決上述問題。TVM是一個(gè)全新的框架,可以:
- 為CPU、GPU和其他專用硬件,表示和優(yōu)化常見的深度學(xué)習(xí)計(jì)算工作負(fù)載
- 自動(dòng)轉(zhuǎn)換計(jì)算圖以最小化內(nèi)存占用,優(yōu)化數(shù)據(jù)布局和融合計(jì)算模式
- 提供端到端編譯,從現(xiàn)有的前端框架到裸機(jī)硬件,直到瀏覽器可執(zhí)行的javascript
在TVM的幫助下,可以輕松在手機(jī)、嵌入式設(shè)備甚至瀏覽器上運(yùn)行深度學(xué)習(xí)的工作負(fù)載,而不需要額外的工作。TVM還為許多硬件平臺上的深度學(xué)習(xí)工作負(fù)載,提供統(tǒng)一的優(yōu)化框架,包括依賴于新計(jì)算基元的專用加速器。
我們采用了編譯器界的共同理念,提供兩個(gè)中間表示層,以有效地將高級深度學(xué)習(xí)算法降低到多種硬件后端。
在這次放出的版本中,開源的TVM軟件包提供x86、ARM、OpenCL、Metal、CUDA和JavaScript的優(yōu)化基元。我們正積極的致力于增加對專業(yè)硬件加速和Nvidia GEMM優(yōu)化的Volta架構(gòu)的支持。
技術(shù)細(xì)節(jié)
TVM堆棧的目標(biāo),是提供一個(gè)可重復(fù)使用的工具鏈,來將高級神經(jīng)網(wǎng)絡(luò)描述從深度學(xué)習(xí)框架前端,向下編譯為多個(gè)硬件后端的低級機(jī)器代碼。
以Apache MXNet作為前端案例,下面的代碼演示了如何使用TVM將深度學(xué)習(xí)模型的高級描述編譯為針對目標(biāo)硬件定制的優(yōu)化可執(zhí)行模塊。
這件事的挑戰(zhàn)在于支持多個(gè)硬件后端,同時(shí)將計(jì)算、內(nèi)存和能量足跡保持在最低水平。我們借鑒了編譯器界的智慧,構(gòu)建了兩級中間層:其中一層是NNVM(用于任務(wù)調(diào)度和內(nèi)存管理的高級中間表示),另一層是TVM(用于優(yōu)化計(jì)算內(nèi)核的富有表現(xiàn)力的低級中間表示)
堆棧的第一級是基于計(jì)算圖的表示。計(jì)算圖是一個(gè)有向無環(huán)圖,用節(jié)點(diǎn)表示計(jì)算,用箭頭表示數(shù)據(jù)流關(guān)系。大多數(shù)現(xiàn)有深度學(xué)習(xí)框架都采用這種方法,包括TVM堆棧中的NNVM圖表示,TensorFlow XLA以及英特爾的Ngraph。
圖優(yōu)化框架可以支持很多強(qiáng)大的優(yōu)化。例如,我們提供了一個(gè)次線性內(nèi)存優(yōu)化功能,允許用戶在單個(gè)GPU上訓(xùn)練1000層的ImageNet ResNet。
然而,我們發(fā)現(xiàn)僅基于IR的計(jì)算圖不足以解決支持不同硬件后端的挑戰(zhàn)。因?yàn)閱为?dú)一個(gè)圖形運(yùn)算符,例如卷積或矩陣乘法能以非常不同的方式映射和優(yōu)化在不同的硬件后端。這些特定硬件優(yōu)化在內(nèi)存布局、并行線程模式、緩存訪問模式和硬件基元的選擇方面,可能會(huì)發(fā)生巨大的變化。我們希望能以通用方式對此進(jìn)行明確表達(dá)。
我們建立了一個(gè)低級表示來解決這個(gè)問題。這個(gè)表示基于索引公式,而且支持重復(fù)計(jì)算。
低級別IR采用了現(xiàn)有的圖像處理語言(例如Halide或darkroom)的原理來制定一種表現(xiàn)力很強(qiáng)的深度學(xué)習(xí)DSL。TVM在循環(huán)變換工具(例如loopy等)的啟發(fā)下構(gòu)建了圖優(yōu)化。我們也從MXNet、TensorFlow、Theano等深度學(xué)習(xí)框架的數(shù)據(jù)流描述語言中獲得靈感。然后在調(diào)度階段對TVM中描述的算法進(jìn)行處理,以應(yīng)用針對目標(biāo)硬件后端訂制的轉(zhuǎn)換。
TVM包括CPU優(yōu)化框架中常見的標(biāo)準(zhǔn)轉(zhuǎn)換基元。更重要的是,TVM集成了針對GPU的新優(yōu)化基元,包括利用線程協(xié)作模式、數(shù)據(jù)布局變換和強(qiáng)大的計(jì)算基元。將TVM和NNVM結(jié)合使用,可以用多種方式優(yōu)化軟件堆棧中的深度學(xué)習(xí)工作負(fù)載,進(jìn)一步實(shí)現(xiàn)計(jì)算圖級和運(yùn)算符級的優(yōu)化。
多語言和平臺支持
TVM的優(yōu)勢之一,就是對多個(gè)平臺和語言提供了豐富的支持。這由兩個(gè)部分組成。一是編譯器堆棧,其中包括完整的優(yōu)化庫,以產(chǎn)生優(yōu)化過的機(jī)器代碼;二是輕量級的運(yùn)行環(huán)境,提供了在不同平臺上部署編譯模塊所需的可移植性。
TVM目前支持嵌入式編譯器堆棧的Python和C++接口。我們在設(shè)計(jì)框架時(shí)最大程度的實(shí)現(xiàn)了重復(fù)利用,以便編譯器堆棧的改進(jìn)可以在Python和C++組建之間互換使用。
我們還提供了一個(gè)輕量級的運(yùn)行環(huán)境,可以讓TVM用JavaScript、Java、Python、C++等編譯過的代碼,運(yùn)行在Android、iOS、樹莓派和網(wǎng)頁瀏覽器等平臺上。
遠(yuǎn)程部署和執(zhí)行
通過輕量級的接口TVM RPC,可以在遠(yuǎn)程嵌入式設(shè)備上部署和執(zhí)行TVM交叉編譯過的模塊。這為TVM用戶提供了一個(gè)熟悉的高級Python界面,用于在各種低級嵌入式設(shè)備上遠(yuǎn)程編譯、優(yōu)化和測試深度學(xué)習(xí)算法。
性能
TVM處于早期階段,讓然有很多需要改進(jìn)的地方,但是我們已經(jīng)看到一些令人振奮的結(jié)果。
樹莓派
我們首先在一個(gè)樹莓派3B上運(yùn)行ResNet工作復(fù)雜,來比較TVM和nnpack。由于時(shí)間限制,我們使用了TVM實(shí)現(xiàn)直接卷積,而nnpack用于對3×3內(nèi)核執(zhí)行winograd卷積。
我們發(fā)現(xiàn)在這次的樹莓派試驗(yàn)中,使用TVM的自動(dòng)調(diào)整內(nèi)核,我們可以獲得類似nnpack中的手動(dòng)優(yōu)化內(nèi)核的性能。
GPU
以下測試歸功于Leyuan Wang (AWS / UCDavis),Yuwei Hu(TuSimple),Weitang Liu (AWS/ UCDavis)。
作為一個(gè)概念的證明,我們創(chuàng)建了一個(gè)端到端的編譯流程,可以將MXNet模型編譯成TVM執(zhí)行圖。我們通過自動(dòng)融合運(yùn)算符并使TVM生成融合的內(nèi)核,在圖形節(jié)點(diǎn)之間應(yīng)用優(yōu)化。我們對MobileNet ImageNet工作負(fù)載進(jìn)行了測試,結(jié)果如下。
結(jié)果顯示,TVM在速度方面勝過我們的基準(zhǔn)算法。更有趣的是,內(nèi)核融合帶來額外的加速。值得一提的是,TVM自己能生成所有優(yōu)化的GPU內(nèi)核,耳部依賴于CuDNN等外部庫。
我們正在開展更多的實(shí)驗(yàn),并準(zhǔn)備放出更新的結(jié)果。
源代碼
GitHub地址在此:
https://github.com/dmlc/tvm
— 完 —
本文作者:允中 原文發(fā)布時(shí)間:2017-08-18總結(jié)
以上是生活随笔為你收集整理的陈天奇团队发布TVM:把深度学习部署到手机、树莓派等更多硬件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Xmind使用小技巧
- 下一篇: dlib实现人脸检测方法