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