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/20

Variables【是一种特殊的操作,并不是变量】

在大多数计算中,图会被执行多次。在单次执行后许多的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章讨论了分布式实现的一些缺点。

设备Device
设备是tensorflow计算的核心,每个worker可以管理一个或多个设备,并且每个设备都有个类型和名字。设备的名字由设备的类型,编号,和一个分布式的设置(job的标识和任务数的编号)。比如
  “/job:localhost/device:cpu:0 ” 或者"/job:worker/task:17/device:gpu:3"  。我们已经实现了CPU和GPU的设备接口,其他的新设备可以使用注册机制添加。每个设备负责内存的分配和释放,并安排执行由更高级tensorflow请求内核程序。
tensor(张量)
张量类似于多维数组。tensorflow支持许多张量类型:带符号或不带符号的8位到64位的整型、IEEE浮点float或double、复数型、以及字符串型。适当大小的备份存储由分配器管理tensor的驻留,tensor备份存储buffer记录tensor的引用数,一旦引用数为0,就释放此tensor占的存储空间。

3.1单设备执行

首先,看一个最简单的场景,单设备单进程,图中的节点按依赖顺序执行。我们会追踪每个节点的count数,记录还未执行的依赖节点数。一旦这个count降为0,节点适合执行,并放入准备队列。就绪队列按一些未指定的顺序进行处理,将这个节点委派到某个设备内核去执行。当一个节点完成执行后,所有依赖它的节点count数减一。

3.2 多设备执行

一旦一个系统有多个计算设备,面临的问题有两个:
(a)节点该分配到哪个设备执行?
(b)跨设备执行的节点数据怎么通信?
接下来就讨论这两个问题
节点分配
对于一个计算图,tensorflow负责将图中的节点映射到不同的设备上去执行。接下来呈现一个特殊的算法,4.3章拓展了这个算法。分配设备的输入是一个代价模型,这个模型包含了每个节点的输入输出张量的大小估计,同时估计对于输入节点需要请求执行的时间。这个代价模型要么是基于建立在不同操作上的启发式规则,要么是基于一部分节点真实执行运算后测得。
分配算法首先会仿真执行整个计算图。这个仿真方法使用贪婪法为每个节点挑选设备,最后由仿真选出的设备就作为节点真正执行时设备来分配。
分配算法从图的源节点开始,并在每个设备以进程形式仿真执行。对于在此遍历中达到的每个节点,考虑一组可行设备(如果一个设备并不能提供内核功能实现某个操作,说明它并不是个可行的设备)。对于有多个可行设备的,分配算法使用贪婪法,比较将节点分别在这些设备上执行的时间。将输入传递到这个设备的时间和节点操作在这个设备的执行时间做个综合,选择最佳的。然后继续下一节点。4.3章将会介绍一种拓展方式,用户可以限制规则来配合分配策略。
跨设备通信
---------2017.5.5

TensorFlow 白皮书的翻译(未翻译完请绕行)相关推荐

  1. 深度解析】Google第二代深度学习引擎TensorFlow开源(CMU邢波独家点评、白皮书全文、视频翻译)

    新智元原创1 作者:王嘉俊 王婉婷 TensorFlow 是 Google 第二代深度学习系统,今天宣布完全开源.TensorFlow 是一种编写机器学习算法的界面,也可以编译执行机器学习算法的代码. ...

  2. 考研英语 各种阅读/翻译/新题型/完形填空技巧

    本文内容为考研英语 各种阅读/翻译/新题型/完形填空技巧,源文件已经上传到我的资源中,有需要的可以去看看, 我主页中的思维导图中内容大多从我的笔记中整理而来,相应技巧可在笔记中查找原题, 有兴趣的可以 ...

  3. abortonerror_android-错误:“ app_name”未翻译

    android-错误:" app_name"未翻译 我是Android编码和这个论坛的新手. 当我尝试运行项目进行测试时,出现以下错误:- " app_name" ...

  4. Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译

    Android官方文档training中英文翻译目录大全:29篇已翻译,45篇未翻译 1. Getting Started Building Your First App: 原文: https://d ...

  5. 如何在手机上进行英文翻译中文在线翻译

    当你与外国人进行中英文交流时,你可以用翻译软件进行中英文翻译,可是当老外说英文时应该如何进行英文翻译中文在线翻译呢?今天小编就来给大家介绍一个方法,帮你快速进行中英文在线互译. 1:首先我们在手机上下 ...

  6. python爬虫之基于JS加密破解--有道翻译/百度翻译

    有道翻译破解案例(post) 目标 破解有道翻译接口,抓取翻译结果 # 结果展示 请输入要翻译的词语: elephant 翻译结果: 大象 ************************** 请输入 ...

  7. Office内嵌12国语言翻译功能----翻译好助手(转)

    Office内嵌12国语言翻译功能----翻译好助手(转)[@more@] 这是Office XP/2003之后才有的超好用功能,但可能很多人都不知道,所以,每次遇到不会念或看不懂的英文.日文,往往束 ...

  8. 绵阳python培训_《绵》原文及翻译海绵翻译

    <绵>原文及翻译海绵翻译 查字典语文网小编给各位考 生筛选整理了 : 诗经中<绵>原文,<绵>原文翻译,诗经的来源, 希望对大家有所帮助,更多的资讯请持续关注查字典 ...

  9. 英汉互译在线翻译-英文翻译中文的翻译

    您是否曾经遇到需要翻译英语文件,但被繁琐的翻译过程所拖慢了工作进度?或者遭遇了机器翻译的低准确率和翻译错误困扰?如果是这样,那么我们的英语翻译中文转换器将是您在这方面的最佳选择! 我们的英语翻译中文转 ...

最新文章

  1. 组原,汇编语言关于代码段的定义
  2. tl r402路由器设置_怎么进入路由器设置界面
  3. Xamarin开发安装Visual Studio 2015 update2报错的解决办法
  4. android 自定义event,Android运用onTouchEvent自定义滑动布局
  5. Korn Shell: typeset
  6. SOT-143封装 ESD二极管
  7. sqlite-常用语句
  8. 从底层重学 Java 之两大浮点类型 GitChat链接
  9. 第一个Netty应用
  10. videocapture 保存图片_RoboMaster视觉教程OpenCV(二)读取视频图像与转换
  11. Exadata Griddisk Can't be auto added
  12. QEMU学习笔记——QOM(Qemu Object Model)
  13. Lodop简短问答客户反馈篇 及排查步骤 及注册相关
  14. verilog赋多位值_verilog语句两个always块对同一个变量赋值问题!【恢复】
  15. java判断日文_java判断字符串是否中文、日文
  16. 解构2019世界人工智能大会:三大变化,十年趋势,一场地球与火星的碰撞
  17. 移动拼图游戏(八数码问题) BFS版
  18. Yii:zii.widgets.CMenu使用方法
  19. nacos项目启动失败[NA] failed to request
  20. 基岩版刷铁傀儡机制和Java_我的世界:Java版1.14获得铁傀儡的四种方式,第三种千万别忘记...

热门文章

  1. android逆向终极版,x32dbg/x64dbg之条件断点生成器改良第三终结版
  2. CHS-DRG医保支付(甘肃省庆阳市)分组解读第一篇:分组规则总述及MDCA篇
  3. 听说谷歌秘密开发Xphone手机
  4. Dockerfile启动多个服务
  5. office 2019 工具鼠标点击反应慢、滚轮滚动反应慢的问题
  6. 3月16日,晚上快停电了
  7. ubuntu系统配置固定ip
  8. postcss解决兼容_使用PostCSS进行跨浏览器兼容性
  9. Edge浏览器 2020船新版本 比chrome好用太多的原因 前端必选浏览器之一 换它换它换它
  10. Android图片加载框架比较