自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PyTorch和TensorFlow到底哪個(gè)更好?

開發(fā) 開發(fā)工具
PyTorch和TensorFlow到底哪個(gè)更好?下面就讓我們看看看看一線開發(fā)者怎么說。

PyTorch和TensorFlow到底哪個(gè)更好?

Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學(xué)習(xí)框架之間的比較一直以來都是非常受人關(guān)注的熱點(diǎn)話題。機(jī)器之心也曾發(fā)表過多篇相關(guān)的介紹和對(duì)比文章,如《主流深度學(xué)習(xí)框架對(duì)比:看你最適合哪一款?》、《五大主流深度學(xué)習(xí)框架比較分析:MXNET 是最好選擇》、《對(duì)比深度學(xué)習(xí)十大框架:TensorFlow 最流行但并不是最好》和《從 TensorFlow 到 Theano:橫向?qū)Ρ绕叽笊疃葘W(xué)習(xí)框架》。

不過你知道用戶實(shí)際用起來的感覺怎么樣嗎?近日,Reddit 用戶 cjmcmurtrie 發(fā)了一個(gè)主題為「PyTorch vs. TensorFlow」的討論帖,想要了解這兩大流行的框架之間各自有什么優(yōu)勢。

原帖地址:https://redd.it/5w3q74

帖子一樓寫道:

我還沒有從 Torch7 遷移到 TensorFlow。我玩過 TensorFlow,但我發(fā)現(xiàn) Torch7 更加直觀(也許是我玩得不夠?)。我也嘗試了一點(diǎn) PyTorch,所以我決定先看看效果。

使用了幾周 PyTorch 之后,我認(rèn)為我現(xiàn)在還不必遷移到 TensorFlow,至少在我感興趣的項(xiàng)目上還不需要。用 PyTorch 寫自定義模塊真是簡單至極。而且其動(dòng)態(tài)圖構(gòu)建(dynamic graph construction)給我之前需要熬夜實(shí)現(xiàn)(或等待列表上)的東西帶來了很多新想法。我認(rèn)為對(duì)機(jī)器學(xué)習(xí)開發(fā)者來說,PyTorch 是一個(gè)了不起的工具集。我也知道 TensorFlow 的社區(qū)資源要強(qiáng)大得多,但如果要開發(fā)全新的項(xiàng)目(而不是為已有的架構(gòu)重新寫代碼或閱讀教程),社區(qū)也不一定能有很大的幫助。

這個(gè) Reddit 帖子發(fā)出后得到了很多機(jī)器學(xué)習(xí)研究者和開發(fā)者的關(guān)注,他們紛紛跟貼談?wù)撟约旱南敕ê徒?jīng)驗(yàn)(不只是關(guān)于 PyTorch 和 TensorFlow,討論中還涉及到更多工具)。機(jī)器之心在這里選擇其中一些我們認(rèn)為有價(jià)值的評(píng)論,希望能夠給你的學(xué)習(xí)和研究帶來幫助。以下按贊成數(shù)量排序。

ajmooch的回復(fù):

我一直在做一個(gè) TensorFlow 的項(xiàng)目,所以我可以公正地在 Theano+Lasagne, PyTorch 和 Tensorflow 三者之間做一個(gè)比較。但對(duì)于前兩者,我可以給出一些漫漫的看法。

背景:大概在一年前我開始接觸 Theano+Lasagne,并在我的兩篇論文中使用了它。我上周改換到 PyTorch,并重新建了兩個(gè)我以前用 Theano 實(shí)現(xiàn)的關(guān)鍵項(xiàng)目。

API:Theano 的圖形構(gòu)建和編譯工作方式讓我學(xué)習(xí)起來很費(fèi)勁,但一旦我找到了它的竅門,一切都迎刃而解(這也許會(huì)花費(fèi)兩個(gè)月,但是我仍舊在學(xué)習(xí) Python 和基本的神經(jīng)網(wǎng)絡(luò)方面的東西,所以對(duì)這一速度的參考價(jià)值持保留態(tài)度)。Lasagne 的 API,對(duì)我來說,就像是優(yōu)雅的凱瑟琳女皇騎著逆戟鯨展開了戰(zhàn)斗,也就是說我愛死它了。如果我提前知道我有多想要一個(gè) Theano 的程式庫去工作,我一定會(huì)寫一個(gè)程式庫,這大大地減輕了繁重的勞動(dòng)。

PyTorch 的 API,另一方面來說感覺有些粗糙,但對(duì)它有一些限定詞,這個(gè)稍后再談。如果你只是做一些標(biāo)準(zhǔn)的任務(wù)(實(shí)現(xiàn) ResNet 或者 VGG)我認(rèn)為你不會(huì)有問題,但我一直都有一些分歧因?yàn)槲宜龅囊磺卸加行┢婀?。舉個(gè)例子,在我當(dāng)前的項(xiàng)目中,因?yàn)?strided 張量索引(tensor indexing)還未實(shí)現(xiàn),我必須使用幾個(gè) hacky 解決方法,雖然當(dāng)前的索引技術(shù)非常靈活,比起直接使用 numpy 風(fēng)格的索引,它們少了很多直觀性。中心的限定條件是,它們確實(shí)只是釋放 friggin 的框架,當(dāng)然并不是一切都實(shí)現(xiàn),還有一些待解決的問題。Theano 發(fā)展時(shí)間長且已經(jīng)成熟,我并沒有觀察到它或者 Lasagne 在這個(gè)過程中遇到過困難。

除此之外,對(duì)于 PyTorch 我最大的「抱怨」基本上是在神經(jīng)網(wǎng)絡(luò) API 方面「事情并未按照我讓他們組合的方式進(jìn)行放置」。具體來說,我非常喜歡 Lasagne 的「層次(layers)」范式—但是一點(diǎn)點(diǎn)批判性的思維就會(huì)讓你得出這個(gè)結(jié)論,這個(gè)范式尤其不適合動(dòng)態(tài)圖框架。我完全習(xí)慣于考慮并且優(yōu)化我關(guān)于靜態(tài)圖形定義的思考過程,所以轉(zhuǎn)換 API 方法是一個(gè)小的痛點(diǎn)。這非常重要-我花了很長時(shí)間思考「好吧,既然我不能使用自己的標(biāo)準(zhǔn)流控制寫出一個(gè)常規(guī)的程序一樣,寫出這個(gè)圖的 Theano,那么我該如何定義它呢,」這讓我在思維的道路上變得越來越強(qiáng)大。

然而,動(dòng)態(tài)圖需要一個(gè)與「定義+運(yùn)行」基本不同的 API,雖然我個(gè)人認(rèn)為它并不直觀,就在上周其單獨(dú)執(zhí)行定義的方法,正如 CJ 所說,打開了我的思路并給了我?guī)资畟€(gè)項(xiàng)目的想法,這在以前是不可能的。我還想象,如果你在任何你想的地方使用 RNNs 做任何事情,比如,在沒有消耗計(jì)算的前提下實(shí)現(xiàn)動(dòng)態(tài)計(jì)算,接口的命令性質(zhì)將會(huì)使它更容易這樣做。

速度:所以我沒有做廣泛的基準(zhǔn)測試,但是我驚訝的發(fā)現(xiàn),PyTorch 是可以立即使用的,在我當(dāng)前的項(xiàng)目的單 GPU 的訓(xùn)練時(shí)間比 theano+lasagne 快 100%。我已經(jīng)在 Geforce gtx 980 和 Titan X 上測試了它,并實(shí)現(xiàn)了已經(jīng)確認(rèn)相同且在合理的誤差范圍內(nèi)的網(wǎng)絡(luò)。100% 逐字地在 CIFAR100 上從(在最簡單的情況下)5 分/歷元到 2.5 分/歷元,并且在某些情況下降到 2 分鐘/歷元(即,快兩倍)

這是相同的模板代碼,使用了相同的數(shù)據(jù)提取程序(我不得不諷刺地說「fetcher」沒有思考「去死吧,F(xiàn)ETCHER(DIE, FETCHER!)」),除了實(shí)際的代碼,訓(xùn)練和運(yùn)行網(wǎng)絡(luò),一切都相同。

這讓我感到驚訝,因?yàn)槲业挠∠笫牵琓heano 的廣泛和積極的內(nèi)存優(yōu)化(在這種情況下,當(dāng)你開始訓(xùn)練,只需花費(fèi)幾分鐘進(jìn)行編譯)意味著它在單 GPU 下的速度非???。我不知道什么導(dǎo)致了速度的提升,或者,因?yàn)樗麄兺瑯佣际褂昧?cuDNN 的最新版本(我仔細(xì)地檢查了一遍以確保的確是這樣),所以這一切的收獲一定在天空的某一個(gè)地方,但我并不知道會(huì)在哪里。

相關(guān)地,使用 Theano 工作時(shí),我從來沒有能夠得到多 GPU 或者半精度浮點(diǎn)數(shù)。我花了好幾天的時(shí)間試圖讓 libgpuarray 工作,并使用 platoon 試圖進(jìn)行修復(fù),但每次我都會(huì)精疲力盡(想象一下即使我可以得到編譯的資源也不會(huì)如此困難,這已經(jīng)是一個(gè)痛點(diǎn)了)。然而,立即使用的 PyTorch 的數(shù)據(jù)并行性(單節(jié)點(diǎn),4 GPU)和半精度(用于卷積的 pseudo-FP16,這意味它不會(huì)變快但是會(huì)使用更少的內(nèi)存)問題就解決了。當(dāng)時(shí)就是這樣。

開發(fā)團(tuán)隊(duì)交互:我與兩個(gè)框架的核心開發(fā)團(tuán)隊(duì)一直交流的非常愉快。對(duì)于 Lasagne 和 Theano,我遇到了一些困難,很多奇怪的問題。很多次,他們總是快速且簡潔地幫我弄清楚什么錯(cuò)了(我通常不明白)。PyTorch 團(tuán)隊(duì)同樣有幫助—我一直在提出我遇到的錯(cuò)誤或問題,并得到及時(shí)的反映,通常會(huì)在當(dāng)天修復(fù),或者得到解決方法或得到問題跟蹤。我并沒有在 Keras 或者 Tensorflow 上工作,但是我看過他們的「問題」日志和一些用戶組,只是因?yàn)榇罅康挠脩?,這些框架看起來并不會(huì)得到這種個(gè)人的關(guān)注 - 就像是我去 Cal Poly(加州理工州立大學(xué))一樣,在這個(gè)地方,教授/學(xué)生的比例很高,你很少看到一個(gè)班中有超過 20 個(gè)學(xué)生,然而在 Berkeley 你能看到 1000 人的演講廳。這并非批評(píng) Cal 的孩子或者暗示 berkeley 盲目擴(kuò)招,但如果你是一個(gè)像我一樣開發(fā)非標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)的人(我并不是在說 Chuck Tingle weird),然而從一個(gè)實(shí)際構(gòu)建框架的人那里得到快速的反饋,這是非常寶貴的能力。

Misc:我擔(dān)心一個(gè)特別的問題(為什么我打算幾年拾起 TensorFlow 并將它作為主要框架),Theano 和 PyTorch 都沒有為部署設(shè)計(jì),開發(fā)團(tuán)隊(duì)它看上去并沒有把重心放在 PyTorch 上(雖然在這方面,我可能看錯(cuò)了,我模糊的記得我在論壇的帖子上看到過這個(gè))。我想要練習(xí)將一些東西放置在網(wǎng)站或者 droid app 上(主要是為了娛樂,但我一直都非常專注于研究并認(rèn)為這是一個(gè)真正有用的技能,可以實(shí)際獲得我在設(shè)備上所做的東西),我不確定其他的框架能很好地支持這種方式。

相關(guān)地,PyTorch 的分布式框架仍然是實(shí)驗(yàn)性的,最近我聽說 TensorFlow 在設(shè)計(jì)時(shí)就考慮到了分布式,所以如果你需要運(yùn)行真正的大規(guī)模項(xiàng)目,TensorFlow 多半是最好的。

TL;DR:我并不是試圖推薦哪個(gè)框架比較好;我至死都愛 Lasagne(可能更多),但我已經(jīng)發(fā)現(xiàn)動(dòng)態(tài)圖的靈活性和其快速地、難以理解的增益的速度。我在上個(gè)星期安裝了 PyTorch 并且只用了非常少的時(shí)間就上手了,我想我不太可能回頭了。我并不是很了解 TensorFlow。但能從 PyTorch 開發(fā)者那里得到及時(shí)反饋對(duì)我來說是很重要的一點(diǎn),因?yàn)槲艺谧鲆恍┛磥碛悬c(diǎn)奇怪的研究,但在未來我也可能為一些項(xiàng)目重新使用 TensorFlow。這個(gè)討論帖非常棒,但我希望在你閱讀過后的印象是:這是他們的主觀經(jīng)驗(yàn),而不是一個(gè)刻板的印象如:「就是這樣,你絕對(duì)會(huì)感到同樣的方式」。

taion的回復(fù):

我們最近從 Theano+Lasagne 轉(zhuǎn)到了 TensorFlow。

我還沒有嘗試過任何分布式的架構(gòu),但總體上用過 Theano 之后再用 TensorFlow 感覺非常熟悉——甚至更好。對(duì)你提到的幾點(diǎn),回復(fù)如下:

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

從 Lasagne 轉(zhuǎn)到 TensorFlow 之后,我喜歡 tf.layers 和 tf.contrib.layers 中更高層次的功能;它們?yōu)榻邮軓埩?tensor)并返回張量的功能性 API,因此更容易與「原始」的 TensorFlow 集成。我們可以做普通的張量操作,而不用寫一個(gè)層那么麻煩。

在我們使用的模型上,TensorFlow 的速度稍稍快于 Theano(20%-30%)。當(dāng)?shù)谝淮问褂脮r(shí),我們看到大致相同的性能,并認(rèn)為這可以接受,但然后我們閱讀 TensorFlow 的性能指南(https://www.tensorflow.org/performance/performance_guide),并切換到 NCHW 并融入批處理規(guī)范(batch norm),然后一切運(yùn)行得更快了。我猜 Theano 本身就不是很快……

關(guān)于開發(fā)人員的反饋速度:我曾在 TF 的問題區(qū)提出了一些微不足道的問題,但 TF 開發(fā)人員通常在一兩天內(nèi)就回復(fù)我了。

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

TensorFlow 當(dāng)然也有幾個(gè)缺點(diǎn),例如在實(shí)踐中部署到 iOS,但這說來話長。使用 TensorFlow 不是沒有痛苦,但與需要 Python runtime 的 Theano 相比,這還算什么事情嗎?這是相當(dāng)大的進(jìn)步。

如果你使用 TensorFlow,我強(qiáng)烈建議你看看 tf.layers 或 TF-Slim。具體的說,tf.layers 本質(zhì)上嵌入了 Keras API。

盡管我不指望任何有意義的性能差異;本帖討論的操作最終定義了一個(gè)靜態(tài)計(jì)算圖形(computation graph),所以使用像 Keras 這樣的包裝器本身并不增加資源消耗,除了在圖形定義時(shí)最小的資源占用,但是如果你原來使用 Theano,你會(huì)感到 TensorFlow 的啟動(dòng)時(shí)間快得多(以秒計(jì)而不是以分鐘計(jì)的編譯速度)。

遵循 TensorFlow 性能指南(TensorFlow performance guide)非常有用。在 DenseNet(L = 40,k = 12)模型上,從默認(rèn)的 NHWC 和未融入批處理規(guī)范切換到 NCHW 和融入批處理規(guī)范后,我們的每個(gè) epoch 時(shí)間都下降了超過 30%。在 WRN-16-4 模型上,我們看到 epoch 時(shí)間下降了超過 20%。

badmephisto的回復(fù):

我認(rèn)為在深度神經(jīng)網(wǎng)絡(luò)庫的設(shè)計(jì)方面,PyTorch 目前已然接近啟發(fā)的高度。

  • 它屬于輕量級(jí);
  • 它目前位于 Python 中;
  • 它使你能夠明確地控制計(jì)算。沒有編譯器能自己妄圖變聰明來「幫助你」,或是將你的代碼加速;事實(shí)上大多編譯器在調(diào)試中會(huì)產(chǎn)生大量麻煩;
  • 它使 GPU 內(nèi)核調(diào)用之上僅有少量(可解釋的)抽象層,而這恰恰是高性能的保證;
  • 也許這是個(gè)人偏好,但我得到了與抽象有關(guān)的特定 OCD。每當(dāng)我要做艱巨的工作時(shí)都會(huì)很緊張,因?yàn)橐坏┪业奈磥肀恍孤?,我便能感覺到它那些無法擺脫且難以忍受的痛苦。相對(duì)簡單的事情理應(yīng)在引擎蓋之下發(fā)生的大多數(shù)情況下,這種感覺尤為強(qiáng)烈;
  • 調(diào)試更容易,因?yàn)樘囟ùa中會(huì)是特定行(而不是在距離使用大型或生成的 Graph 對(duì)象的 sess.run()很遠(yuǎn)的地方)失敗。你的堆棧跟蹤不會(huì)填滿三個(gè)屏幕來讓你玩「找找錯(cuò)誤在哪里!」的豎版卷軸游戲;
  • 不存在編譯時(shí)間。我無法理解 Theano 用戶是如何處理的,他們一定更有耐心;
  • 你可以直接操作漸變,顯然,做一些事情時(shí)可以更容易,也更自然(如在反向傳播過程中的漸變剪輯,或各種「破碎的反向傳播」的有關(guān)想法,就像最近的 Shake Shake reg 命令一樣;的確,我認(rèn)為你可以用 stop_gradient 破解一個(gè)解決方案);
  • 它對(duì)動(dòng)態(tài)圖的支持從一開始就是自上而下的設(shè)計(jì)原則,而非隨之而至的事后想法。并且我們會(huì)看到更多的動(dòng)態(tài)圖表,如做成一大塊 NLP,或是神經(jīng)模塊網(wǎng) ;
  • 它沒有縮進(jìn)或膨脹你的代碼的顯式會(huì)話對(duì)象;
  • 它獲得的抽象是正確的:raw numpy - > Tensors(但 GPU 上的 raw numpy 可能對(duì)深度學(xué)習(xí)一無所知!)- >變量(它們了解深度學(xué)習(xí)),并且 Modules 或 Optim 等等會(huì)稍有益處。

到目前為止,我與 TF 的有關(guān)經(jīng)驗(yàn)有些膨脹,所以即便是像數(shù)據(jù)驅(qū)動(dòng)初始化這樣理應(yīng)很簡單的事情,也會(huì)用到一些 tricks。當(dāng)然,TF 的開發(fā)者有他們的一套解決方案,但往往涉及你從未聽說過的 5 個(gè) TensorFlow 函數(shù)的組合。我不記得曾用 Torch 做過這些,又或許我現(xiàn)在做的事情更復(fù)雜。

免責(zé)聲明:我仍行進(jìn)于對(duì) PyTorch 進(jìn)行嘗試的漫漫征途中;所以我的經(jīng)驗(yàn)是基于在 TensorFlow 做了很多復(fù)雜事情,而在 PyTorch 上才剛剛開始的背景上得到的。讓我們看看未來會(huì)發(fā)生什么。

jeremyhoward的回復(fù):

對(duì)于 http://course.fast.ai 的第 2 部分,我們從 keras + theano(第 1 部分)切換到 Keras、TensorFlow 和 PyTorch 合用的狀態(tài)。一般而言,使用 PyTorch 總是令人愉快的,主要是因?yàn)椋?/p>

  • 動(dòng)態(tài)計(jì)算使很多事情更加容易,如 seq2seq + attention 的神經(jīng)翻譯很難通過 keras + tf 來實(shí)現(xiàn),但使用 PyTorch 便會(huì)很容易;
  • 更容易調(diào)試,因?yàn)槟憧梢灾皇褂脴?biāo)準(zhǔn)的 PyThon 工具;
  • PyTorch 讓自定義的實(shí)現(xiàn)更加容易,所以你得以將更多時(shí)間專注于算法中,這樣往往能夠改進(jìn)主要性能;
  • 使 Multi-gpu 簡單易懂;
  • Torch-vision 使加載和變換圖像變得容易。

TensorFlow 的 API 非常荒謬,它在每個(gè)階段都會(huì)重新發(fā)明輪子,并且要求開發(fā)者學(xué)習(xí)很多本不必要的新概念。然而,開發(fā)者峰會(huì)表示這一境況正在改善——而且同時(shí)使用 TensorFlow Servin 和 Cloud ML 會(huì)提高你的生產(chǎn)力。

Powlerbare的回復(fù):

我大約在半年前使用 TensorFlow 實(shí)現(xiàn)了一些 seq2seq 模型,并意識(shí)到為何 TensorFlow 很好用:它的內(nèi)置組件很棒,讓研究變得就像有老師在推動(dòng)著你一樣容易,而注意與損失函數(shù)就如同噪聲對(duì)比估測,等等。倘若我收集基線或修改函數(shù),一切都會(huì)變?nèi)菀?。我已?jīng)習(xí)慣于搜索代碼庫,并確定究竟哪種函數(shù)在運(yùn)作(如果不小心,某些可選的函數(shù)默認(rèn)值便會(huì)得到不好的結(jié)果)——并且我對(duì)基于這些實(shí)現(xiàn)的大部分報(bào)告結(jié)果非常有信心。

下面是幾點(diǎn)與我所愛的 PyTorch 有關(guān),而 TensorFlow 卻不會(huì)提供的事項(xiàng):

1)PyTorch 提供了一個(gè)強(qiáng)化功能,我很喜歡它。增強(qiáng)功能基本上不會(huì)在實(shí)現(xiàn)中產(chǎn)生過多資源消耗,能有一些內(nèi)置函數(shù)來調(diào)用 RL 的感覺真棒。

2)我并未大量使用 autograd,因?yàn)槟菚r(shí)它速度很慢,但人們感覺用它來做一些沒譜的事情很有趣。我是這個(gè)范例的死忠粉,因?yàn)槲覜]來由地鐘愛在 numpy 上編寫網(wǎng)絡(luò)。

【本文是51CTO專欄機(jī)構(gòu)機(jī)器之心的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】

戳這里,看該作者更多好文

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2019-07-27 09:40:56

MySQLPG數(shù)據(jù)庫

2020-06-08 11:30:04

PGMySQL數(shù)據(jù)庫

2017-03-01 20:18:04

2021-07-01 16:45:17

PyTorchTensorflow 機(jī)器學(xué)習(xí)

2021-12-19 22:51:24

PyTorchTensorFlow框架

2021-06-28 11:17:14

CoutPrintf接口

2022-02-04 00:10:14

手機(jī)關(guān)機(jī)卡頓

2022-09-02 08:28:44

AWS多云云提供商

2016-08-05 14:23:15

系統(tǒng)

2020-12-08 10:25:56

HibernateMyBatis數(shù)據(jù)庫

2019-09-01 19:19:04

TensorFlowPyTorch深度學(xué)習(xí)

2023-05-28 13:03:46

BeegoGin設(shè)計(jì)

2020-10-15 11:22:34

PyTorchTensorFlow機(jī)器學(xué)習(xí)

2020-08-18 16:10:44

ManjaroArch LinuxLinux

2023-09-05 07:32:22

vscode開源故障

2021-04-12 08:01:21

GridFlexbox網(wǎng)格

2024-07-10 10:54:44

2018-12-11 12:38:23

UbuntuMint發(fā)行版

2021-03-15 10:03:10

框架自動(dòng)化開發(fā)

2019-10-21 13:40:20

代碼開發(fā)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)