1. 程式人生 > >如此多的深度學習框架 為什麼我選擇PyTorch

如此多的深度學習框架 為什麼我選擇PyTorch

               

小編說:目前研究人員正在使用的深度學習框架不盡相同,本文介紹了6種常見的深度學習框架,PyTorch與他們相比又有哪些優勢呢?本文選自《深度學習框架PyTorch:入門與實踐》

1 PyTorch的誕生

2017年1月,Facebook人工智慧研究院(FAIR)團隊在GitHub上開源了PyTorch,並迅速佔領GitHub熱度榜榜首。

作為一個2017年才釋出,具有先進設計理念的框架,PyTorch的歷史可追溯到2002年就誕生於紐約大學的Torch。Torch使用了一種不是很大眾的語言Lua作為介面。Lua簡潔高效,但由於其過於小眾,用的人不是很多,以至於很多人聽說要掌握Torch必須新學一門語言就望而卻步(其實Lua是一門比Python還簡單的語言)。

考慮到Python在計算科學領域的領先地位,以及其生態完整性和介面易用性,幾乎任何框架都不可避免地要提供Python介面。終於,在2017年,Torch的幕後團隊推出了PyTorch。PyTorch不是簡單地封裝Lua Torch提供Python介面,而是對Tensor之上的所有模組進行了重構,並新增了最先進的自動求導系統,成為當下最流行的動態圖框架。

PyTorch一經推出就立刻引起了廣泛關注,並迅速在研究領域流行起來。圖1-2所示為Google指數,PyTorch自發布起關注度就在不斷上升,截至2017年10月18日,PyTorch的熱度已然超越了其他三個框架(Caffe、MXNet和Theano),並且其熱度還在持續上升中。

PyTorch 和 Caffe、Theano、MXNet 的 Google 指數對比(類別為科學)

2 常見的深度學習框架簡介

隨著深度學習的發展,深度學習框架如雨後春筍般誕生於高校和公司中。尤其是近兩年,Google、Facebook、Microsoft等巨頭都圍繞深度學習重點投資了一系列新興專案,他們也一直在支援一些開源的深度學習框架。

目前研究人員正在使用的深度學習框架不盡相同,有 TensorFlow 、Caffe、Theano、Keras等,常見的深度學習框架如圖2所示。這些深度學習框架被應用於計算機視覺、語音識別、自然語言處理與生物資訊學等領域,並獲取了極好的效果。本部分主要介紹當前深度學習領域影響力比較大的幾個框架,限於筆者個人使用經驗和了解程度,對各個框架的評價可能有不準確的地方。

常見的深度學習框架

2.1 Theano

Theano最初誕生於蒙特利爾大學 LISA 實驗室,於2008年開始開發,是第一個有較大影響力的Python深度學習框架。

Theano 是一個 Python 庫,可用於定義、優化和計算數學表示式,特別是多維陣列(numpy.ndarray)。在解決包含大量資料的問題時,使用 Theano 程式設計可實現比手寫 C 語言更快的速度,而通過 GPU 加速,Theano 甚至可以比基於 CPU 計算的 C 語言快上好幾個數量級。Theano 結合了計算機代數系統(Computer Algebra System,CAS)和優化編譯器,還可以為多種數學運算生成定製的 C 語言程式碼。對於包含重複計算的複雜數學表示式的任務而言,計算速度很重要,因此這種 CAS 和優化編譯器的組合是很有用的。對需要將每一種不同的數學表示式都計算一遍的情況,Theano 可以最小化編譯/解析的計算量,但仍然會給出如自動微分那樣的符號特徵。

Theano誕生於研究機構,服務於研究人員,其設計具有較濃厚的學術氣息,但在工程設計上有較大的缺陷。一直以來,Theano因難除錯、構建圖慢等缺點為人所詬病。為了加速深度學習研究,人們在它的基礎之上,開發了Lasagne、Blocks、PyLearn2和Keras等第三方框架,這些框架以Theano為基礎,提供了更好的封裝介面以方便使用者使用。

2017年9月28日,在Theano 1.0正式版即將釋出前夕,LISA實驗室負責人,深度學習三巨頭之一的Yoshua Bengio 宣佈Theano即將停止開發:“Theano is Dead”。儘管Theano即將退出歷史舞臺,但作為第一個Python深度學習框架,它很好地完成了自己的使命,為深度學習研究人員的早期拓荒提供了極大的幫助,同時也為之後深度學習框架的開發奠定了基本設計方向: 以計算圖為框架的核心,採用GPU加速計算。

2017年11月,LISA實驗室在 GitHub 上開啟了一個初學者入門專案,旨在幫助實驗室新生快速掌握機器學習相關的實踐基礎,而該專案正是使用PyTorch作為教學框架。

點評:由於Theano已經停止開發,不建議作為研究工具繼續學習。

2.2 TensorFlow

2015年11月10日,Google宣佈推出全新的機器學習開源工具TensorFlow。 TensorFlow 最初是由 Google 機器智慧研究部門的 Google Brain 團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。TensorFlow主要用於進行機器學習和深度神經網路研究, 但它是一個非常基礎的系統,因此也可以應用於眾多領域。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今使用者最多的深度學習框架。

TensorFlow在很大程度上可以看作Theano的後繼者,不僅因為它們有很大一批共同的開發者,而且它們還擁有相近的設計理念,都是基於計算圖實現自動微分系統。TensorFlow 使用資料流圖進行數值計算,圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維陣列(張量)。

TensorFlow程式設計介面支援Python和C++。隨著1.0版本的公佈,Java、Go、R和Haskell API的alpha版本也被支援。此外,TensorFlow還可在Google Cloud和AWS中執行。TensorFlow還支援 Windows 7、Windows 10和Windows Server 2016。由於TensorFlow使用C++ Eigen庫,所以庫可在ARM架構上編譯和優化。這也就意味著使用者可以在各種伺服器和移動裝置上部署自己的訓練模型,無須執行單獨的模型解碼器或者載入Python直譯器。

作為當前最流行的深度學習框架,TensorFlow獲得了極大的成功,對它的批評也不絕於耳,總結起來主要有以下四點。• 過於複雜的系統設計,TensorFlow 在GitHub程式碼倉庫的總程式碼量超過100萬行。這麼大的程式碼倉庫,對於專案維護者來說維護成為了一個難以完成的任務,而對讀者來說,學習TensorFlow底層執行機制更是一個極其痛苦的過程,並且大多數時候這種嘗試以放棄告終。• 頻繁變動的介面。TensorFlow的介面一直處於快速迭代之中,並且沒有很好地考慮向後相容性,這導致現在許多開原始碼已經無法在新版的TensorFlow上執行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。• 介面設計過於晦澀難懂。在設計TensorFlow時,創造了圖、會話、名稱空間、PlaceHolder等諸多抽象概念,對普通使用者來說難以理解。同一個功能,TensorFlow提供了多種實現,這些實現良莠不齊,使用中還有細微的區別,很容易將使用者帶入坑中。• 文件混亂脫節。TensorFlow作為一個複雜的系統,文件和教程眾多,但缺乏明顯的條理和層次,雖然查詢很方便,但使用者卻很難找到一個真正循序漸進的入門教程。由於直接使用TensorFlow的生產力過於低下,包括Google官方等眾多開發者嘗試基於TensorFlow構建一個更易用的介面,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等數不勝數的第三方框架每隔幾個月就會在新聞中出現一次,但是又大多歸於沉寂,至今TensorFlow仍沒有一個統一易用的介面。

憑藉Google著強大的推廣能力,TensorFlow已經成為當今最炙手可熱的深度學習框架,但是由於自身的缺陷,TensorFlow離最初的設計目標還很遙遠。另外,由於Google對TensorFlow略顯嚴格的把控,目前各大公司都在開發自己的深度學習框架。

點評:不完美但最流行的深度學習框架,社群強大,適合生產環境。

2.3 Keras

Keras是一個高層神經網路API,由純Python編寫而成並使用TensorFlow、Theano及CNTK作為後端。Keras為支援快速實驗而生,能夠把想法迅速轉換為結果。Keras應該是深度學習框架之中最容易上手的一個,它提供了一致而簡潔的API, 能夠極大地減少一般應用下使用者的工作量,避免使用者重複造輪子。

嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習介面,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高階API而誕生,後來增加了TensorFlow和CNTK作為後端。為了遮蔽後端的差異性,提供一致的使用者介面,Keras做了層層封裝,導致使用者在新增操作或是獲取底層的資料資訊時過於困難。同時,過度封裝也使得Keras的程式過於緩慢,許多BUG都隱藏於封裝之中,在絕大多數場景下,Keras是本文介紹的所有框架中最慢的一個。

學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間裡,使用者主要是在呼叫介面,很難真正學習到深度學習的內容。

點評:入門最簡單,但是不夠靈活,使用受限。

2.4 Caffe/Caffe2

Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,核心語言是C++,它支援命令列、Python和MATLAB介面,既可以在CPU上執行,也可以在GPU上執行。

Caffe的優點是簡潔快速,缺點是缺少靈活性。不同於Keras因為太多的封裝導致靈活性喪失,Caffe靈活性的缺失主要是因為它的設計。在Caffe中最主要的抽象物件是層,每實現一個新的層,必須要利用C++實現它的前向傳播和反向傳播程式碼,而如果想要新層執行在GPU上,還需要同時利用CUDA實現這一層的前向傳播和反向傳播。這種限制使得不熟悉C++和CUDA的使用者擴充套件Caffe十分困難。

Caffe憑藉其易用性、簡潔明瞭的原始碼、出眾的效能和快速的原型設計獲取了眾多使用者,曾經佔據深度學習領域的半壁江山。但是在深度學習新時代到來之時,Caffe已經表現出明顯的力不從心,諸多問題逐漸顯現(包括靈活性缺失、擴充套件難、依賴眾多環境難以配置、應用侷限等)。儘管現在在GitHub上還能找到許多基於Caffe的專案,但是新的專案已經越來越少。

Caffe的作者從加州大學伯克利分校畢業後加入了Google,參與過TensorFlow的開發,後來離開Google加入FAIR,擔任工程主管,並開發了Caffe2。Caffe2是一個兼具表現力、速度和模組性的開源深度學習框架。它沿襲了大量的 Caffe 設計,可解決多年來在 Caffe 的使用和部署中發現的瓶頸問題。Caffe2的設計追求輕量級,在保有擴充套件性和高效能的同時,Caffe2 也強調了便攜性。Caffe2 從一開始就以效能、擴充套件、移動端部署作為主要設計目標。Caffe2 的核心 C++ 庫能提供速度和便攜性,而其 Python 和 C++ API 使使用者可以輕鬆地在 Linux、Windows、iOS、Android ,甚至 Raspberry Pi 和 NVIDIA Tegra 上進行原型設計、訓練和部署。

Caffe2繼承了Caffe的優點,在速度上令人印象深刻。Facebook 人工智慧實驗室與應用機器學習團隊合作,利用Caffe2大幅加速機器視覺任務的模型訓練過程,僅需 1 小時就訓練完ImageNet 這樣超大規模的資料集。然而儘管已經發布半年多,開發一年多,Caffe2仍然是一個不太成熟的框架,官網至今沒提供完整的文件,安裝也比較麻煩,編譯過程時常出現異常,在GitHub上也很少找到相應的程式碼。

極盛的時候,Caffe佔據了計算機視覺研究領域的半壁江山,雖然如今Caffe已經很少用於學術界,但是仍有不少計算機視覺相關的論文使用Caffe。由於其穩定、出眾的效能,不少公司還在使用Caffe部署模型。Caffe2儘管做了許多改進,但是還遠沒有達到替代Caffe的地步。

點評:文件不夠完善,但效能優異,幾乎全平臺支援(Caffe2),適合生產環境。

2.5 MXNet

MXNet是一個深度學習庫,支援C++、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支援命令和符號程式設計;可以執行在CPU、GPU、叢集、伺服器、桌上型電腦或者移動裝置上。MXNet是CXXNet的下一代,CXXNet借鑑了Caffe的思想,但是在實現上更乾淨。在2014 年的NIPS 上,同為上海交大校友的陳天奇與李沐碰頭,討論到各自在做深度學習 Toolkits 的專案組,發現大家普遍在做很多重複性的工作,例如檔案 loading 等。於是他們決定組建 DMLC【Distributied (Deep) Machine Learning Community】,號召大家一起合作開發 MXNet,發揮各自的特長,避免重複造輪子。

MXNet以其超強的分散式支援,明顯的記憶體、視訊記憶體優化為人所稱道。同樣的模型,MXNet往往佔用更小的記憶體和視訊記憶體,並且在分散式環境下,MXNet展現出了明顯優於其他框架的擴充套件效能。

由於MXNet最初由一群學生開發,缺乏商業應用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇為其雲端計算的官方深度學習平臺。2017年1月,MXNet專案進入Apache基金會,成為Apache的孵化器專案。

儘管MXNet擁有最多的介面,也獲得了不少人的支援,但其始終處於一種不溫不火的狀態。個人認為這在很大程度上歸結於推廣不給力及介面文件不夠完善。MXNet長期處於快速迭代的過程,其文件卻長時間未更新,導致新手使用者難以掌握MXNet,老使用者常常需要查閱原始碼才能真正理解MXNet介面的用法。

為了完善MXNet的生態圈,推廣MXNet,MXNet先後推出了包括MinPy、Keras和Gluon等諸多介面,但前兩個介面目前基本停止了開發,Gluon模仿PyTorch的介面設計,MXNet的作者李沐更是親自上陣,線上講授如何從零開始利用Gluon學習深度學習,誠意滿滿,吸引了許多新使用者。

點評:文件略混亂,但分散式效能強大,語言支援最多,適合AWS雲平臺使用。

2.6 CNTK

2015年8月,微軟公司在CodePlex上宣佈由微軟研究院開發的計算網路工具集CNTK將開源。5個月後,2016年1月25日,微軟公司在他們的GitHub倉庫上正式開源了CNTK。早在2014年,在微軟公司內部,黃學東博士和他的團隊正在對計算機能夠理解語音的能力進行改進,但當時使用的工具顯然拖慢了他們的進度。於是,一組由志願者組成的開發團隊構想設計了他們自己的解決方案,最終誕生了CNTK。

根據微軟開發者的描述,CNTK的效能比Caffe、Theano、TensoFlow等主流工具都要強。CNTK支援CPU和GPU模式,和TensorFlow/Theano一樣,它把神經網路描述成一個計算圖的結構,葉子節點代表輸入或者網路引數,其他節點代表計算步驟。CNTK 是一個非常強大的命令列系統,可以建立神經網路預測系統。CNTK 最初是出於在 Microsoft 內部使用的目的而開發的,一開始甚至沒有Python介面,而是使用了一種幾乎沒什麼人用的語言開發的,而且文件有些晦澀難懂,推廣不是很給力,導致現在使用者比較少。但就框架本身的質量而言,CNTK表現得比較均衡,沒有明顯的短板,並且在語音領域效果比較突出。

點評:社群不夠活躍,但是效能突出,擅長語音方面的相關研究。

2.7 其他框架

除了上述的幾個框架,還有不少的框架,都有一定的影響力和使用者。比如百度開源的PaddlePaddle,CMU開發的DyNet,簡潔無依賴符合C++11標準的tiny-dnn,使用Java開發並且文件極其優秀的Deeplearning4J,還有英特爾開源的Nervana,Amazon開源的DSSTNE。這些框架各有優缺點,但是大多流行度和關注度不夠,或者侷限於一定的領域。此外,還有許多專門針對移動裝置開發的框架,如CoreML、MDL,這些框架純粹為部署而誕生,不具有通用性,也不適合作為研究工具。

3 為什麼選擇PyTorch

這麼多深度學習框架,為什麼選擇PyTorch呢?因為PyTorch是當前難得的簡潔優雅且高效快速的框架。在筆者眼裡,PyTorch達到目前深度學習框架的最高水平。當前開源的框架中,沒有哪一個框架能夠在靈活性、易用性、速度這三個方面有兩個能同時超過PyTorch。下面是許多研究人員選擇PyTorch的原因。

  • • 簡潔:PyTorch的設計追求最少的封裝,儘量避免重複造輪子。不像TensorFlow中充斥著session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的設計遵循tensor→variable(autograd)→nn.Module 三個由低到高的抽象層次,分別代表高維陣列(張量)、自動求導(變數)和神經網路(層/模組),而且這三個抽象之間聯絡緊密,可以同時進行修改和操作。簡潔的設計帶來的另外一個好處就是程式碼易於理解。PyTorch的原始碼只有TensorFlow的十分之一左右,更少的抽象、更直觀的設計使得PyTorch的原始碼十分易於閱讀。在筆者眼裡,PyTorch的原始碼甚至比許多框架的文件更容易理解。

  • • 速度:PyTorch的靈活性不以速度為代價,在許多評測中,PyTorch的速度表現勝過TensorFlow和Keras等框架 。框架的執行速度和程式設計師的編碼水平有極大關係,但同樣的演算法,使用PyTorch實現的那個更有可能快過用其他框架實現的。

  • • 易用:PyTorch是所有的框架中面向物件設計的最優雅的一個。PyTorch的面向物件的介面設計來源於Torch,而Torch的介面設計以靈活易用而著稱,Keras作者最初就是受Torch的啟發才開發了Keras。PyTorch繼承了Torch的衣鉢,尤其是API的設計和模組的介面都與Torch高度一致。PyTorch的設計最符合人們的思維,它讓使用者儘可能地專注於實現自己的想法,即所思即所得,不需要考慮太多關於框架本身的束縛。

  • • 活躍的社群:PyTorch提供了完整的文件,循序漸進的指南,作者親自維護的論壇 供使用者交流和求教問題。Facebook 人工智慧研究院對PyTorch提供了強力支援,作為當今排名前三的深度學習研究機構,FAIR的支援足以確保PyTorch獲得持續的開發更新,不至於像許多由個人開發的框架那樣曇花一現。

在PyTorch推出不到一年的時間內,各類深度學習問題都有利用PyTorch實現的解決方案在GitHub上開源。同時也有許多新發表的論文采用PyTorch作為論文實現的工具,PyTorch正在受到越來越多人的追捧 。

作為論文實現的工具,PyTorch正在受到越來越多人的追捧 。如果說 TensorFlow的設計是“Make It Complicated”,Keras的設計是“Make It Complicated And Hide It”,那麼PyTorch的設計真正做到了“Keep it Simple,Stupid”。簡潔即是美。使用TensorFlow能找到很多別人的程式碼,使用PyTorch能輕鬆實現自己的想法。