Tensorflow 2.0 到底好在哪里?

阅读数:4592 2019 年 8 月 3 日

TensorFlow 现在已经不仅是一个单纯的工具包了,而是发展成为了一个平台,在易用性、分布式训练和部署等方面都取得了长足的进步。

如今已经没有人质疑机器学习和深度学习的重要性了。数十年来这一行业让人们见识过无数承诺、骗局和失望,时至今日两大技术终于带来了众多实际应用。机器学习或深度学习应用离充分完善还有很长的路要走,但现有的成果已经非常喜人了。

在所有优秀的机器学习和深度学习框架中,TensorFlow 是最成熟的,在研究论文中被引用最多(就算排除谷歌员工的引用也是如此),也有着最出色的生产实践案例。它可能不是最容易学习的框架,但比起它 2016 年刚发布时的情况,现在的 TensorFlow 对新人要友好得多。TensorFlow 还是许多谷歌服务的基础。

TensorFlow 2.0 网站将该项目描述为“端到端开源机器学习平台”。实际上 TensorFlow 已进化成为一个更全面的“工具、库和社区资源生态系统”,可帮助研究人员构建和部署人工智能助力的应用。

TensorFlow 2.0 有四大组成部分:

  • TensorFlow 核心,一个用于开发和训练机器学习模型的开源库;

  • TensorFlow.js,一个用于在浏览器和 Node.js 上训练和部署模型的 JavaScript 库;

  • TensorFlow Lite,一个轻量级库,用于在移动和嵌入式设备上部署模型;

  • TensorFlow Extended,一个在大型生产环境中准备数据、训练、验证和部署模型的平台。

TensorFlow 2.0 生态系统包括对 Python、JavaScript 和 Swift 的支持,以及对云、浏览器和边缘设备的部署支持。TensorBoard(可视化)和 TensorFlow Hub(模型库)都是很有用的工具。TensorFlow Extended(TFX)则支持端到端生产流水线。

在以前的文章中,我曾评测过 TensorFlow r0.10(2016)( https://www.infoworld.com/article/3127397/review-tensorflow-shines-a-light-on-deep-learning.html )和 TensorFlow 1.5(2018)( https://www.infoworld.com/article/3250165/tensorflow-review-the-best-deep-learning-library-gets-better.html )。

这些年来,TensorFlow 逐渐发展为基于数据流图的机器学习和神经网络库,拥有较高的学习曲线和一个底层 API。对普通人来说 TensorFlow 2.0 已经不再那么难学了,2.0 版本还拥有一个高级 Keras API,支持在 JavaScript 中运行、在移动和嵌入式设备上部署以及在大型生产环境中运行。

TensorFlow 的竞争对手包括 Keras(可能使用除 TensorFlow 之外的其他后端)( https://www.infoworld.com/article/3305058/review-keras-sails-through-deep-learning.html )、MXNet( https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html )(与 Gluon, https://www.infoworld.com/article/3318557/review-mxnet-deep-learning-shines-with-gluon.html )、PyTorch( https://www.infoworld.com/article/3289633/pytorch-review-a-deep-learning-framework-built-for-speed.html )、Scikit-learn( https://www.infoworld.com/article/3158509/review-scikit-learn-shines-for-simpler-machine-learning.html )和 Spark MLlib( https://www.infoworld.com/article/3141605/review-spark-lights-up-machine-learning.html )。最后两个主要是机器学习框架,缺乏深度学习的相关设施。

你可以同时使用多种方案。在单条流水线中同时使用多个框架是非常合理的,例如使用 Scikit-learn 准备数据并使用 TensorFlow 训练模型。

TensorFlow 核心

TensorFlow 2.0 的设计重点就是简洁易用,它的新特性包括 Eager Execution、直观的高级 API 以及在任何平台上灵活构建模型等更新。前两个特性值得深入研究。

Eager Execution

Eager Execution 意味着 TensorFlow 代码被定义后会立即运行,而不是先将节点和边缘添加一个图上,稍后再在一个会话中运行——后者是 TensorFlow 原来使用的模式。例如,TensorFlow r0.10 早期版本的“Hello,World!”脚本如下所示:

复制代码
$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>> exit()

注意这里使用的 tf.Session() 和 sess.run()。在 TensorFlow 2.0 中,Eager Execution 模式是默认的,如下例所示。

TensorFlow 2.0 中的 Eager Execution 示意。这个笔记本可以在谷歌 Colab 中运行,或者在安装好预设的 Jupyter 笔记本中也能运行。

tf.keras

前面的两个示例都使用了底层 TensorFlow API。“活用 TensorFlow 2.0 指南”( https://www.tensorflow.org/beta/guide/effective_tf2 )则使用了高级别的 tf.kerasAPI 取代了旧的底层 API;这将大大减少你需要编写的代码量。你只需要每层写一行代码就能构建 Keras 神经网络,如果能善用循环结构的话需要的代码就更少了。下面的示例演示了 Keras 数据集和顺序模型 API,它们运行在谷歌 Colab 中;谷歌 Colab 用来运行 TensorFlow 样本和实验很方便(还是免费的)。请注意,Colab 除了 CPU 外还提供了 GPU 和 TPU 实例。

上图是一个 TensorFlow 笔记本,用于训练基本的深度神经网络对 MNIST 手写数字图像进行分类。这是在谷歌 Colab 上运行的 TensorFlow 示例笔记本。注意这里使用了 tf.keras.datasets 来提供 MNIST 图像。

过渡到 TensorFlow 2.0

在撰写本文时,从 TensorFlow 1.14 到 TensorFlow 2.0 的过渡( https://github.com/orgs/tensorflow/projects/4 )还在进行中,如下面的截图所示。目前有两个待办事项、23 个正在进行的任务以及 34 个已完成的任务。正在进行的任务中既有完全没有进展的(可能是因为当事人退出),也有几乎完成的(代码已进入存储库主分支,但尚未经过审查和部署)。

从 TensorFlow 1.14 到 TensorFlow 2.0 的过渡状态可通过以下网址跟踪: https://github.com/orgs/tensorflow/project/4 。此截图生成于 6 月 21 日,但请注意该页面自 4 月 17 日以来都未更新。

将模型升级到 TensorFlow 2.0

就像很多开源项目的大版本更新一样,TensorFlow 2.0 对 API 引入了许多重大更改,需要你随之升级你的代码( https://www.tensorflow.org/beta/guide/migration_guide )。所幸我们有一个随 TensorFlow 2.0 自动安装的 Python 代码升级脚本( https://www.tensorflow.org/beta/guide/upgrade ),还有一个给无法升级的 API 符号用的兼容模块(compat.v1),只需使用字符串替换即可。运行升级脚本后,你的程序可能会在 TensorFlow 2.0 上运行,但是会引用 tf.compat.v1 命名空间,你得在有空的时候处理一下以保持代码清洁。此外,你可以将 GitHub repos 上的 Jupyter 笔记本升级到 TensorFlow 2.0( http://tf2up.ml/ )。

使用 tf.function

Eager Execution 模式的缺点是可能会损失一些编译和执行流程图的性能。有一种方法可以在不完全关闭 Eager Execution 模式的情况下恢复性能,它就是 tf.function。

基本上,当你使用 @tf.function 注释一个函数时后者将被编译成一个图,它和它调用的任何函数就(可能)更快地执行、支持在 GPU 或 TPU 上运行,还支持导出到 SavedModel。tf.function 的一项便利的新功能是 AutoGraph( https://www.tensorflow.org/beta/guide/autograph ),它自动将 Python 控制流语句编译为 TensorFlow 控制操作。

分布式训练

以前我研究 TensorFlow 时有两种方法可以运行分布式训练:使用异步参数服务器,或使用第三方的 Horovod 项目——该项目是同步的并使用 all-reduce 算法。现在新版有五种原生的 TensorFlow 分布式策略( https://www.tensorflow.org/beta/guide/distribute_strategy ),以及一个用于选择所需策略的 API,tf.distribute.Strategy;它允许你跨多个 GPU、多台计算机或多个 TPU 分发训练。此 API 还可用于在不同平台上分发评估和预测。

TensorFlow 现在支持五种原生分布式策略,TensorFlow 2.0 beta 还对三种训练 API 提供不同级别的支持。

TensorFlow.js

TensorFlow.js( https://www.tensorflow.org/js )是一个用于在 JavaScript 中开发和训练机器学习模型并在浏览器或 Node.js 中部署它们的库。还有一个基于 TensorFlow.js 的高级库 ml5.js( https://ml5js.org/ ),使用户无需直接面对复杂的张量和优化器。

TensorFlow.js 运行在浏览器中( https://www.tensorflow.org/js/guide/platform_environment ),支持移动设备和桌面设备。如果你的浏览器支持 WebGL 着色器 API,TensorFlow.js 就可以使用它们并利用 GPU 计算能力,带来相比 CPU 后端多达 100 倍的加速效果。在配备 GPU 的计算机上,TensorFlow.js 演示( https://www.tensorflow.org/js/demos/ )在浏览器中运行得非常快。

在 Node.js 上,TensorFlow.js 可以使用已安装的 TensorFlow 版本作为后端,或者运行基本的 CPU 后端。CPU 后端是纯 JavaScript 的,并行优化不够充分。

你可以在浏览器上运行官方 TensorFlow.js 模型( https://www.tensorflow.org/js/models/ )、转换 Python 模型( https://www.tensorflow.org/js/tutorials#convert_pretained_models_to_tensorflowjs )、使用迁移学习来用你自己的数据自定义模型( https://www.tensorflow.org/js/tutorials/transfer/what_is_transfer_learning ),以及直接在 JavaScript 中构建和训练模型( https://www.tensorflow.org/js/tutorials )。

TensorFlow Lite

TensorFlow Lite( https://www.tensorflow.org/lite/ )是一个用于设备上推断的开源深度学习框架。它目前为 iOS、ARM64 和树莓派构建了模型。

TensorFlow Lite 的两大组件分别是解释器和转换器。解释器用来在许多不同的硬件类型上运行特别针对优化的模型。转换器则将 TensorFlow 模型转换为高效形式供解释器使用,并可引入优化以改善程序体积和性能。预先训练的模型有图像分类、对象检测、智能回复、姿势估计和语义分割等类型。还有用于手势识别、图像分类、对象检测和语音识别的示例应用。

TensorFlow Extended

TensorFlow Extended(TFX)( https://www.tensorflow.org/tfx/ )是用于部署机器学习生产流水线的端到端平台。你训练好一个模型就要考虑使用 TFX 了。其流水线包括数据验证( https://www.tensorflow.org/tfx/guide/tfdv )、功能设计( https://www.tensorflow.org/tfx/transform/get_started )、建模( https://www.tensorflow.org/tfx/guide/train )、模型评估( https://www.tensorflow.org/tfx/model_analysis/get_started )、服务推断( https://www.tensorflow.org/tfx/guide/serving )以及在线平台、移动原生平台和 JavaScript 平台的部署管理。下图显示了 TFX 流水线的组件是如何组合在一起的。

TensorFlow Extended 示意图。

Swift for TensorFlow

Swift for TensorFlow( https://www.tensorflow.org/swift )是一个用于深度学习和可微分编程的下一代(并且仍不稳定)平台。它有一个用于训练的高级 API,看起来很像 Python TensorFlow,但它也支持使用 @differentiable 属性自动微分构建到 Swift 编译器的一个 fork 中。Swift for TensorFlow 可以导入和调用 Python 代码,使开发者更容易从 Python TensorFlow 过渡过来。

TensorFlow 工具

目前有七种工具支持 TensorFlow( https://www.tensorflow.org/resources/tools )。它们分别是 TensorBoard,TensorFlow 图的一组可视化工具;TensorFlow Playground,一个可调节的在线神经网络;CoLab,又名 Colaboratory,一个免费的在线 Jupyter 笔记本环境;What-If 工具,可用于探索和调试 TensorBoard、CoLab 或 Jupyter 笔记本中的模型;ML Perf,流行的机器学习基准测试套件;XLA(加速线性代数),一种用于线性代数的特定领域编译器,可优化 TensorFlow 计算;和 TFRC(TensorFlow 研究云),一个由 1000 多个云 TPU 组成的集群,研究人员可以申请免费使用。

总的来说,TensorFlow 2.0 测试版已经在很多方面取得了很大进展。在 tf.keras API 和 Eager Execution 模式的帮助下,新版核心框架更易于学习、使用和调试。你可以有选择地将要编译的函数标记为图形。有五种方法可以进行分布式训练和推断。

新版有一套完整的组件,也就是 TFX,用于构建从数据验证到推断模型管理的全套机器学习流水线。你可以在浏览器或 Node.js 上运行 TensorFlow.js,还可以在移动设备和嵌入式设备上运行 TensorFlow Lite。最后,Swift for TensorFlow 将为模型构建开辟新的可能性。

原文链接 https://www.infoworld.com/article/3405641/tensorflow-2-review-easier-end-to-end-machine-learning.html

收藏

评论

微博

发表评论

注册/登录 InfoQ 发表评论