「動手學習Tensorflow」- 深度學習框架紛爭

「動手學習Tensorflow」- 深度學習框架紛爭


大家好,我是人工智能工程師Alpha浪。

作為一名AI工程師,掌握一門深度學習框架是必備的生存技能之一。

深度學習發展至今,出現過很多深度學習框架,如theano,cntk,caffe,caffe2,torch,mxnet,keras,chainer,tensorflow, pytorch,PaddlePaddle 等。

框架之間競爭激烈,經過不斷的紛爭,有的框架成為主流,而有些框架使用的人越來越少,甚至退出了歷史的舞臺。


框架之間的紛爭


Caffe和Theano 是比較早的深度學習框架。Caffe是賈揚清在加州大學伯克利分校攻讀博士期間創建的項目,在2014年開源。

想當年,從事計算機視覺相關研究的小夥伴要復現一個深度學習相關的工作基本要從頭到尾自己手擼,寫代碼和調試要耗費比較大的時間和精力。

Caffe的開源在當時受到了相關研究者的歡迎和熱捧,尤其在圖像等領域受到了廣泛的應用。

Theano是大牛Benjio所在的蒙特利爾機器學習小組所創建的Python庫,誕生於2008年,是很多人深度學習實操的啟蒙框架。

然而,隨著巨頭google開源的tensorflow 和 Facebook 開源的Torch問世,這兩個框架的使用人數越來越少。最終,Theano 官方在2017年宣佈不再維護,而Caffe的升級版Caffe2則被整合到了Pytorch中。

Google 在2015年開源了Tensorflow,它的前身是Google內部從2011年開始使用的DisBelief。Facebook 則開源了Torch,torch是一門非常優秀的框架,但是需要使用不是十分流行的Lua進行深度學習開發。

印象中在2015年的時候,當時Stanford Nlp組提出了Tree structured Lstm, 並開源基於Torch的實現代碼。

我當時想在它的代碼上進行魔改,來實現自己的一些idea,但是由於對Lua不是很熟,魔改的過程異常艱難。

可能也是由於對Lua語言沒那麼熟悉原因,Facebook開源的Torch不是很能打,Tensorflow在Google的強推下變得越來越主流。

Facebook 在2016年9月份開源了Pytorch。PyTorch的前身是Torch,其底層和Torch框架一樣,但是使用Python重新寫了很多內容,不僅更加靈活,支持動態圖,而且提供了Python接口。

和當時只支持靜態圖的tensorflow相比,支持動態圖的pytorch 編寫代碼和調試起來更加方便,因此也受了越來越多的人的歡迎。

CNTK是由微軟發佈的一款機器學習框架,但是使用的人一直比較少,相關的博客也很少。

MXNET是由李沐,陳天奇等大神引領的開源社區開發的深度學習框架,目前已進駐apache開源項目,並受巨頭Amazon熱捧,但是mxnet一直不溫不火。

個人感覺mxnet比較可惜,mxnet有一段時間是比較領先的,但是那個時候是由相關的開源社區維護和推廣,力量比較有限。雖然後來加入了apache開源項目,並抱到了Amazon的大腿,但是失去了先機,現在從使用人數上應該排在第三的位置。

經過不斷的衍化和升級,Tensorflow和Pytorch在眾多深度學習框架中脫穎而出,形成了兩強爭霸的局面,是當下最火的深度學習框架,被廣泛應用在工業界和學術界。


Tensorflow VS Pytorch


「動手學習Tensorflow」- 深度學習框架紛爭

Tensorflow 在工業界有著更廣泛的應用,Pytorch在學術界有著更廣泛的應用。

TensorFlow強在在線部署,多語言支持和較好的線上系統穩定性,我覺得這個是TensorFlow在業界被廣泛應用的最主要原因。

在業界,無論算法性能有多好,總歸還是要上線的,不然都是白扯,不上線就算不到kpi中去。而方便部署到線上,支持多語言,並且有較好的系統穩定性以及有非常多線上應用實例是TensorFlow稱霸業界的主要原因。

比較好一點的公司會在線上部署TensorFlow Serving,這樣算法科學家們只需要提供相應的Tensorflow model即可將模型上線。

但是據我所知,在國內某電商巨頭公司內部,只有某院才能夠使用TensorFlow Serving, 其他業務部門(包括很多小公司)想將TensorFlow modle上到線上,一律通過TensorFlow api來加載模型,做線上serve。

這時候TensorFlow 支持多語言的特性就發揮了巨大的作用,它不僅支持c++, python,還支持如java等語言;很多公司目前的infrastructure 還沒有針對AI做更新換代,也不提供相應的TensorFlow serving 能力,所以這些公司基本都用C++或者java來做TensorFlow 模型的線上serve。

再者,TensorFlow基於靜態圖的這種方式非常適合線上應用,一次build好graph,多次在這個圖上面做inference,工程效率很高。

但是在線下,TensorFlow體驗很差,用過的人都覺得體驗很不好。

1. 在TensorFlow1.x時期,基於靜態圖的模式,無法在變量定義和使用的時候查看tensor的值,只有在session run的時候才能查看tensor的值,使得debug起來異常困難。

2. TensorFlow API混亂,使用體驗比較差。

而Pytorch 在API和文檔方面都做得更好,並且pytorch是基於動態圖的模式,可以很方便的查看tensor的值,可以像debug Python程序一樣debug pytorch模型。因此,pytorch在只關心算法性能而不用太關心部署的學術界,非常受歡迎。

雖然TensorFlow2.x默認是eager execution模式,可以像pytorch一樣直接查看tensor的值,但是個人感覺出來的還是有點晚,短時間內可能不太會是主流的線下框架了。

一方面,已經習慣TensorFlow1.x的人還要重新學習tensorflow2.x,並且在TensorFlow1.x中靜態圖習慣的一些寫法,在TensorFlow2.x可能不怎麼支持,還要重新再踩很多坑,才能比較好的掌握;另一方面,習慣使用pytorch的那波人不太會去在學習TensorFlow2.x。

雖然Pytorch在新版本中也出了新的特性,更好的支持線上部署,但畢竟是才出來不久,沒有經過線上的長時間檢驗,實際線上應用案例和分享也比較少。

而TensorFlow自15年release以來,已經在線上經歷了五年多的考驗,撐過了多次雙十一高流量的檢測,性能穩定。

Pytorch想更廣泛應用在線上,短時間內也不太現實,替換成本還是很高,TensorFlow在這方面已經佔盡了先機。

總的來說,Tensorflow在業界線上部署佔盡了先機,而Pytorch在線下佔盡了先機,短時間內誰都不能很快的取代誰。


框架之間的統一


「動手學習Tensorflow」- 深度學習框架紛爭

Open Neural Network Exchange (ONNX,開放神經網絡交換),是一個通用的深度學習模型標準。

起初是微軟聯合Facebook等多個相關公司為了抗衡Tensorflow而提出的,Pytorch,CNTK,MXNET等框架都支持導出和加載ONNX格式的模型。

模型格式的統一,可以給不同框架之間提供更好的交互性。例如,我們線下模型代碼是用Pytorch實現的,但是線上是用MXNET部署的。

沒有ONNX,我們可能要將代碼重新用MXNET進行實現;有了ONNX,我們只需要將Pytorch模型實現導出到ONNX格式的模型,然後線上使用MXNET進行加載即可,非常方便。


「動手學習Tensorflow」- 深度學習框架紛爭


而後,隨著ONNX的發展,現在也支持Tensorflow和ONNX之間的相互轉換,不過這個特徵是在ONNX中實現的,Tensorfow官方暫不支持。


如今,ONNX支持上圖中的框架,可以說常用的機器學習框架和深度學習框架都支持了。


「動手學習Tensorflow」- 深度學習框架紛爭


對於ONNX,除了使用Pytorch,MXNET等框架提供的線上Inference方式,還可以使用進行優化過的Inference框架,如Nvidia的TensorRT,小米的MACE,騰訊的ncnn等。


Nvidia的TensorRT對計算圖中的計算做了相應的優化,相比使用tensorflow部署線上模型,性能可以提高10+倍以上。


雖然ONNX可以將不同框架統一起來,雖然TensorRT可以將線上Inference速度提高很多,但是畢竟沒出來多久,可以找到的例子和博客也比較少。


對於目前來講,工業界線上部署的模型大部分還是Tensorflow。


動手學習Tensorflow


工業界線上部署的模型大部分還是Tensorflow模型,接下來的日子我們開始動手學習Tensorflow,精彩內容不容錯過。



分享到:


相關文章: