2019深度學(xué)習(xí)框架決戰(zhàn):PyTorch橫掃AI頂會(huì),再奪NeurIPS 2019!
近日,Reddit的一則熱帖引發(fā)機(jī)器學(xué)習(xí)社區(qū)大量討論:
NeurIPS 2019使用的機(jī)器學(xué)習(xí)框架:PyTorch 68-> 166,TensorFlow 91-> 74
帖主Horace He是康奈爾大學(xué)的學(xué)生,他的研究興趣是編譯器和機(jī)器學(xué)習(xí)的交叉。他分析了 NeurIPS 2019論文使用的機(jī)器學(xué)習(xí)框架,發(fā)現(xiàn)相比2018年,今年使用PyTorch的論文從68篇增加到166篇,使用TensorFlow的從91篇減少到74篇。
從篇數(shù)上看,相比2018年,使用PyTorch的論文大幅增加,而TensorFlow略有下降
在所有提及TensorFlow/PyTorch的論文中,PyTorch占了69%
這印證了他的在上個(gè)月寫(xiě)了一篇題為《2019年機(jī)器學(xué)習(xí)框架的狀態(tài)》的文章,指出PyTorch的增長(zhǎng)在研究領(lǐng)域已經(jīng)大幅超越TensorFlow,研究人員正在放棄TensorFlow并大量涌向PyTorch。同時(shí),在工業(yè)界,Tensorflow當(dāng)前仍然是首選框架,但長(zhǎng)期來(lái)看可能并非如此。
這篇全面分析比較PyTorch和Tensorflow的增長(zhǎng)的文章當(dāng)時(shí)引起熱議,但有人質(zhì)疑:這些結(jié)果是否只適用于NLP會(huì)議?
現(xiàn)在,從NeurIPS會(huì)議的分析結(jié)果來(lái)看,答案是否定的。
也有人仍然認(rèn)為動(dòng)態(tài)圖/PyTorch只在NLP社區(qū)中流行。很顯然,事實(shí)并非如此。
從這些分析結(jié)果來(lái)看,PyTorch在深度學(xué)習(xí)研究,包括機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺(jué)和自然語(yǔ)言處理各領(lǐng)域都占據(jù)了主導(dǎo)地位,這點(diǎn)Yann LeCun也同意。
Yann LeCun:NeurIPS19論文使用深度學(xué)習(xí)框架中,超過(guò)69%提到了PyTorch。PyTorch在深度學(xué)習(xí)研究(ML/CV/NLP會(huì)議)中占據(jù)了主導(dǎo)地位。
上圖可以看出,各大ML/CV/NLP的頂會(huì)上,采用PyTorch的論文持續(xù)大幅增長(zhǎng),而TensorFlow增速減緩,甚至略有下降。
考慮到各大頂會(huì)錄取論文數(shù)量年年增長(zhǎng),只看絕對(duì)數(shù)量不能完全反映實(shí)際。上圖是采用PyTorch/TensorFlow的論文相對(duì)總論文數(shù)量的百分比,可以更明顯地看出這一趨勢(shì)。
Reddit網(wǎng)友:從TensorFlow轉(zhuǎn)PyTorch,真香
造成這一趨勢(shì)的原因是什么?PyTorch真的那么好用,足以讓一大批研究人員放棄TensorFlow涌向PyTorch嗎?
從Reddit網(wǎng)友的評(píng)論來(lái)看,改用PyTorch的一致表示“真香”:
過(guò)去兩年我一直使用Keras/TF,直到最近我才改用PyTorch?,F(xiàn)在我真的很喜歡PyTorch,我覺(jué)得它更簡(jiǎn)潔明了。只是我個(gè)人的看法。
我喜歡使用PyTorch來(lái)設(shè)計(jì)帶有怪異的訓(xùn)練、反向傳播圖和其他內(nèi)容的新模型。我覺(jué)得使用PyTorch,即使你不能快速部署標(biāo)準(zhǔn)模型,也可以更自由地設(shè)計(jì)自己的自定義算法。也許這就是為什么它主要用于研究。
我使用Tensorflow/Keras已經(jīng)有一段時(shí)間了。我記得的結(jié)論是,Tensorflow在生產(chǎn)部署方面更出色,PyTorch在研究中表現(xiàn)更好。我最近開(kāi)始使用PyTorch,不得不說(shuō)我真的很喜歡它,感覺(jué)它更“pythonic”。此外,通過(guò)諸如ONNX之類(lèi)的框架,部署(眾所周知的模型)也開(kāi)始變得不成問(wèn)題。兩者我都會(huì)繼續(xù)使用。
Tensorflow 2.0 vs PyTorch是一個(gè)艱難的選擇。
我喜歡Tensorflow,我也喜歡PyTorch。
TF是基于開(kāi)發(fā)的,PyTorch是基于研究的。
兩者都很需要。在我看來(lái),兩者是平等的。50-50
很長(zhǎng)一段時(shí)間以來(lái),TensorFlow有很多PyTorch沒(méi)有的“面向生產(chǎn)”的特性。例如部署到移動(dòng)端,能夠在沒(méi)有python環(huán)境的情況下運(yùn)行,有很多方法可以最大化模型的性能(量化等等)。
如果你要在生產(chǎn)中部署模型,那么業(yè)界仍然首選TF。除非他們能讓PyTorch的production pipeline不那么糟糕,否則這種情況將一直持續(xù)下去。
總體來(lái)看,網(wǎng)友的體驗(yàn)與Horace He的分析在很大程度上是一致的。但PyTorch究竟好用在哪里呢,Horace He的文章還細(xì)致分析了兩者各自的特性、優(yōu)勢(shì)和不足,并討論了機(jī)器學(xué)習(xí)框架的未來(lái)。
2019年機(jī)器學(xué)習(xí)框架之戰(zhàn),PyTorch還是TensorFlow?
自2012年深度學(xué)習(xí)重新獲得重視以來(lái),許多機(jī)器學(xué)習(xí)框架便爭(zhēng)相成為研究人員和行業(yè)從業(yè)人員的新寵。從早期的學(xué)術(shù)成果Caffe和Theano到龐大的產(chǎn)業(yè)支持的PyTorch和TensorFlow,在這么多選擇中,到底最流行的是哪一個(gè)?
如果你只瀏覽Reddit,則可能會(huì)假設(shè)每個(gè)人都在用PyTorch。若從Francois Chollet的Twitter來(lái)判斷,TensorFlow或Keras可能是主流,而PyTorch卻停滯不前。
在2019年,機(jī)器學(xué)習(xí)框架之戰(zhàn)還有兩個(gè)主要競(jìng)爭(zhēng)者:PyTorch和TensorFlow。分析表明,研究人員正在放棄TensorFlow并大量涌向PyTorch。同時(shí),在行業(yè)中,Tensorflow當(dāng)前是首選平臺(tái),但從長(zhǎng)遠(yuǎn)來(lái)看可能并非如此。
PyTorch在研究領(lǐng)域的主導(dǎo)地位不斷提升
先來(lái)看看數(shù)據(jù)。下圖顯示了從2017~2019年,在主要機(jī)器學(xué)習(xí)頂會(huì)上,僅提及PyTorch的論文和使用TensorFlow或PyTorch的論文之間的比例。可以看出,所有的線(xiàn)條都在向上傾斜,并且在2019年的每個(gè)主要會(huì)議上,大多數(shù)論文都在PyTorch中實(shí)現(xiàn)。
詳見(jiàn):https://chillee.github.io/pytorch-vs-tensorflow/
如果你需要更多證據(jù)證明PyTorch在學(xué)術(shù)界的發(fā)展有多快,下面是PyTorch與TensorFlow被提及數(shù)量的對(duì)比圖。
PyTorch和TensorFlow被單獨(dú)提及的數(shù)量
在2018年,PyTorch還是少數(shù)。現(xiàn)在,PyTorch已是主流,CVPR使用PyTorch的占 69%,NAACL和ACL中占75%以上,而ICLR和ICML中占50%以上。雖然PyTorch在視覺(jué)和語(yǔ)言會(huì)議上的統(tǒng)治地位最強(qiáng)(PyTorch與TensorFlow相比是2:1和3:1),但在ICLR和ICML等常規(guī)機(jī)器學(xué)習(xí)會(huì)議上,PyTorch也比TensorFlow受歡迎。
雖然有人認(rèn)為PyTorch仍然是一個(gè)新興的框架,試圖在TensorFlow主導(dǎo)的世界中開(kāi)拓一席之地,但數(shù)據(jù)顯示并非如此。除了ICML之外,在任何一次會(huì)議上,TensorFlow的增長(zhǎng)都與論文的總體增長(zhǎng)保持一致。在NAACL、ICLR和ACL,Tensorflow今年的論文數(shù)量實(shí)際上比去年少。
PyTorch不用擔(dān)心自己的未來(lái),需要擔(dān)心的是TensorFlow。
為什么研究人員喜歡PyTorch?
- 簡(jiǎn)單。它類(lèi)似于numpy,非常具有python風(fēng)格,并且可以輕松地與Python生態(tài)系統(tǒng)的其余部分集成。例如,只需在PyTorch模型中的任何地方插入一個(gè)pdb斷點(diǎn),它就可以工作了。在TensorFlow中,調(diào)試模型需要一個(gè)活動(dòng)會(huì)話(huà)(active session),并且最終變得更加棘手。
- 很棒的API。與TensorFlow的API相比,大多數(shù)研究人員更喜歡PyTorch的API。一個(gè)原因是PyTorch的設(shè)計(jì)更好,另一個(gè)原因是TensorFlow通過(guò)多次切換API(例如‘layers’ -> ‘slim’ -> ‘estimators’ -> ‘tf.keras’)把自己搞殘了。
- 性能。盡管事實(shí)上PyTorch的動(dòng)態(tài)圖提供的優(yōu)化機(jī)會(huì)很少,但是有許多傳聞稱(chēng)PyTorch的速度和TensorFlow一樣快,甚至比TensorFlow還快。目前尚不清楚這是否真的成立,但至少,TensorFlow在這一領(lǐng)域還沒(méi)有獲得決定性的優(yōu)勢(shì)。
TensorFlow的研究前景如何?
即使TensorFlow在功能方面與PyTorch不相上下,但PyTorch已經(jīng)覆蓋了社區(qū)的大部分。這意味著PyTorch將更容易找到,作者將更有動(dòng)力在PyTorch中發(fā)布代碼(以便人們使用它),并且你的合作者很可能會(huì)更喜歡PyTorch。因此,如果真的發(fā)生的話(huà),任何回到Tensorflow 2.0的遷移都可能很慢。
TensorFlow在Google / DeepMind中將始終擁有一定的受眾群體,但不知道Google是否最終會(huì)放棄。即使是現(xiàn)在,Google想要招募的許多研究人員已經(jīng)在不同層次上偏愛(ài)PyTorch,而且還聽(tīng)到有人抱怨說(shuō)Google內(nèi)部的許多研究人員都希望使用TensorFlow以外的框架。
此外,PyTorch的統(tǒng)治地位可能會(huì)開(kāi)始將Google研究人員與其他研究群體隔離開(kāi)來(lái)。他們不僅很難在外部研究的基礎(chǔ)上進(jìn)行構(gòu)建,而且外部研究人員也不太可能在Google發(fā)布的代碼基礎(chǔ)上進(jìn)行構(gòu)建。
PyTorch和TensorFlow用于生產(chǎn)
盡管PyTorch現(xiàn)在在研究領(lǐng)域占據(jù)主導(dǎo)地位,但縱觀業(yè)界,TensorFlow仍然是主導(dǎo)框架。例如,根據(jù)2018年至2019年的招聘網(wǎng)站數(shù)據(jù),TensorFlow有1541個(gè)新職位,PyTorch有1437個(gè)新職位。TensorFlow的Medium文章有3230篇,PyTorch則有1200篇;TensorFlow有13700顆GitHub新星,PyTorch有7200顆,等等。
因此,如果PyTorch在學(xué)界中如此流行,為什么它沒(méi)有在業(yè)界獲得同樣的成功呢?一個(gè)顯而易見(jiàn)的第一個(gè)答案就是懶(inertia)。Tensorflow比PyTorch早幾年問(wèn)世,業(yè)界采用新技術(shù)的速度比研究人員慢。另一個(gè)原因是TensorFlow在生產(chǎn)方面比PyTorch更好。但是,這是什么意思?
要回答這個(gè)問(wèn)題,我們需要知道研究人員和行業(yè)的需求有何不同。
研究人員在意他們能夠以多快的速度進(jìn)行研究,該研究通常是在相對(duì)較小的數(shù)據(jù)集(可以放在一臺(tái)機(jī)器上的數(shù)據(jù)集)上運(yùn)行的,并且運(yùn)行在<8個(gè)GPU上。通常,研究人員考慮的是速度而非性能,即哪個(gè)能讓他們快速實(shí)踐新想法。相反,業(yè)界認(rèn)為性能是重中之重。盡管將運(yùn)行速度提高10%對(duì)研究人員來(lái)說(shuō)毫無(wú)意義,但這可以直接為公司節(jié)省數(shù)百萬(wàn)美元的費(fèi)用。
另一個(gè)區(qū)別是部署。研究人員將在自己的計(jì)算機(jī)或?qū)S糜谶\(yùn)行研究工作的服務(wù)器群集上進(jìn)行實(shí)驗(yàn)。相反,業(yè)界有很多限制/要求:
- 無(wú)Python。一些公司會(huì)運(yùn)行服務(wù)器,而高昂的Python運(yùn)行開(kāi)銷(xiāo)無(wú)法承受。
- 移動(dòng)。無(wú)法在mobile binary中嵌入Python interpreter。
- 服務(wù)。一個(gè)全面的功能,如不停機(jī)更新模型,無(wú)縫切換模型,在預(yù)測(cè)時(shí)間批處理,等等。
TensorFlow是專(zhuān)門(mén)針對(duì)這些需求而構(gòu)建的,并為所有這些問(wèn)題提供了解決方案:圖形格式和執(zhí)行引擎本來(lái)就不需要Python,TensorFlow Lite和TensorFlow Serving服務(wù)分別考慮了移動(dòng)和服務(wù)。
從歷史上看,PyTorch未能滿(mǎn)足這些考慮,因此大多數(shù)公司目前在生產(chǎn)中使用TensorFlow。
Tensorflow Eager
在 API 級(jí)別,TensorFlow eager 模式與 PyTorch 的 eager 模式本質(zhì)上是相同的。eager 模式為 TensorFlow 提供了 PyTorch 的大部分優(yōu)勢(shì) (易用性、可調(diào)試性等)。
然而,這也給了 TensorFlow 帶來(lái)了同樣的缺點(diǎn)。TensorFlow eager 模型不能導(dǎo)出到非 python 環(huán)境,不能進(jìn)行優(yōu)化,不能在移動(dòng)設(shè)備上運(yùn)行,等等。
這將 TensorFlow 置于與 PyTorch 相同的位置,它們以本質(zhì)上相同的方式進(jìn)行解析 —— 你可以跟蹤代碼 (tf.function) 或重新解釋 Python 代碼 (Autograph)。
因此,TensorFlow 的 eager 模式并不能真正做到 “兩全其美”。盡管可以使用 tf 將代碼轉(zhuǎn)換為靜態(tài)圖,但這不是一個(gè)無(wú)縫的過(guò)程。跟蹤代碼會(huì)受到限制,重新解釋 Python 代碼本質(zhì)上需要重寫(xiě)大部分 Python 編譯器。當(dāng)然,通過(guò)將范圍限制為用于深度學(xué)習(xí)的 Python 子集,可以大大簡(jiǎn)化范圍。
PyTorch占領(lǐng)研究界,TensorFlow統(tǒng)治工業(yè)界
至此,我們得出了機(jī)器學(xué)習(xí)框架當(dāng)前的現(xiàn)狀:
- PyTorch 占領(lǐng)了研究界,并試圖將其在研究領(lǐng)域的成功推廣到工業(yè)界。
- TensorFlow 試圖在不犧牲太多生產(chǎn)能力的情況下,遏制其在研究領(lǐng)域的損失。
當(dāng)然,PyTorch 要在業(yè)界產(chǎn)生有意義的影響還需要很長(zhǎng)一段時(shí)間 ——TensorFlow 太根深蒂固了,而行業(yè)變化緩慢。
不過(guò),從 TensorFlow 1.0 過(guò)渡到 2.0 會(huì)是困難的,這為公司考慮采用 PyTorch 提供了機(jī)會(huì)。
未來(lái)將取決于誰(shuí)能更好地回答下列問(wèn)題。
- 研究人員的偏好會(huì)對(duì)業(yè)界產(chǎn)生多大的影響?
現(xiàn)在這批博士生即將畢業(yè),他們將帶上 PyTorch 進(jìn)入業(yè)界。這種偏好是否足夠強(qiáng)大,以至于公司會(huì)出于招聘目的選擇 PyTorch?創(chuàng)業(yè)的畢業(yè)生會(huì)為自己的公司選擇 PyTorch 嗎 ?
- TensorFlow 的 eager 模式在可用性方面能趕上 PyTorch 嗎?
在線(xiàn)社區(qū)給我的印象是,TensorFlow Eager 深受性能 / 內(nèi)存問(wèn)題的困擾,而 Autograph 系列也有自己的問(wèn)題。谷歌將花費(fèi)大量的工程努力,但 TensorFlow 卻受歷史包袱拖累。
- PyTorch 達(dá)到生產(chǎn)狀態(tài)的速度有多快?
PyTorch 仍有許多基本問(wèn)題問(wèn)題沒(méi)有解決 —— 沒(méi)有好的量化指標(biāo)、不支持移動(dòng)設(shè)備、服務(wù)性等等。在這些問(wèn)題解決之前,PyTorch 不會(huì)成為許多公司的選擇。注:在本文發(fā)布的當(dāng)天,PyTorch 就宣布了對(duì)量化和移動(dòng)的支持。這兩種方法都還處于試驗(yàn)階段,但是對(duì)于 PyTorch 來(lái)說(shuō)已經(jīng)取得了重大進(jìn)展。
- 谷歌在行業(yè)上的孤立會(huì)傷害它嗎?
谷歌推動(dòng) TensorFlow 的主要原因之一是幫助其迅速發(fā)展的云服務(wù)。由于谷歌試圖擁有整個(gè) ML 垂直市場(chǎng),這可能激勵(lì)競(jìng)爭(zhēng)的公司 (微軟、亞馬遜、英偉達(dá)等) 支持唯一的替代機(jī)器學(xué)習(xí)框架,即 PyTorch。
機(jī)器學(xué)習(xí)框架的下一步:高階微分和代碼生成
下一步是什么
機(jī)器學(xué)習(xí)框架在很大程度上影響了ML研究,這一點(diǎn)或許沒(méi)有得到充分的認(rèn)識(shí)。它們不僅使機(jī)器學(xué)習(xí)研究成為可能,它們還使研究人員能夠輕松探索的想法成為可能,或?qū)@些想法加以限制。有多少新生的想法僅僅因?yàn)闆](méi)法簡(jiǎn)單地在一個(gè)框架中表達(dá)而粉碎?PyTorch可能已經(jīng)達(dá)到了本地研究的最低要求,但值得探討的是,其他框架提供了什么,以及它們可能帶來(lái)哪些研究機(jī)會(huì)。
高階微分:
PyTorch和Tensorflow的核心是自動(dòng)微分框架。也就是說(shuō),它們?cè)试S對(duì)某個(gè)函數(shù)求導(dǎo)。然而,有許多方法可以實(shí)現(xiàn)自動(dòng)微分,大多數(shù)現(xiàn)代ML框架選擇的特定實(shí)現(xiàn)稱(chēng)為“反向模式自動(dòng)微分”,更常見(jiàn)的說(shuō)法是“反向傳播”。這個(gè)實(shí)現(xiàn)被證明對(duì)神經(jīng)網(wǎng)絡(luò)求導(dǎo)非常有效。
但是,計(jì)算高階導(dǎo)數(shù)(Hessian/Hessian向量?jī)?nèi)積)的情況有所變化。有效地計(jì)算這些需要所謂的“前向模式自動(dòng)微分”。如果沒(méi)有這種能力,計(jì)算Hessian向量?jī)?nèi)積可能會(huì)慢幾個(gè)數(shù)量級(jí)。
Jax是由Autograd的同一幫人構(gòu)建的,具有正向和反向模式自動(dòng)微分的特性。這使得計(jì)算高階導(dǎo)數(shù)的速度比PyTorch/TensorFlow快幾個(gè)數(shù)量級(jí)。
然而,Jax提供的不僅僅是高階導(dǎo)數(shù)。Jax開(kāi)發(fā)人員將Jax視為組合任意函數(shù)轉(zhuǎn)換的框架,包括vmap(用于自動(dòng)批處理)或pmap(用于自動(dòng)并行處理)。
最初的autograd有一批忠實(shí)追隨者(盡管沒(méi)有GPU支持,ICML仍然有11篇論文還是使用了它),Jax很可能很快就會(huì)形成一個(gè)類(lèi)似的忠實(shí)社區(qū),將它用于各種n階導(dǎo)數(shù)。
代碼生成
當(dāng)運(yùn)行PyTorch/TensorFlow模型時(shí),大部分工作實(shí)際上并不是在框架中完成的,而是由第三方內(nèi)核完成的。這些內(nèi)核通常由硬件供應(yīng)商提供,由高級(jí)框架可以利用的操作符庫(kù)組成。比如MKLDNN(用于CPU)或cuDNN(用于Nvidia GPU)。更高級(jí)的框架將它們的計(jì)算圖分解成多個(gè)塊,然后這些塊可以調(diào)用這些計(jì)算庫(kù)。這些庫(kù)代表了數(shù)千小時(shí)的工作,并且經(jīng)常針對(duì)架構(gòu)和應(yīng)用程序進(jìn)行優(yōu)化以獲得最佳性能。
然而,最近對(duì)非標(biāo)準(zhǔn)硬件、稀疏/量化張量和新運(yùn)算符的興趣暴露了依賴(lài)這些運(yùn)算符庫(kù)的一個(gè)主要缺陷:它們不靈活。如果你想在研究中使用一個(gè)新的運(yùn)算符,比如膠囊網(wǎng)絡(luò),你會(huì)怎么做?如果你想在ML框架不支持的新硬件加速器上運(yùn)行模型,該怎么辦?現(xiàn)有的解決方案往往達(dá)不到要求。
每一個(gè)新的硬件結(jié)構(gòu)、張量類(lèi)別或運(yùn)算符都大大增加了這個(gè)問(wèn)題的難度。有很多工具 (Halide, TVM, PlaidML, Tensor Comprehensions, XLA, Taco, etc)可以處理,但是仍沒(méi)有一個(gè)正確的方法。
如果不投入更多的工作來(lái)解決這個(gè)問(wèn)題,我們就會(huì)有將ML研究過(guò)度適合于現(xiàn)有工具的風(fēng)險(xiǎn)。
機(jī)器學(xué)習(xí)框架的未來(lái)
這些對(duì)于TensorFlow和PyTorch的未來(lái)來(lái)說(shuō)是激動(dòng)人心的時(shí)刻。它們的設(shè)計(jì)已經(jīng)趨同到這樣一個(gè)地步,以至于任何一個(gè)框架都不會(huì)憑借其設(shè)計(jì)而獲得決定性的勝利。雙方都劃出了各自的領(lǐng)域——一方占據(jù)研究界,另一方占據(jù)工業(yè)界。
就我個(gè)人而言,在PyTorch和TensorFlow之間,我傾向于PyTorch。機(jī)器學(xué)習(xí)仍然是一個(gè)研究驅(qū)動(dòng)的領(lǐng)域。工業(yè)界不能忽視研究成果,只要PyTorch主導(dǎo)研究,就會(huì)迫使公司轉(zhuǎn)向PyTorch。
然而,快速發(fā)展的不僅僅是框架。機(jī)器學(xué)習(xí)研究本身也處于快速的變化之中。不僅框架會(huì)改變——5年后使用的模型/硬件/范例都可能與我們今天使用的有很大的不同。也許隨著另一種計(jì)算模型占據(jù)主導(dǎo)地位,PyTorch和TensorFlow之爭(zhēng)將變得無(wú)關(guān)緊要。
我們大多數(shù)人從事機(jī)器學(xué)習(xí)工作不是為了賺錢(qián),也不是為了協(xié)助公司的戰(zhàn)略計(jì)劃。我們從事機(jī)器學(xué)習(xí)是因?yàn)槲覀冴P(guān)心——關(guān)于推進(jìn)機(jī)器學(xué)習(xí)研究,關(guān)于人工智能的民主化,或者僅僅是關(guān)于構(gòu)建有趣的東西。不管你是喜歡TensorFlow還是PyTorch,我們都在努力讓機(jī)器學(xué)習(xí)軟件做到最好。