TensorFlow
背景
谷歌大脑自2011年成立起开展了面向科学研究和谷歌产品开发的大规模
深度学习
应用研究,其早期工作即是TensorFlow的前身DistBelief [1]。DistBelief的功能是构建各尺度下的神经网络分布式学习和交互系统,也被称为“第一代机器学习系统” [1]。DistBelief在谷歌和
Alphabet
旗下其它公司的产品开发中被改进和广泛使用 [3-4]。2015年11月,在DistBelief的基础上,谷歌大脑完成了对“第二代机器学习系统”TensorFlow的开发并对代码开源。相比于前作,TensorFlow在性能上有显著改进、构架灵活性和
可移植性
也得到增强 [1]。此后TensorFlow快速发展,截至稳定API版本1.12,已拥有包含各类开发和研究项目的完整生态系统。在2018年4月的TensorFlow开发者峰会中,有21个TensorFlow有关主题得到展示 [2]。
安装
语言与系统支持
TensorFlow支持多种客户端语言下的安装和运行。截至版本1.12.0,绑定完成并支持版本兼容运行的语言为
C
和
Python
,其它(试验性)绑定完成的语言为
JavaScript
、
C++
、
Java
、
Go
和
Swift
,依然处于开发阶段的包括
C#
、
Haskell
、
Julia
、
Ruby
、Rust和
Scala
[5]。
Python
TensorFlow提供Python语言下的四个不同版本:CPU版本(tensorflow)、包含GPU加速的版本(tensorflow-gpu),以及它们的每日编译版本(tf-nightly、tf-nightly-gpu)。TensorFlow的Python版本支持
Ubuntu
16.04、
Windows 7
、
macOS
10.12.6 Sierra、Raspbian 9.0及对应的更高版本,其中macOS版不包含GPU加速 [6]。安装Python版TensorFlow可以使用模块管理工具
pip
/pip3 [7]或
anaconda
并在终端直接运行。
版本兼容性
TensorFlow的公共API版本号使用语义化版本2.0标准 [12],包括主版本号.次版本号.修订号,其中主版本号的更改不是
向下兼容
的,已保存的TensorFlow工作可能需迁移到新的版本; 次版本号的更改包含向下兼容的性能提升;修订号的更改是向下兼容的问题修正 [5]。
TensorFlow支持版本兼容的部分包括协议缓冲区文件、所有的C接口、Python接口中的tensorflow模块以及除tf.contrib和其它私有函数外的所有子模块、Python函数和类 [5]。更新不支持版本兼容的部分为:包含“试验性(experimental)”字段的组件、使用除C和Python外其它语言开发的TensorFlow API、以GraphDef形式保存的工作、浮点数值特定位的计算精度、随机数、错误和错误消息 [5]。其中GraphDef拥有与TensorFlow相独立的版本号,当TensorFlow的更新放弃对某一GraphDef版本的支持后,可能有相关工具帮助用户将GraphDef转化为受支持的版本 [5]。需要指出,尽管 GraphDef的版本机制与TensorFlow相独立,但对GraphDef的更改仍受限于语义版本控制,即只能在TensorFlow主版本号之间移除或更改功能。此外,修订版本之间实施GraphDef的向前兼容 [5]。
组件与工作原理
核心组件
设备层
(device layer)/
网络层
(networking layer) [13]。
分发中心从输入的数据流图中剪取子图(subgraph),将其划分为操作片段并启动执行器。分发中心处理数据流图时会进行预设定的操作优化,包括公共子表达式消去(common subexpression elimination)、常量折叠(constant folding)等 [13]。
执行器负责图操作(graph operation)在进程和设备中的运行、收发其它执行器的结果。分布式TensorFlow拥有参数器(parameter server)以汇总和更新其它执行器返回的模型参数。执行器在调度本地设备时会选择进行
并行计算
和GPU加速 [13]。
内核应用负责单一的图操作,包括数学计算、数组操作(array manipulation)、控制流(control flow)和状态管理操作(state management operations)。内核应用使用
Eigen
执行张量的并行计算、cuDNN库等执行GPU加速、gemmlowp执行低数值精度计算,此外用户可以在内核应用中注册注册额外的内核(fused kernels)以提升基础操作,例如激励函数和其梯度计算的运行效率 [13]。
单进程版本的TensorFlow没有分发中心和执行器,而是使用特殊的会话应用(Session implementation)联系本地设备。TensorFlow的C语言API是核心组件和用户代码的分界,其它组件/API均通过C语言API与核心组件进行交互 [13]。
低阶API
张量(tf.Tensor)
张量是TensorFlow的核心数据单位,在本质上是一个任意维的数组。可用的张量类型包括常数、变量、张量占位符和稀疏张量 [14-15]。这里提供一个对各类张量进行定义的例子:
高阶API
Estimators
Estimators是TensorFlow自带的高阶神经网络API [29]。Estimators封装了神经网络的训练、评估、预测、导出等操作。Estimators的特点是具有完整的
可移植性
,即同一个模型可以在各类终端、服务中运行并使用GPU或TPU加速而无需重新编码 [29]。Estimators模型提供分布式训练循环,包括构建图、初始化变量、加载数据、处理异常、创建检查点(checkpoint)并从故障中恢复、保存TensorBoard的摘要等。Estimators包含了预创建模型,其工作流程如下 [29]:
加速器
CPU和GPU设备
TensorFlow支持CPU和GPU运行,在程序中设备使用字符串进行表示。CPU表示为"/cpu:0";第一个GPU表示为"/device:GPU:0";第二个GPU表示为"/device:GPU:1",以此类推 [45]。如果TensorFlow指令中兼有CPU和GPU实现,当该指令分配到设备时,GPU设备有优先权。TensorFlow仅使用计算能力高于3.5的GPU设备 [11]。
在启用会话时打开log_device_placement配置选项,可以在终端查看会话中所有操作和张量所分配的设备,这里提供一个例子:
优化器
模型优化工具
Tensorflow提供了模型优化工具(Model Optimization Toolkit)对模型的尺度、响应时间和计算开销进行优化 [51]。模型优化工具可以减少模型参数的使用量(pruning)、对模型精度进行量化(quantization)和改进模型的拓扑结构,适用于将模型部署到终端设备,或在有硬件局限时运行模型,因此有很多优化方案是TensorFlow Lite项目的一部分。其中量化能够在最小化精度损失的情况下显著减小模型尺度和缩短响应时间,并是优化深度学习模型的重要手段。这里提供一个使用使用模型优化工具的例子 [52]:
可视化工具
TensorFlow拥有自带的
可视化工具
TensorBoard,
TensorBoard
具有展示数据流图、绘制分析图、显示附加数据等功能 [54]。开源安装的TensorFlow会自行配置TensorBoard。启动TensorBoard前需要建立模型档案,低阶API使用tf.summary构建档案,Keras包含callback方法、Estimator会自行建立档案。这里提供两个例子:
调试程序
由于通用
调试程序
,例如Python的pdb很难对TensorFlow代码进行调试,因此TensorFlow团队开发了专用的调试模块TFDBG,该模块可以在学习和预测时查看会话中数据流图的内部结构和状态 [55]。TFDBG在运行时期间会拦截指令生成的错误,并向用户显示错误信息和调试说明。TFDBG使用文本交互系统
curses
,在不支持curses的Windows操作系统,可以下载非官方的Windows curses软件包或使用readline作为代替。使用TFDBG调试会话时,可以直接将会话进行封装,具体有如下例子 [55]:
部署
TensorFlow支持在一个或多个系统下使用多个设备并部署
分布式服务器
(distributed server)和
服务器集群
(cluster)。tf.train.Server.create_local_server可在本地构建简单的分布式服务器 [56]。这里提供一个例子 [57]:
安全性
TensorFlow的模型文件是代码,在执行数据流图计算时可能的操作包括读写文件、从网络发送和接收数据、生成子进程,这些过程对系统会造成影响 [60]。在运行由未知第三方提供的TensorFlow模型、 计算流图(GraphDef和SavedModel)和检查点文件时,一个推荐的做法是使用沙盒(sand box)以监测其行为 [60]。安全的TensorFlow模型在引入未知输入数据时,也可能触发TensorFlow内部或系统的错误。
TensorFlow的分布式计算平台和服务器接口(tf.train.Server)不包含授权协议和信息加密选项,任何具有网络权限的访问者都可以运行tf.train.Server上的任何代码,因此TensorFlow不适用于不信任的网络。在局域网或云计算平台部署TensorFlow计算集群时,需要为其配备独立网络(isolated networks) [60]。
TensorFlow作为一个使用大量第三方库(NumPy、libjpeg-turbo等)的复杂系统,容易出现漏洞。用户可以使用电子邮件向TensorFlow团队报告漏洞和可疑行为,对于高度敏感的漏洞,其GitHub页面提供了邮件的SSH密钥 [60]。以下列出截至2018年7月12日的已知漏洞 [61]:
生态系统
社区
TensorFlow位于GitHub的三个代码库负责处理事件和提供技术支持,一般性的求助也可发送至StackOverflow的TensorFlow板块 [62]。TensorFlow使用公共邮箱发布主要版本和重要公告 [63],其官方网站的“路线图”页面汇总了其近期的开发计划 [64]。TensorFlow团队拥有推特账户和博客以发布项目的新闻和动态。TensorFlow的YouTube频道介绍了TensorFlow在机器学习和人工智能领域的应用,并定期推送节目,包括“TensorFlow Meets”、“Ask TensorFlow”和“Coding TensorFlow” [65]。
项目
TensorFlow Hub
TensorFlow Hub是一个允许用户发布、共享和使用TensorFlow模块的库开发项目。用户可以将TensorFlow数据流图或其部分使用Hub进行封装并移植到其它问题中再次利用 [66]。TensorFlow Hub页面列出了由谷歌和DeepMind提供的封装模型,其主题包括字符嵌入、视频分类和图像处理 [67]。
TensorFlow Extended (TFX)
TFX是谷歌基于TensorFlow开发的产品级机器学习平台,其目标是是对产品开发中的模型实现、分析验证和业务化操作进行整合,在实时数据下完成机器学习产品的标准化生产 [68]。TFX包含三个算法库:TensorFlow Data Validation对机器学习数据进行统计描述和验证、TensorFlow Transform对模型数据进行预处理、TensorFlow Model Analysis对机器学习模型进行分析,提供表现评分。另有TensorFlow Serving作为模型业务化的高性能系统,提供模型接口和管理 [69]。
TensorFlow Probability (TFP)
TFP是在TensorFlow Python API基础上开发的统计学算法库,其目标是方便用户将概率模型和深度学习模型相结合使用 [70]。TFP包含大量概率分布的生成器、支持构建深度网络的概率层(probabilistic layers)、提供变分贝叶斯推断(Variational inference)和马尔可夫链蒙特卡罗方法(Markov chain Monte Carlo)和一些特殊的优化器,包括Nelder-Mead方案、BFGS算法(Broyden-Fletcher-Goldfarb-Shanno algorithm)和SGLD(Stochastic Gradient Langevin Dynamics) [70]。
应用开发
TensorFlow.js
TensorFlow.js是TensorFlow的JavaScript API,主要用于网页端的机器学习应用开发。TensorFlow.js可以在浏览器和Node.js下转化和运行TensorFlow构建的机器学习模型,并使用网页端数据对模型进行训练 [71]。截至2018年9月18日,TensorFlow.js的版本号为0.13 [72]。
TensorFlow Lite
TensorFlow Lite是为移动和嵌入式设备运行机器学习代码的问题提供解决方案。TensorFlow Lite包含优化算法以提升Android、iOS等系统下机器学习模型的响应时间并降低文件大小。谷歌内部的许多移动端产品,包括谷歌相册、谷歌邮箱客户端、谷歌键盘等都使用TensorFlow Lite部署了人工智能算法 [73]。
Swift for TensorFlow
Swift for TensorFlow是开源版Swift的TensorFlow API开发项目。Swift for TensorFlow类似于Eager Execution可以直接执行数据流图且性能更高 [74]。截至10月13日,Swift for TensorFlow处于早期开发状态。
研究
TensorFlow Research Cloud
(原文) [75]“Our goal is to ensure that the most promising researchers in the world have access to enough compute power to imagine, implement, and publish the next wave of ML breakthroughs.”
除面向研究的TPU服务外,谷歌也提供商用的Cloud TPU项目以支持企业的Tensorflow开发 [47]。
Magenta
Magenta是在艺术领域使用机器学习的研究项目,该项目使用深度学习网络和强化学习算法学习生成音乐、绘画和其它艺术作品,以帮助艺术人员拓展其创作过程 [77]。Magenta项目的研究成果包括音乐创作工具NSynth和混音工具MusicVAE。
Nucleus
Nucleus是将TensorFlow应用于基因组文件,例如SAM和VCF格式文件的读写和分析的库开发项目 [78]。Nucleus使用Python和C++进行开发,截至2018年9月已发布0.2.0版本 [78]。
版本
TensorFlow 2.8.0
2022年2月,TensorFlow 官方发布了 2.8.0 正式版,提供了更多的 bug 修复和功能改进,还针对漏洞发布了补丁。TensorFlow 2.8.0 主要功能和改进:
在 tf.lite 中,增加了 TFLite 内置 op 支持以下功能:
tf.raw_ops.Bucketize op 可在 CPU 上操作;
tf.where op 可用于数据类型 tf.int32、tf.uint32、tf.int8、tf.uint8、tf.int64;
tf.random.normal op 用于在 CPU 上输出数据类型 tf.float32;
tf.random.uniform op 用于在 CPU 上输出数据类型 tf.float32;
f.random.categorical op 用于在 CPU 上的输出数据类型 tf.int64。
tensorflow.experimental.tensorrt:
Conversion_params 在 TrtGraphConverterV2 中被弃用,现在可以支持参数 max_workspace_size_bytes、precision_mode、minimum_segment_size、maximum_cached_engines、use_calibration 和 allow_build_at_runtime;
在 TrtGraphConverterV2 中的 .save () 函数中添加了一个名为 save_gpu_specific_engines 的新参数。当为 False 时,.save () 函数不会保存任何已构建的 TRT 引擎;如果为 True(默认),则保留原始行为;
TrtGraphConverterV2 提供了一个名为 .summary () 的新 API。它显示了每个 TRTEngineOp 及其输入和输出的形状和 dtype,并提供了详细版本摘要。
tf.tpu.experimental.embedding:
tf.tpu.experimental.embedding.FeatureConfig 增加了一个额外的参数 output_shape,它可以指定特征输出激活的形状;
tf.tpu.experimental.embedding.TPUEmbedding 现在具有与 tf.tpu.experimental.embedding.serving_embedding_lookup 相同的功能,它可以使用任意等级密集和稀疏的张量。对于不规则张量,尽管输入张量仍然是 2 级,但现在可以通过在特征配置中指定输出形状或通过 build 方法来激活 2 级或更高级别。
添加 tf.config.experimental.enable_op_determinism ,这使得 TensorFlow ops 以性能为代价可以确定性地运行。替换 TF_DETERMINISTIC_OPS 环境变量。
(自 TF 2.7 起)向 TensorFlow Profiler 添加 PluggableDevice 支持。
Bug 修复和其他改进
tf.data:
如果用户未禁用,现在优化 parallel_batch 现在成为默认值,这样可以并行复制批处理元素;
添加了 TensorSliceDataset,用于识别和处理文件输入。
tf.lite:
为 Java API 的序列化添加 GPU 委托支持,当 OpenCL 可用时,这将初始化时间提高了 90%;
弃用 Interpreter::SetNumThreads,支持 InterpreterBuilder::SetNumThreads。
tf.keras
tf.random.Generator 用于 keras 初始化和所有的 RNG 代码;
TextVectorization 增加了额外的 standardize 和 split 模式:standardize="lower" 转化为小写字母输入;standardize="string_punctuation" 删除所有标点符号;Split ="character" 将对每个 unicode 字符进行拆分。
增加 GPU 实现:
(自 2.7 版本开始) tf.math.segment_mean
(自 2.7 版本开始) tf.math.segment_prod
(自 2.7 版本开始) tf.math.segment_sum
TensorFlow 已在适用于 GPU 和 CPU 的 Windows Subsystem for Linux 2(又名 WSL 2)上得到验证。
此外,TensorFlow 2.8.0 在安全方面进行了一些修正,包括修正了执行卷积运算时浮点数被 0 除的问题:CVE-2022-21725;修正了 Dequantize 形状推断中的整数溢出问题:CVE-2022-21727;修正了 ConcatV2 形状推断中的类型混淆问题:CVE-2022-21731 等。 [81]
评论