作者 | 缺月
隨著深度學習的發展,智能化已經開始賦能各行各業,前端作為互聯網中離用戶最近的一環,也希望藉助 AI 的能力大幅提高效率,減少人力成本,給用戶創建更好的體驗。因此,前端智能化也被看作是前端的未來的重要發展方向。
然而,在這條道路上,有幾個問題一直阻礙著智能化的發展:1. 熟悉機器學習的算法工程師對前端的業務沒有體感,對前端所積累的數據和這些數據可能產生的價值也並不瞭解,很難參與到這個過程中來。2. 傳統的前端工程師對機器學習常用的語言,諸如 python, c++ 等並不瞭解,學習和轉換的成本很高。3. 傳統的前端工程師對深度學習本身的算法和原理不瞭解,導致很難直接使用一些現有的機器學習框架 (tensorflow, pytorch 等)來進行訓練。
為了解決這些問題,推動前端智能化發展,我們開發了 pipcook。pipcook 使用對前端友好的 JS 環境,基於 Tensorflow.js 框架作為底層算法能力並且針對前端業務場景包裝了相應算法,從而讓前端工程師可以快速簡單的運用起機器學習的能力。
此篇文章將主要討論 pipcook 是如何和 Tensorflow.js 結合的,重點探討一下如何利用 tfjs-node 的底層模型和計算能力搭建一個高階機器學習流水線。
為什麼採用 TensorFlow.js 作為底層算法框架
Tensorflow.js 是 google 在 2018 年發佈的基於 js 的機器學習框架,google 也開源了相關代碼。pipcook 在數據處理和模型訓練中使用 tfjs-node 作為底層依賴的框架,在 Tensorflow.js 之上開發 pipcook 插件並組裝成流水線。我們使用 Tensorflow.js 主要有以下幾個原因:
- pipcook 定位於服務前端工程師,所以主要採用 JS 語言開發,所以我們更傾向於採用 JS 的運算框架,避免橋接其他語言等方式帶來的性能損失和出錯風險
- 相對於一些其他的 JS 的機器學習框架,Tensorflow 本身在 C++ 和 Python 上非常流行,js 版本也複用了 C++ 的底層能力和很多算子, 支持大量的網絡層,激活函數,優化器和其他組件,並且具有良好的性能並提供 GPU 支持。
- 官方提供了 tfjs-converter 等工具,可以將 SavedModel 或者 Keras 等模型轉化為 JS 模型,從而可以複用很多 Python 成熟的模型
- JS 在對數學運算這一方面的生態並不成熟,沒有一個如同 numpy 這樣的科學計算庫,一些類似的庫也很難和其他的運算框架無縫結合。而 tfjs 本身提供了 tensor 的封裝,相當於 numpy arary 的能力,並且可以直接傳入到 tfjs 模型中進行訓練,同時性能非常高效
- tfjs 提供了 Dataset API, 可以對數據進行抽象,為數據封裝了簡單高效的接口,同時可以進行批數據處理。Dataset API 的數據流的方式也可以和 pipcook 管道的方式高效結合。
使用 TensorFlow.js 處理數據
對於機器學習,訪問和處理大量數據是一個關鍵問題。對於一些傳統數據量不大的場景,我們可以把數據一次性讀入內存進行操作,但是對於深度學習來說,很多時候數據遠遠超出了內存大小,因此,我們需要按需從數據源逐段訪問數據的能力。而 tfjs 提供的 Dataset API 對這種場景的處理進行了包裝。
在一個標準的 pipcook pipeline 中,我們會使用 Dataset API 對數據進行包裝和處理。如圖所示是一個典型的數據流通的過程。
- 一開始,原始的訓練數據會通過 data collect 插件進入到管道中,這種原始數據可能是一些本地文件或者存儲在雲上的數據,插件會把這些數據讀進管道
- data collect 插件在讀入這些數據之後,會對數據的格式進行判斷,並且封裝成相應的 tensor
- data access 插件負責對這些數據進行接入,將 tensor 包裝成 tf.Dataset,方便後面進行批量數據處理和訓練
- 在 data process 插件中,我們將會對數據做具體的某種處理,包括 shuffle, augment 等操作,這些操作會用到 Dataset 封裝的一些諸如 map 等操作符,從而在數據流中實時的進行批量處理
- 隨後,在 model load 中,數據會以 batch 的形式讀入模型進行訓練
至此,我們可以將數據集想象為一組訓練數據的可迭代集合,如同 Node.js 中的 Stream。每當從數據集中請求下一個元素時,內部實現都會根據需要進行訪問,並且執行預先設置好的數據處理操作函數。這種抽象使得模型可以輕鬆訓練大量的數據。當我們有多個數據集時,Dataset 還便於將數據集共享和組織為同一組抽象。
訓練模型
TensorFlow.js 分成低階與高階兩組 API。低階的 API 是由 deeplearn.js 衍生,包含搭建模型所需要的 operator (OP), 負責處理一些低階如線性代數的數據運算等等,來協助我們處理機器學習中的數學運算部分。而高階的 Layers API 則是用來包裝一些常用的機器學習的算法,同時允許我們載入訓練好的模型,像是由 Keras 學習的模型等等。
pipcook 通過插件的方式開發和運行模型,每個 model load 插件會負責加載某一具體的模型,大部分模型基於 tfjs 實現。同時 tfjs-node 還提供了 gpu 加速等功能,可以提高模型訓練的速度。當然,現階段由於生態等原因,對於一些特定的模型在 tfjs 裡面實現的成本比較高,對於這一部分問題,pipcook 同時還提供了 python 橋接等方式,可以直接在 js 的運行環境裡調用 python 進行訓練,對於這一部分橋接的細節,我們將會在後續的篇章裡詳細介紹。
部署
對於一條工業級的機器學習流水線,在訓練模型完成之後,還需要有一種方式部署您的模型,從而讓模型可以為真實的業務服務,目前 pipcook 部署的方案主要有以下幾種,這些方案都是通過 model deploy 插件完成的:
- 快速驗證方案:很多時候您可能想要對您的數據和模型進行快速的實驗,例如使用小批量的數據和數量較少的 epoch,對於這種場景,我們不需要將模型部署到遠程再進行驗證。對此,pipcook 內置了本地部署的插件,在機器上訓練完成之後,pipcook 將會在本地啟動一個預測服務器,進行預測服務
- 服務器 docker 鏡像:pipcook 提供了官方鏡像,此官方鏡像包含了 pipcook 訓練和預測的必要環境, 您可以直接將此鏡像部署到您的部署主機上,也可以使用 k8s 等集群解決方案管理 docker 鏡像
- 雲服務打通:pipcook 將會在後續開發中逐漸打通各雲服務廠商的機器學習部署服務,現階段實際上 Gcloud 已經提供了 tfjs 和 automl 的結合,後續 pipcook 將會逐漸支持阿里雲, AWS 等服務
和TFX(TensorFlow Extended)的對比
我們最終的目標是一個成熟的工業級的機器學習 pipeline,這個 pipeline 可以將出色的模型運用於生產環境,實際上為了解決這種需求,google 官方基於長期的實踐發佈了 TFX,並且開源了此項目。那麼外界可能會有一些疑問,我們所做的事情和 TFX 的區別是什麼,實際上,pipcook 的核心並不是取代任何其他的框架,尤其是基於 python 生態的產品,因為 pipcook 的使命是推動前端的智能化發展,因此,pipcook 所採用的技術棧以及產品化方式都是面向前端的,像是:
- TFX 採用的是 DAG 的方式,因為其涉及到數據生成,對數據進行統計分析,對數據進行驗證,轉化數據等多種操作,而這些操作可以自由組合,實際上,對於很多前端域的場景,我們並不需要很多複雜的組合操作,因此,pipcook 採用了 pipeline 的方式,對於數據的操作抽象為簡單的管道中的插件,可以減少前端工程師的使用成本
- TFX 採用 Apache Airfow 等進行調度,而 pipcook 採用的是前端技術棧進行這類操作,例如,我們使用 Rxjs 等響應式框架對不同的 plugin 進行響應和串聯,方便前端理解和貢獻代碼
- 同時,我們設計的 API 也是基於 JS 習慣的,對前端來說學習和上手的成本較低
基於以上這些設計,我們儘量嘗試去構建一個對前端友好的機器學習環境,從而達到我們的預期和目標。
未來展望
pipcook 自開源以來已經有一段的時間,期間,也收到了一些用戶的反饋,同時,根據我們的規劃,我們還有很多需要做的事情,我們也期望可以藉助開源社區的力量,不斷完善 pipcook,使其可以真正助力前端智能化。
- 與各雲服務廠商 (阿里雲,AWS, Gcloud 等)合作,打通 pipcook 到各個雲服務機器學習部署鏈路
- 生態完善,建立起 pipcook 的試玩廣場等從而降低用戶的上手成本
- 更好的支持分佈式訓練
- 插件豐富,模型完善,支持更多的 pipeline
未來我們希望通過阿里內部前端智能化小組和整個開源社區的力量結合在一起,不斷完善 pipcook 和 pipcook 背後所代表的前端智能化戰役,讓前端智能化技術方案普惠化,沉澱更具競爭力的樣本和模型,提供準確度更高、可用度更高的代碼智能生成服務;切實提高前端研發效率,減少簡單的重複性工作,不加班少加班,一起專注更有挑戰性的工作內容!
如何貢獻?
如果您對我們的項目有興趣並且想要為前端智能化貢獻一份力量,歡迎您前往我們的 github 開源倉庫
關注「Alibaba F2E」
把握阿里巴巴前端新動向