TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊
誕生五年的 TensorFlow 出現(xiàn)大 bug,使用對(duì)應(yīng)訓(xùn)練方式得到的模型甚至論文結(jié)果可能受到波及,然而相關(guān) issue 提交 24 天后依然沒(méi)有 TensorFlow 開(kāi)發(fā)團(tuán)隊(duì)的處理。用戶表示很失望,「怒而轉(zhuǎn)用 PyTorch」。在事情發(fā)酵后,TensorFlow 團(tuán)隊(duì)終于回復(fù)了,表示已經(jīng)在改,但對(duì)應(yīng)的功能將在 2.4 版本中才能用。
谷歌團(tuán)隊(duì) 2015 年發(fā)布的 TensorFlow 框架是目前機(jī)器學(xué)習(xí)領(lǐng)域最流行的框架之一。雖然后起之秀 PyTorch 奮起直追,但 TensorFlow 框架的使用者仍然眾多。
TensorFlow 經(jīng)常被吐槽難用、新版本也常常收到差評(píng),但不管怎樣,已經(jīng)誕生五年之久的 TensorFlow 應(yīng)該不會(huì)有什么太大的 bug 吧?然而,事實(shí)似乎并非如此。
最近,機(jī)器學(xué)習(xí)工程師 Santosh Gupta 在使用 TensorFlow 時(shí)發(fā)現(xiàn)了一個(gè)問(wèn)題:使用 Keras 功能 API 創(chuàng)建的模型自定義層中的權(quán)重?zé)o法進(jìn)行梯度更新。
issue 詳情:https://github.com/tensorflow/tensorflow/issues/40638
這個(gè)帖子在 reddit 上引起了熱議,網(wǎng)友紛紛表示:「這是在逼我用 PyTorch!」
到底是什么驚天大 bug?
那么這個(gè)令人震驚的 bug 到底是什么呢?
Santosh Gupta 對(duì)此的描述是:由于 Tensorflow 的缺陷,阻止了 Keras 功能 API 創(chuàng)建模型的自定義層中權(quán)重的梯度更新,從而使這些權(quán)重基本上保持無(wú)法更新?tīng)顟B(tài)。
而我們都知道,梯度更新對(duì)于訓(xùn)練神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō)相當(dāng)重要,它是保證模型正常訓(xùn)練的前提。
對(duì)于使用自定義圖層功能性 API 的研究人員來(lái)說(shuō),他們往往會(huì)運(yùn)行下列程序:
for i, var in enumerate(model.trainable_variables): print(model.trainable_variables[i].name)
這個(gè)程序會(huì)保存你的訓(xùn)練權(quán)重。而 Tensorflow 中出現(xiàn)的這個(gè) bug,導(dǎo)致使用者在功能性 API 中使用自定義圖層時(shí) trainable_variables 缺少權(quán)重。同樣地,這些權(quán)重在 non_trainable_variables 也會(huì)消失。
但是,如果這些權(quán)重不在可訓(xùn)練變量中,則必須凍結(jié)這些權(quán)重,因?yàn)橹挥羞@些權(quán)重才會(huì)接收梯度更新,如下面的 Keras 模型訓(xùn)練代碼所示:
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))
通過(guò) Colab gist [1],你可以看到此 bug。
針對(duì)上述 bug,也有研究者提出了解決方案。
一種解決方法是改用 Keras 子類(lèi)創(chuàng)建模型。模型子類(lèi)化導(dǎo)致所有權(quán)重出現(xiàn)在 trainable_variables 中。為了確保功能性 API 和子類(lèi)模型完全相同,研究人員在每個(gè)筆記本底部使用相同的輸入對(duì)它們進(jìn)行推論。模型的輸出完全相同。但是使用功能性 API 模型進(jìn)行訓(xùn)練會(huì)將許多權(quán)重視為凍結(jié)。
針對(duì)此帖,Keras 之父、谷歌軟件工程師 Francois Chollet 也不淡定了。
他表示,「如果第三方寫(xiě)的代碼有 bug,且涉及到了 Keras 模型,這并不意味著『Keras 就有 bug』。」
此外,他認(rèn)為:跟蹤自定義圖層中訓(xùn)練參數(shù)的效果非常好,只需要 7 行代碼就可以進(jìn)行測(cè)試。
最新動(dòng)向:引發(fā)熱議后,谷歌回復(fù)
在 Francois Chollet 發(fā)推一小時(shí)后,谷歌工程師、TensorFlow 貢獻(xiàn)者 Tomer Kaftan 在 GitHub 上回復(fù)了該 issue:
目前,TensorFlow 的情況是這樣的:如果第一個(gè)參數(shù)中的所有輸入來(lái)自其他 Keras 層,則當(dāng)前層進(jìn)入「functional api construction」模式。但是,你的第一個(gè)位置參數(shù)輸入中包含 None,因此,無(wú)法觸發(fā)「functional api construction」模式。
這導(dǎo)致該層與外部功能模型產(chǎn)生內(nèi)聯(lián)(inlined),而不是正確地被納入外部模型。你可以更改層 API,排除掉輸入中的 Nones,這樣就可以解決該問(wèn)題。
功能 API 的主要 cleanup/refactoring 已經(jīng)大部分完成,以使功能 API 觸發(fā)機(jī)制更加清晰(即使輸入中出現(xiàn)任意符號(hào)值),并解決其他的一些 issue。但是,該功能將在 TensorFlow 2.4 版本中出現(xiàn)。
對(duì)此,issue 發(fā)起者 Santosh Gupta 表示同意:
網(wǎng)友:震驚,這是逼我用 PyTorch!
在這篇帖子的評(píng)論中,有網(wǎng)友復(fù)現(xiàn)了這個(gè) bug,并表示震驚:「這個(gè) bug 到底存在多久了?!這是不是意味著用這種方式訓(xùn)練的每一個(gè)模型都失效了,基于這些模型的每一篇研究論文的結(jié)果也會(huì)被拖累。」
此外,該網(wǎng)友對(duì) TensorFlow 開(kāi)發(fā)者的維護(hù)效率也表示質(zhì)疑:
Git issue 顯示 23 天前就有 TensorFlow 開(kāi)發(fā)者承認(rèn)了這個(gè) bug 的存在,并將該 issue 指定給另一位開(kāi)發(fā)者,而被指定者并沒(méi)有查看這個(gè) issue。
這就像一家食品公司 23 天就發(fā)現(xiàn)自己的產(chǎn)品中存在大腸桿菌,但是這么多天過(guò)去了他們啥都沒(méi)干。
我見(jiàn)過(guò)很多對(duì) TensorFlow 的抱怨,但是之前從未聽(tīng)到過(guò)這樣的事情。
這件事也引發(fā)了開(kāi)發(fā)者們對(duì) TensorFlow 甚至谷歌產(chǎn)品的吐槽:
作為谷歌曾經(jīng)的擁躉,現(xiàn)在我對(duì)它的所有產(chǎn)品感到厭倦。所有事情都半途而廢,看不到完成的可能性,也看不到對(duì)用戶的關(guān)注。
TensorFlow 真是糟糕透了。開(kāi)發(fā)團(tuán)隊(duì)意識(shí)到 PyTorch 正在搶奪他們的用戶,但他們?nèi)院鸵酝粯影胪径鴱U,沒(méi)有將資源或 Keras 置于優(yōu)先級(jí)較高的位置,因?yàn)樗麄儍?nèi)部并不使用。文檔也很糟糕,是因?yàn)槿魏斡凶宰鹦牡墓こ處煻疾幌霝閷?xiě)優(yōu)秀的文檔費(fèi)心嗎?
然而,競(jìng)爭(zhēng)對(duì)手 PyTorch 的文檔可讀性就很強(qiáng),PyTorch 官方甚至還提供了限時(shí)免費(fèi)的權(quán)威官方教程書(shū)籍。
或許有一天谷歌也會(huì)出現(xiàn)一位像薩提亞 · 納德拉那樣的人物,改變谷歌的內(nèi)部文化,更加關(guān)注用戶和產(chǎn)品。而現(xiàn)在,谷歌只是停留在廣告業(yè)務(wù)帶來(lái)的收益上吃老底,這使得他們忽略了自己在幾乎其他所有業(yè)務(wù)上的無(wú)能。
即便在事情引發(fā)熱議后 TensorFlow 團(tuán)隊(duì)進(jìn)行了回復(fù),但這個(gè) bug 仍有可能對(duì) TensorFlow 造成影響。
下面這句評(píng)論或許最能反映廣大開(kāi)發(fā)者的心態(tài):
「這將破壞用戶對(duì) TensorFlow 的信任,可能有更多的開(kāi)發(fā)者轉(zhuǎn)用 PyTorch。」
原文鏈接:https://new.qq.com/omn/20200715/20200715A0ION100.html
總結(jié)
以上是生活随笔為你收集整理的TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 智能驾驶继续突破,国内国外技术进入深水区
- 下一篇: C#学习路线