上线俩月,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 的高歌猛进,这样的局面可能不久就会变化。