8 月中旬,谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布,新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布。今日,在上海谷歌开发者大会上,机器之心独家了解到一个重大的改变将会把 Eager Execution 变为 TensorFlow 默认的执行模式。这意味着 TensorFlow 如同 PyTorch 那样,由编写静态计算图全面转向了动态计算图。
谷歌开发者大会
在谷歌开发者大会的第二天,主会场全天都将进行 TensorFlow 专场的演讲。
来自 Google Brain 的软件工程师冯亦菲在分享 TensorFlow 编程接口的新动态时着重介绍了 tf.keras,tf.data 等高层库,总结了 TensorFlow 团队对开发者使用 TensorFlow 的一系列建议,包括:
用 Eager 模式搭建原型
用 Datasets 处理数据
用 Feature Columns 提取特征
用 Keras 搭建模型
借用 Canned Estimators
用 SavedModel 打包模型
其中,在介绍 Eager 模式时,她提到,在 TensorFlow 2.0 版本中,Eager 模式会成为默认执行模式,让开发者更简洁高效地搭建原型。
在演讲结束后的交流中,冯亦菲提到 TensorFlow 2.0 beta 版将会在今年年底公开,而正式版预计于明年 Q1 或 Q2 问世。Eager 模式变为默认设置之后,开发者可以在原型搭建完成后,利用 AutoGraph 把在 Eager 模式下搭建的模型自动变成计算图。开发者也可以进一步对 AutoGraph 生成的计算图进行优化,或者关掉 Eager 模式自己构建计算图。
我们注意到,在两个月之前刚刚发布的 AutoGraph 已经离开 tf.contrib 成为了正式的 TF 库的一部分,在设计文档中,工程师提到,「为了 TF 2.0 做准备,我们将 AutoGraph 从 tensorflow / contrib / autograph 移动到了 tensorflow / python / autograph。AutoGraph 仍可在 tensorflow.contrib.autograph 下访问,直到 tensorflow.contrib 被取消。」
谷歌开发者大会的「熟面孔」,Google AI 软件工程师金安娜同样出现在了今年的主题演讲中,她提到 TensorFlow 工程师会将自己的最新的设计提议放在 TensorFlow Community 的 Request for Comments 中,她鼓励开发者前往浏览,并针对工程师的最新设计思路给出自己的意见。
例如,Martin Wicke 关于 sunset tf.contrib 的提议就仍然在反馈阶段,有诸多开发者在该条 pull request 下提出了自己的意见。
RFC 的地址如下:
https://github.com/tensorflow/community/tree/master/rfcs
在今天下午的演讲中,会有更多来自谷歌的工程师分享与 Eager 模式相关的设计思路和设计细节。
TensorFlow 历程
TensorFlow 是由 Google Brain 团队在谷歌内部第一代 DL 系统 DistBelief 的基础上改进而得到的,这一通用计算框架目前已经成为最流行的机器学习开源工具。
TensorFlow 的前身 DistBelief 是谷歌 2011 年开发的内部 DL 工具,基于 DistBelief 的 Inception 网络获得了 2014 年的 ImageNet 挑战赛冠军。虽然 DistBelief 当时在谷歌内部已经应用于非常多的产品,但它过度依赖于谷歌内部的系统架构,因此很难对外开源。经过对 DistBelief 的改进与调整,谷歌于 2015 年 11 月正式发布了开源计算框架 TensorFlow 0.5.0。相比于 DistBelief,TensorFlow 的计算框架更加通用、计算资源安排更加合理,同时支持更多的深度学习算法与平台。
在 TensorFlow 开源后,基于 TF 的项目在第一年里面层出不穷:超过 480 人为 TF 做出了直接贡献,其中包括谷歌开发者、外部研究者、独立开发者、学生和其它公司的资深开发者。当时,TensorFlow 已经成为了 GitHub 上最受欢迎的机器学习项目。
在开源的第一年中,TensorFlow 增加了对分布式训练、iOS、树莓派开发板的支持,并且还与广泛使用的大数据架构相结合。此外,谷歌还发布了当时表现最好的图像分类模型 Inception-ResNet-v2,并且还回答了 GitHub、StackOverflow 和 TensorFlow mailing list 上数以千计的问题。
去年 2 月份在首届 TensorFlow 开发者大会中,谷歌正式发布了 TensorFlow 1.0。在速度上,它在 64 个 GPU 上分布式训练 Inception v3 获得了 58 倍提速。在灵活性上,TensorFlow 1.0 引入了高层 API,例如 tf.layers、tf.metrics 和 tf.losses 等模块,同时通过 tf.keras 将 Keras 库正式整合进 TF 中。
此后,TensorFlow 发布了非常多的重要更新,包括动态图机制 Eager Execution、移动端深度学习框架 TensorFlow Lite、面向 JavaScript 开发者的机器学习框架 TensorFlow.js,以及自动将 Python 转化为 TF 计算图的 AutoGraph 等。
在 TensorFlow 2.0 的规划中,Eager Execution 变为默认执行模式可能对开发者有比较大的影响,因为我们不再需要编写完整的静态计算图,并打开会话(Session)运行它。相反,与 PyTorch 一样,Eager Execution 是一个由运行定义的接口,这意味着我们在 Python 上调用它进行计算可以直接得出结果。这种方式非常符合人类直觉,因此可以预想 TensorFlow 的入门在以后会简单地多。
以下为 8 月中旬谷歌大脑成员 Martin Wicke 在公开邮件中透露的 TensorFlow 2.0 的规划:
TensorFlow 2.0 的规划
自 2015 年开源发布以来,TensorFlow 已经成为世界上使用最广泛的机器学习框架,面向广泛的用户和用例。此后,TensorFlow 随着计算硬件、机器学习研究和商业部署的快速发展而不断更新。
为了反映这些快速变化,谷歌开发者已经开始研究下一个版本的 TensorFlow。TensorFlow 2.0 将是一个重要的里程碑,重点关注易用性。以下是用户对 TensorFlow 2.0 的一些期望:
Eager execution 将是 2.0 的核心功能。它把用户对编程模型的期望与 TensorFlow 实践更好地结合起来,应该会使 TensorFlow 更容易学习和应用。
支持更多的平台和语言,并通过交换格式的标准化和 API 的对齐来改善这些组件之间的兼容性和对等性。
将删除过时的 API 并减少重复,以免给用户带来困惑。
据邮件称,谷歌计划年底之前发布 TensorFlow 2.0 的预览版。
兼容性与连续性
TensorFlow 2.0 提供了一个纠错并改正的机会,而这些改进在语义版本控制中是不允许的。
为了简化转换,TensorFlow 团队将创建一个转换工具,该工具需要更新 Python 代码以使用与 TensorFlow 2.0 兼容的 API,或者在无法自动转换时发出警告。在向 1.0 过渡的过程中,类似的工具发挥了巨大的作用。
不是所有的改进都能自动进行。比如,TensorFlow 不赞成使用一些没有直接对接的 API。对于这种情况,我们将提供一个兼容模块 (tensorflow.compat.v1),其中包含完整的 TensorFlow 1.x API,它会在 TensorFlow 2.x 的周期里得到维护。
磁盘兼容性
谷歌表示,他们不打算对 SavedModels 或 GraphDef 存储进行重大更改,计划 2.0 中能包含所有当前内核。然而,2.0 的变化意味着在与新模型兼容之前,原始 checkpoint 中的变量名必须要进行转换。
tf.contrib
TensorFlow 的 contrib 模块已经超出了单个存储库可以维护和支持的范围。较大的项目最好分开维护,我们将把较小的扩展与 TensorFlow 主代码一起孵化。因此发布 TensorFlow2.0 之后,我们将停止发布 tf.contrib。在接下来的几个月里,我们将与 contrib 各自的所有者合作制定详细的迁移计划,包括如何在 TensorFlow 的社区页面和文档中宣传你的 TensorFlow 扩展。对于每一个 contrib 模块,我们有以下选择:a)将项目整合到 TensorFlow 中;b)将其移动到一个单独的存储库;c)将其彻底移除。这确实意味着所有的 tf.contrib 将被弃用,今天,TensorFlow 将停止添加新的 tf.contrib 项目。