前言
AI
正在不斷拓展前端的技術邊界, 算法的加持也爲前端研發注入了全新的力量。本文爲大家介紹什麼是端智能,端智能的應用場景以及 Web
端側實現 AI
的基本原理概念。
什麼是端智能
首先,回顧一個AI
應用的開發流程,具體步驟包括了
- 數據的採集與預處理
- 模型的選取與訓練
- 模型的評估
- 模型服務部署
模型訓練的中間產物爲一個模型文件,通過加載模型文件,部署爲可調用的服務,然後就可以調用進行推理預測了。
在傳統流程中,模型服務會部署在高性能的服務器上,由客戶端發起請求,由服務器端進行推理,將預測結果返回給客戶端,而端智能則是在客戶端上完成推理的過程。
端智能的應用場景
端智能現在已經有非常多的應用場景,涵蓋視覺類的 AR
、互動遊戲,推薦類的信息流推薦,觸達類的智能Push
等,語音類的直播、智能降噪等多個領域。算法逐漸從服務端覆蓋到用戶實時感知更強的移動終端。
典型應用包括了
AR
應用、遊戲。由AI
提供理解視覺信息的能力,由AR
根據視覺信息來實現虛實結合的交互,帶來更沉浸式的購物、互動體驗。比如美顏相機、虛擬試妝,即是通過檢測人臉面部的關鍵點,在特定區域使用AR
增強、渲染妝容。- 互動遊戲。飛豬雙十一的互動遊戲"找一找", 即是一個跑在
h5
頁面的圖片分類應用,通過攝像頭實時捕捉圖片,調用分類模型進行分類,當出現遊戲設定目標時得分。 - 端側重排。通過實時的用戶意識識別,對服務器推薦算法下發的
feeds
流進行重新排列,做出更精準的內容推薦。 - 智能Push。通過端側感知用戶狀態,決策是否需要向用戶實施干預,推送
Push
,選取合適的時機主動觸達用戶,而非服務器端定時的批量推送,帶來更精準的營銷,更好的用戶體驗。
端智能的優勢
從普遍的應用場景,可以看到端智能的明顯優勢,包括了
-
低延時
實時的計算節省了網絡請求的時間。對於高幀率要求的應用,比如美顏相機每秒都要請求服務器,高延遲絕對是用戶所不能接受的。而對於高頻交互場景,比如遊戲,低延時變得更爲重要。
-
低服務成本
本地的計算節省了服務器資源,現在的新手機發布都會強調手機芯片的
AI
計算能力,越來越強的終端性能讓更多的端上AI
應用成爲了可能。 -
保護隱私
數據隱私的話題在今天變得越來越重要。通過在端側進行模型的推理,用戶數據不需要上傳到服務器,保證了用戶隱私的安全。
端智能的侷限
同時,端智能也有一個最明顯的侷限,就是低算力,雖然端側的性能越來越強,但是和服務器相比還是相差甚遠。爲了在有限的資源裏做複雜的算法,就需要對硬件平臺進行適配,做指令級的優化,讓模型能夠在終端設備中跑起來,同時,需要對模型進行壓縮,在時間和空間上減少消耗。
現在已經有一些比較成熟的端側推理引擎了,這些框架、引擎都對終端設備做了優化來充分發揮設備的算力。比如Tensorflow Lite
、Pytorch mobile
、阿里的 MNN
、百度飛槳 PaddlePaddle
。
Web端呢
Web
端同樣擁有端側 AI
的優勢與侷限,作爲在 PC
上用戶訪問互聯網內容和服務的主要手段,在移動端很多APP
也會嵌入 Web
頁面,但是瀏覽器內存和存儲配額的有限,讓 Web
上運行 AI
應用看上去更不可能。
然而在 2015
年的時候就已經出現了一個 ConvNetJS
的庫,可以在瀏覽器裏用卷積神經網絡做分類、迴歸任務,雖然現在已經不維護了,2018
年的時候湧現了非常多的JS
的機器學習、深度學習框架。如 Tensorflow.js
、 Synaptic
、 Brain.js
、 Mind
、 Keras.js
、 WebDNN
等。
受限於瀏覽器算力,部分框架如 keras.js
、 WebDNN
框架只支持加載模型進行推理,而不能在瀏覽器中訓練。
此外,一些框架不適用於通用的深度學習任務,它們支持的網絡類型有所不同。比如 TensorFlow.js
、 Keras.js
和 WebDNN
支持了 DNN
、 CNN
和 RNN
。而 ConvNetJS
主要支持 CNN
任務,不支持 RNN
。Brain.js
和 synaptic
主要支持 RNN
任務,不支持 CNN
網絡中使用的卷積和池化操作。Mind
僅支持基本的 DNN
。
在選擇框架時需要看下是否支持具體需求。
Web端架構
Web
端是如何利用有限的算力的呢?
一個典型的 JavaScript
機器學習框架如圖所示,從底向上分別是驅動硬件,使用硬件的瀏覽器接口,各種機器學習框架、圖形處理庫,最後是我們的應用。
CPU vs GPU
在 Web
瀏覽器中運行機器學習模型的一個先決條件是通過 GPU
加速獲得足夠的計算能力。
在機器學習中,尤其是深度網絡模型,廣泛使用的操作是將大矩陣與向量相乘,再與另一個向量做加法。這種類型的典型操作涉及數千或數百萬個浮點操作,而是它們通常是可並行化的。
以一個簡單的向量相加爲例,將兩個向量相加可分爲許多較小的運算,即每個索引位置相加。這些較小的操作並不相互依賴。儘管 CPU
對每個單獨的加法所需的時間通常更少,隨着計算量規模的變大,併發會逐漸顯示出優勢。
WebGPU/WebGL vs WebAssembly
有了硬件之後,需要對硬件進行充分的利用。
-
WebGL
WebGL
是目前性能最高的GPU
利用方案,WebGL
爲在瀏覽器中加速2D
和3D
圖形渲染而設計,但可以用於神經網絡的並行計算來加速推理過程,實現速度數量級的提升。 -
WebGPU
隨着
Web
應用對可編程3D
圖形、圖像處理和GPU
訪問需求的持續增強,爲了在WEB
中引入GPU
加速科學計算性能,W3C
在2017
年提出了WebGPU
,作爲下一代WEB
圖形的的API
標準,具有更低的驅動開銷,更好的支持多線程、使用GPU
進行計算。 -
WebAssembly
當終端設備沒有
WebGL
支持或者性能較弱的時候,使用CPU
的通用計算方案爲WebAssembly
。WebAssembly
是一種新的編碼方式,可以在現代的網絡瀏覽器中運行,它是一種低級的類彙編語言,具有緊湊的二進制格式,可以接近原生的性能運行,併爲諸如C / C ++
等語言提供一個編譯目標,以便它們可以在Web
上運行。
Tensorflow.js
以 Tensorflow.js
爲例,爲了在不同的環境下實現運行,tensorflow
支持了不同的後端,根據設備條件自動選擇相應的後端 ,當然也支持手動更改。
tf.setBackend('cpu');
console.log(tf.getBackend());
對一些通用模型進行測試,WebGL
速度大於普通 CPU
後端計算的 100
倍,WebAssembly
則比普通的 JS CPU
後端快 10-30
倍。
同時, tensorflow
也提供了 tfjs-node
版本,通過 C++
和 CUDA
代碼編譯的本機編譯庫驅動 CPU
、 GPU
進行計算,訓練速度與 Python
版本的 Keras
相當。不需要切換常用語言,可以直接在 nodejs
服務上添加 AI
模塊,而不是再啓動一個 python
的服務。
模型壓縮
有了框架對於硬件設備的適配,還需要對模型進行壓縮,複雜的模型固然有更好的預測精度,但是高額的存儲空間、計算資源的消耗,過長的推理速度在大部分移動端場景中還是難以接受的。
模型的複雜度在於模型結構的複雜以及海量的參數。模型文件中通常存儲了兩部分信息:結構與參數,如下圖中簡化的神經網絡所示,每個方塊對應一個神經元,每個神經元以及神經元中的連線上都是參數。
模型的推理即從左側輸入,通過與神經元進行計算,再通過連線加上權重傳到下一層計算,到最終層得到預測輸出。節點越多、連接越多,則計算量越大。
模型剪枝
對訓練好的模型進行裁剪,是模型壓縮的一個常見方式,網絡模型中存在着大量冗餘的參數,大量神經元激活值趨近於 0
,通過對無效節點或者是不那麼重要的節點進行裁剪,可以減少模型的冗餘。
最簡單粗暴的剪枝即 DropOut
,在訓練過程中隨機對神經元進行丟棄。
大部分的剪枝方法會計算重要性因子,計算神經元節點對於最終的結果的重要性,剪去不那麼重要的節點。
模型剪枝的過程是迭代反覆進行的,並非剪枝後直接用來推理,通過剪枝後的訓練恢復模型的精度,模型的壓縮過程是在精度和壓縮比例之間的不斷權衡,在可接受的精度損失範圍內選擇最好的壓縮效果。
模型量化
爲了保證較高的精度,大部分的科學運算都是採用浮點型進行計算,常見的是 32
位浮點型和 64
位浮點型,即 float32
和 double64
。量化即是把高精度的數值轉化爲低精度。
如二值量化(1bit
量化)會直接將 Float32/float64
的值映射到 1bit
,存儲空間直接壓縮 32
倍/ 64
倍,計算時加載所需內存同樣也會變小,更小的模型尺寸,帶來更低的功耗以及更快的計算速度。除此還有8bit
量化、任意bit
量化。
知識蒸餾
知識蒸餾則是將深度網絡中所學到的知識轉移到另一個相對簡單的網絡中,先訓練一個 teacher
網絡,然後使用這個 teacher
網絡的輸出和數據的真實標籤去訓練 student
網絡。
工具
模型壓縮的實現較爲複雜,如果只是面向應用,大概瞭解其作用原理即可,可以直接用封裝好的工具。
比如 Tensorflow Model Optimization Toolkit
提供了量化功能,其官方對於一些通用模型進行了壓縮測試,如下表可以看到,對於 mobilenet
模型,模型大小由 10M+
壓縮到了 3、4M
,而模型的精度損失很小。
百度的飛槳提供的 PaddleSlim
則提供了上述三種壓縮方法。
總結
綜上,開發一個 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