「大數據就像青少年討論性一樣,每個人都討論它,卻沒有人真正知道如何做它。」(Big data is like teenage sex: everyone talks about it, nobody really knows how to do it, ...)
這是美國杜克大學經濟系教授,Dan Ariely,在自己的
社交平台上發表對大數據的評論。同樣的,這句評論,也可應用在自 2014 年,火熱至今的深度學習。從學術界到業界,從課堂到職場,每一個人都在討論深度學習,彷彿他們真的懂得那是什麼,但沒有人能夠宣稱真正了解深度學習,直到他們親自動手實踐了深度學習的專案。
fast.ai 的創辦人同時也是加州舊金山大學的助理教授 Rachel Thomas
在 KDNuggets 預測 2018 年的趨勢中,表達對 Facebook 支援開發的深度學習架構開源專案 --PyTorch 在 2017 年加入深度學習軟體架構的戰局後,所帶來在深度學習架構軟體設計趨勢上的改變,抱持著樂觀的看法。她是這麼說著:
“... 2017 年的人工智慧趨勢中,我最期待莫過於深度學習架構往更加使用者友善和更易編碼的方向大幅改變。多虧了動態計算圖和物件導向設計,使得 PyTorch 在 2017 甫推出後,即獲得許多 Python 使用者的喜愛。甚至連 TensorFlow 藉由納入廣受社群歡迎的深度學習高階函式 -- Keras 於其核心程式庫,以及發表動態執行 eager 介面,也朝著使用者友善的程式介面前進。建構深度學習程式的藩籬對多數程式寫作者將逐漸地降低...
... the 2017 AI trend I’m most excited about is that deep learning frameworks are getting dramatically more user-friendly and accessible. PyTorch (released this year) is friendly to anyone who knows Python (largely due to dynamic computation and OOP design). Even TensorFlow is moving in that direction, by adopting Keras into its core codebase and announcing eager (dynamic) execution. The barriers for coders to use deep learning are getting lower all the time ...
的確,在 2010 年由同為深度學習的先驅研究者 Yoshua Bengio 發表了以 python 為主的深度學習函式庫,Theano(目前
已宣布停止更新,見參考資料[1]),利用符號式的計算圖資料結構,來建置類神經網路。符號式的計算圖結構,可以將數學表現式與真正的資料內容分離,而使原始碼更為近似於紙筆的理論推導,令類神經網路的理論建構者,能更輕鬆的編寫直覺式的程式碼,也增加了原始碼的易讀性。除此之外,需要耗費許多運算能力的梯度運算,藉由封裝成計算圖中運算元裡的屬性,在執行計算圖時,根據運算元的特性,在執行期間分散到不同的設備上,如 GPU,平行執行,更加快了類神經網路的訓練速度。
至今,許多大型科技公司,紛紛投入深度學習架構的開源計畫,分別在程式架構,結合雲端,和高效能的運算能力上互別苗頭。現今,至 2018 年初,已有幾個較為深度學習社群所熟知的開源專案發表,而這些專案與其支援的科技公司之間的關係可見下圖。
在上圖中,我們可以將圖中的圓形視為深度學習架構的戰場,而各佔據四方的則是:由 Google 支援,在 2015 年發表的深度學習架構專案 Tensorflow。由 Microsoft 支援,原以 CNLTK 為人知曉,現在則被正式命名為 Cognitive Toolkit 的深度學習架構。以及 2017 年由 Facebook 支援的 PyTorch 與 Caffe2。最後,則是 Amazon 將著名的開源計畫搖籃,Apache 基金會,發展出的深度學習架構,MXNet,整合入自家公司的雲端服務中。
一般而言,深度學習架構的使用者可以粗略分為兩類:一種是運用深度學習架構來進行概念驗證(Proof of Concept),因而需要快速實驗且評估不同的模型。另一種則是希望將深度學習導入商業應用,將深度學習模型配置成應用程式(app),成為對一般民眾開放的服務平台。
然而,基於不同的使用需求,究竟該依何標準從不同的深度學習架構中選擇呢?
以研究為取向的使用者,對於深度學習架構的需求,最重要的考量即是快速上手,且容易除錯。透過可動態執行的直譯式語言,在嘗試或開發早期時,便可及早發現模型裡的臭蟲,避免浪費大量時間訓練一個錯誤的模型。因此,現行深度學習架構的一個共同處,即是支持一或多種直譯式語言的呼叫介面。其中,鑑於 Python 是目前最熱門的一個程式語言,在目前許多比較深度學習架構的部落格文章中,無論是由第三方公司所評比,或是部落客個人的努力,多將深度學習架構中是否包含 Python 的客戶端呼叫介面(Client Interface),視為一個加分條件。
Tensorflow 的計算圖在 Tensorboard 上顯示(圖片來源:參考資料 [5])
在這樣的考量,似乎在架構設計上,以動態計算圖(dynamic graph)為主要網路資料結構的 PyTorch 為最佳考量。
Facebook 的 PyTorch 誠如其名,將原本較少人知以 Lua 為程式介面的深度學習程式庫 Torch 重新以 Python 包裝而成。和 Theano 一樣都是深度學習的先驅函式庫,Torch 在具有優化 Lua 語法的執行期即時編譯器(JIT )的專屬虛擬機器上執行,在建模時,並不需要如 Theano 另外產生與 Python 直譯器相容的 C 原始碼,亦沒有符號編程的需求。然而因為官方的 Lua 語言並不支持 Windows 作業系統,因此一直鮮為人知,而使 Torch 較 Theano 更為少人使用。
PyTorch 的潛在使用者也包括了長久使用 Python 作為資料處理的主要語言的工程師們,專注於與 Python 語言的緊密結合,期待以更無痛的學習方式,快速地以已經熟悉的函式庫,如 numpy,Cython,pandas 等建立深度學習模型。
較 PyTorch 早兩年發表的 TensorFlow,在架構上則是沿用以靜態的符號計算圖為主的 Theano,後端的執行引擎是由 C 寫成,在執行引擎上層則有多個直譯式語言作為前端介面,如 Python 和 Java 等。更有與執行引擎緊密結合,且執行速度普遍較直譯式語言快速的C++ 所寫成運算元函式庫。
這些 C++ 函式庫,程式邏輯已成熟,原始碼變動不大,透過多語言介面程式產生器(SWIG)「註一」產生呼叫函式庫的程式碼。然而,因為這樣的呼叫方式,仍是透過直譯器執行,為了維持效能,Tensorflow 另外使用
Protocol Buffers 「註二」序列化執行參數與指令,直接交予後端的執行引擎執行。
Tensorflow 的架構(圖片來源:參考資料 [5])
在多數評比文章中可發現,函式庫的建模的能力(Model Capability)也是多數使用者關注的重點。在建模能力上,主要是比較函式庫在編寫經常使用的深度學習模型的容易度,以及建模的程式架構是否有恰當的模組化。雖然 Tensorflow 一直在許多深度學習開發者中受到歡迎,但缺乏適當的模組化或物件導向語言的封裝,使用者需要重複編寫許多相同的程式碼。相對地,能夠動態計算圖編程,和即時除錯的 PyTorch 很快地就從深度學習的研究者和使用者間流行起來。
於是,在 PyTorch 的歡迎度升高後,Tensorflow 也開始改變策略,重新利用 python 程式語言動態執行的長處,發展了 eager 執行模式,而使除錯更為容易 並併入了在深度學習社群中非常受歡迎的 Keras 作為高階的介面函式庫(API)。
Keras 是一個深度學習的介面函式庫(API),而非深度學習架構。在早期,Keras 只有專注於開發建構在 Theano 上的高階 API 為主。以物件導向的方式,將建模的程式碼封裝成 layer,而利用堆疊一層一層的 Layer 物件來建立類神經模型,或又稱為 Layer-wise 為主的方式來建模。在 Tensorflow 發表後,人氣相當高的 Keras 便進而採用 Tensorflow 作為執行後端(backend),但在不同的深度學習的架構逐漸蓬勃發展後,又併入 Microsoft 的 CNLK,而成為一個通用化的深度學習介面。
Keras 作為一個深度學習架構的最上層,就如 Thomas 所言,將後端的原始碼封裝,使用者在建構類神經網路模型時,只需簡短的幾行程式碼便可完成,因此達到建模的簡易性。然而以 Layer-wise 為主的的建模方式通常缺乏彈性,在較為複雜的類神經網路,仍需要親自撰寫後端的原始碼,或甚至打破 Layer 的架構,重新編寫計算圖中的運算元。不過 Keras 所提供的便利性,對於許多深度學習入門者而言是非常寶貴的踏腳石,那些複雜的網路架構,如
MAC network (Hudson and Manning, ICLR 2018),或
Capsule Network 就留給那些天才般的腦袋吧!
2017 年 Data Incubator 所做的 Deep Learning Libraries Ranking (圖片來源:延伸閱讀 [6])
和 PyTorch 都在去年發表的,還有 Amazon 和 Microsoft 共同合作的開源專案,以 python 為主的 Gluon API。Amazon 的雲端服務使用的深度學習架構 MXNet 和 Microsoft 的 Cognitive Toolkit 都會使用 Gluon API 介面,不過目前還是以支援 MXNet 為主。
MXNet,由著名的開源專案搖籃 Apache 基金會所培育,亦是由多個開源專案演化而來,在 2015 年正式發表。除了 Gluon API 外,MXNet 更提供高度優化的 R 介面。如同 PyTorch 所標榜的,Gluon 也是使用所謂的動態計算圖,使用者無需再建模的時候,就先把計算圖建立好,反而透過如同錄影的方式,一步一步的執行,讓使用者在對梯度除錯時更加的容易。但同時,Gluon 也容許使用者,建立抽象式的符號計算圖,藉著事先優化已編譯好的深度網路架構,在執行速度上比動態計算圖更為快速。
Amazon 雲端服務支持的深度學習函式庫(圖片來源: AWS)
然而,對於希望能將深度學習模型配置成雲端服務,就必須要考慮深度學習架構的 API 穩定性,對於實驗性較高,或還在發展階段的 PyTorch,因為具有升級時,無法支援舊版 API,而造成舊有模型無法配置,服務中斷的危機。(見延伸閱讀 [1])
在現行的深度學習架構的建置中,除了希望在使用者的親和度上贏得更多初階使用者們的芳心,並藉由計算圖資料結構,而使該架構能更為普及,另外還有一些特點,能讓深度學習架構成為一條龍的服務 -- 那就是模型配置成服務(Model Deployment)以及相依生態軟體(Ecosystem)。
Tensorflow 作為將深度學習架構視為一條龍服務的方向上,顯然是相當卓越。因為 Tensorflow,早在初期便展現了相當的野心,從訓練資料的視覺化(Tensorboard),模型配置成服務(Tensorflow serving),並和 Hadoop,以及自家的雲端服務做結合。
反觀,起步較晚的 PyTorch,則是以介面的親和力來凝聚該軟體使用者社群,在相依生態軟體上,和 Tensorflow 比起就稍微遜色不少。為了能更讓起步較晚的 PyTorch Caffe 能夠在深度學習應用上能站穩它的寸方之地,PyTorch 採納 Caffe2 作為該函式庫的一部分。Caffe2 是由 Berkeley 大學的視覺與學習中心所開發的軟體,Caffe 的後繼者,多用於電腦視覺,主要語言是用 C++ 寫成,同樣有給廣大 python 愛好者使用的友善 API。在訓練資料的視覺化,則需要第三方軟體所開發的套件。而在配置模型為服務上,則是使用如 Flask,建置通用目的的網路服務架構相輔相成。
至於 MXNet,在呈現計算圖上,則有和 Tensorflow 一別苗頭的 MXBoard,而配置上也擁有自己的 Server,並且與 Amazon 的雲端服務結合。
延伸閱讀 [1] 所提出的一個衡量深度學習架構效率的流程(圖片來源:延伸閱讀 [1])
未來深度學習架構發展的趨勢,目前有兩個重要的走向備受到關注:
之一,是計算能力的提升。即使有良好的軟體設計框架來設計日漸複雜的類神經網路模型,缺乏強大的硬體計算能力,過於複雜的網路模型,只是精工雕琢,具有複雜紋路的美麗雕刻,卻不具有任何實際效用。 GPU 加入高效能運算的硬體計算行列,成為深度學習研究的加速器。然而雖然加快了執行速度(performance),但也提高了維持高效能計算在異質化系統執行的難處,於是乎,除了在硬體上力求革命性的突破,一個針對異質化設備做運算最佳化的編譯器,更顯重要。
之二,則是模型在不同架構間的交換檔案格式。鑑於,深度學習的相關函式庫與架構日漸蓬勃發展,顯然地,一個受各方認可的檔案交換格式制定,將會有利於以建構的深度類神經網路模型在不同的架構中使用,有利於重製模型成果以及比較各個架構的速度和實踐細節。
在同一系列的下篇中,將會先詳細介紹在本篇中不斷神秘出現的計算圖,也會對這兩點做更深入的說明,請各位敬請期待。
註釋:
- SWIG 一個如 Cython 之於 Python,作為原生程式碼(C/C++)程式碼產生器和編譯器,只不過 SWIG 可產生多個不同直譯式語言的介面。
- Protocol Buffers 屬於許許多多序列化二元檔案格式中的滄海一粟,封裝類別物件,並搭配 Google 發展的 gRPC 服用。
參考資料:
- Theano 由 University of Toronto MILA 實驗室開發,深度學習以及抽象化編程的先驅函式庫之一。
- Battle of the Deep Learning frameworks — Part I: 2017, even more frameworks and interfaces(英,發表於 2017.12)
- Introducing Gluon: a new library for machine learning from AWS and Microsoft(英,發表於 2017.10)
- PyTorch vs TensorFlow — spotting the difference(英,發表於 2017.6)
- Tensorflow 官網
- pytorch tutorial on github
延伸閱讀:
- A Way to Benchmark Your Deep Learning Framework On-premise(英,發表於 2018.7, MXNet 的官方部落格):該文以 DevOps 的角度和需要經常更新深度學習模型,而不造成服務的中斷為主要選取深度學習的架構的考量。基於此一考量,API 和 code base 的穩定,也在考慮之中,因而該文作者較為偏好 MXNet 和 Gluon 的組合。同時在該文章中,也對如何對不同的深度學習架構做 benchmarking,提出了架構和流程的解說。
- The Battle Between Deep Learning Frameworks(英,發表於 2018.4):該文對現行的深度學習架構作兩兩比較。包括的比較對數有 Tensorflow vs PyTorch,Tensorflow vs Theano,Tensorflow vs Keras,Keras vs TFLearn。該文在每一對的比較之後,都會有簡短的核對清單,主要是提供架構選擇者來依據需求決定該使用何種函式庫。
- Deep Learning Frameworks (英)Nvidia 在開發者專欄中所做的深度學習架構介紹並不包括評比,包括了 Caffe2(Berkeley Vision and Learning Center, 同時也併入 PyTorch)/ Nvidia Caffe,Cognitive Toolkit (CNTK, Microsoft),MATLAB,MXNet(Apache,用於 AWS),Tensorflow(Google)以及 PyTorch (Facebook)。另外還有較少為人知的 Chainer (Python) 以及 PaddlePaddle
- TensorFlow, MXNet, Caffe, H2O - Which Machine Learning Tool Is Best? (英,發表於 2017.8)主要評比機械學習架構包括了 Tensorflow, Caffe, MXNet, H2O,文章的末段主要討論如何使用一或多個機械學習架構,和 data pipeline 結合。
- The Anatomy of Deep Learning Frameworks / An Overview of Python Deep Learning Frameworks:KDNuggets 在 2017 刊登兩篇關於深度學習架構的文章。其中一篇是以 python 為主的架構。
- Building simple artificial neural networks with TensorFlow, Keras, PyTorch and MXNet/Gluon(英,2018.5):文中先以 Data Incubator 在 2017 年使用 google search,github watch stars,stackoverflow tagging counts 所做的深度學習函式庫的排名。再使用 MNIST 手寫影像識別 dataset 作為訓練資料,分別用Tensorflow,Keras(仍舊是 Tensorflow 做後端), PyTorch 和 MXNet 建立簡單的 CNN 模型。
- Comparison of Frameworks(英):對約 16 個深度學習函式庫,給予正面和反面的評價。
- Deep Learning Frameworks Hands-on Review(英,2017.12):和延伸閱讀 [6] 的一樣,使用 MNIST 手寫影像識別的 dataset 作為訓練資料,但在較多的深度學習函式庫上比較。