TensorFlow学习--实现原理

单机和分布式版



       TensorFlow中的client通过Session的接口与master及多个worker相连。每一个worker可以和多个硬件设备相连如CPU&GPU,并负责管理这些硬件。而master则负责管理所有worker按流程执行计算图。其中分布式版本中的client、master、及worker可以分布在不同的机器的不同进程中。如下图:

机器学习框架TensorFlow原理 tensorflow架构及原理_子图

设备名格式:

单机: /job:localhost/device:cpu:0

分布式:/job:worker/task:17/device:gpu:3

内存:每一个设备有单独的allocator负责各种存储数据的tensor,各个tensor通过引用计数来管理内存。

多设备管理

    (1)节点fen分配;

    (2)节点间数据通信的管理。

        对(1),TensorFlow通过计算一个代价模型,取其值最小的节点分配。代价模型的求解是通过启发式规则和模拟节点计算过程结合估算得到的。未来可能要通过Reinforcement Learning的神经网络来辅助决策。此外TensorFlow还允许用户对节点的分配设置限制条件。

        对(2),当计算图确定了,整个计算图会被划分为许多的子图,使用同一个设备或者相邻的节点会被分到同一个子图中,两个子图相连的边会被取代为一个发送端的发送节点(send node)、一个接收端的接收节点(receive node):

机器学习框架TensorFlow原理 tensorflow架构及原理_数据_02

        单设备转化为多设备也很简单:

for i in range(8):
    for d in range(4):
        with tf.device("/gpu:%d"%d):
            input = x[i] if d is 0 else m[d-1]
            m[d], c[d] = LSTMCell(input, mprev[d],cprev[d])
            mprev[d] = m[d]
            cprev[d] = c[d]

        分布式情况下数据的通信变为使用TCP或者RDMA传输数据。

拓展功能

        TensorFlow支持自动求导,比如  tensor C 依赖于tensor {Xn} 那么在TensorFlow中可以自动求导求出{dC/dXn},其过程对用户透明。

机器学习框架TensorFlow原理 tensorflow架构及原理_机器学习框架TensorFlow原理_03

        TensorFlow也支持单独计算子图:

机器学习框架TensorFlow原理 tensorflow架构及原理_机器学习框架TensorFlow原理_04

      TensorFlow可以通过feed node和input node两种方式输入数据,feed node输入数据,必须从client读取,并通过网络传到分布式系统的其他节点,这样有较大的网络开销,而通过input node输入数据,直接使用文件路径,可以让worker节点读取本地的文件,提高效率。

        TensorFlow也有队列的方式调度任务,这样可以在一个batch的数据运算的时候,提前从磁盘中读取下一个batch的数据,减少磁盘的I/O阻塞时间。TensorFlow实现了FIFO、shuffling queue队列,后者可以满足算法对随机性的要求。

        TensorFlow使用Container来管理长期变量,其中Variable对象就储存在容器中。

性能的优化

        检测重复计算,使其只计算一次,避免冗余计算;

        巧妙的安排计算顺序,改善数据的传输和内存的占用问题;

        支持高度优化的第三方库;

                线性代数计算库: Eigen

                矩阵乘法计算库:BLAS,cuBLAS

                深度学习计算库:cuda-convnet,cuDNN

        支持数据压缩,float32=>float16

        TensorFlow提供三种并行计算模式:

        (1)数据并行:通过将一个mini-batch的数据放到不同的设备上实现梯度计算的并行,然后合并各个设备上得到的梯度并更新到共享参数服务器(parameter server)。

机器学习框架TensorFlow原理 tensorflow架构及原理_数据_05

        梯度的计算也可以异步的实现,使用多个线程控制梯度的计算,每一个线程计算完后异步的更新参数。同步的方式相当于用了一个大mini-batch,其优点是没有梯度的干扰,缺点是容错性差。而异步的方式容错性好,但是收到梯度的干扰,导致每一组梯度的利用效率都下降。

        (2)模型并行:将计算图的不同部分放在不同的设备上实现模型的并行。模型并行需要模型本身有大量可以并行,且互相不依赖或者是依赖的程度小。

机器学习框架TensorFlow原理 tensorflow架构及原理_数据通信_06

(3)流水线并行:和异步的数据并行很像,只不过是在同一个设备上实现并行。在一个设备上设计流水线连续的并行执行,提高设备的利用率:

机器学习框架TensorFlow原理 tensorflow架构及原理_数据_07

        未来TensorFlow将实现把任意的子图独立出来,封装成一个函数,提供不同的前端调用(比如Python和C++)。实现大家工作的分享。