《TensorFlow实战》第一章-TensorFlow基础读书笔记

来源:互联网 发布:java ssh实战项目 编辑:程序博客网 时间:2024/05/18 15:28

关注微信公众号【Microstrong】,我写过四年Android代码,了解前端、熟悉后台,现在研究方向是机器学习、深度学习!一起来学习,一起来进步,一起来交流吧! 

最近买了一本《TensorFlow 实战》黄文坚、唐源著。感觉只看书,不写代码不记笔记,没有收获。所以,还是边看书,边记录了一下读书笔记。这是这本书第一章节的读书笔记。欢迎大家批评指正!


1.1 TensorFlow概要


1.1.1 TensorFlow背景


TensorFlowGoogle公司开源的第二代分布式机器学习框架。Google第一代分布式机器学习框架是DistBelief,在Google大规模内部使用后并没有选择开源。TensorFlow最早由Google Brain研究组发起,设计的初衷是加速机器学习的研究,并快速地将研究原型转化为产品。

官网:http://www.tersorflow.org 
Github
网址:https://github.com/tensorflow/tensorflow 
模型仓库网址:https://github.com/tensorflow/models


1.1.2 TensorFlow主要技术特性


1.2 TensorFlow编程模型简介


1.2.1 核心概念


TensorFlow中的计算可以表示为一个有向图(directed graph),或称计算图(computation graph)。其中每一个运算操作(operation)将作为一个节点(node),节点与节点之间的连接称为边(edge)。计算图中每一个节点可以有任意多个输入和任意多个输出,每一个节点描述了一种运算操作,节点可以算是运算操作的实例化(instance)。在计算图的边中流动(flow)的数据被称为张量(tensor),故得名TensorFlow。

(1) 自定义节点,自定义有向图,一般是把整个流程图都定义完整。




一个运算操作代表了一种类型的抽象运算,比如矩阵乘法或者向量加法。运算操作可以有自己的属性,但是所有属性必需被预先设置,或者能在创建计算图时被推断出来。运算核(kernel)是一个运算操作在某个具体硬件(CPU/GPU等)的实现。在TensorFlow中,可以通过注册机制加入新的运算操作或者运算核。表1-2所示为部分TensorFlow内建的运算操作。


(2) 通过Session的run方法进行执行计算图

Session是用户使用TensorFlow时的交互式接口。用户可以通过Session的Extend方法添加新的节点和边,用以创建计算图,然后就可以通过Session的Run方法执行计算图。在大多数运算中,计算图会被反复执行多次,而数据也就是tensor并不会被持续保留,只是在计算图中过一遍。Variable是一类特殊的运算操作,它可以将一些需要保留的tensor存储在内存或显存中。每一次执行计算图后,Variable中的数据tensor将会被保存,同时在计算过程中这些tensor也可以被更新。


1.2.2 实现原理


(1)工作组件

Client:客户端通过Session的接口与master及多个worker相连。

Worker:worker可以与多个硬件设备相连,比如CPU或GPU,并负责管理这些硬件。

Master: master则负责指导所有worker按流程执行计算图。

TensorFlow中每一个worker可以管理多个设备,每一个设备的name包含硬件类别、编号、任务号(单机版本没有)。

单机模式:/job:localhost/device:cpu:0
分布式模式: /job:worker/task:17/device:gpu:3

(2)运行模式

单机模式:计算图会按依赖关系被顺序执行。当一个节点的所有上游依赖都被执行完时(依赖数为0),这个节点就会被加入ready queue以等待执行;同时,它下游所有节点的依赖数减1,实际上这就是标准的计算拓扑序的方式。

分布式模式:设计了一套为节点分配设备的策略。这个策略首先需要计算一个代价模型,这个代价模型估算每一个节点的输入、输出tensor的大小,以及所需的计算时间。代价模型一部分由人工经验制定的启发式规则得到,另一部分则是由对一小部分数据进行实际运算而测量得到的。当给节点分配设备的方案被确定,整个计算图就会被划分成许多子图,使用同一个设备且相邻的节点会被划分到同一个子图。



同时,从单机单设备的版本改造为单机多设备的版本也非常容易,下面的代码只添加加粗的这一行,就实现了从一块GPU训练到多块GPU训练的改造。



(3)分布式TensorFlow的容错性

容错性也是分布式TensorFlow的一个特点。故障会在两种情况下被检测出来。

信息从发送节点传输到接受节点失败时。

周期性的worker心跳检测失败。

当一个故障被检测到时,整个计算图会被终止并重启。


1.2.3拓展功能


1TensorFlow原生支持自动求导。

2TensorFlow还支持单独执行子图,用户可以选择计算图的任意子图,并沿某些边输入数据,同时从另一些边获取输出结果。

3TensorFlow支持计算图的控制流,比如:if-conditionwhile-loop,因为大部分机器学习算法需要反复迭代,所以这个功能非常重要。

4TensorFlow的数据输入除了通过feed node,也有特殊的input node可以让用户直接输入文件系统的路径,例如一个Google Cloud Platfrom的文件路径。

5)队列(queue)也是TensorFlow任务调度的一个重要特性,这个特性可以让计算图的不同节点异步地执行。

6)容器(Container)是TensorFlow中一种特殊的管理长期变量的机制,例如Variable对象就存储在容器中。


1.2.4性能优化


1TensorFlow同时支持几种高度优化的第三方计算库。

线性代数计算库:Eigen

矩阵乘法计算库:BLAScuBLAS(CUDA BLAS)

深度学习计算库:cuda-convnetcuDNN

2TensorFlow提供了三种不同的加速神经网络训练的并行计算模式。

数据并行通过将一个mini-batch的数据放在不同的设备上计算,实现梯度计算的并行化。计算还可以分同步、异步和混合三种方式。同步的优点是没有梯度干扰,缺点是容错性差,一台机器出现问题后要重跑。异步的优点是有一定的容错性,但是受梯度干扰问题,导致每一组梯度的利用效率都下降了。一般来说,同步训练的模型精度较好。

模型并行:将计算图的不同部分放在不同的设备上运算,可以实现简单模型的并行,其目标在于减少每一轮训练迭代的时间,不同于数据并行同时进行多份数据的训练。

流水线并行:和异步的数据并行很像,只不过是在同一个硬件设备上实现并行。大致思路是将计算做成流水线,在一个设备上连续地并行执行,提高设备的利用率。