如何在瀏覽器上跑深度學習模型?並且一行JS程式碼都不用寫

AI科技大本營發表於2018-03-13

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


翻譯 | 林椿眄

編輯 | 周翔


2017 年 8 月,華盛頓大學的陳天奇團隊釋出了 TVM,和 NNVM 一起組成深度學習到各種硬體的完整優化工具鏈,支援手機、CUDA、OpenCL、Metal、JavaScript 以及其它各種後端,而且使用者可以針對這些目標平臺用 Python 來進行調優。


那麼到底什麼是 TVM 呢?


陳天奇在論文(https://arxiv.org/pdf/1802.04799.pdf)中解釋到,TVM 其實是一個端到端優化堆疊,可以降低和調整深度學習工作負載,以適應多種硬體後端。TVM 的設計目的是分離演算法描述、排程和硬體介面。


此外,TVM 具備兩個優化層:計算圖優化層;具備新型排程基元的張量優化層。通過結合這兩種優化層,TVM 從大部分深度學習框架中獲取模型描述,執行高層級和低層級優化,生成特定硬體的後端優化程式碼,如樹莓派、GPU 和基於 FPGA 的專用加速器。


同一小組的劉洪亮在微博上解釋到:“TVM 可以把模型部署到不同硬體,比如群眾常問的能不能用 AMD 的 GPU,用 FPGA 怎麼搞,TVM 提供這個中間層有效解決這個問題”。


總的來說,除了比較明顯的多硬體支援,更重要的是 TVM 支援相對方便的自動調優和輕量級部署。


之後,陳天奇團隊又釋出了基於 TVM 工具鏈的深度學習編譯器 NNVM compiler O(http://www.tvmlang.org/2017/10/06/nnvm-compiler-announcement.html),支援將包括MxNet、Pytorch、Caffe2,、CoreML 等在內的深度學習模型編譯部署到硬體上並提供多級別聯合優化,速度更快,部署更加輕量級。


如今,谷歌工程師談至勳又將 TVM 向前推進了一步:支援 WebGL/OpenGL 平臺並可以在瀏覽器運。也就是說,未來你將不需要寫一行 JavaScript 程式碼,就可以把深度學習模型自動編譯生成 WebGL 並且跑在瀏覽器中 。


MxNet 的作者李沐評價到,“這是 Mxnet JavaScript frontend 往前的一大進步”。


以下是此次更新的完整內容解析:


OpenGL / WebGL 後端支援


TVM目前已經能夠支援多個硬體後端:CPU,GPU,移動裝置等......這次我們新增了另一個後端:OpenGL / WebGL。


OpenGL / WebGL 允許我們能夠在未安裝 CUDA 的環境中使用 GPU。目前這是在瀏覽器中使用 GPU 的唯一方式。


這個新的後端允許我們通過以下 3 種方式使用 OpenGL / WebGL:


  • 本地 OpenGL:我們可以將一個深度學習模型編譯成 OpenGL,並直接在本地機器上執行,整個過程只用到了 Python。

  • 帶 RPC 的WebGL:我們可以將深度學習模型編譯為 WebGL,通過 Emscripten 將其作為一個共享庫匯出,包含 JavaScript 主機程式碼和 WebGL 裝置程式碼。然後,我們可以通過 RPC 將這個共享庫部署到 TVM JavaScript 執行時間系統(runtime system)中,並在瀏覽器上執行。

  • 帶靜態庫的 WebGL:我們可以將深度學習模型編譯為 WebGL,將其與 TVM JavaScript 執行時間系統相連線,並匯出整個包。然後我們就可以不需要任何依賴庫,直接在瀏覽器的網頁中執行模型。詳細流程如圖 1 所示。


我們通過 Emscripten 及其 fastcomp LLVM 後端來生成 JavaScript 後端。


640?wx_fmt=png

圖 1


以下是 3 中使用方式的例子:

https://github.com/dmlc/nnvm/blob/master/tutorials/from_mxnet_to_we

bgl.py


和其他方法有什麼不同?


在瀏覽器上執行神經網路模型已經不是一件多麼新鮮的事了。Andrej Karpathy 提出的ConvNetJS,及 Google 的 DeepLearning.JS 都能夠實現這種想法。


那麼,TVM 的 WebGL 有何獨特之處呢?最大的區別就在於 TVM 的 WebGL 中操作核心是自動編譯的,而不是人工編譯的。如圖 2 所示,TVM 使用統一的 AST 來定義其核心,並將其編譯為用於不同的平臺的程式碼。


640?wx_fmt=png

圖 2


這就意味著:


  • 你不需要額外編寫大量的程式碼就可以將現有模型部署到 WebGL 上。NNVM/TVM 模型的定義對於所有的目標來說都是一樣的,因此你只需要將其編譯到新的目標中。

  • 如果要新增新的作業系統核心,你只需要在 TVM 中定義一次即可,而不需要為每個目標執行一次。你也不需要知道如何編寫 GLSL 程式碼才能向 WebGL 新增新的核心,因為這一切都能夠自動生成。


測試基準


在這裡,我們針對一個典型的工作負載進行了基準測試:使用 resnet18 模型進行影像分類。


我使用的是一臺工作了 5 年的,配備 8 核英特爾酷睿™ i7-3610QM 處理器以及 GTX650M 顯示卡的筆記本。在基準測試中,我們從 Gluon 模型庫裡下載了 resnet18 模型,並對貓的影像進行端到端的分類。我們只測量了模型執行時間(這不包含模型/輸入/引數的載入),每個模型執行 100 次,最終得到執行時間的平均值,其結果如圖3所示。


640?wx_fmt=png

圖3


該基準測試在 4 中不同的設定下執行的:


  • CPU(LLVM):模型被編譯到 LLVM IR 和 JIT'ed 上,因此它完全執行在 CPU 上。

  • OpenCL:模型被編譯到 OpenCL 上。還有一部分的 glue code 編譯在 LLVM 上,用於設定並啟動 OpenCL 核心。然後我們在本地的機器上執行該模型。

  • OpenGL:和 OpenCL 設定一樣,不過模型是被編譯到 OpenGL 上。

  • WebGL:glue code 被編譯到 LLVM 平臺上,進而通過 Emscripten 的 Fastcomp LLVM 後端轉換為 Javascript。裝置的程式碼被編譯到 WebGL 平臺上,我們可以在Firefox 瀏覽器上執行該模型。


從以上得到的結果我們可以看到,TVM OpenGL 後端與 OpenCL 有相似的效能。更有意思的是,瀏覽器中的 WebGL 版本並不比桌面端的 OpenGL 執行效率慢。考慮到主機的程式碼是 JavaScript 編寫的,出現這個現象的確讓人驚訝。這可能是由於 Emscripten 生成了 asm.js,使得模型在 Firefox 瀏覽器中的執行效率得到了顯著優化。


這個更新邁出了將深度學習模型自動編譯到瀏覽器的第一步。我們會為 TVM 堆疊加入更多的優化,期待模型的效能能夠得到更多的改進。


部落格地址:

http://www.tvmlang.org/2018/03/12/webgl.html



招聘

新一年,AI科技大本營的目標更加明確,有更多的想法需要落地,不過目前對於營長來說是“現實跟不上靈魂的腳步”,因為缺人~~


所以,AI科技大本營要壯大隊伍了,現招聘AI記者和資深編譯,有意者請將簡歷投至:gulei@csdn.net,期待你的加入!


如果你暫時不能加入營長的隊伍,也歡迎與營長分享你的精彩文章,投稿郵箱:suiling@csdn.net


AI科技大本營讀者群(計算機視覺、機器學習、深度學習、NLP、Python、AI硬體、AI+金融方向)正在招募中,後臺回覆:讀者群,聯絡營長,新增營長請備註姓名,研究方向。


640?wx_fmt=gif


640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png


☟☟☟點選 | 閱讀原文 | 檢視更多精彩內容

相關文章