前幾天,量子位發過一篇《忽悠VC指南》。其中有一條建議是,當你僞裝AI專家時,最好別談衆人皆知的TensorFlow,那談什麼?web
PyTorch。docker
其實這也不全然都是調侃。和TensorFlow相比,PyTorch確實也有爲數很多的擁躉。根據Keras做者François Chollet發佈的數據顯示:GitHub上的各類深度學習框架中,PyTorch排在第五位。編程
但須要提醒你們的是,PyTorch但是今年1月19日才正式發佈。小程序
最近,斯坦福大學研究機器學習的博士生Awni Hannun,圍繞PyTorch仍是TensorFlow這個話題,作了一個深刻的比較。量子位把內容傳送以下:後端
我寫的這份指南,主要對比了PyTorch和TensorFlow之間的區別。但願對那些想着手開始一個新項目或者考慮轉換深度學習框架的人有所幫助。數組
我主要考察了深度學習堆棧的訓練和部署時,相關的可編程性和靈活性。在這裏,我不會過多的談論速度、內存佔用等方面的權衡。bash
PyTorch更有利於研究人員、愛好者、小規模項目等快速搞出原型。而TensorFlow更適合大規模部署,特別是須要跨平臺和嵌入式部署時。服務器
而後我們一項一項分着說。
贏家:PyTorch
PyTorch本質上是Numpy(numerical python,是一個開源的Python科學計算庫)的替代者,並且支持GPU、帶有高級功能,能夠用來搭建和訓練深度神經網絡。若是你熟悉Numpy、Python以及常見的深度學習概念(卷積層、循環層、SGD等),會很是容易上手PyTorch。
而TensorFlow能夠當作是一個嵌入Python的編程語言。你寫的TensorFlow代碼會被Python編譯成一張圖,而後由TensorFlow執行引擎運行。我見過好多新手,因爲這個增長的間接層而困擾。也正是由於一樣的緣由,TensorFlow有一些額外的概念須要學習,例如會話、圖、變量做用域(variable scoping)、佔位符等。
另外還須要更多的樣板代碼才能讓一個基本的模型運行。因此TensorFlow的上手時間,確定要比PyTorch長。
贏家:PyTorch
建立和運行計算圖多是兩個框架最不一樣的地方。在PyTorch中,圖結構是動態的,這意味着圖在運行時構建。而在TensorFlow中,圖結構是靜態的,這意味着圖先被「編譯」而後再運行。
舉一個簡單的例子,在PyTorch中你能夠用標準的Python語法編寫一個for循環結構
for _ in range(T): h = torch.matmul(W, h) + b
此處T能夠在每次執行代碼時改變。而TensorFlow中,這須要使用「控制流操做」來構建圖,例如tf.while_loop。TensorFlow確實提供了dynamic_rnn用於常見結構,可是建立自定義動態計算真的更加困難。
PyTorch中簡單的圖結構更容易理解,更重要的是,還更容易調試。調試PyTorch代碼就像調試Python代碼同樣。你可使用pdb並在任何地方設置斷點。調試TensorFlow代碼可不容易。要麼得從會話請求要檢查的變量,要麼學會使用TensorFlow的調試器(tfdbg)。
贏家:TensorFlow
隨着PyTorch逐漸成熟,我預計這部分的差距會趨近於零。但目前,TensorFlow仍是有一些PyTorch不支持的功能。它們是:
沿維翻轉張量(np.flip, np.flipud, np.fliplr)
檢查無窮與非數值張量(np.is_nan, np.is_inf)
快速傅里葉變換(np.fft)
這些TensorFlow都支持。另外,TensorFlow的contrib軟件包中,有更多PyTorch沒有的高級功能和模型。
贏家:TensorFlow
兩種框架下保存和加載模型都很簡單。PyTorch有一個特別簡單的API,能夠保存模型的全部權重或pickle整個類。TensorFlow的Saver對象也很易用,並且爲檢查提供了更多的選項。
TensorFlow序列化的主要優勢是能夠將整個圖保存爲protocol buffer。包括參數和操做。然而圖還能被加載進其餘支持的語言(C++、Java)。這對於部署堆棧相當重要。理論上,當你想改動模型源代碼但仍但願運行舊模型時很是有用。
贏家:TensorFlow
對於小規模的服務器端部署(例如一個Flask web server),兩個框架都很簡單。
對於移動端和嵌入式部署,TensorFlow更好。不僅是比PyTorch好,比大多數深度學習框架都要要。使用TensorFlow,部署在Android或iOS平臺時只須要很小的工做量,至少沒必要用Java或者C++重寫模型的推斷部分。
對於高性能服務器端的部署,還有TensorFlow Serving能用。除了性能以外,TensorFlow Serving一個顯著的優勢是能夠輕鬆的熱插拔模型,而不會使服務失效。
贏家:平手
對於兩個框架,我都在文檔中找到所需的一切。Python API被很好的記錄,以及有足夠的案例和教程來學習框架。
一個特例是,PyTorch的C庫大多數沒有文檔。不過,這隻有在你編寫一個定製化的C擴展時纔有影響。
贏家:PyTorch
PyTorch中用於加載數據的API設計的很棒。接口由一個數據集、一個取樣器和一個數據加載器構成。數據加載器根據取樣器的計劃,基於數據集產生一個迭代器。並行化數據加載簡單的就像把num_workers參數傳遞給數據加載器同樣簡單。
我在TensorFlow中沒有發現特別有用的數據加載工具。不少時候,並不總能直接把準備並行運行的預處理代碼加入TensorFlow圖。以及API自己冗長難學。
贏家:TensorFlow
TensorFlow的設備管理很是好用。一般你不須要進行調整,由於默認的設置就很好。例如,TensorFlow會假設你想運行在GPU上(若是有的話)。而在PyTorch中,即便啓用了CUDA,你也須要明確把一切移入設備。
TensorFlow設備管理惟一的缺點是,默認狀況下,它會佔用全部的GPU顯存。簡單的解決辦法是指定CUDA_VISIBLE_DEVICES。有時候你們會忘了這一點,因此GPU在空閒的時候,也會顯得很忙。
在PyTorch中,我發現代碼須要更頻繁的檢查CUDA是否可用,以及更明確的設備管理。在編寫可以同時在CPU和GPU上運行的代碼時尤爲如此。以及得把GPU上的PyTorch變量轉換爲Numpy數組,這就顯得有點冗長。
numpy_var = variable.cpu().data.numpy()
贏家:PyTorch
兩個框架均可以構建和綁定用C、C++、CUDA編寫的自定義擴展。TensorFlow仍然須要更多的樣板代碼,儘管這對於支持多類型和設備可能更好。在PyTorch中,你只需爲每一個CPU和GPU編寫一個接口和相應的實現。兩個框架中編譯擴展也是直接記性,並不須要在pip安裝的內容以外下載任何頭文件或者源代碼。
TensorBoard是TensorFlow自帶的可視化工具,用來查看機器學習訓練過程當中數據的變化。經過訓練腳本中的幾個代碼段,你能夠查看任何模型的訓練曲線和驗證結果。TensorBoard做爲web服務運行,特別便於對於無頭結點上存儲的結果進行可視化。
若是沒有相似的功能,我可不想用PyTorch。不過還好,藉助兩個開源項目能夠實現。第一個是tensorboard_logger,第二個是crayon。tensorboard_logger庫用起來甚至比TensorBoard的「摘要」更容易,儘管想用這個首先得安裝TensorBoard。
crayon能夠徹底替代TensorBoard,可是須要更多的設置(docker是先決條件)。
Keras是具備可配置後端的高級API。目前TensorFlow、Theano、CNTK都支持。也許不久的未來,PyTorch也會提供支持。做爲tf.contrib的一部分,Keras也隨TensorFlow一塊兒分發。
雖然上面我沒有討論過Keras,但其API特別容易使用,這也是配合常見深度神經網絡架構最快的方式。不過,使用API畢竟沒有使用PyTorch或者核心TensorFlow那麼靈活。
Keras是許多經常使用的深層神經網絡架構中運行最快的方法之一。
今年2月,谷歌推出了TensorFlow Fold。這個庫創建在TensorFlow智商,容許構建更多的動態圖。這個庫的主要優點是動態批處理。動態批處理能夠自動對不一樣大小的輸入進行批量計算(例如解析樹上的循環網絡)。
可編程性方面,語法不像PyTorch那麼簡單,固然在某些狀況下,批處理帶來的性能提高仍是值得考慮。
好了,以上就是來自Awni Hannun的分享。但願對你們有所幫助,另外兼聽則明,量子位繼續搬運幾條reddit上讀者的評論。
讀者Reiinakano:
我不以爲「文檔」環節雙方勢均力敵。
官方的TensorFlow文檔不好勁。比方,在PyTorch文檔中,對於遷移學習的講解,使用了實際、有用的代碼,並且還解釋了構建的方式。而在TensorFlow的文旦中,整個講解就是運行了一個bash scripts,沒有任何實際代碼。
讀者ThaHypnotoad:
PyTorch還有很長的路要走。前幾天我發現int tensor沒有neg()定義。不過,我更討厭調試靜態圖。因此我選擇忍受PyTorch成長的煩惱。
讀者trias10:
另外一個缺點是,PyTorch沒有對Windows的官方支持,而TensorFlow有。不少場合(一般是金融和保險行業)使用Windows進行開發和原型設計,用Linux進行生產部署,因此你須要一個能對二者都支持的框架。
好啦,今天先談到這裏。但願對你有所幫助~
— 完 —
加入社羣
量子位AI社羣7羣開始招募啦,歡迎對AI感興趣的同窗,加小助手微信qbitbot2入羣;
此外,量子位專業細分羣(自動駕駛、CV、NLP、機器學習等)正在招募,面向正在從事相關領域的工程師及研究人員。
進羣請加小助手微信號qbitbot2,並務必備註相應羣的關鍵詞~經過審覈後咱們將邀請進羣。(專業羣審覈較嚴,敬請諒解)
誠摯招聘
量子位正在招募編輯/記者,工做地點在北京中關村。期待有才氣、有熱情的同窗加入咱們!相關細節,請在量子位公衆號(QbitAI)對話界面,回覆「招聘」兩個字。
量子位 QbitAI
վ'ᴗ' ի 追蹤AI技術和產品新動態
長按二維碼向我轉帳
受蘋果公司新規定影響,微信 iOS 版的讚揚功能被關閉,可經過二維碼轉帳支持公衆號。
微信掃一掃
關注該公衆號