天天看點

PyTorch 和 TensorFlow 哪個更好?看一線開發者怎麼說

theano、tensorflow、torch、mxnet 再到近日比較熱門的 pytorch 等等,深度學習架構之間的比較一直以來都是非常受人關注的熱點話題。不過你知道使用者實際用起來的感覺怎麼樣嗎?近日,reddit 使用者 cjmcmurtrie 發了一個主題為「pytorch vs. tensorflow」的讨論帖,想要了解這兩大流行的架構之間各自有什麼優勢。

文章一樓寫道:

我還沒有從 torch7 遷移到 tensorflow。我玩過 tensorflow,但我發現 torch7 更加直覺(也許是我玩得不夠?)。我也嘗試了一點 pytorch,是以我決定先看看效果。

使用了幾周 pytorch 之後,我認為我現在還不必遷移到 tensorflow,至少在我感興趣的項目上還不需要。用 pytorch 寫自定義子產品真是簡單至極。而且其動态圖建構(dynamic graph construction)給我之前需要熬夜實作(或等待清單上)的東西帶來了很多新想法。我認為對機器學習開發者來說,pytorch 是一個了不起的工具集。我也知道 tensorflow 的社群資源要強大得多,但如果要開發全新的項目(而不是為已有的架構重新寫代碼或閱讀教程),社群也不一定能有很大的幫助。

這個 reddit 文章發出後得到了很多機器學習研究者和開發者的關注,他們紛紛跟貼談論自己的想法和經驗(不隻是關于 pytorch 和 tensorflow,讨論中還涉及到更多工具)。

tensorflow

優勢:

等效的圖形編譯(graph compilation)要快得多;我們用了幾秒而不是幾分鐘。但是它仍然不夠快,如果我們想要将它的大部分添加到我們的 ci 套件(ci suite),但我們不需要等待很長時間來開始訓練。

從 lasagne 轉到 tensorflow 之後,我喜歡 tf.layers 和 tf.contrib.layers 中更高層次的功能;它們為接受張量(tensor)并傳回張量的功能性 api,是以更容易與「原始」的 tensorflow 內建。我們可以做普通的張量操作,而不用寫一個層那麼麻煩。

關于開發人員的回報速度:我曾在 tf 的問題區提出了一些微不足道的問題,但 tf 開發人員通常在一兩天内就回複我了。

此外,工具是相當好的。tensorboard 絕對好用,用來表示的時間線(timeline)/跟蹤(trace)的工具也一樣好用。但是我還沒有嘗試新加入的 tfdbg。

tensorflow 在設計時就考慮到了分布式,是以如果你需要運作真正的大規模項目,tensorflow 多半是最好的。

缺點:

tensorflow 的 api 非常荒謬,它在每個階段都會重新發明輪子,并且要求開發者學習很多本不必要的新概念。然而,開發者峰會表示這一境況正在改善——而且同時使用 tensorflow servin 和 cloud ml 會提高你的生産力。

在實踐中部署到 ios 非常困難。

我并沒有在 keras 或者 tensorflow 上工作,但是我看過他們的「問題」日志和一些使用者組,隻是因為大量的使用者,這些架構看起來并不會得到這種個人的關注。

pytorch

它屬于輕量級;

它目前位于 python 中;

它使你能夠明确地控制計算。沒有編譯器能自己妄圖變聰明來「幫助你」,或是将你的代碼加速;事實上大多編譯器在調試中會産生大量麻煩;

它使 gpu 核心調用之上僅有少量(可解釋的)抽象層,而這恰恰是高性能的保證;

也許這是個人偏好,但我得到了與抽象有關的特定 ocd。每當我要做艱巨的工作時都會很緊張,因為一旦我的未來被洩漏,我便能感覺到它那些無法擺脫且難以忍受的痛苦。相對簡單的事情理應在引擎蓋之下發生的大多數情況下,這種感覺尤為強烈;

調試更容易,因為特定代碼中會是特定行(而不是在距離使用大型或生成的 graph 對象的 sess.run()很遠的地方)失敗。你的堆棧跟蹤不會填滿三個螢幕來讓你玩「找找錯誤在哪裡!」的豎版卷軸遊戲;

不存在編譯時間。我無法了解 theano 使用者是如何處理的,他們一定更有耐心;

你可以直接操作漸變,顯然,做一些事情時可以更容易,也更自然(如在反向傳播過程中的漸變剪輯,或各種「破碎的反向傳播」的有關想法,就像最近的 shake shake reg 指令一樣;的确,我認為你可以用 stop_gradient 破解一個解決方案);

它對動态圖的支援從一開始就是自上而下的設計原則,而非随之而至的事後想法。并且我們會看到更多的動态圖表,如做成一大塊 nlp,或是神經子產品網 ;

它沒有縮進或膨脹你的代碼的顯式會話對象;

它獲得的抽象是正确的:raw numpy - > tensors(但 gpu 上的 raw numpy 可能對深度學習一無所知!)- >變量(它們了解深度學習),并且 modules 或 optim 等等會稍有益處。

動态計算使很多事情更加容易,如 seq2seq + attention 的神經翻譯很難通過 keras + tf 來實作,但使用 pytorch 便會很容易;

更容易調試,因為你可以隻使用标準的 python 工具;

pytorch 讓自定義的實作更加容易,是以你得以将更多時間專注于算法中,這樣往往能夠改進主要性能;

使 multi-gpu 簡單易懂;

torch-vision 使加載和變換圖像變得容易。

pytorch 提供了一個強化功能。增強功能基本上不會在實作中産生過多資源消耗,能有一些内置函數來調用 rl 的感覺真棒。

我遇到的錯誤或問題得到pytorch 團隊及時的反映,通常會在當天修複,或者得到解決方法或得到問題跟蹤。

pytorch 是可以立即使用的,在我目前的項目的單 gpu 的訓練時間比 theano+lasagne 快 100%。我測試過,100% 逐字地在 cifar100 上從(在最簡單的情況下)5 分/曆元到 2.5 分/曆元,并且在某些情況下降到 2 分鐘/曆元(即,快兩倍)

pytorch 的 api感覺有些粗糙,但對它有一些限定詞。如果你隻是做一些标準的任務(實作 resnet 或者 vgg)我認為你不會有問題,但我一直都有一些分歧因為我所做的一切都有些奇怪。

對于 pytorch 我最大的「抱怨」基本上是在神經網絡 api 方面「事情并未按照我讓他們組合的方式進行放置」。具體來說,我非常喜歡 lasagne 的「層次(layers)」範式—但是一點點批判性的思維就會讓你得出這個結論,這個範式尤其不适合動态圖架構。

pytorch 沒有為部署設計,開發團隊它看上去并沒有把重心放在 pytorch 上(雖然在這方面,我可能看錯了,我模糊的記得我在論壇的文章上看到過這個)。我想要練習将一些東西放置在網站或者 droid app 上我不确定其他的架構能很好地支援這種方式。

繼續閱讀