05月27, 2017

一篇文章,带你了解Tensorflow的奥秘

最近在乌镇举办的人工智能峰会上,AlphaGo 2.0作为1.0的升级版,和现世界排名第一的柯洁进行了三局厮杀,且不说结果如何,人工智能,尤其是深度学习领域已经在悄然间走进了我们的视野之中。AlphaGo一路连克世界冠军井山裕太、朴廷桓、李世石以及柯洁等众多高手,一时间成为大家茶余饭后的话题。作为支撑AlphaGo复杂训练任务的深度学习框架tensorflow,和其他深度学习框架如caffe、CNTK等相比有什么优势?怎么样才能对它有大体的认识和了解呢?希望通过这篇文章,能够让你对上面的问题有了比较全面的了解。

tensorflow框架简介

为了巩固自身在深度学习领域的地位,google在2015年年底开源了内部机器学习框架DistBeilef,取名tensorflow。在相继发布了分布式版本和1.0版本后,短短一年半时间里,tensorflow在github上的star已经逼近6w,将其他的老牌深度学习平台远远甩在自己的身后,成为当下最流行的深度学习项目。不仅在图像领域,甚至是强化学习、自然语言处理等场景,tensorflow都有丰富的应用场景。

tensorflow后端采用更高效的C++、CUDA编写,前端提供python、c++、go以及java等多种开发语言。它可以在众多的异构平台上方便的移植,比如android、ios、cpu服务器以及gpu集群。除了提供常见的深度学习算法,如cnn、rnn外,tensorflow还实现了常见的机器学习算法,如线性回归、随机森林等。

tensorflow编程模型简介

构建图

我们可以使用一个有向图(或称计算图)来形象刻画每个tensorflow程序的计算过程,而代表不同含义的节点和有向边构成了这个或复杂或简单的图。计算图中的节点有两种形式,一种是运算操作,一种是表示变量。有向边可以看做是节点之间的关系。计算图中的每个节点可以有多个输入和输出,每个节点表示了一种运算操作,节点可以算是运算操作的实例化。由于计算图中的边流动(flow)的数据被称为张量(tensor),所以计算图也被称为tensorflow。

对于一个计算图来说,需要数据(tensor),运算操作(operation)以及边来刻画计算的过程,下面我们结合一个简单的例子来说明如何构建一个tensorflow计算图。

import tensorflow as tf
b = tf.Variable(tf.zeros([100]))                   # 定义一个100维的向量b,并初始化为0
w = tf.Variable(tf.random_uniform([784,100],-1,1)) # 定义一个784x100维的矩阵
x = tf.placeholder(name="x")                       # 输入一个名字为name的placeholder
relu = tf.nn.relu(tf.matmul(w,x)+b)                # 定义计算公式Relu(Wx+b)
C =[...]

上面首先定义了两个变量,矩阵w和b,x为输入变量,然后将w和x相乘后加上b后使用relu函数将结果由线性到非线性转换,你可能会问Relu是个什么函数?它是一种在神经网络中经常使用的激活函数,将输入映射到[0,1]区间内的值。如果你对这块很感兴趣,可以自行google,在此先值得relu是一个函数就行。然后经过一些计算后得到C,为了使我们的图更直观,更简洁,我们将过程省略掉。

上面叙述的过程可以使用一张计算图来表示:

alt

启动图

构造好计算图后,这时候图并没有真正实行,我们需要创建一个会话session,在会话中通过传入数据,来真正执行图。

如果我们要执行上面的计算图,需要定义一个会话,在会话里启动图。

s = tf.Session()
for step in range(0,10):
     input=...construct 100-D input array...    #为输入创建一个100维的向量
     result=s.run(C,feed_dict={x:input})

实现

为了实现计算图的过程,tensorflow中定义了多个角色来完成该任务。首先,我们需要一个client,定义好计算图。它通过Session的接口与master和多个worker连接,将图交给master去管理。master则负责指导所有的worker,同时与client交互。worker是真正干活的地方,每个worker可以与多个硬件设备相连,共同完成任务。tensorflow目前支持的硬件设备包括x86架构的cpu、手机的ARM CPU、GPU、TPU(Tensor Processing Unit, goole开发的深度学习定制芯片)。

tensorflow实现了单机和分布式两种模式。其中单机模式是指client、master以及worker全部在一个机器上的一个进程中,也就不存在各个组件之间的交互。而分布式模式允许client、maste和worker在不同机器的不同进程上,而正是由于其在分布式上的优势,tensorflow被越来越多的人使用。下图是两种模式的示意图: alt

当只有一个硬件设备的时候,计算图会按照依赖的关系依次执行,但是如果遇到多个设备的时候,tensorflow使用代价估计策略和用户指定策略来分配合理的设备,将资源利用率最大化。此外不同设备可能涉及到交换数据和通信,tensorflow也有很好的方法来进行数据传输和通信,在此就不展开。

总结

上面介绍了tensorflow的编程模式、架构实现方面的基本知识,接下来还会介绍更多关于tensorflow的东西,包括使用过程中的经验教训以及我们公司tensorflow在kubernetes方面的尝试,敬请关注!!!

本文链接:https://www.opsdev.cn/post/tensorflow-introduce.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。