上線倆月,TensorFlow 2.0被吐槽太難用,網(wǎng)友:看看人家PyTorch
TensorFlow 被吐槽不好用,也不是一天兩天了。TensorFlow 2.0 的發(fā)布似乎將這種「民怨」推上了高潮。
昨天,一位 reddit 網(wǎng)友說自己正在嘗試從 PyTorch 轉(zhuǎn)到 TF 2. 0(雖然沒有說為什么這么想不開),但他吐槽說:真是「太難了」。
這篇吐槽 TensorFlow 2.0 的帖子,讓深有同感的網(wǎng)友們瘋狂點(diǎn)贊。
切換之后,TF 2.0 給他的最大感覺是:這個(gè)庫本身沒有什么問題,真正的問題在于缺乏官方指南、詳細(xì)的說明文檔以及來自官方開發(fā)團(tuán)隊(duì)的答疑。
首先,ta 感覺 TensorFlow 信息不全:很多在用戶中非常常見的 pipeline 都要自己動(dòng)手做。而且,無論做什么似乎都有很多種方法。令人頭疼的是,這些方法都有細(xì)微的差別,但官方文檔并沒有告訴你有哪些差別,你只能苦哈哈地翻他們的 GitHub issue,找不找得到全憑運(yùn)氣。
其次,ta 發(fā)現(xiàn),medium 上有很多非正式的 TF 2.0 相關(guān)博客,但這些博客中包含很多錯(cuò)誤信息,還有一些是廣告。
最后,ta 發(fā)現(xiàn)網(wǎng)上有很多關(guān)于 TF 的提問,但卻沒人回答,有些甚至是一年前提出的。這些問題質(zhì)量很高,而且都是官方文檔里沒有提及的。相比之下,PyTorch 有一個(gè)論壇,在上面問問題可以得到 PyTorch 開發(fā)人員的解答,這方面要比 TensorFlow 好太多。
發(fā)帖者還對(duì)比了一下 TensorFlow 和 PyTorch 積壓的問題,發(fā)現(xiàn) PyTorch 積壓未回答的問題只有 2101 個(gè),但 TensorFlow 卻達(dá)到了 24,066 個(gè)。差距之大觸目驚心。
所以,作者的總體感覺是,TensorFlow 架構(gòu)本身問題不大,但給人的用戶體驗(yàn)是在是太差了。
最后,這位網(wǎng)友不禁發(fā)出了靈魂追問:「如果不提供足夠的信息讓用戶掌握最佳的使用方式,東西做得再好又有什么用呢?」
所謂一石激起千層浪。這位網(wǎng)友的抱怨引來了大批 TFboys(girls)的共鳴,該貼也成為 TF2.0 的大型吐槽現(xiàn)場。
TF2.0 遭遇瘋狂吐槽
除了贊同發(fā)帖者提出的幾個(gè)問題外,跟帖的網(wǎng)友還指出了 TensorFlow 2.0 本身存在的一些問題,如與 Keras 的整合。
跟帖網(wǎng)友的主要觀點(diǎn)可以歸納如下:
官方文檔不足/官方文檔不好找;
很多 Bug 沒有及時(shí)修復(fù)或更新;
和 Keras 的整合很不好,導(dǎo)致用戶混亂。
2.0 版本的文檔和教程有很多不足
一位網(wǎng)友寫道:「在過去 TF 的黃金時(shí)期,有很多容易上手的教程,官網(wǎng)上的教程質(zhì)量也很高。但是自從 Keras 被引入后,整個(gè)指引文檔成了 Keras 和經(jīng)典 TF 的混合?!惯@段評(píng)論得到了很多人的贊同。一些人表示,TF1.x 版本盡管學(xué)習(xí)成本很高,但是(教程)是非常連貫的,況且還有 tensor2tensor 這樣的代碼庫,使得舊版本的使用并不是那么困難。
官方教程缺失使得社區(qū)只好自力更生,很多人不得不去其他渠道尋找相關(guān)教程和指南。但是非官方的教程也不一定靠譜。比如下面一位網(wǎng)友就寫到:
我的故事:
1. 我有個(gè)想法,我想要在訓(xùn)練過程中逐漸改變損失函數(shù)的『形狀』;
2. 我搜索『tensorflow 在訓(xùn)練中改變損失函數(shù)』;
3. 最高搜索結(jié)果是一個(gè) Medium 的文章,我們?nèi)タ纯窗桑?/p>
4. 這個(gè) Medium 文章介紹的是均方誤差(MSE)損失函數(shù),以及你怎樣在 TensorFlow 中用它訓(xùn)練一個(gè)深度神經(jīng)網(wǎng)絡(luò);
5. 我只好用腦袋砸鍵盤了。
不僅僅是教程文不對(duì)題的問題。正如發(fā)帖者所說,非官方的教程也會(huì)有很多錯(cuò)誤,增加了用戶解決問題的成本。久而久之,大家自然都不愿意用 TF2.0 了。
此外,跟帖者的反饋也證實(shí)了發(fā)帖者提出的第三個(gè)問題:太多問題和反饋沒有及時(shí)處理。
反饋延遲,bug 積壓
可能是因?yàn)?TF 社區(qū)本身就比較火爆,對(duì)框架的提問和反饋會(huì)更多,因此 TF 官方對(duì)問題的回復(fù)和 bug 的修復(fù)似乎比 PyTorch 要慢。正如發(fā)帖者所說,TensorFlow 待回答問題數(shù)量比 PyTorch 高了 10 倍還要多。更何況,PyTorch 還有一個(gè)專門的團(tuán)隊(duì)在平臺(tái)上負(fù)責(zé)解答疑問。
對(duì)于一個(gè)開源軟件來說,提高其性能、易用性、安全性及減少 bug 的最佳方式是不斷地收集用戶反饋、給予回復(fù)、并根據(jù)反饋修復(fù)錯(cuò)誤和問題。但是,如果 TF2.0 沒有及時(shí)對(duì)這些出現(xiàn)的問題進(jìn)行處理,則軟件本身不可能繼續(xù)進(jìn)步。
正是因?yàn)橛脩粲龅絾栴}時(shí) TF 官方能夠及時(shí)跟進(jìn)并改進(jìn)問題,用戶才會(huì)繼續(xù)留存。有位網(wǎng)友就評(píng)論說,他在使用 TF2.0 的過程中遇到了很多問題,但是幸好有官方的開發(fā)經(jīng)理跟進(jìn)和解決,所以他才愿意繼續(xù)留在 TF2.0 上繼續(xù)使用。
除了這兩個(gè)問題,很多人還是回到了吐槽 Keras 和 TF 的結(jié)合上。
Keras 讓使用變得更困難
一些網(wǎng)友認(rèn)為,TF2.0 還有一個(gè)不好用的地方,那就是 Keras 和 TF2.0 的「聯(lián)姻」。上圖的這位就表示,eager 模式的確是 TF 版本更新迭代的正確方向(畢竟去掉了 session 這個(gè)萬惡之源,支持動(dòng)態(tài)圖),但是引入 Keras 卻讓 API 又變得更混亂了?,F(xiàn)在人們有多種構(gòu)建模型的方法:tf.keras、tf.function 等等。
這些都是 TF2.0 目前遇到的問題,但是距離其第一個(gè)版本——alpha 發(fā)布已過去大半年,為什么還有這么多問題困擾著開發(fā)社區(qū)呢?機(jī)器之心通過整理過去發(fā)布的資料認(rèn)為,TF2.0 的設(shè)計(jì)思路可能有一些問題,導(dǎo)致原本朝著易用性發(fā)展的框架又變得難用了。
思路混亂,框架難用
TensorFlow2.0 本身的定位是:減少復(fù)雜和冗余的 API,降低用戶的使用門檻,推動(dòng)它向研究領(lǐng)域和深度學(xué)習(xí)普及方向發(fā)展。這一思路是正確的,但是在實(shí)際的設(shè)計(jì)階段,為了實(shí)現(xiàn)以上目的而采用的解決方法并不正確,最終導(dǎo)致 TF2.0 依然難用。
引入 Keras 可能是個(gè)錯(cuò)誤
Keras 是一個(gè)封裝了 TF 等深度學(xué)習(xí)框架的代碼庫,具有很好的易用性。TensorFlow 為了解決飽受詬病的上手困難問題而引入了 Keras 的 API。但是從 TensorFlow 的定位和功能來看,和 Keras 的結(jié)合在目前來說不夠成功。
如下圖所示,TensorFlow 本身在架構(gòu)上有著細(xì)粒度很高的低級(jí) API,這樣的框架很適合進(jìn)行各種方面的定制。但是 Keras 則正好和它相反,用戶不知道底層的架構(gòu)如何搭建,只需要關(guān)注整體的設(shè)計(jì)流程即可。
這兩個(gè)框架可以說是兩種極端,而在 TF2.0 里使用了一種妥協(xié)性的兼容形式:TF2.0 本身仿照 PyTorch 的方法構(gòu)建靈活的模型,而不需要這種設(shè)計(jì)的用戶則使用 tf.keras 高級(jí) API。這樣割裂的 API 使得用戶有些不知所措,也加大了他們在尋找教程的難度,因?yàn)樗麄兂怂阉?TF2.0 的同時(shí)還需要搞清楚:這個(gè)教程是關(guān)于 TF2.0 本身的,還是關(guān)于 tf.keras 的。
圖源:https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/
這就有點(diǎn)類似 TF1.x 時(shí)代各種各樣的 API 混雜的情況——同一個(gè)功能可以由不同的 API 實(shí)現(xiàn)。但是,在不同的功能 API 進(jìn)行組合的時(shí)候,某些 API 之間可能不兼容。
例如,我使用了 tf.keras,以 model = tf.keras.Sequential 的方式構(gòu)建了一個(gè)網(wǎng)絡(luò),它的 training loop 是什么樣的?我應(yīng)該使用 model.fit() 嗎?還是 with tf.GradientTape() as Tape ? 如果我想要自定義損失函數(shù)中某個(gè)標(biāo)簽的損失,我該在哪里修改?
多余的 API 增加了額外的學(xué)習(xí)成本,自然就讓用戶產(chǎn)生很多新的疑問。而這些疑問和錯(cuò)誤如果沒有及時(shí)解決,就會(huì)讓用戶喪失使用這個(gè)框架的興趣。
更何況,在分布式訓(xùn)練、數(shù)據(jù)并行/模型并行的需求下,框架越復(fù)雜,用戶就越難上手。TF2.0 的框架已經(jīng)非常復(fù)雜了。
現(xiàn)在的 TF2.0 架構(gòu)已經(jīng)非常復(fù)雜。圖源:https://www.pyimagesearch.com/2019/10/21/keras-vs-tf-keras-whats-the-difference-in-tensorflow-2-0/
大版本更新傷害老用戶
另一個(gè)麻煩的問題是,TF 2.0 無疑想讓它成為研究領(lǐng)域和生產(chǎn)領(lǐng)域都非常流行的深度學(xué)習(xí)框架。因此在版本更新的時(shí)候一步大跨越,砍掉了很多 1.x 時(shí)代的 API,希望讓追求簡單特性的用戶能夠使用它。
但是別忘了,生產(chǎn)級(jí)的代碼產(chǎn)品很怕的就是——突如其來的、沒有向下兼容的版本更新。很多企業(yè)一旦部署了某個(gè)模型,就會(huì)希望它能夠穩(wěn)定支撐業(yè)務(wù)運(yùn)行多年。除非有切實(shí)的需要(安全性問題、性能需要極大更新),否則他們是沒有很大動(dòng)力要更新的。
但是,為了吸引新用戶使用 TF2.0,官方就大手一揮砍掉了很多 API,還不兼容舊版本??紤]到重新開發(fā)、訓(xùn)練、部署模型的成本,以及這個(gè)過程中對(duì)企業(yè)業(yè)務(wù)造成的可能影響,業(yè)界對(duì)于這種更新興趣缺缺。更不用說,在新版本居然還有致命的 bug 的情況下。
在今年一月,用戶發(fā)現(xiàn) TF2.0 的 tf.keras API 中的 dropout 居然失效。雖然是測試版的問題,但是面對(duì)這樣不穩(wěn)定的更新,沒有幾個(gè)用戶敢更新使用。
更不用說版本更新給開源社區(qū)帶來的影響,很多開發(fā)者需要重新開始學(xué)習(xí) 2.0。從 1.x 到 2.0 的學(xué)習(xí)成本,這也是他們覺得 TF2.0 難用的一個(gè)原因。
此外,從時(shí)間上來看,TensorFlow 的推出要比 PyTorch 早好幾年,但最近卻被 PyTorch 步步緊逼。此前就有人猜測,TF 的團(tuán)隊(duì)可能分了三部分,一路人忙著開發(fā) 2.0,一路人忙著改變 eager,還有一部分人著力重構(gòu) Keras。這種分散精力的做法可能大大削弱 TensorFlow 在用戶體驗(yàn)方面的投入,所以造成現(xiàn)在「怨聲載道」的局面。
現(xiàn)在,TensorFlow 和 PyTorch 依然維持著「業(yè)界 vs 學(xué)界」分庭抗禮的局面。但是隨著 PyTorch 的高歌猛進(jìn),這樣的局面可能不久就會(huì)變化。
當(dāng)然,作為目前非常流行的深度學(xué)習(xí)框架之一,總有些人有需要使用 TensorFlow 2.0 的理由。對(duì)于這部分讀者,我們向大家推薦一個(gè) GitHub 教程:《TensorFlow 2.0 深度學(xué)習(xí)開源書》。該項(xiàng)目曾經(jīng)登上 GitHub 熱榜,目前已有 5500 星。該教程有配套學(xué)習(xí)的書、代碼和視頻課程,非常適合希望了解 tf2.0 的開發(fā)者學(xué)習(xí)參考。
項(xiàng)目鏈接:https://github.com/dragen1860/Deep-Learning-with-TensorFlow-book