說一說Web端側AI

前言

AI 正在不斷拓展前端的技術邊界, 算法的加持也爲前端研發注入了全新的力量。本文爲大家介紹什麼是端智能,端智能的應用場景以及 Web 端側實現 AI 的基本原理概念。

什麼是端智能

首先,回顧一個AI應用的開發流程,具體步驟包括了

  • 數據的採集與預處理
  • 模型的選取與訓練
  • 模型的評估
  • 模型服務部署

模型訓練的中間產物爲一個模型文件,通過加載模型文件,部署爲可調用的服務,然後就可以調用進行推理預測了。

在傳統流程中,模型服務會部署在高性能的服務器上,由客戶端發起請求,由服務器端進行推理,將預測結果返回給客戶端,而端智能則是在客戶端上完成推理的過程。

端智能的應用場景

端智能現在已經有非常多的應用場景,涵蓋視覺類的 AR 、互動遊戲,推薦類的信息流推薦,觸達類的智能Push等,語音類的直播、智能降噪等多個領域。算法逐漸從服務端覆蓋到用戶實時感知更強的移動終端。

典型應用包括了

  • AR 應用、遊戲。由 AI 提供理解視覺信息的能力,由 AR 根據視覺信息來實現虛實結合的交互,帶來更沉浸式的購物、互動體驗。比如美顏相機、虛擬試妝,即是通過檢測人臉面部的關鍵點,在特定區域使用 AR 增強、渲染妝容。
  • 互動遊戲。飛豬雙十一的互動遊戲"找一找", 即是一個跑在 h5 頁面的圖片分類應用,通過攝像頭實時捕捉圖片,調用分類模型進行分類,當出現遊戲設定目標時得分。
  • 端側重排。通過實時的用戶意識識別,對服務器推薦算法下發的feeds流進行重新排列,做出更精準的內容推薦。
  • 智能Push。通過端側感知用戶狀態,決策是否需要向用戶實施干預,推送Push,選取合適的時機主動觸達用戶,而非服務器端定時的批量推送,帶來更精準的營銷,更好的用戶體驗。

端智能的優勢

從普遍的應用場景,可以看到端智能的明顯優勢,包括了

  • 低延時

    實時的計算節省了網絡請求的時間。對於高幀率要求的應用,比如美顏相機每秒都要請求服務器,高延遲絕對是用戶所不能接受的。而對於高頻交互場景,比如遊戲,低延時變得更爲重要。

  • 低服務成本

    本地的計算節省了服務器資源,現在的新手機發布都會強調手機芯片的 AI 計算能力,越來越強的終端性能讓更多的端上 AI 應用成爲了可能。

  • 保護隱私

    數據隱私的話題在今天變得越來越重要。通過在端側進行模型的推理,用戶數據不需要上傳到服務器,保證了用戶隱私的安全。

端智能的侷限

同時,端智能也有一個最明顯的侷限,就是低算力,雖然端側的性能越來越強,但是和服務器相比還是相差甚遠。爲了在有限的資源裏做複雜的算法,就需要對硬件平臺進行適配,做指令級的優化,讓模型能夠在終端設備中跑起來,同時,需要對模型進行壓縮,在時間和空間上減少消耗。

現在已經有一些比較成熟的端側推理引擎了,這些框架、引擎都對終端設備做了優化來充分發揮設備的算力。比如Tensorflow LitePytorch mobile、阿里的 MNN、百度飛槳 PaddlePaddle

Web端呢

Web 端同樣擁有端側 AI 的優勢與侷限,作爲在 PC 上用戶訪問互聯網內容和服務的主要手段,在移動端很多APP也會嵌入 Web 頁面,但是瀏覽器內存和存儲配額的有限,讓 Web 上運行 AI 應用看上去更不可能。

然而在 2015 年的時候就已經出現了一個 ConvNetJS的庫,可以在瀏覽器裏用卷積神經網絡做分類、迴歸任務,雖然現在已經不維護了,2018 年的時候湧現了非常多的JS的機器學習、深度學習框架。如 Tensorflow.jsSynapticBrain.jsMindKeras.jsWebDNN 等。

受限於瀏覽器算力,部分框架如 keras.jsWebDNN框架只支持加載模型進行推理,而不能在瀏覽器中訓練。

此外,一些框架不適用於通用的深度學習任務,它們支持的網絡類型有所不同。比如 TensorFlow.jsKeras.jsWebDNN 支持了 DNNCNNRNN。而 ConvNetJS 主要支持 CNN 任務,不支持 RNNBrain.jssynaptic 主要支持 RNN 任務,不支持 CNN 網絡中使用的卷積和池化操作。Mind 僅支持基本的 DNN

在選擇框架時需要看下是否支持具體需求。

Web端架構

Web端是如何利用有限的算力的呢?

一個典型的 JavaScript 機器學習框架如圖所示,從底向上分別是驅動硬件,使用硬件的瀏覽器接口,各種機器學習框架、圖形處理庫,最後是我們的應用。

Untitled

CPU vs GPU

Web 瀏覽器中運行機器學習模型的一個先決條件是通過 GPU 加速獲得足夠的計算能力。

在機器學習中,尤其是深度網絡模型,廣泛使用的操作是將大矩陣與向量相乘,再與另一個向量做加法。這種類型的典型操作涉及數千或數百萬個浮點操作,而是它們通常是可並行化的。

以一個簡單的向量相加爲例,將兩個向量相加可分爲許多較小的運算,即每個索引位置相加。這些較小的操作並不相互依賴。儘管 CPU 對每個單獨的加法所需的時間通常更少,隨着計算量規模的變大,併發會逐漸顯示出優勢。

Untitled

WebGPU/WebGL vs WebAssembly

有了硬件之後,需要對硬件進行充分的利用。

  • WebGL

    WebGL 是目前性能最高的 GPU 利用方案,WebGL 爲在瀏覽器中加速 2D3D圖形渲染而設計,但可以用於神經網絡的並行計算來加速推理過程,實現速度數量級的提升。

  • WebGPU

    隨着 Web 應用對可編程 3D 圖形、圖像處理和 GPU 訪問需求的持續增強,爲了在 WEB 中引入GPU 加速科學計算性能,W3C2017 年提出了 WebGPU ,作爲下一代 WEB 圖形的的 API 標準,具有更低的驅動開銷,更好的支持多線程、使用 GPU 進行計算。

  • WebAssembly

    當終端設備沒有 WebGL 支持或者性能較弱的時候,使用 CPU 的通用計算方案爲 WebAssemblyWebAssembly是一種新的編碼方式,可以在現代的網絡瀏覽器中運行,它是一種低級的類彙編語言,具有緊湊的二進制格式,可以接近原生的性能運行,併爲諸如C / C ++ 等語言提供一個編譯目標,以便它們可以在 Web 上運行。

Tensorflow.js

Tensorflow.js 爲例,爲了在不同的環境下實現運行,tensorflow 支持了不同的後端,根據設備條件自動選擇相應的後端 ,當然也支持手動更改。

Untitled

tf.setBackend('cpu');
console.log(tf.getBackend());

對一些通用模型進行測試,WebGL速度大於普通 CPU 後端計算的 100 倍,WebAssembly 則比普通的 JS CPU 後端快 10-30 倍。

同時, tensorflow 也提供了 tfjs-node 版本,通過 C++CUDA 代碼編譯的本機編譯庫驅動 CPUGPU 進行計算,訓練速度與 Python 版本的 Keras 相當。不需要切換常用語言,可以直接在 nodejs 服務上添加 AI 模塊,而不是再啓動一個 python 的服務。

模型壓縮

有了框架對於硬件設備的適配,還需要對模型進行壓縮,複雜的模型固然有更好的預測精度,但是高額的存儲空間、計算資源的消耗,過長的推理速度在大部分移動端場景中還是難以接受的。

模型的複雜度在於模型結構的複雜以及海量的參數。模型文件中通常存儲了兩部分信息:結構參數,如下圖中簡化的神經網絡所示,每個方塊對應一個神經元,每個神經元以及神經元中的連線上都是參數。

模型的推理即從左側輸入,通過與神經元進行計算,再通過連線加上權重傳到下一層計算,到最終層得到預測輸出。節點越多、連接越多,則計算量越大。

Untitled

模型剪枝

對訓練好的模型進行裁剪,是模型壓縮的一個常見方式,網絡模型中存在着大量冗餘的參數,大量神經元激活值趨近於 0,通過對無效節點或者是不那麼重要的節點進行裁剪,可以減少模型的冗餘。

最簡單粗暴的剪枝即 DropOut ,在訓練過程中隨機對神經元進行丟棄。
大部分的剪枝方法會計算重要性因子,計算神經元節點對於最終的結果的重要性,剪去不那麼重要的節點。

模型剪枝的過程是迭代反覆進行的,並非剪枝後直接用來推理,通過剪枝後的訓練恢復模型的精度,模型的壓縮過程是在精度和壓縮比例之間的不斷權衡,在可接受的精度損失範圍內選擇最好的壓縮效果。

模型量化

爲了保證較高的精度,大部分的科學運算都是採用浮點型進行計算,常見的是 32 位浮點型和 64 位浮點型,即 float32double64。量化即是把高精度的數值轉化爲低精度。

如二值量化(1bit量化)會直接將 Float32/float64 的值映射到 1bit ,存儲空間直接壓縮 32 倍/ 64 倍,計算時加載所需內存同樣也會變小,更小的模型尺寸,帶來更低的功耗以及更快的計算速度。除此還有8bit量化、任意bit量化。

知識蒸餾

知識蒸餾則是將深度網絡中所學到的知識轉移到另一個相對簡單的網絡中,先訓練一個 teacher 網絡,然後使用這個 teacher 網絡的輸出和數據的真實標籤去訓練 student 網絡。

工具

模型壓縮的實現較爲複雜,如果只是面向應用,大概瞭解其作用原理即可,可以直接用封裝好的工具。

比如 Tensorflow Model Optimization Toolkit 提供了量化功能,其官方對於一些通用模型進行了壓縮測試,如下表可以看到,對於 mobilenet 模型,模型大小由 10M+ 壓縮到了 3、4M,而模型的精度損失很小。

Untitled

百度的飛槳提供的 PaddleSlim 則提供了上述三種壓縮方法。

Untitled

總結

綜上,開發一個 Web 端上的 AI 應用,流程即變成了

  • 針對特定場景設計算法、訓練模型
  • 對模型進行壓縮
  • 轉換爲推理引擎所需要的格式
  • 加載模型進行推理預測

對於算法而言,通用的深度學習框架已然提供了若干的通用預訓練模型,可以直接用來做推理,也可以在其基礎上訓練自己的數據集。模型的壓縮與推理也可以使用現有的工具。

參考文獻

[1] https://tech.taobao.org/news/2021-1-7-32.html

[2] https://juejin.cn/post/6844904152095539214

[3] Ma Y, Xiang D, Zheng S, et al. Moving deep learning into web browser: How far can we go?[C]//The World Wide Web Conference. 2019: 1234-1244.

[4] WebGPU: https://www.w3.org/TR/webgpu/

[5] Tensorflow.js: https://www.tensorflow.org/js?hl=zh-cn

[6] WebAssembly: https://developer.mozilla.org/zh-CN/docs/WebAssembly

[7] Deep Learning with JavaScript https://www.manning.com/books/deep-learning-with-javascript

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章