喜大普奔,在祖国 70 岁生日的这一天,TensorFlow2.0 正式 Release,本文主要介绍一下 TensorFlow2.0 的新特性。TensorFlow 1.15 官方已经宣布该版本是 1.X 的最后一个版本了。
主要特点和改进
TensorFlow 2.0 专注于简单性和易用性,具有以下更新:
- 使用 Keras 轻松构建模型,渴望执行模式
- 在任何平台上进行生产中的稳健模型部署
- 强大的研究实验
- 通过减少重复并删除已经标记不再使用的端点来简化 API
有关 2.0 最佳实践的详细信息,参照 the Effective 2.0 guide
这里我强调一下渴望执行模式。TensorFlow 2.0 主推的 eager execution mode 采用和解释执行图完全不同的深度学习计算方式。类似 PyTorch 的做法,前向计算过程把对基本计算单元(operator)的调用记 录在一个内存数据结构 tape 里,随后,反向计算过程(计算 gradients 的)可以回溯这个 tape,以此调用 operator 对应的 gradient operator。这个 tape 提供一个操作让用户可以获取每个参数的 gradient。
Highlights
- TF 2.0 提供 Keras 作为用于构建和训练模型的中央高级 API。Keras 提供了一些模型构建 API,例如顺序,功能和子类化以及急切的执行(用于立即迭代和直观调试)以及 tf.data(用于构建可扩展的输入管道)。
- 分发策略:TF 2.0 用户将能够使用 tf.distribute.Strategy API 通过最少的代码更改来分发培训,从而获得出色的现成性能。它支持 Keras model.fit 以及自定义训练循环的分布式训练。提供多 GPU 支持,以及对多工作人员和 Cloud TPU 的实验性支持
- 功能,而不是会话。不鼓励使用传统的声明式编程模型来构建图形并通过 tf.Session 执行它,并通过编写常规的 Python 函数来代替。使用 tf.function 装饰器,这些函数可以转换为图形,可以远程执行,序列化并针对性能进行优化。
- tf.train.Optimizers 和 tf.keras.Optimizers 的统一。对 TF2.0 使用 tf.keras.Optimizers。作为公共 API 删除了 compute_gradients,使用 GradientTape 计算梯度。
- AutoGraph 将 Python 控制流转换为 TensorFlow 表达式,允许用户在装饰有 tf.function 的函数中编写常规 Python。AutoGraph 也适用于与 tf.data,tf.distribute 和 tf.keras API 一起使用的函数。
- 交换格式与 SavedModel 的统一。所有 TensorFlow 生态系统项目(TensorFlow Lite,TensorFlow JS,TensorFlow Serving,TensorFlow Hub)都接受 SavedModels。模型状态应保存到 SavedModels 或从 SavedModels 恢复。
- API 更改:许多 API 符号已重命名或删除,参数名称也已更改。这些变化中的许多变化都是出于一致性和清晰性。1.x API 在 compat.v1 模块中仍然可用。
- 添加环境变量 TF_CUDNN_DETERMINISTIC。设置为 TRUE 或“1”将强制选择确定性 cuDNN 卷积和最大池算法。启用此功能后,算法选择过程本身也是确定性的。
TensorFlow 2.0 与 kubernetes
这两个在各自领域最火的框架,结合的工作其实业界已经有很多尝试了,包括谷歌的 kubeflow。Distributed TensorFlow 虽然提供了分布式能力,可以利用服务器集群加快训练,但是还有许多缺点:
- 训练时 TensorFlow 各个 Task 资源无法隔离,很有可能会导致任务间因资源抢占互相影响。
- 缺乏调度能力,需要用户手动配置和管理任务的计算资源。
- 集群规模大时,训练任务的管理很麻烦,要跟踪和管理每个任务的状态,需要在上层做大量开发。
- 用户要查看各个 Task 的训练日志需要找出对应的服务器,并 ssh 过去,非常不方便。
- TensorFlow 原生支持的后端文件系统只支持:标准 Posix 文件系统(比如 NFS)、HDFS、GCS、memory-mapped-file。大多数企业中数据都是存在大数据平台,因此以 HDFS 为主。然而,HDFS 的 Read 性能并不是很好。
而这些正是 Kubernetes 所擅长的地方。
当你试着去创建一个大规模 TensorFlow 集群时,发现并不轻松;
尤其是蚂蚁金服开源的 ElasticDL,该项目是基于 TensorFlow 2.0 的 Kubernetes-native 弹性分布式深度学习系统。