TensorFlow驚現大bug?網友:這是逼著我們用PyTorch啊

2020-12-11 機器之心Pro

機器之心報導

參與:魔王、陳萍

誕生五年的 TensorFlow 出現大 bug,使用對應訓練方式得到的模型甚至論文結果可能受到波及,然而相關 issue 提交 24 天后依然沒有 TensorFlow 開發團隊的處理。用戶表示很失望,「怒而轉用 PyTorch」。在事情發酵後,TensorFlow 團隊終於回復了,表示已經在改,但對應的功能將在 2.4 版本中才能用。

谷歌團隊 2015 年發布的 TensorFlow 框架是目前機器學習領域最流行的框架之一。雖然後起之秀 PyTorch 奮起直追,但 TensorFlow 框架的使用者仍然眾多。

TensorFlow 經常被吐槽難用、新版本也常常收到差評,但不管怎樣,已經誕生五年之久的 TensorFlow 應該不會有什麼太大的 bug 吧?然而,事實似乎並非如此。

最近,機器學習工程師 Santosh Gupta 在使用 TensorFlow 時發現了一個問題:使用 Keras 功能 API 創建的模型自定義層中的權重無法進行梯度更新。

issue 詳情:https://github.com/tensorflow/tensorflow/issues/40638

這個帖子在 reddit 上引起了熱議,網友紛紛表示:「這是在逼我用 PyTorch!」

到底是什麼驚天大 bug?

那麼這個令人震驚的 bug 到底是什麼呢?

Santosh Gupta 對此的描述是:由於 Tensorflow 的缺陷,阻止了 Keras 功能 API 創建模型的自定義層中權重的梯度更新,從而使這些權重基本上保持無法更新狀態。

而我們都知道,梯度更新對於訓練神經網絡來說相當重要,它是保證模型正常訓練的前提。

對於使用自定義圖層功能性 API 的研究人員來說,他們往往會運行下列程序:

fori, varinenumerate(model.trainable_variables): print(model.trainable_variables[i].name)

這個程序會保存你的訓練權重。而 Tensorflow 中出現的這個 bug,導致使用者在功能性 API 中使用自定義圖層時 trainable_variables 缺少權重。同樣地,這些權重在 non_trainable_variables 也會消失。

但是,如果這些權重不在可訓練變量中,則必須凍結這些權重,因為只有這些權重才會接收梯度更新,如下面的 Keras 模型訓練代碼所示:

gradients = tape.gradient(loss, trainable_variables) # Whether to aggregate gradients outside of optimizer. This requires support # of the optimizer and doesn't work with ParameterServerStrategy and # CentralStroageStrategy. aggregate_grads_outside_optimizer = ( optimizer._HAS_AGGREGATE_GRAD and # pylint: disable=protected-access not isinstance(strategy.extended, parameter_server_strategy.ParameterServerStrategyExtended)) if aggregate_grads_outside_optimizer: # We aggregate gradients before unscaling them, in case a subclass of # LossScaleOptimizer all-reduces in fp16. All-reducing in fp16 can only be # done on scaled gradients, not unscaled gradients, for numeric stability. gradients = optimizer._aggregate_gradients(zip(gradients, # pylint: disable=protected-access trainable_variables)) if isinstance(optimizer, lso.LossScaleOptimizer): gradients = optimizer.get_unscaled_gradients(gradients) gradients = optimizer._clip_gradients(gradients) # pylint: disable=protected-access if trainable_variables: if aggregate_grads_outside_optimizer: optimizer.apply_gradients( zip(gradients, trainable_variables), experimental_aggregate_gradients=False) else: optimizer.apply_gradients(zip(gradients, trainable_variables))

通過 Colab gist [1],你可以看到此 bug。

針對上述 bug,也有研究者提出了解決方案。

一種解決方法是改用 Keras 子類創建模型。模型子類化導致所有權重出現在 trainable_variables 中。為了確保功能性 API 和子類模型完全相同,研究人員在每個筆記本底部使用相同的輸入對它們進行推論。模型的輸出完全相同。但是使用功能性 API 模型進行訓練會將許多權重視為凍結。

針對此帖,Keras 之父、谷歌軟體工程師 Francois Chollet 也不淡定了。

他表示,「如果第三方寫的代碼有 bug,且涉及到了 Keras 模型,這並不意味著『Keras 就有 bug』。

此外,他認為:跟蹤自定義圖層中訓練參數的效果非常好,只需要 7 行代碼就可以進行測試。

最新動向:引發熱議後,谷歌回復

在 Francois Chollet 發推一小時後,谷歌工程師、TensorFlow 貢獻者 Tomer Kaftan 在 GitHub 上回復了該 issue:

目前,TensorFlow 的情況是這樣的:如果第一個參數中的所有輸入來自其他 Keras 層,則當前層進入「functional api construction」模式。但是,你的第一個位置參數輸入中包含 None,因此,無法觸發「functional api construction」模式。這導致該層與外部功能模型產生內聯(inlined),而不是正確地被納入外部模型。你可以更改層 API,排除掉輸入中的 Nones,這樣就可以解決該問題。

功能 API 的主要 cleanup/refactoring 已經大部分完成,以使功能 API 觸發機制更加清晰(即使輸入中出現任意符號值),並解決其他的一些 issue。但是,該功能將在 TensorFlow 2.4 版本中出現。

對此,issue 發起者 Santosh Gupta 表示同意:

網友:震驚,這是逼我用 PyTorch!

在這篇帖子的評論中,有網友復現了這個 bug,並表示震驚:「這個 bug 到底存在多久了?!這是不是意味著用這種方式訓練的每一個模型都失效了,基於這些模型的每一篇研究論文的結果也會被拖累。

此外,該網友對 TensorFlow 開發者的維護效率也表示質疑:

Git issue 顯示 23 天前就有 TensorFlow 開發者承認了這個 bug 的存在,並將該 issue 指定給另一位開發者,而被指定者並沒有查看這個 issue。這就像一家食品公司 23 天就發現自己的產品中存在大腸桿菌,但是這麼多天過去了他們啥都沒幹。我見過很多對 TensorFlow 的抱怨,但是之前從未聽到過這樣的事情。

這件事也引發了開發者們對 TensorFlow 甚至谷歌產品的吐槽:

作為谷歌曾經的擁躉,現在我對它的所有產品感到厭倦。所有事情都半途而廢,看不到完成的可能性,也看不到對用戶的關注。TensorFlow 真是糟糕透了。開發團隊意識到 PyTorch 正在搶奪他們的用戶,但他們仍和以往一樣半途而廢,沒有將資源或 Keras 置於優先級較高的位置,因為他們內部並不使用。文檔也很糟糕,是因為任何有自尊心的工程師都不想為寫優秀的文檔費心嗎?

然而,競爭對手 PyTorch 的文檔可讀性就很強,PyTorch 官方甚至還提供了限時免費的權威官方教程書籍。或許有一天谷歌也會出現一位像薩提亞 · 納德拉那樣的人物,改變谷歌的內部文化,更加關注用戶和產品。而現在,谷歌只是停留在廣告業務帶來的收益上吃老底,這使得他們忽略了自己在幾乎其他所有業務上的無能。

即便在事情引發熱議後 TensorFlow 團隊進行了回復,但這個 bug 仍有可能對 TensorFlow 造成影響。

下面這句評論或許最能反映廣大開發者的心態:

這將破壞用戶對 TensorFlow 的信任,可能有更多的開發者轉用 PyTorch。

參考連結:

https://colab.research.google.com/gist/Santosh-Gupta/40c54e5b76e3f522fa78da6a248b6826/missingtrainablevarsinference_var.ipynb#scrollTo=28bP9FYpILJ9

https://www.reddit.com/r/MachineLearning/comments/hrawam/d_theres_a_flawbug_in_tensorflow_thats_preventing/

相關焦點

  • GitHub趨勢榜第一:TensorFlow+PyTorch深度學習資源大匯總
    deeplearning-models/blob/master/pytorch_ipynb/basic-ml/perceptron.ipynb邏輯回歸TensorFlow 1:https://github.com/rasbt/deeplearning-models/blob/master/tensorflow1_ipynb/
  • 上線倆月,TensorFlow 2.0被吐槽太難用,網友:看看人家PyTorch
    比如下面一位網友就寫到:我的故事:1. 我有個想法,我想要在訓練過程中逐漸改變損失函數的『形狀』;2. 我搜索『tensorflow 在訓練中改變損失函數』;3. 最高搜索結果是一個 Medium 的文章,我們去看看吧;4. 這個 Medium 文章介紹的是均方誤差(MSE)損失函數,以及你怎樣在 TensorFlow 中用它訓練一個深度神經網絡;5.
  • 深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • 寫給純小白的深度學習環境搭建寶典:pytorch+tensorflow
    Anaconda+pytorch環境準備如果你的電腦帶有GPU,可以先安裝Nvidia驅動 + cuda + cudnn,然後再搭建環境,這樣可以達到更高的運行速度。如果不想使用GPU,學習階段也可以使用cpu版本,對於簡單的程序用CPU和GPU其實沒差別。
  • RTX 3090 的深度學習環境配置指南:Pytorch、TensorFlow、Keras
    導讀本文介紹了作者使用RTX3090進行深度學習環境配置pytorch、tensorflow、keras等的詳細過程及代碼。筆者中山大學研究生,醫學生+計科學生的集合體,機器學習愛好者。-7.2.1.4-cp36-none-linux_x86_64.whl tensorflow_estimator-1.15.1-py2.py3-none-any.whl nvidia_tensorboard-1.15.0+nv20.10-py3-none-any.whlnvidia_tensorflow-1.15.4+nv20.10-cp36-cp36m-linux_x86_64.whl -i http
  • 損失函數理解匯總,結合PyTorch1.7和TensorFlow2
    對異常數據比L1敏感,這是平方項引起的,異常數據會引起很大的損失。它使訓練更容易,因為它的梯度隨著預測值接近真實值而不斷減小,那麼它不會輕易錯過極值點,但也容易陷入局部最優。它的導數具有封閉解,優化和編程非常容易,所以很多回歸任務都是用MSE作為損失函數。
  • 深度學習100+經典模型TensorFlow與Pytorch代碼實現大集合
    傳統機器學習感知器 Perceptron   [TensorFlow 1: GitHub | Nbviewer]https://github.com/rasbt/deeplearning-models/blob/master/tensorflow1
  • 【綜述專欄】損失函數理解匯總,結合PyTorch和TensorFlow2
    [10] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLD[11] https://www.tensorflow.org/api_docs/python/tf/keras/losses/KLDivergence[12] https://pytorch.org/docs/stable/
  • 損失函數理解匯總,結合 PyTorch1.7 和 TensorFlow2
    對異常數據比L1敏感,這是平方項引起的,異常數據會引起很大的損失。它使訓練更容易,因為它的梯度隨著預測值接近真實值而不斷減小,那麼它不會輕易錯過極值點,但也容易陷入局部最優。它的導數具有封閉解,優化和編程非常容易,所以很多回歸任務都是用MSE作為損失函數。
  • 2020,PyTorch真的趕上TensorFlow了嗎?
    通過這四個方面的對比,作者最後得出結論,TensorFlow 在大多數領域仍然處於領先地位,但 PyTorch 正在取得進展並逐漸縮小差距。其實,這已經不是這位作者第一次調研深度學習框架了。從 2018 年到 2020 年,他先後進行過三次調查研究並發布了相關報告。從這些報告中,我們可以看出深度學習框架在多個維度的熱度演變史。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    目錄谷歌的 TensorFlowFacebook 的 PyTorch我們可以用 TensorFlow 和 PyTorch 構建什麼?我們可以用 TensorFlow 和 PyTorch 構建什麼?神經網絡起初是被用於解決手寫數字識別或用相機識別汽車註冊車牌等簡單的分類問題。但隨著近來框架的發展以及英偉達高計算性能圖形處理單元(GPU)的進步,我們可以在 TB 級的數據上訓練神經網絡並求解遠遠更加複雜的問題。
  • Pytorch還是TensorFlow?頂會帶你覽趨勢
    在機器之心往期文章中,我們曾報導,雖然 2018 年 TensorFlow 依然碾壓 PyTorch,但自 2019 年以來 PyTorch 的發展可謂是火力全開,特別是在學界,幾乎是獨領風騷。這兩年,我們從各類自然語言處理(NLP)、計算機視覺(CV)國際學術頂會接收論文中使用 PyTorch 和 TensorFlow 的佔比情況,就可以發現這種趨勢 。
  • PyTorch稱霸頂會:CVPR論文佔比是TensorFlow 4 倍
    這兩年,我們從各類自然語言處理(NLP)、計算機視覺(CV)國際學術頂會接收論文中使用 PyTorch 和 TensorFlow 的佔比情況,就可以發現這種趨勢 。圖表的交互版本參見:http://horace.io/pytorch-vs-tensorflow/ICLR 2020 論文 PyTorch/TensorFlow 使用分析首先看下 ICLR 2020 接收論文中,PyTorch 使用數在
  • 從零開始搭建深度學習伺服器:TensorFlow + PyTorch + Torch
    在深度學習大行其道的今天,我們不應該停留於觀望的階段,我們應該多多上手進行實踐,下面將為大家介紹一下最簡單也是最基礎的內容,配置一個自己的深度學習伺服器.1.python-pip python-dev python-virtualenv mkdir tensorflowcd tensorflowvirtualenv --system-site-packages venvsource venv/bin/activatepip install --upgrade tensorflow-gpu測試GPU:
  • PYTORCH與TENSORFLOW:哪種框架最適合您的深度學習項目?
    PyTorch有優點:簡單,易用,動態計算圖和有效的內存使用,科研工作者用的比較多,我們將在後面詳細討論。我們可以使用TENSORFLOW和PYTORCH開發什麼?最初,神經網絡用於解決簡單的分類問題,例如手寫數字識別或使用攝像頭識別汽車的車牌。由於有了最新的框架和NVIDIA的GPU,我們可以更快的訓練神經網絡,並解決更複雜的問題。
  • 一行代碼切換TensorFlow與PyTorch,模型訓練也能用倆框架
    機器之心報導參與:思源你是否有時要用 PyTorch,有時又要跑 TensorFlow?這個項目就是你需要的,你可以在訓練中同時使用兩個框架,並端到端地轉換模型。也就是說 TensorFlow 寫的計算圖可以作為某個函數,直接應用到 Torch 的張量上,這操作也是很厲害了。
  • TensorFlow 2.0凌晨發布!「改變一切,力壓PyTorch」
    不少網友表示,TensorFlow 2.0比PyTorch更好用,已經準備全面轉向這個新升級的深度學習框架了。更易用的TF2.0儘管是排名第一的深度學習框架,但TensorFlow的缺點也一直非常明顯。
  • 如何使用 TensorFlow mobile 將 PyTorch 和 Keras 模型部署到行動裝置
    在這篇文章中,我將闡釋如何使用 TensorFlow mobile 將 PyTorch 和 Keras 部署到行動裝置。用 TensorFlow mobile 部署模型到安卓設備分為三個步驟:在這篇文章中,我將介紹整個過程,最後完成一個植入圖像識別功能的安卓應用。
  • TensorFlow圖像分類教程
    深度學習需要大量的訓練數據,因此,我們需要大量已分類的花朵圖像。值得慶幸的是,另外一個模型在圖像收集和分類這方面做得非常出色,所以我們使用這個帶有腳本的已分類數據集,它有現成且完全訓練過的圖像分類模型,重新訓練模型的最後幾層以達到我們想要的結果,這種技術稱為遷移學習。
  • pytorch常見的坑匯總
    首先作為tensorflow的骨灰級玩家+輕微強迫症患者,一路打怪升級,從0.6版本用到1.2,再用到1.10,經歷了tensorfow數個版本更迭,這裡不得不說一下tf.data.dataset+tfrecord使用起來效率遠比dataloader高的多。