TensorFlow 2.0终于来了!
今天凌晨,谷歌在加州举办TensorFlow开发者峰会(TensorFlow Dev Summit),正式发布2.0版本。
这场发布会有几大亮点:
-
TensorFlow 2.0 Alpha版发布,用户现在可以抢先体验;
-
2.0版本具有简易性、更清晰、扩展性三大特征,大大简化API;
-
提高了TensorFlow Lite和TensorFlow.js部署模型的能力;
发布会还把TensorFlow目前的家底透露了一遍:目前TF在全球已经有超过4100万的下载次数,社区有超过1800多个贡献者。
尽管官方没有透露中国社区的情况,但是发布会现场展示一张全球地图,根据图中的用户分布情况可以推测,目前TF中国应该是仅次于美国和欧洲的第三大地区。
另外一个值得注意的变化是,从2.0开始,TensorFlow的logo也不一样,从类似积木的形状变成了两个分开的字母“T”和“F”,或许也意味着减少冗余,看上去更简洁。
简单易用可扩展,TF2.0迎来新架构
TensorFlow 已经发展为世界上最受欢迎和被广泛采用的机器学习平台之一,自2015年问世,并在去年11月迎来三周岁生日。
之前开发者反馈,希望TensorFlow能够简化API、减少冗余并改进文档和示例。这次2.0发布,听取了开发者的建议,因此新版本有以下三大特点:简单、强大、可拓展。
基于这三大特点,TensorFlow 2.0也有新架构,如下面的简化概念图所示:
TensorFlow 2.0 将专注于简单性和易用性,具有以下更新:
-
使用 Keras 和 eager execution,轻松构建模型
-
在任意平台上实现生产环境的稳健模型部署
-
为研究提供强大的实验工具
-
通过清理废弃的 API 和减少重复来简化 API
下面详细介绍TF2.0的新特性。
易用至上,TensorFlow 2.0 Alpha发布
这次TensorFlow的一些列更新,重点就在于:让你使用得更加简单。
TensorFlow 2.0发布以后,训练的流程将变得十分简洁:
主要流程就是:数据集成和转换→模型构建→训练→保存模型。
当然,TensorFlow也秉承着“哪儿都可以部署”的原则,使其在应用方面更加灵活和方便,包括服务器、edge device边缘设备、JS环境,TF都有相应的版本支持:
下面是TensorFlow2.0在这次更新中的几大亮点:
TensorFlow Alpha
-
更易用:诸如tf.keras等高级API将更易于使用;并且Eager execution将成为默认设置。例如:
>>>tf.add(2,3)<tf.Tensor: id=2, shape=(), dtype=int32, numpy=5>
-
更清晰:删除了重复的功能;不同API的调用语法更加一致、直观;兼容性更加完善。
-
更灵活:提供完整的低级API;可在tf.raw_ops中访问内部操作;提供变量、checkpoint和层的可继承接口。
当然,TensorFlow 2.0 Alpha版本从安装上便十分的简单,仅需一句话:
pip install -U --pre tensorflow
而Eager execution 与 “@tf.function”作为核心升级重点,接下将会对其如何协同工作进行做详细介绍。
其中一个最明显的变化是,TensorFlow 是 “Eager 优先”,这意味着 op 在调用后会立即运行。在 TensorFlow 1.x 中,使用者可能会先构图,然后通过 “tf.Session.run()” 执行图的各个部分。
TensorFlow 2.0 从根本上简化了 TensorFlow 的使用 — 同样出色的 op,现在却更易理解和使用。
a = tf.constant([1, 2])
b = tf.constant([3, 4])
print(a + b)
# returns: tf.Tensor([4 6], shape=(2,), dtype=int32)
TensorFlow 2.0 使用 Keras 作为开发者的核心体验。在 2.0 中,可以如常使用 Keras,利用 Sequential API 构建模型,然后使用 “compile” 和 “fit”。tensorflow.org 中所有这些熟悉的 “tf.keras” 示例均可在 2.0 中实现 “开箱即用”。
Keras 的 “fit()” 适用于很多情况,但是,需要更高灵活性的开发者现在可以有更多选择。来看一下如下示例中以 TensorFlow 2.0 风格编写的自定义训练循环:
def train_one_step(model, optimizer, x, y): with tf.GradientTape() as tape: logits = model(x) loss = compute_loss(y, logits) grads = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(grads, model.trainable_variables)) compute_accuracy(y, logits) return lossdef train(model, optimizer): train_ds = mnist_dataset() step = 0 loss = 0.0 for x, y in train_ds: step += 1 loss = train_one_step(model, optimizer, x, y) if tf.equal(step % 10, 0): tf.print('Step', step, ': loss', loss, '; accuracy', compute_accuracy.result())return step, loss, accuracy
此示例采用 Autograd 风格的 GradientTape,并通过优化器手动应用你的梯度。在编写具有复杂内部运作的自定义训练循环(譬如在强化学习中)或进行研究(轻松帮您落实提高优化器效率的新想法)时,这特别有帮助。
“Eager execution” 还有助于调试和监控运行中的代码,可以使用 Python 调试程序检查变量、层及梯度等对象。在训练循环中,使用 “if”、“for” 和 “print()” 等 Python 语句。
一旦代码运行正常,便会想要获得图表优化和效率。为此,可以利用装饰器 “@tf.function” 封装 “train”。“tf.function” 中内置 Autograph,因此无需任何特殊操作便可获取以用图表效率运行的 “if” 或 “for” 子句。
@tf.function
def train(model, optimizer):
train_ds = mnist_dataset()
step = 0
loss = 0
accuracy = 0
for x, y in train_ds:
# 如上所述,包括“if”和“print()”
return step
这段代码并不会受注释影响,但会将其编译到可在 GPU、TPU 上轻松运行的图表中,或将其保存至 “SavedModel” 留待后用。
针对这对代码,尤为有趣之处在于,通过在 “@tf.function” 中封装 “train()”,“train_one_step()”、“compute_loss()” 和 “compute_accuracy()” 也会自动进行转换。也可选择在 “@tf.function” 中仅封装部分运算,从而获得所需行为。
此外,TensorFlow 2.0 完全支持 Estimator。
tensorflow.org/alpha 链接
https://www.tensorflow.org/alpha
高级API变化
TensorFlow 2.0 在API上可谓是下足了功夫,在这个版本中,高级API将十分“易于扩展”且“扩展地很容易”:
例如,对tf.keras.optimizer\ tf.keras.layers\ tf.keras.loss等一些列高级API都做了“易用性”的优化。例如:
值得注意的是,尤其是对诸如RNN layers等神经网络的高级API做了优化,用户还可以对其自定义。
可谓是开发者福音。
升级
TensorFlow 2.0 将包含许多 API 变更,例如,对参数进行重新排序、重新命名符号和更改参数的默认值。手动执行所有这些变更不仅枯燥乏味,而且容易出错。
为简化变更过程并让开发者尽可能顺畅地过渡到 TensorFlow 2.0,TensorFlow 工程团队创建了实用程序 tf_upgrade_v2,可将旧代码转换至新 API。
tf_upgrade_v2 链接
https://github.com/tensorflow/docs/blob/master/site/en/r2/guide/upgrade.md
TensorFlow.js v1.0
TensorFlow for Javascript已经有300,000次下载和100个贡献者。 今天TensorFlow.js的1.0版本包括性能改进。
例如浏览器中MobileNet v1推理的9倍提升。 还有针对Web开发人员的新现成模型和更广泛的平台支持。
TensorFlow Lite:超20亿移动设备部署使用
TensorFlow Lite 是一个为移动和嵌入式设备打造的轻量级、跨平台解决方案。
这样一个轻量级的解决方案很有必要,因为机器学习越来越多地转移到终端设备,如手机、汽车、可穿戴设备等。在这样的设备上使用 ML 有很多限制,如有限的计算能力、有限的内存、电池限制等,TensorFlow Lite 可以很大程度上解决这些限制。
TensorFlow Lite 的用例
一个惊人的事实:已经有 20 亿移动设备部署使用了 TensorFlow Lite。
说明,TensorFlow Lite 有很多国内外客户……
网易有道技术总监林会杰作为 “为什么选择 TensorFlow Lite” 的代表,受邀上台介绍了有道翻译应用 TensorFlow Lite 取得的成果。
TensorFlow Lite 四大主题:
-
可用性 (Usability):拿来即用
-
性能 (Performance):模型执行速度更快
-
优化 (Optimization):让你的模型更小、更快
-
文档 (Documentation):有很多资源
可用性:部署简单,拿来即用
保存模型,转换到TF Lite,就是这么简单。
新的 TensorFlow Select 功能让模型转换到 TensorFlow Lite 更简单。
性能:在可用的硬件条件下,让模型执行尽可能快
有多快呢?训练 MobileNet v1,CPU、GPU 和 Edge TPU 下推理速度分别提升了 1.9倍、7.7 倍和 62 倍!
优化:让模型更小、更快
优化表现:
文档:
Coral 开发板和 USB 加速器
比较有趣的是,今日谷歌还发布两个全新的硬件产品:Coral 开发板和 USB 加速器。
首先介绍下 Coral。Coral 是一个构建智能设备的平台,它提供完全本地的 AI 工具箱,包括硬件组件、软件工具,以及帮助你创造、训练、运行神经网络的模块。
Coral 的首个硬件组件就是之前谷歌发布的 ASIC——Edge TPU,它能为低功率设备提供极高的机器学习推理性能。例如,它能以高能效方式在 100+ 的 fps 下执行 MobileNet v2 这样的视觉模型。
Coral 摄像模块、开发板和 USB 加速器。
作为全新的开发产品,Coral 开发板是个完全集成的系统,它被设计成构建在载板上的系统模块(SoM)。SoM 把强大的 NXP iMX8M SoC 与谷歌的 Edge TPU 协处理器(包括 Wi-Fi、蓝牙、RAM 和 eMMC 存储)融合在了一起。为了让计算机视觉应用原型更简单,谷歌还提供了一个摄像头连接开发板与 MIPI 接口。
为了把 Edge TPU 加入到已有的设计中,Coral USB 加速器允许通过 USB2.0、3.0 接口轻松接入到任何 Linux 系统中,之后谷歌还会添加 PCIe 版本。
价格方面,Coral 开发板售价为 149.99 美元,Coral USB 加速器售价为 74.99 美元。
小结
以上就是一年一度的谷歌 TensorFlow 开发者大会上的全新发布了。总体而言,我们看到了 TensorFlow 在设计上的重大革新。这些新特征是否让你对它有所期待呢?
参考文章:
https://medium.com/tensorflow/introducing-tensorflow-privacy-learning-with-differential-privacy-for-training-data-b143c5e801b6
https://medium.com/tensorflow/test-drive-tensorflow-2-0-alpha-b6dd1e522b01
https://developers.googleblog.com/2019/03/introducing-coral-our-platform-for.html