如何学习在linux服务器上使用tensorflow

用户名:lucianlv
文章数:32
访问量:18655
注册日期:
阅读量:1297
阅读量:3317
阅读量:580936
阅读量:464735
51CTO推荐博文
650) this.width=650;" src="https://3./-OyWF7uWakqc/Vsk3w3teOUI/AAAAAAAADQs/E_YhiuPYkXg/s1600/tensorflow.jpg" alt="tensorflow logo" />什么是TensorFlow?TensorFlow&是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow&最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。当前TensorFlow最新的开源版本是。什么是数据流图?650) this.width=650;" src="/images/tensors_flowing.gif" alt="dataflow graph" />数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点”&一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。TensorFlow的关键特性高度的灵活性TensorFlow 不是一个严格的“神经网络”库。只要可以将计算表示为一个数据流图,就可以使用Tensorflow来构建图,描写驱动计算的内部循环。Tensorflow提供了有用的工具来帮助你组装“子图”(常用于神经网络),当然用户也可以自己在Tensorflow基础上写自己的“上层库”。定义顺手好用的新复合操作和写一个python函数一样容易,而且也不用担心性能损耗。当然万一发现找不到想要的底层数据操作,也可以自己写一点c++代码来丰富底层的操作。真正的可移植性Tensorflow 可以在CPU和GPU上运行,比如说可以运行在台式机、服务器、手机移动设备等等。想要在没有特殊硬件的前提下,在你的笔记本上跑一下机器学习的新想法?Tensorflow也可以办到。准备将你的训练模型在多个CPU上规模化运算,又不想修改代码?Tensorflow也可以办到。想要将你的训练好的模型作为产品的一部分用到手机app里?Tensorflow可以办到这点。你改变主意了,想要将你的模型作为云端服务运行在自己的服务器上,或者运行在Docker容器里?Tensorfow也能办到。将科研和产品联系在一起过去如果要将科研中的机器学习想法用到产品中,需要大量的代码重写工作。那样的日子一去不复返了!在Google,科学家用Tensorflow尝试新的算法,产品团队则用Tensorflow来训练和使用计算模型,并直接提供给在线用户。使用Tensorflow可以让应用型研究者将想法迅速运用到产品中,也可以让学术性研究者更直接地彼此分享代码,从而提高科研产出率。自动求微分基于梯度的机器学习算法会受益于Tensorflow自动求微分的能力。作为Tensorflow用户,你只需要定义预测模型的结构,将这个结构和目标函数(objective function)结合在一起,并添加数据,Tensorflow将自动为你计算相关的微分导数。计算某个变量相对于其他变量的导数仅仅是通过扩展你的图来完成的,所以你能一直清楚看到究竟在发生什么。多语言支持Tensorflow 有一个合理的c++使用界面,也有一个易用的python使用界面来构建和执行你的graphs。你可以直接写python/c++程序,也可以用交互式的ipython界面来用Tensorflow尝试些想法,它可以帮你将笔记、代码、可视化等有条理地归置好。当然这仅仅是个起点――Tensorflow鼓励创造自己最喜欢的语言界面,比如Go,Java,Lua,Javascript,或者是R。目前开源的版本暂时只看到对于python/C++的支持,并且python的API比C++的还是要更成熟易用。社区已经有针对Java和Ruby的支持。性能最优化比如说你有一个具有32个CPU内核、4个GPU显卡的工作站,想要将你工作站的计算潜能全发挥出来?由于Tensorflow 给予了线程、队列、异步操作等以最佳的支持,Tensorflow 让你可以将你手边硬件的计算潜能全部发挥出来。你可以自由地将Tensorflow图中的计算元素分配到不同设备上,Tensorflow可以帮你管理好这些不同副本。TensorFlow在Google的应用超过100项线上产品在使用TensorFlow;Google数据科学家和工程师都在使用TensorFlow;Google用TensorFlow构建下一代的智能应用;TensorFlow已经被Google开源,并部署到Google Cloud上;社区活跃度TensorFlow的安装TensorFlow支持二进制包和源码包等多种安装方式,支持在Linux、Mac OS X、Ubuntu等多个平台上进行安装,并且可以运行在docker之上,官网上有比较详细的安装文档。TensorFlow最简单的安装方式是通过进行安装,如果条件不允许(例如无外网的条件下),需要通过源码进行安装,TensorFlow的源码编译依赖Python 2.7版本,以及进行编译。整体来说TensorFlow的安装过程还是比较简单的。TensorFlow基本术语Devices一块可以用来运算并且拥有自己的地址空间的硬件,比如GPU和CPU。evalTensor 的一个方法,返回 Tensor 的值。触发任意一个图计算都需要计算出这个值。只能在一个已经启动的会话的图中才能调用该 Tensor 值。FeedTensorFlow 的一个概念:把一个 Tensor 直接连接到一个会话图表中的任意节点。feed 不是在构建图(graph)的时候创建,而是在触发图的执行操作时去申请。一个 feed 临时替代一个带有 Tensor 值的节点。把feed数据作为run( )方法和eval( )方法的参数来初始化运算。方法运行结束后,替换的 feed 就会消失,而最初的节点定义仍然还在。可以通过tf.placeholder( )把特定的节点指定为 feed 节点来创建它们。FetchTensorFlow中的一个概念:为了取回运算操作的输出结果。取回的申请发生在触发执行图操作的时候,而不是发生在建立图的时候。如果要取回一个或多个节点(node)的 Tensor 值,可以通过在 Session 对象上调用run( )方法并将待取回节点(node)的列表作为参数来执行图表(graph)。Graph把运算任务描述成一个直接的无环图形(DAG),图表中的节点(node)代表必须要实现的一些操作。图中的边代表数据或者可控的依赖。GratheDef 是系统中描述一个图表的协议(api),它由一个 NodeDefs 集合组成。一个GraphDef可以转化成一个更容易操作的图表对象。IndexedSlices在 Python API 中,TensorFlow 仅仅在第一维上对 Tensor 有所体现。如果一个 Tensor 有k维,那么一个 IndexedSlices 实例在逻辑上代表一个沿着这个 Tensor 第一维的(k-1)维切片的集合。切片的索引被连续储存在一个单独的一维向量中,而对应的切片则被拼接成一个单独的k维 Tensor。如果 sparsity 不是受限于第一维空间,请用 SparseTensor。Node图中的一个元素。 把启动一个特定操作的方式称为特定运算图表的一个节点,包括任何用来配置这个操作的属性的值。对于那些多形态的操作,这些属性包括能完全决定这个节点(Node)签名的充分信息。operation在 TensorFlow 的运行时中,它是一种类似 add 或 matmul 或 concat的运算。可以用how to add an op中的方法来向运行时添加新的操作。在 Python 的API中,它是图中的一个节点。在tf.Operation类中列举出了这些操作。一个操作(Operation)的 type 属性决定这个节点(node)的操作类型,比如add和matmul。Run在一个运行的图中执行某种操作的行为。要求图必须运行在会话中。在 Python 的 API 中,它是 Session 类的一个方法tf.Session.run。可以通过 Tensors 来订阅或获取run( )操作。在C++的API中,它是tensorflow::Session类 的一个方法。Session启动图的第一步是创建一个 Session 对象。Session 提供在图中执行操作的一些方法。在 Python API中,使用tf.Session。在 C++ 的API中,tensorflow::Session是用来创建一个图并运行操作的类。ShapeTensor 的维度和它们的大小。在一个已经启动的图中,它表示流动在节点(node)之间的 Tensor 的属性。一些操作对 shape 有比较强的要求,如果没有 Shape 属性则会报告错误。在 Python API中,用创建图的 API 来说明 Tensor 的 Shape 属性。Tensor 的Shape 属性要么只有部分已知,要么全部未知。详见tf.TensroShape在C++中,Shape 类用来表示 Tensor 的维度。tensorflow::TensorShape。SparseTensor在 Python API 中,它用来表示在 TensorFlow 中稀疏散落在任意地方的 Tensor 。SparseTensor 以字典-值格式来储存那些沿着索引的非空值。换言之,m个非空值,就包含一个长度为m的值向量和一个由m列索引(indices)组成的矩阵。为了提升效率,SparseTensor 需要将 indice(索引)按维度的增加来按序存储,比如行主序。如果稀疏值仅沿着第一维度,就用 IndexedSlices。TensorTensor是一种特定的多维数组。比如,一个浮点型的四维数组表示一小批由[batch,height,width,channel]组成的图片。在一个运行的图(graph)中,它是一种流动在节点(node)之间的数据。 在 Python 中,Tensor 类表示添加到图的操作中的输入和输出,见tf.Tensor,这样的类不持有数据。在C++中,Tensor是方法Session::Run( )的返回值,见tensorflow::Tensor,这样的 Tensor 持有数据。TensorFlow上手层度TensorFlow 和 Numpy在描述N维数据方面是非常相似的,不同的是TensorFlow除了能定义N维数组,还能创建N维数组的方程,并能自动计算求导,做更多的事情。numpytensorflow对比两者之间的区别:&可见在tensorflow中许多基础的N-array操作都是类似的,这让很多接触过numpy进行数据分析的人员都能很自然的上手tensorflow。TensorFlow体验以下借助TensorFlow我实现了一个简单的单变量线性回归程序:import&tensorflow&as&tf
import&numpy&as&np
import&matplotlib.pyplot&as&plt
#&定义输入数据
X_data&=&np.linspace(-1,&1,&100)
noise&=&np.random.normal(0,&0.5,&100)
y_data&=&5&*&X_data&+&noise
#&Plot&输入数据
fig&=&plt.figure()
ax&=&fig.add_subplot(1,&1,&1)
ax.scatter(X_data,&y_data)
plt.show()
#&定义数据大小
n_samples&=&100
#&转换成向量
X_data&=&np.reshape(X_data,&(n_samples,&1))
y_data&=&np.reshape(y_data,&(n_samples,&1))
#&定义占位符
X&=&tf.placeholder(tf.float32,&shape=(None,&1))
y&=&tf.placeholder(tf.float32,&shape=(None,&1))
#&定义学习的变量
W&=&tf.get_variable("weight",&(1,&1),
&&&&&&&&&&&&&&&&&&&&initializer=tf.random_normal_initializer())
b&=&tf.get_variable("bais",&(1,),
&&&&&&&&&&&&&&&&&&&&initializer=tf.constant_initializer(0.0))
y_pred&=&tf.matmul(X,&W)&+&b
loss&=&tf.reduce_mean(tf.reduce_sum(tf.square(y&-&y_pred)))
#&梯度下降
#&定义优化函数
opt&=&tf.train.GradientDescentOptimizer(0.001)
operation&=&opt.minimize(loss)
with&tf.Session()&as&sess:
&&&&#&初始化变量
&&&&sess.run(tf.initialize_all_variables())
&&&&lines&=&None
&&&&for&i&in&range(50):&&
&&&&&&&&_,&loss_val&=&sess.run([operation,&loss],&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&feed_dict={X:&X_data,&y:&y_data})
&&&&&&&&if&i&%&5&==&0:
&&&&&&&&&&&&if&lines:
&&&&&&&&&&&&&&&&ax.lines.remove(lines[0])
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&prediction_value&=&sess.run(y_pred,&feed_dict={X:&X_data})
&&&&&&&&&&&&lines&=&ax.plot(X_data,&prediction_value,&'r-',&lw=5)
&&&&&&&&&&&&plt.pause(0.1)
&&&&plt.pause(5)通过简单的定义目标函数和选择优化算法,就可以开始训练我的模型了。结果我并没有亲手实现梯度下降算法,就达到了训练样本的目的。开发人员可以只关注模型本身,剩下的事情 TensorFlow 帮你搞定的妥妥的!这只是小试牛刀,TensorFlow 可以训练更加复杂的模型:循环神经网络,卷积神经网络,递归神经网络等等。TensorBoardTensorFlow 提供了一个内置的可视化工具叫做&TensorBoard。有了&TensorBoard&可以更方便 TensorFlow 程序的理解、调试与优化。你可以用 TensorBoard 来展现你的 TensorFlow 图像,绘制图像生成的定量指标图以及附加数据。通过简单的改写,我就可以在上面的例子中使用TensorBoard了:import&tensorflow&as&tf
import&numpy&as&np
#&定义输入数据
X_data&=&np.linspace(-1,&1,&100)
noise&=&np.random.normal(0,&0.5,&100)
y_data&=&5&*&X_data&+&noise
#&定义数据大小
n_samples&=&100
#&转换成向量
X_data&=&np.reshape(X_data,&(n_samples,&1))
y_data&=&np.reshape(y_data,&(n_samples,&1))
with&tf.name_scope("input"):
&&&&#&定义占位符
&&&&X&=&tf.placeholder(tf.float32,&shape=(None,&1))
&&&&y&=&tf.placeholder(tf.float32,&shape=(None,&1))
#&定义学习的变量
with&tf.name_scope("linear-regression"):
&&&&with&tf.name_scope("Weight"):
&&&&&&&&W&=&tf.get_variable("weight",&(1,&1),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&initializer=tf.random_normal_initializer())
&&&&with&tf.name_scope("bais"):
&&&&&&&&b&=&tf.get_variable("bais",&(1,),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&initializer=tf.constant_initializer(0.0))
&&&&with&tf.name_scope("prediction"):
&&&&&&&&y_pred&=&tf.add(tf.matmul(X,&W),&b)
&&&&with&tf.name_scope("loss"):
&&&&&&&&loss&=&tf.reduce_mean(tf.reduce_sum(tf.square(y&-&y_pred)))
&&&&&&&&tf.scalar_summary("loss",&loss)
#&梯度下降
#&定义优化函数
with&tf.name_scope("train"):
&&&&opt&=&tf.train.GradientDescentOptimizer(0.001)
&&&&operation&=&opt.minimize(loss)
with&tf.Session()&as&sess:
&&&&merged&=&tf.merge_all_summaries()
&&&&writer&=&tf.train.SummaryWriter("logs/",&sess.graph)&&&&
&&&&#&初始化变量
&&&&sess.run(tf.initialize_all_variables())
&&&&for&i&in&range(50):&&
&&&&&&&&_,&loss_val&=&sess.run([operation,&loss],&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&feed_dict={X:&X_data,&y:&y_data})
&&&&&&&&if&i&%&5&==&0:
&&&&&&&&&&&&result&=&sess.run(merged,&feed_dict={X:&X_data,&y:&y_data})
&&&&&&&&&&&&writer.add_summary(result,&i)再次执行上面的代码,会在logs/子目录下生成一个日志文件。通过在打开&TensorBoard&的时候指定日志目录加载这个日志文件,我们就可以通过浏览器访问&TensorBoard&了。tensorboard --logdir=logs通过&TensorBoard&我们可查看定义的模型:同时我们也可以通过&TensorBoard&观察我们定义的损失量loss有没有按照预期的收敛,收敛的过程如何:TensorBoard&是一个很好用的工具,官网文档有关于&TensorBoard&更为详尽的描述。总结TensorFlow&作为一款机器学习的库,提供了类似&Numpy&数据结构,支持python,C++等多种语言,可以在cpu或者gpu上运行,安装简单,上手容易,社区活跃,文档目前还不够丰富,好在通俗易懂,但是目前的示例还比较少(特别是python以外的示例)。更多资源;;;;;;;参考文献(官方文档);&(中文社区);&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)热门搜索:
关注软件产品网
办公、管理
软件开发、网站建设
网管、安全
图形图像、多媒体
工具软件、游戏娱乐
您现在的位置: >
> 如何通过TensorFlow实现深度学习算法并运用到企业实践中
如何通过TensorFlow实现深度学习算法并运用到企业实践中
本文根据才云科技首席大数据科学家郑泽宇在QCon2016全球软件开发大会(上海站)上的演讲整理而成,希望大家可以了解如何通过TensorFlow实现深度学习算法,并将深度学习运用到企业实践中。讲师介绍郑泽宇,谷歌高级工程师。从 2013 年加入谷歌至今,郑泽宇作为主要技术人员参与并领导了多个大数据项目,拥有丰富机器学习、数据挖掘工业界及科研项目经验。2014 年,他提出产品聚类项目用于衔接谷歌购物和谷歌知识图谱(Knowledge Graph)数据,使得知识卡片形式的广告逐步取代传统的产品列表广告,开启了谷歌购物广告在搜索页面投递的新纪元。他于2013年5月获得美国 Carnegie Mellon University(CMU)大学计算机硕士学位, 期间在顶级国际学术会议上发表数篇学术论文,并获得西贝尔奖学金。什么是深度学习?深度学习这个名词听了很多次,它到底是什么东西,它背后的技术其实起源于神经网络。神经网络最早受到人类大脑工作原理的启发,我们知道人的大脑是很复杂的结构,它可以被分为很多区域,比如听觉中心、视觉中心,我在读研究中心的时候,做视频有计算机视觉研究室,做语言有语言所,语音有语音所,不同的功能在学科划分中已经分开了,这个和我们人类对大脑理解多多少少有一些关系。之后科学家发现人类大脑是一个通用的计算模型。 &科学家做了这样一个实验,把小白鼠的听觉中心的神经和耳朵通路剪断,视觉输入接到听觉中心上,过了几个月,小白鼠可以通过听觉中心处理视觉信号。这就说明人类大脑工作原理是一样的,神经元工作原理一样,只是需要经过不断的训练。基于这样的假设,神经学家做了这样的尝试,希望给盲人能够带来重新看到世界的希望,他们相当于是把电极接到舌头上,通过摄像机把不同的像素传到舌头上,使得盲人有可能通过舌头看到世界。对人类神经工作原理的进一步理解让我们看到深度学习有望成为一种通用的学习模型。上图给出了神经网络的大致结构。图中左侧是人类的神经元,右侧是神经网络的神经元。神经网络的神经元最早受到了人类神经元结构的启发,并试图模型人类神经元的工作方式。具体的技术这里不做过深的讨论。上图中下侧给出的是人类神经网络和人工神经网络(Artificial Neural Network)的对比,在计算机神经网络中,我们需要明确的定义输入层、输出层。合理的利用人工神经网络的输入输出就可以帮助我们解决实际的问题。神经网络最核心的工作原理,是要通过给定的输入信号转化为输出信号,使得输出信号能够解决需要解决的问题。比如在完成文本分类问题时,我们需要将文章分为体育或者艺术。那么我们可以将文章中的单词作为输入提供给神经网络,而输出的节点就代表不同的种类。文章应该属于哪一个种类,那么我们希望对应的输出节点的输出值为1,其他的输出值为0。通过合理的设置神经网络的结构和训练神经网络中的参数,训练好的神经网络模型就可以帮助我们判断一篇文章应该属于哪一个种类了。深度学习在图像识别中的应用深度学习,它最初的应用,在于图像识别。最经典的应用就是Imagenet的数据集。ImageNet是一个非常大的数据集,它里面有1500万张图片。下图展示了数据集中一张样例图片。在深度学习算法被应用之前,传统的机器学习方法对图像处理的能力有限。在2012年之前,最好的机器学习算法能够达到的错误率为25%,而且已经很难再有新的突破了。在2012年时,深度学习首次被应用在在ImageNet数据集上,直接将错误率降低到了16%。在随后的几年中,随着深度学习算法的改进,错误率一直降低到2016年的3.5%。在ImageNet数据集上,人类分类的错误率大概为5.1%。我们可以看到,机器的错误率比人的错误率更低,这是深度学习带来的技术突破。什么是TensorFlowTensorFlow是谷歌在去年11月份开源出来的深度学习框架。开篇我们提到过AlphaGo,它的开发团队DeepMind已经宣布之后的所有系统都将基于TensorFlow来实现。TensorFlow一款非常强大的开源深度学习开源工具。它可以支持手机端、CPU、GPU以及分布式集群。TensorFlow在学术界和工业界的应用都非常广泛。在工业界,基于TensorFlow开发的谷歌翻译、谷歌RankBrain等系统都已经上线。在学术界很多我在CMU、北大的同学都表示TensorFlow是他们实现深度学习算法的首选工具。上面的ppt给出了一个简单的TensorFlow程序样例,这个样例实现了向量加法的功能。TensorFlow提供了Python和C++的API,但Python的API更全面,所以大部分TensorFlow程序都是通过Python实现的。在上面程序的第一行我们通过import将TensorFlow加载进来。在TensorFlow中所有的数据都是通过张量(Tensor)的方式存储,要计算张量中数据的具体取值,我们需要通过一个会话(session)。上面代码中的第二行展示了如何生成会话。会话管理运行一个TensorFlow程序所需要的计算资源。TensorFlow中一个比较特殊的张量是变量(tf.Variable),在使用变量之前,我们需要明确调用变量初始化的过程。在上面的代码最后一行,我们可以看到要得到结果张量output的取值,我们需要明确调用计算张量取值的过程。通过TensorFlow实现神经网络是非常简单的。通过TFLearn或者TensorFlow-Slim可以在10行之内实现MNIST手写体数字识别问题。上面的ppt展示了TensorFlow对于不同神经网络结构的支持,可以看出,TensorFlow可以在很短的代码内支持各种主要的神经网络结构。虽然TensorFlow可以很快的实现神经网络的功能,不过单机版的TensorFlow却很难训练大规模的深层神经网络。这张图给出了谷歌在2015年提出的Inception-v3模型。这个模型在ImageNet数据集上可以达到95%的正确率。然而,这个模型中有2500万个参数,分类一张图片需要50亿次加法或者乘法运算。即使只是使用这样大规模的神经网络已经需要非常大的计算量了,如果需要训练深层神经网络,那么需要更大的计算量。神经网络的优化比较复杂,没有直接的数学方法求解,需要反复迭代。在单机上要把Inception-v3模型训练到78%的准确率大概需要5个多月的时间。如果要训练到95%的正确率需要数年。这对于实际的生产环境是完全无法忍受的。TensorFlow on Kubernetes如我们上面所介绍的,在单机环境下是无法训练大型的神经网络的。在谷歌的内部,Google Brain以及TensorFlow都跑在谷歌内部的集群管理系统Borg上。我在谷歌电商时,我们使用的商品分类算法就跑在1千多台服务器上。在谷歌外,我们可以将TensorFlow跑在Kubernetes上。在介绍如何将TensorFlow跑在Kubernetes上之前,我们先来介绍一下如何并行化的训练深度学习的模型。深度学习模型常用的有两种分布式训练方式。一种是同步更新,另一种是异步更新。如上面的ppt所示,在同步更新模式下,所有服务器都会统一读取参数的取值,计算参数梯度,最后再统一更新。而在异步更新模式下,不同服务器会自己读取参数,计算梯度并更新参数,而不需要与其他服务器同步。同步更新的最大问题在于,不同服务器需要同步完成所有操作,于是快的服务器需要等待慢的服务器,资源利用率会相对低一些。而异步模式可能会使用陈旧的梯度更新参数导致训练的效果受到影响。不同的更新模式各有优缺点,很难统一的说哪一个更好,需要具体问题具体分析。无论使用哪种更新方式,使用分布式TensorFlow训练深度学习模型需要有两种类型的服务器,一种是参数服务器,一种是计算服务器。参数服务器管理并保存神经网络参数的取值;计算服务器负责计算参数的梯度。在TensorFlow中启动分布式深度学习模型训练任务也有两种模式。一种为In-graph replication。在这种模式下神经网络的参数会都保存在同一个TensorFlow计算图中,只有计算会分配到不同计算服务器。另一种为Between-graph replication,这种模式下所有的计算服务器也会创建参数,但参数会通过统一的方式分配到参数服务器。因为In-graph replication处理海量数据的能力稍弱,所以Between-graph replication是一个更加常用的模式。最后一个问题,我们刚刚提到TensorFlow是支持以分布式集群的方式运行的,那么为什么还需要Kubernetes?如果我们将TensorFlow和Hadoop系统做一个简单的类比就可以很清楚的解释这个问题。大家都知道Hadoop系统主要可以分为Yarn、HDFS和mapreduce计算框架,那么TensorFlow就相当于只是Hadoop系统中Mapreduce计算框架的部分。TensorFlow没有类似Yarn的调度系统,也没有类似HDFS的存储系统。这就是Kubernetes需要解决的部分。Kubernetes可以提供任务调度、监控、失败重启等功能。没有这些功能,我们很难手工的去每一台机器上启动TensorFlow服务器并时时监控任务运行的状态。除此之外,分布式TensorFlow目前不支持生命周期管理,结束的训练进程并不会自动关闭,这也需要进行额外的处理。
相关文章关键词:IT
热门技术文章
最新技术文章现阶段用TensorFlow结合keras做深度学习有必要用Linux吗? - 知乎7被浏览222分享邀请回答0添加评论分享收藏感谢收起深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow | 我爱自然语言处理
关注我们的微信公众号}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信