TensorFlow惊现大bug?网友:这是逼着我们用PyTorch啊!
加入极市专业CV交流群,与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~
诞生五年的 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 的研究人员来说,他们往往会运行下列程序:
for i, var in enumerate(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))
最新动向:引发热议后,谷歌回复
目前,TensorFlow 的情况是这样的:如果第一个参数中的所有输入来自其他 Keras 层,则当前层进入「functional api construction」模式。但是,你的第一个位置参数输入中包含 None,因此,无法触发「functional api construction」模式。
这导致该层与外部功能模型产生内联(inlined),而不是正确地被纳入外部模型。你可以更改层 API,排除掉输入中的 Nones,这样就可以解决该问题。
功能 API 的主要 cleanup/refactoring 已经大部分完成,以使功能 API 触发机制更加清晰(即使输入中出现任意符号值),并解决其他的一些 issue。但是,该功能将在 TensorFlow 2.4 版本中出现。
网友:震惊,这是逼我用 PyTorch!
Git issue 显示 23 天前就有 TensorFlow 开发者承认了这个 bug 的存在,并将该 issue 指定给另一位开发者,而被指定者并没有查看这个 issue。
这就像一家食品公司 23 天就发现自己的产品中存在大肠杆菌,但是这么多天过去了他们啥都没干。
我见过很多对 TensorFlow 的抱怨,但是之前从未听到过这样的事情。
作为谷歌曾经的拥趸,现在我对它的所有产品感到厌倦。所有事情都半途而废,看不到完成的可能性,也看不到对用户的关注。
TensorFlow 真是糟糕透了。开发团队意识到 PyTorch 正在抢夺他们的用户,但他们仍和以往一样半途而废,没有将资源或 Keras 置于优先级较高的位置,因为他们内部并不使用。文档也很糟糕,是因为任何有自尊心的工程师都不想为写优秀的文档费心吗?
然而,竞争对手 PyTorch 的文档可读性就很强,PyTorch 官方甚至还提供了限时免费的权威官方教程书籍。
或许有一天谷歌也会出现一位像萨提亚 · 纳德拉那样的人物,改变谷歌的内部文化,更加关注用户和产品。而现在,谷歌只是停留在广告业务带来的收益上吃老底,这使得他们忽略了自己在几乎其他所有业务上的无能。
添加极市小助手微信(ID : cv-mart),备注:研究方向-姓名-学校/公司-城市(如:目标检测-小极-北大-深圳),即可申请加入极市技术交流群,更有每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、行业技术交流,一起来让思想之光照的更远吧~
△长按添加极市小助手
△长按关注极市平台,获取最新CV干货
觉得有用麻烦给个在看啦~