跳到主要內容區塊

ntuccepaper2019

專題報導

以JavaScript將Model帶離Python與HPC環境 - Tensorflow.js
  • 卷期:v0050
  • 出版日期:2019-09-20

作者:林子南/臺灣大學計算機及資訊網路中心作業管理組幹事


以Machine Learning或Deep Learning作為特色的服務,將會面臨伺服器難以負荷與使用者個資問題,如果想要以AI作為服務特色,那麼就需要考慮如何將Model帶離High Performance Computing(HPC)環境,並進一步帶到使用者端。

 

為了將Model帶到使用者端提供服務,本文將會介紹以JavaScript實踐Edge Computing的Tensorflow框架-Tensorflow.js,透過介紹Tensorflow.js特性讓讀者能更好了解自己的開發需求。

 

介紹

以Machine Learning或Deep Learning作為服務特色時,將會面臨運算資源與經費的問題。在伺服器上應用Model來提供服務時需要考慮使用人數與頻率,當使用人數與頻率提升時,首先會面臨運算資源不足的問題,假設以台大師生(35,840)為客群提供Alex-Net[1]224*224的RGB影像辨識服務,台大師生20%作為最小同時在線人數(7,168)來看,至少記憶體需要分別提供給kernels約232.5235 MB(60,954,656 parameters)和運算過程中間產出值約420.1048 MB,其中運算過程中間產出值乘上最小同時在線人數來看,將會需要至少2.8718 TB,以伺服器用16GB DDR4記憶體單價2,999元來看最少要383,872元,更不用說其他對應的伺服器、CPU/GPU、人事費用、降地服務延遲的措施等成本,考慮到以上的代價,將服務推向Edge Computing才是適合的方法。

 

Tensorflow適合Edge Computing的有兩套框架且能在不新增硬體開銷的情況下提供服務:(1)以JavaScript面向瀏覽器與伺服器的Tensorflow.js[2]、(2)以Java、Swift、Objective-C、C++、Python面向Mobile和IoT的Tensorflow Lite[3],由於本次電子報的主題是Script相關,在本文將只會提到Tensorflow.js的內容。

 

特性

Tensorflow.js可以運行在瀏覽器或伺服器上,因為運行的設備上不一定會有獨立或是高運算能力的GPU,為了能夠以JavaScript運行,Tensorflow.js降低了對CUDA、cuDNN、Intel MKL-DNN等Deep Learning Toolkit的仰賴程度,並提供了3種對運算資源仰賴程度不一的Backend來運行Tensorflow.js[4],以下將介紹Tensorflow.js特性與各個Backend。

 

1. Tensorflow.js特性

在介紹Backends之前需要先介紹Tensorflow.js的特性(表格 1),有別於Tensorflow需要建立Graph和Session才能執行運算,Tensorflow.js採用了同步與非同步運算(不是平行運算!!)。以Tensorflow.js建立與運算Tensor為例,像是tf.matMul(a, b)執行完的時候就會回傳運算Tensor,但是實際上在呼叫完API時運算結果可能還沒算完,僅僅只是回傳一個Tensor,等到運算完成後這個Tensor才會有運算結果;而建立Tensor則是採用了兩種方法,可以透過arraySync()呼叫完就回傳值,也可以透過JavaScript的Promise.prototype.then()以非同步運算建立。

 

表格 1, Tensorflow和Tensorflow.js基礎概念特性比較

 

Tensorflow

Tensorflow.js

Tensor

只在Session開始後才有值。

有兩種方式建立Tensor:

同步運算、非同步運算。

Operations

必須先建立Graph並開始Session後才能進行運算。

使用API的當下就會進行運算,但不一定會在API呼叫完後回傳運算結果。

Graph

Operations透過傳遞Tensor建立Graph。

X

Session

在Session執行期間會將Graph的內容交由GPU(或CPU)運算。

X

Memory

X

(沒有API直接對記憶體操作,只能透過設定Session的GPUOptions影響記憶體的增長或Python Garbage collection來釋放記憶體)

使用API能夠釋放Tensor的記憶體。

(Tensorflow.js 特有的API tf.dispose()能釋放Tensor的記憶體)


2. Backends

接下來介紹Backends,其中最適合Browser的Backend是WebGL,能夠達到一邊使用網頁一邊執行Tensorflow.js Application:

2.1 WebGL Backend
這個Backend的Tensorflow.js,除了比CPU快百倍之外,透過非同步運算還能夠在不影響UI Thread(Avoid blocking the UI thread),也就是說可以一邊執行Tensorflow.js一邊使用網頁,並且能夠將資料載入GPU,提升之後的運算速度(Shader compilation & texture uploads)。

2.2 Node.js TensorFlow Backend
在Server上能夠呼叫Tensorflow C API來進行硬體加速,比WebGL Backend在浮點數上更精確(32 bit floating point),但因為不像WebGL Backend能夠非同步運算,因此呼叫API會導致UI Thread停止(根據官網的建議是建立Worker Thread專門處裡Tensorflow.js的API)。

2.3 CPU Backend
最容易取得的硬體資源,但運算效能遠低於前兩項。

 

表格 2, Backends[4]

 

優點

缺點

WebGL Backend

  1. Avoid blocking the UI thread
  2. Memory management
  3. Shader compilation & texture uploads
  1. 無法使用硬體加速。
  2. Precision不夠精確(16 bit floating point)

Node.js TensorFlow Backend

Hardware acceleration

UI Thread會因為API導致停止。

CPU Backend

所有平台都可以使用,易於測試。

運算最慢,且會導致UI Thread停止。

 

Model

雖然以上介紹了Tensorflow.js的眾多特性,只看特性還是無法讓人接受,並將訓練好的Machine Learning或Deep Learning Model為此改用JavaScript重寫,上述的優勢不足以抵銷重寫導致曠日廢時的成本。這一方面Tensorflow.js也做到了能夠Import Pre-trained Keras or Graphdef Models,並且目前已經有9種Pre-trained TensorFlow.js Models可供非商業用途使用[5]:

1.MobileNet

2.PoseNet

3.Coco SSD

4.BodyPix

5.DeepLab v3

6.Speech Commands

7.Universal Sentence Encoder

8.Text Toxicity

9.KNN Classifier

 

對於已經訓練好Model可以透過以下方式載入並使用,除了可以省卻重寫的成本之外,也能夠透過分工合作來達到快速開發,目前能夠載入的Model只有以下兩類:

 

1. Keras Model[6]

Python模組tensorflowjs將Keras Model轉換成TF.js Layers format,或是用指令tensorflowjs_converter轉換成TF.js Layers format,再由Tensorflow.js載入就可以使用了,詳細指令與載入方式由於不是本文介紹重點,請參考官網

 

2. Graphdef Model[7]

物件是指基於Protocol Buffers格式的Graph物件[8],而Tensorflow透過將Graph轉換成Graphdef寫入檔案來儲存Model,儲存的方式共有四類:TensorFlow SavedModel、Frozen Model、Session Bundle、Tensorflow Hub module,其中Frozen Model、Session Bundle已經被TensorFlow SavedModel取代。TensorFlow SavedModel跟Tensorflow Hub module產生的Model只能透過指令tensorflowjs_converter轉換成TF.js Layers format,詳細指令與載入方式由於不是本文介紹重點,請參考官網

 

結論

想要提供以Machine Learning或Deep Learning為特色的服務,可以考慮先在High Performance Computing(HPC)環境上訓練Model,之後透過將Model帶到Browser上,由使用者端的Browser來運行,一方面可以確保使用者的個資不會傳到伺服器上,免於個資問題,另一方面也可以降低對伺服器的需求,以有限的資源達成AI服務,落實AI普及化。如果打算將Model帶到使用者端的Browser,將會面臨兩項嚴重影響服務的問題:(1)惡意使用者將Model挪作他用與(2)使用者記憶體不足,如何處裡這兩項問題將會考驗開發者的技術與思想。