主流深度學習框架匯總與對比

2020-07-16 10:05:18
想要學習深度學習,就要掌握一個有效的深度學習框架。那麼現在都有哪些主流的深度學習開源框架,它們各自的優/缺點又是什麼呢?

在工程實踐中,我們認為,要選擇一個得心應手的深度學習框架,主要從框架的流行程度和應用場景出發。
  • 對想要入門深度學習的使用者來說,選擇一個比較流行的框架意味著能從多種渠道中獲得更多的支援,譬如書籍、部落格、GitHub 專案等;
  • 對專門從事深度學習模型開發的使用者來說,選擇一個適合應用場景的框架,使用一門合適的開發語言,將會使模型開發達到事半功倍的效果。

下面介紹現在主流的深度學習開源框架,幫助讀者對這些框架有直觀的認識。

主流的深度學習開源框架

這是一個深度學習框架群雄逐鹿的年代,許多深度學習框架在湧現、合併,抑或凋零,其中包括 TensorFlow、Keras、CNTK、PyTorch、MXNet、Theano 等,它們的背後是 Google、Microsoft、Facebook、Amazon 等科技巨頭。

就目前的情況來看:
  • 在 Google 的號召下,TensorFlow 擁有眾多的開發者,在關注度和使用者數上都佔據絕對優勢。
  • Keras 作為“框架上的框架”,以其易用性吸引了不少支援者。
  • Facebook 的 PyTorch、Amazon 的 MXNet、Microsoft 的 CNTK 等各有一技之長,在目前深度學習的戰場上立有一席之地。
  • 而曾經的霸主 Theano,在沒有大公司的支援下,開始沒落。

對準備入門深度學習的人來說,深度學習框架在 GitHub上的活躍度可以作為一個重要的參考指標。在 GitHub 上,被 Star(收藏)和 Fork(分支)越多,意味著有越多的開發者選擇了這個深度學習框架。

我總結了在 GitHub上(到 2019-02-01 為止)各個主流深度學習框架的活躍度,以及它們對程式語言和系統的支援情況,如下表所示。

主流深度學習框架的活躍度
框架名稱 GitHub的活躍度 維護團隊 支援語言 支援系統 程式設計模式
Star (數量) Fork (數量) 貢獻者數量
TensorFlow 119730 71727 1817 Google Python、C++、 Java、 Go Linux、macOS、 Windows 、 Raspberry Pi 符號式程式設計
Keras 37850 14450 771 Google Python、 R Linux、macOS、 Windows 符號式程式設計
PyTorch 24331 5778 906 Facebook Python、C++ Linux、macOS、 Windows 指令式程式設計
MXNet 16255 5842 667 DMLC、 Amazon Python、C++、 Clojure、Julia、 Perl、R、Scala、 Java Linux、macOS、 Windows、Raspberry Pi、NVIDIA Jetson 符號式程式設計和指令式程式設計的混合程式設計
CNTK 15721 4213 191 Microsoft Python、C++、 C#/.NET、Java Linux、Windows 符號式程式設計
Theano 8667 2479 334 蒙特利爾 大學 Python Linux、macOS、Windows 符號式程式設計

從深度學習開源框架統計表中,我們可以看到:

1) TensorFlow 處於毫無疑問的霸主地位,其 Star 數和 Fork 數均超過了表中其他開源框架的 Star 數和 Fork 數的總和。

2) 在對語言的支援上,Python 為最受歡迎的語言,所有框架均支援 Python 或者 Python 優先。Python 的優雅、簡潔,使得其具有較低的使用門檻和極高的程式設計效率,能夠更快地嘗試不同的引數組合以及更複雜的模型。

C++ 排名第二,除 Theano 和 Keras 外,其他深度學習框架底層都是由 C/C++ 語言編寫的,保證了模型訓練的速度和效率。

其他語言支援的框架各有不同,譬如 TensorFlow 支援Go語言、MXNet 支援 Scala 語言、CNTK 支援 C# 語言等。

3) 在支援的系統上,所有框架基本都支援 Linux、macOS 和 Windows 這3個主流系統(除 CNTK 缺少對 macOS 的原生支援外),TensorFlow 和 MXNet 還支援 Raspberry Pi(樹莓派),MXNet 還支援 NVIDIA Jetson。

4) 在程式設計模式上,Theano、TensorFlow、CNTK、Keras 為符號式程式設計;PyTorch 為指令式程式設計;MXNet 比較特殊,支援符號式程式設計和指令式程式設計的混合程式設計。

【答疑解惑】程式設計模式與計算圖

程式設計模式通常分為指令式程式設計(imperative style programs)和符號式程式設計(symbolic style programs)。

符號式程式設計

符號式程式設計將計算過程抽象為計算圖。使用計算圖可以方便地描述計算過程,所有輸入節點、運算節點、輸出節點均被符號化處理。計算圖通過建立輸入節點到輸出節點的傳遞閉包,從輸入節點出發,沿著傳遞閉包完成數值計算和資料流動,直到輸出節點。

這個過程經過計算圖優化,以資料流方式完成,節省了記憶體空間,計算速度快,但不適合程式偵錯。

因為符號式程式設計中的計算圖先定義後執行(define and run),也被稱為靜態計算圖。

指令式程式設計

指令式程式設計就是輸入什麼便執行什麼,在執行語句時馬上進行計算,對語句基本沒有優化,按原有邏輯執行,容易理解和偵錯。指令式程式設計在執行過程中定義(define by run)的計算圖,是動態計算圖。