TensorFlow最初由Google大脑的研究员和工程师开发出来,用于机器学习和神经网络方面的研究,于2015.10宣布开源,在众多深度学习框架中脱颖而出,在Github上获得了最多的Star量。TensorFlow最早由Google Brain研究组发起。TensorFlow在历史上机器学习时间线如下:

TensorFlow的计算可以表示为一种有向图(directed graph),或者称计算图(computation graph)。图中每一个运算操作(operation)是一个节点(node),节点之间的连接线称为边(edge)。计算图中的节点可以有任意多个输入和任意多个输出,每个节点都只有一个运算操作。在计算图中流动(flow)的数据被称为张量(tensor),故得名TensorFlow。计算图示例 如下:

 TensorFlow关键版本发布历史


  • 2015.11.09 在Github上开源(Ver0.5.0)
  • 2015.12.10 支持Python3.3+,GPU性能提升...(Ver0.6.0)
  • 2016.02.17 支持GPU使用Cuda7.0+、cuDNN R2+、cuDNN R4等运算加速库...(Ver0.7.0)
  • 2016.04.30 通过gRPC实现分布式计算...(Ver0.8.0)
  • 2016.06.28 支持Python3.5,支持iOS,支持Mac电脑上的GPU计算...(Ver0.9.0)
  • 2016.09.13 添加C++ shape inference,添加graph-construction C/C++(大部分) Api...(Ver0.10.0)
  • 2016.11.11 支持cuDNN 5、Cuda8.0,HDFS...(Ver0.11.0)
  • 2016.12.21 支持Windows环境运行,cuDNN 5.1...(Ver0.12.0)
  • 2017.02.16 发布正式版(Ver1.0.0)
  • 2017.04.27 支持Windows下的Java Api...(Ver1.1.0)
  • 2017.06.15 支持Windows下的Python 3.6...(Ver1.2.0)

前端API支持语言


  • Python (推荐使用,API最全面)
  • C++
  • Go
  • Java
  • Rust
  • Haskell
  • 非官方(Julia、Javascript、R)

基本使用


  • 使用Tensor表示数据
  • 通过变量(Variable)输入训练数据,维护状态
  • 使用计算图(computational graph)来表示计算任务
  • 在会话(Session)的上下文(Context)来执行计算图

TensorFlow依赖视图


  • TF托管在github平台,有google groups和contributors共同维护。

  • TF提供了丰富的深度学习相关的API,如上一小节。

  • TF提供了可视化分析工具Tensorboard,方便分析和调整模型。

  • TF支持Linux平台,Windows平台,Mac平台,甚至手机移动设备等各种平台。

TF系统架构


TF的系统架构,从底向上分为设备管理和通信层、数据操作层、图计算层、API接口层、应用层。其中设备管理和通信层、数据操作层、图计算层是TF的核心层。如下图:

  1. 底层设备通信层负责网络通信和设备管理。设备管理可以实现TF设备异构的特性,支持CPU、GPU、Mobile等不同设备。网络通信依赖gRPC通信协议实现不同设备间的数据传输和更新。
  2. 第二层是Tensor的OpKernels实现。这些OpKernels以Tensor为处理对象,依赖网络通信和设备内存分配,实现了各种Tensor操作或计算。Opkernels不仅包含MatMul等计算操作,还包含Queue等非计算操作。
  3. 第三层是图计算层(Graph),包含本地计算流图分布式计算流图的实现。Graph模块包含Graph的创建、编译、优化和执行等部分,Graph中每个节点都是OpKernels类型表示。
  4. 第四层是API接口层。Tensor C API是对TF功能模块的接口封装,便于其他语言平台调用。
  5. 第四层以上是应用层。不同编程语言在应用层通过API接口层调用TF核心功能实现相关实验和应用。

详细点的层次及功能划分,可以描述如下:

  1. 最底层是硬件计算资源,支持CPU、GPU;
  2. 支持两种通信协议;
  3. 数值计算层提供最基础的计算,有线性计算、卷积计算;
  4. 数据的计算都是以数组的形式参与计算;
  5. 计算图层用来设计神经网络的结构;
  6. 工作流层提供轻量级的框架调用
  7. 最后构造的深度学习网络可以通过TensorBoard服务端可视化

架构详解:


TensorFlow的系统结构以C API为界,将整个系统分为「前端」和「后端」两个子系统:

  • 前端系统:提供编程模型,负责构造计算图;
  • 后端系统:提供运行时环境,负责执行计算图。

如上图所示,重点关注系统中如下4个基本组件,它们是系统分布式运行机制的核心。

Client:

  • Client是前端系统的主要组成部分,它是一个支持多语言的编程环境。它提供基于计算图的编程模型,方便用户构造各种复杂的计算图,实现各种形式的模型设计

  • 如下图:Client构建了一个简单计算图。它首先将w与x进行矩阵相乘,再与截距b按位相加,最后更新至s。
  • Client基于TensorFlow的编程接口,构造计算图。

  • 此时,TensorFlow并未执行任何计算。直至建立Session会话,并以Session为桥梁,建立Client与后端运行时的通道,将Protobuf格式的GraphDef发送至Distributed Master。也就是说,当Client对OP结果进行求值时,将触发Distributed Master的计算图的执行过程。

Distributed Master:

  • 在分布式的运行时环境中,Distributed Master根据Session.run的Fetching参数,从计算图中反向遍历,找到所依赖的「最小子图」。

  • 然后,Distributed Master负责将该「子图」再次分裂为多个「子图片段」,以便在不同的进程和设备上运行这些「子图片段」。

  • 最后,Distributed Master将这些「子图片段」派发给Work Service;随后Work Service启动「子图片段」的执行过程。

  • 如上图所示,Distributed Master开始执行计算子图。在执行之前,Distributed Master会实施一系列优化技术,例如「公共表达式消除」,「常量折叠」等。随后,Distributed Master负责任务集的协同执行优化后的计算子图

子片段图:

  • 如上图所示,存在一种合理的「子图片段」划分算法。Distributed Master将模型参数相关的OP进行分组,并放置在PS任务上。其他OP则划分为另外一组,放置在Worker任务上执行。

SEND/RECV节点:

  • 如上图所示,如果计算图的边被任务节点分割,Distributed Master将负责将该边进行分裂,在两个分布式任务之间插入SEND和RECV节点,实现数据的传递。

  • 随后,Distributed Master将「子图片段」派发给相应的任务中执行,在Worker Service成为「本地子图」,它负责执行该子图的上的OP。

Worker Service:

  • 对于每个任务,都将存在相应的Worker Service,它主要负责如下3个方面的职责:

    1. 处理来自Master的请求;
    2. 调度OP的Kernel实现,执行本地子图;
    3. 协同任务之间的数据通信。
  • Worker Service派发OP到本地设备,执行Kernel的特定实现。它将尽最大可能地利用多CPU/GPU的处理能力,并发地执行Kernel实现。

  • 另外,TensorFlow根据设备类型,对于设备间的SEND/RECV节点进行特化实现:

    1. 使用cudaMemcpyAsync的API实现本地CPU与GPU设备的数据传输;

    2. 对于本地的GPU之间则使用端到端的DMA,避免了跨host CPU昂贵的拷贝过程。

  • 对于任务之间的数据传递,TensorFlow支持多协议,主要包括:

    1. gRPC over TCP

    2. RDMA over Converged Ethernet

主流框架对比


  • 对比
  • 社区

参考资料:


TF(1): 基础理论的更多相关文章

  1. TFS命令tf:undo(强制签入签出文件)

    由于修改计算机名称或不同电脑上操作忘记签入,则需要强制签入文件 具体步骤如下: 1.在命令行中输入"cd  C:\Program Files\Microsoft Visual Studio ...

  2. 制作HP MicroServer Gen8可用的ESXi 5.x SD/TF卡启动盘

    前些日子看到HP公司和京东在搞服务器促销活动,于是就入了一个 ProLiant MicroServer Gen8 的低配版 相比上一代产品,新一代 MicroServer系列微型服务器可更换处理器,还 ...

  3. TF Boys (TensorFlow Boys ) 养成记(六)

    圣诞节玩的有点嗨,差点忘记更新.祝大家昨天圣诞节快乐,再过几天元旦节快乐. 来继续学习,在/home/your_name/TensorFlow/cifar10/ 下新建文件夹cifar10_train ...

  4. TF Boys (TensorFlow Boys ) 养成记(五)

    有了数据,有了网络结构,下面我们就来写 cifar10 的代码. 首先处理输入,在 /home/your_name/TensorFlow/cifar10/ 下建立 cifar10_input.py,输 ...

  5. TF Boys (TensorFlow Boys ) 养成记(四)

    前面基本上把 TensorFlow 的在图像处理上的基础知识介绍完了,下面我们就用 TensorFlow 来搭建一个分类 cifar10 的神经网络. 首先准备数据: cifar10 的数据集共有 6 ...

  6. TF Boys (TensorFlow Boys ) 养成记(三)

    上次说到了 TensorFlow 从文件读取数据,这次我们来谈一谈变量共享的问题. 为什么要共享变量?我举个简单的例子:例如,当我们研究生成对抗网络GAN的时候,判别器的任务是,如果接收到的是生成器生 ...

  7. TF Boys (TensorFlow Boys ) 养成记(二)

    TensorFlow 的 How-Tos,讲解了这么几点: 1. 变量:创建,初始化,保存,加载,共享: 2. TensorFlow 的可视化学习,(r0.12版本后,加入了Embedding Vis ...

  8. TF Boys (TensorFlow Boys ) 养成记(一)

    本资料是在Ubuntu14.0.4版本下进行,用来进行图像处理,所以只介绍关于图像处理部分的内容,并且默认TensorFlow已经配置好,如果没有配置好,请参考官方文档配置安装,推荐用pip安装.关于 ...

  9. Vue基础理论

    一 vue的定位 (1)Vue.js是一个构建数据驱动的 web 界面的库. (2)Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. (3)Vue.js 自身不是一 ...

随机推荐

  1. Spring Boot系列一:默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  2. 【分布式搜索引擎】Elasticsearch写入和读取数据过程

    一.Elasticsearch写人数据的过程 1)客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)2)coordinating node,对docum ...

  3. python 实现杨辉三角(依旧遗留问题)

    1 #! usr/bin/env python3 #-*- coding :utf-8 -*- print('杨辉三角的generator') def triangles(): N=[1] while ...

  4. 在github上参与开源项目贡献代码

    1 登录github, 点击自己感兴趣的repository的fork按钮,这样自己的github主页会有一个拷贝. 2 在自己本地修改同时保持和原来的repository同步: git remote ...

  5. Python---高级函数map, filter, zip, enumerate等的用法

    今天看自然语言处理这本书的时候,被这里的高级函数的概念吸引了,因为我觉得所有的函数都只是函数而已,是为了实现特定功能而实现的,不应该有高级,低级之分啊!不过了解之后,发现这几个函数确实是有点高级,非常 ...

  6. 新一代的json--fetch

    fetch( "http://jsontest.bceapp.com/hi", { method:"POST", mode:"core", ...

  7. angular2升级到angular4历程

    Angular 4 在昨天(2017-03-24)正式发布了,我的系列教程也得更新一下.步骤略繁琐,不用 cli 的项目反倒更简单一些,但是 cli 平时给我们的便利还是很多的,升级最多半年一次而已. ...

  8. 移动端H5拍照代码实现及外网部署

    最近的工作中,遇到了一个需求:对于无APP登陆权限的人员,提供拍照上传功能,以便生成更完善的出工记录.经研究讨论,决定实现的机制为:由合法的人员登陆APP认领相关工作任务,并生成当天当工作的唯一二维码 ...

  9. go web framework gin 路由表的设计

    在上一篇go web framework gin 启动流程分析这一篇文章中,我分析了go gin启动的过程,在这一篇文章中我将继续上面的分析,讨论gin 中路由表是如何设计的? 首先查看engine. ...

  10. L328 What Is Millennial Burnout?

    What Is Millennial Burnout?Do you often feel stressed? Does the pace of life make you feel like you' ...