TensorFlow 白皮书的翻译(未翻译完请绕行)
TensorFlow:Large-Scale Machine Learning on Heterogeneous Distributed Systems 大型机器学习异构分布式系统
最近,正在初学TensorFlow,看了许多网上教学视频,翻译白皮书,记录自己的学习过程。能力有限,读者多包涵。tensorflow白皮书下载
tensorflow的官网 www.tensorflow.org ,但被墙了,解决办法为,在/etc/hosts中添加
#TensorFlow
64.233.188.121 www.tensorflow.org
运行命令使之生效
$sudo /etc/init.d/networking restart [ubuntu]
- 摘要
Tensorflow是一种表达机器学习算法的接口和执行这些算法的一种实现框架。用它表示的计算能在广泛的分布式系统上执行,无论是移动设备(手机或者电脑),还是集上百机器和上千上万的计算部件(gpu卡)的分布式系统,最终的计算结果几乎没什么大的变化。Tensorflow是比较灵活的,能表达宽广的算法,包括深度神经网络模型中的训练和推理算法;还能用于研究和部署机器学习系统,横跨了十几个计算机科学和其他领域,其中包括语言识别、计算机视觉、机器人、信息检索、自然语言过程、地理信息获取、计算农药发现等。这篇文章描述TensorFlow接口和我们在Google上搭建好的接口实现。TensorFlow API 和参照实现按照Apache 2证书,于2015.11已经作为开源项目发布,可以在www.tensorflow.org获取。
- 简介
Google brain项目创立于2011年,目的是为了探索超大规模深度神经网络在科研和产品中的使用。早期,创建了distbelief -- 第一代大规模分布式训练和推理系统。它的用途可观, 在Google内部,使用distbelief研究了很多领域。其中包括非监视学习、语言表示、图像分类和对象检测模型、语音识别、视频识别、序列预测、Go 的移动选择、行人检测、强化学习等。此外,和Google brain 团队的紧密合作,超过50个 Google内部团队和其他alpha公司在许多产品中,使用distbelief中的深度神经网络框架。其中,包括Google搜索引擎、广告产品、语音识别、Google photos、Google地图、Google翻译、YouTube等。基于对distbelief的经验和对分布式特点、深度神经网络训练和使用要求的理解,我们开发了TensorFlow -- 第二代超大规模机器学习模型的实现和部署。TensorFlow使用类似数据流模型并将这些计算映射到不同的硬件平台上来进行计算。运行的平台可以是类似Android和iOS这样包含一个或多个gpu的单机器设备或者是带成百上千gpu的集群。有一个横跨宽泛平台的单一的系统一定意义上简化了现实中机器学习系统的使用,相比用分离式系统来进行大规模的训练和小规模部署带来的较大维护负担和较差的抽象效果。
TensorFlow由一些带状态的数据流图表示。我们已经聚焦于使系统具有足够的灵活性来快速实验新模型的研究和具有高的性能和健壮性来进行机器学习产品训练和部署。它允许使用者通过复制和并行执行一个核心模型的数据流图来很容易地表示并行性,这些计算设备间协同更新整套共享的参数和其他状态。描述计算微妙变化允许各式各样的方法并行实现,代价尽量的低。
---------2017/4/18
一些TensorFlow应用就更新参数的一致性而言是相对灵活的,并且在更大的规模部署中我们能轻松地利用这些同步要求。相比Distbelief而言,TensorFlow的编程模型是更加灵活的、性能更好、支持更宽广的异构平台上训练和使用更多的模型。数十个distbelief的用户已经转向TensorFlow。这些用户使用它来做研究和生产,在移动电话上执行计算机视角的推理,到大规模深度神经网络中使用成百上千的机器来对带上百亿参数的上百亿样本进行训练。尽管,这些应用集中在机器学习尤其是深度神经网络,但我们期待TensorFlow的抽象能在其他领域得到使用,包括其他种类的机器学习算法和其他类型的数值计算。我们已经将TensorFlow API和一种推理实现遵循Apache2.0协议已经于2015年开源,你可以在www.tensorflow.org获取。
本文下面的部分更加细致地描述了 TensorFlow。第二节介绍编程模型和 TensorFlow 接口的基本概念,第三节介绍单机和分布式的实现 。第四节给出了基本编程模型的扩展,第五节介绍了一些基本实现的优化方法。第六节给出了一些使用 TensorFlow 的实验结果,第七节描述了一些使用 TensorFlow 编程的 idiom,第九节则是一些在 TensorFlow 核心外围的工具。第十节和第十一节分别讨论了未来和相关的工作,最后一节给出了总结性想法。
- 编程模型和基本概念
TensorFlow的计算由一个包含多个节点的有向图来描述。图代表一个数据流的计算,允许一些类型的节点来维持和更新持久的状态,图中还有一定程度上类似Naiad【流体模型】的分支或循环控制结构。用户使用一种前端支持的语言c++或者python来构建图。图1,是一个使用python构建和执行TensorFlow图的样例片段;图2是它的结构计算图。
在一个TensorFlow的图中,每个节点有0或多个输入,0个或多个输出,代表着一个操作的实例化。流经正常边上的值叫tensor(张量)。任意维度的数组元素,是指定或者在图构建的时候推断出来的。特殊的边--控制依赖在图中同样存在,这类边没有数据流,但它表明控制依赖的源节点必须在控制依赖的目的节点开始执行前完成执行。由于模型包含可变的状态,控制依赖可以在关系之前直接执行。我们的实现有时同样会插入控制依赖操作来控制非独立操作的顺序,例如,控制内存使用的峰值。
OPS和kernels
每个操作都有自己的名字,代表着一个抽象的计算(比如加法和矩阵的乘法)。一个操作可以有属性,所有的属性必须被提供或者在构建图实例化节点来完成是操作的时候推理出来。属性的一种常见用法是使不同的张量元素多态化(比如浮点加和整型加)。 一个核是一种操作的特殊实现,可以运行在特殊类型的设备上,比如CPU、GPU等。通过注册机制,一个TensorFlow二进制定义了整套操作和可以的核,并且能通过连接额外的操作或者核来进行拓展。表格1显示了一些在TensorFlow核心库中定义的操作Sessions【会话】
客户端通过创建会话和TensorFlow系统交互。为了创建一个计算图,会话接口支持拓展方法来扩充由会话管理的带有额外节点和边的当前图。(当会话被创建的时候图是空的)。由会话接口提供的其他主要的操作是RUN,它采用一整套需要计算的输出名字和一个张量操作集合来填充图从而取缔确切的输出节点。使用RUN的参数,TensorFlow实现能计算所有节点的传递闭包,这些闭包是必须被执行来获取计算所需要的输出,然后安排遵循依赖顺序执行那些适当的节点(细节见3.1)。大多数TensorFlow的使用是一个图启动一个会话,然后执行整个图,或者通过Run调用,执行上百亿次不同的子图。 ------------2017/4/20Variables【是一种特殊的操作,并不是变量】
在大多数计算中,图会被执行多次。在单次执行后许多的tensor并不会保存。然而,Variables是一种特殊的操作,它会返回一个句柄,指向执行图后需要持久化保存的张量。这些持久化句柄可以传递给少数特殊的操作,比如赋值或者 “+=” 操作。对于tensorflow的机器学习应用,模型参数典型存储在Variables持久化的张量中,并作为模型训练执行的一部分被更新。------------2017/4/25
- 实现
tensorflow系统中,主要的组件是client(使用session和master交互),一个或多个worker 进程(每个worker进程负责管理一个或多个计算设备,比如CPU、GPU等),master(管理图节点的执行)。tensorflow有本地和分布式两种实现。在本地实现中,client、master、worker运行在同一台机器(带有多个计算设备)的同一进程中;分布式实现共享大部分本地实现的代码,拓展了对client、master、worker运行在不同机器的不同进程的支持。在分布式实现中,这些任务是互不影响的,由集群调度系统管理。图3,图解了这两种模式。这章剩下的内容讨论了二者的共同点,第3.3章讨论了分布式实现的一些缺点。
3.1单设备执行
首先,看一个最简单的场景,单设备单进程,图中的节点按依赖顺序执行。我们会追踪每个节点的count数,记录还未执行的依赖节点数。一旦这个count降为0,节点适合执行,并放入准备队列。就绪队列按一些未指定的顺序进行处理,将这个节点委派到某个设备内核去执行。当一个节点完成执行后,所有依赖它的节点count数减一。3.2 多设备执行
一旦一个系统有多个计算设备,面临的问题有两个: (a)节点该分配到哪个设备执行? (b)跨设备执行的节点数据怎么通信? 接下来就讨论这两个问题 节点分配 对于一个计算图,tensorflow负责将图中的节点映射到不同的设备上去执行。接下来呈现一个特殊的算法,4.3章拓展了这个算法。分配设备的输入是一个代价模型,这个模型包含了每个节点的输入输出张量的大小估计,同时估计对于输入节点需要请求执行的时间。这个代价模型要么是基于建立在不同操作上的启发式规则,要么是基于一部分节点真实执行运算后测得。 分配算法首先会仿真执行整个计算图。这个仿真方法使用贪婪法为每个节点挑选设备,最后由仿真选出的设备就作为节点真正执行时设备来分配。 分配算法从图的源节点开始,并在每个设备以进程形式仿真执行。对于在此遍历中达到的每个节点,考虑一组可行设备(如果一个设备并不能提供内核功能实现某个操作,说明它并不是个可行的设备)。对于有多个可行设备的,分配算法使用贪婪法,比较将节点分别在这些设备上执行的时间。将输入传递到这个设备的时间和节点操作在这个设备的执行时间做个综合,选择最佳的。然后继续下一节点。4.3章将会介绍一种拓展方式,用户可以限制规则来配合分配策略。 跨设备通信---------2017.5.5
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
