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