如何在瀏覽器上跑深度學習模型?並且一行JS程式碼都不用寫
翻譯 | 林椿眄
編輯 | 周翔
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 後端。
圖 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 來定義其核心,並將其編譯為用於不同的平臺的程式碼。
圖 2
這就意味著:
你不需要額外編寫大量的程式碼就可以將現有模型部署到 WebGL 上。NNVM/TVM 模型的定義對於所有的目標來說都是一樣的,因此你只需要將其編譯到新的目標中。
如果要新增新的作業系統核心,你只需要在 TVM 中定義一次即可,而不需要為每個目標執行一次。你也不需要知道如何編寫 GLSL 程式碼才能向 WebGL 新增新的核心,因為這一切都能夠自動生成。
▌測試基準
在這裡,我們針對一個典型的工作負載進行了基準測試:使用 resnet18 模型進行影像分類。
我使用的是一臺工作了 5 年的,配備 8 核英特爾酷睿™ i7-3610QM 處理器以及 GTX650M 顯示卡的筆記本。在基準測試中,我們從 Gluon 模型庫裡下載了 resnet18 模型,並對貓的影像進行端到端的分類。我們只測量了模型執行時間(這不包含模型/輸入/引數的載入),每個模型執行 100 次,最終得到執行時間的平均值,其結果如圖3所示。
圖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+金融方向)正在招募中,後臺回覆:讀者群,聯絡營長,新增營長請備註姓名,研究方向。
☟☟☟點選 | 閱讀原文 | 檢視更多精彩內容
相關文章
- 開啟瀏覽器,不用寫程式碼,做個小遊戲瀏覽器遊戲
- 瀏覽器裡玩機器學習、深度學習瀏覽器機器學習深度學習
- js程式碼判斷瀏覽器JS瀏覽器
- 如何在瀏覽器上新增一鍵式填寫瀏覽器
- 如何在瀏覽器中測試JavaScript程式碼?瀏覽器JavaScript
- js程式碼清楚瀏覽器資源clearCacheJS瀏覽器
- 您是否也有想在瀏覽器中實時的編輯程式碼並且渲染的想法?瀏覽器
- JavaScript 複習之瀏覽器模型JavaScript瀏覽器模型
- python自動開啟瀏覽器下載zip,並且提取內容寫入excelPython瀏覽器Excel
- 瀏覽器中的機器學習:使用預訓練模型瀏覽器機器學習模型
- 機器學習之使用sklearn構建據類模型,並且評價模型機器學習模型
- 判斷瀏覽器版本並且對使用低版本瀏覽器的使用者進行提示瀏覽器
- 瀏覽器沙箱模型瀏覽器模型
- 不用一行程式碼,搞懂React排程器原理行程React
- 學習筆記——瀏覽器物件模型(Window)筆記瀏覽器物件模型
- 別鬧了,寫個網站其實都不用寫一行程式碼網站行程
- 重學瀏覽器(1)-多程式多執行緒的瀏覽器瀏覽器執行緒
- 瀏覽器上寫程式碼,4核8G微軟伺服器免費用,Codespaces真香瀏覽器微軟伺服器
- TensorFlow.js:讓你在瀏覽器中也能玩轉機器學習JS瀏覽器機器學習
- js中css樣式相容各個瀏覽器寫法JSCSS瀏覽器
- 谷歌瀏覽器程式碼格式化谷歌瀏覽器
- What-If 工具:無需寫程式碼,即可測試機器學習模型機器學習模型
- Webnovel 不用照顧 Edge 瀏覽器效能?想多了!Web瀏覽器
- js 獲取瀏覽器核心JS瀏覽器
- 使用SAP WebIDE建立開發Java應用,並且在瀏覽器裡除錯WebIDEJava瀏覽器除錯
- 深度學習模型深度學習模型
- js 判斷是什麼瀏覽器、是否為谷歌瀏覽器JS瀏覽器谷歌
- 10個python常用且好用的機器學習及深度學習庫!Python機器學習深度學習
- 瀏覽器預設樣式程式碼收集瀏覽器
- 瀏覽器執行javaScript程式碼基礎瀏覽器JavaScript
- 利用 Powershell 編寫簡單的瀏覽器指令碼瀏覽器指令碼
- 如何在瀏覽器裡開發並執行 SAP UI5 應用瀏覽器UI
- 不用寫程式碼的爬蟲爬蟲
- [譯] 如何在瀏覽器中編寫一款藍芽應用瀏覽器藍芽
- 3天學寫mvvm框架[三]:瀏覽器端渲染MVVM框架瀏覽器
- JS實現瀏覽器列印WordJS瀏覽器
- 主流瀏覽器核心及JS引擎瀏覽器JS
- js 呼叫瀏覽器複製功能JS瀏覽器