跳转到主要内容

TensorFlow™在砖

分布式计算与TensorFlow

TensorFlow支持分布式计算,允许部分图计算在不同的流程,这可能是完全不同的服务器上!此外,这可以用于分发计算与强大的gpu,服务器和其他计算服务器上做了更多的内存,等等。接口有点复杂,让我们从头开始构建。

这是我们的第一个脚本中,我们将运行在一个单一的过程,然后搬到多个进程。

进口tensorflow作为特遣部队x = tf.constant (2)日元= x +300年y2 = x -66年y = y1 + y2tf.Session ()作为税:结果= sess.run (y)打印(结果)

到目前为止,这个脚本不应该吓到你太多。我们有一个常数,和三个基本方程。结果(238年)最后会被打印出来。

TensorFlow工作有点像于服务器-客户机模式。的想法是创建一个堆的工人执行繁重。然后创建一个会话的工人,并将计算图,可能部分分发到其他集群服务器上。

为了做到这一点,主要的工人,主,需要知道其他工人。这是通过创建ClusterSpec,你需要传递给所有工人。ClusterSpec是使用一个字典,关键是一个“工作名称”,和每个作业包含了许多工人。

下面是图的样子。

下面的代码创建了一个ClusterSpect工作名称的“本地”和两个工作进程。

注意,这些过程不是从这段代码中,创建一个引用,它们将开始。

进口tensorflow作为特遣部队集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})

接下来,我们开始这个过程。要做到这一点,我们图其中一个工人,并开始:

服务器= tf.train。服务器(集群,job_name =“本地”task_index =1)

上面的代码开始“localhost: 2223”工人在“本地”工作。

下面是一个脚本,您可以从命令行运行启动两个过程。保存代码在您的计算机上create_worker.py和运行python create_worker。py 0然后python create_worker。py 1。要做到这一点,你需要独立终端为脚本不完成自己的(他们在等待指令)。

#从命令行得到任务数量进口systask_number =int(sys.argv [1])进口tensorflow作为特遣部队集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})服务器= tf.train。服务器(集群,job_name =“本地”,task_index = task_number)打印(“启动服务器# {}”格式(task_number))server.start ()0server.join ()

这样做之后,你会发现两个终端上运行的服务器。我们已经准备好发布!

“分发”工作的最简单的方法就是创建一个会话这些流程,然后执行图。只是改变了“会话”在上面的行:

tf.Session (“grpc: / / localhost: 2222”)作为税:

现在,这并不分发一样多发送服务器的工作。TensorFlow可能分发处理到集群中的其他资源,但它可能不是。我们可以力通过指定设备与gpu(就像我们上节课):

进口tensorflow作为特遣部队
                   集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})x = tf.constant (2)
                   tf.device (“/工作:本地/任务:1”):y2 = x -66年tf.device (“/工作:本地/任务:0”):日元= x +300年y = y1 + y2
                   tf.Session (“grpc: / / localhost: 2222”)作为税:结果= sess.run (y)打印(结果)

现在我们正在分发!本作品由工人分配任务,根据名称和数量的任务。格式是:

/工作:JOB_NAME /任务:TASK_NUMBER

与多个岗位(即识别电脑大gpu),我们可以在许多不同的方式分配处理。

Map和Reduce

MapReduce是一个流行的执行大型操作范式。它是由两个主要步骤(尽管在实践中有一些更多)。

被称为第一步地图,意思是“把这个东西的列表,并将此函数应用于每个人”。你可以做一个地图在正常python这样的:

defmyfunction(x):返回x +5map_result =地图(myfunction (1,2,3])打印(列表(map_result))

第二步是一个减少,意思是“把这个东西的列表,并使用这个函数结合起来”。一个共同的和减少操作——我。e”把这个数字列表并把它们都通过添加”,这可以通过创建一个执行函数,添加了两个数字。减少所做的是需要第一个列表的两个值,执行功能,需要的结果,然后执行函数结果和未来价值。求和,我们把前两个数字,结果,添加用下一个号码,等等,直到我们达到的最后名单。再次,减少是正常的一部分python(尽管这不是分布式):

functools进口减少def添加(a、b):返回a + b打印(减少(添加,1,2,3)))

注意,你应该从来没有真正需要使用减少,只是使用一个for循环。

分布式TensorFlow,执行map和reduce操作是许多重要项目的关键构件。例如,一个学习可能发送多个工人个人机器学习模型,然后结合分类形成最终的结果。另一个例子是一个过程

这是另一个基本的脚本,我们将分发:

进口numpy作为np进口tensorflow作为特遣部队x = tf.placeholder (tf.float32One hundred.)
                   意味着= tf.reduce_mean (x)
                   tf.Session ()作为税:结果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(结果)
进口numpy作为np进口tensorflow作为特遣部队x = tf.placeholder (tf.float32One hundred.)
                   意味着= tf.reduce_mean (x)
                   tf.Session ()作为税:结果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(结果)

转换成一个分布式的版本只是一个变更之前的转换:

进口numpy作为np进口tensorflow作为特遣部队集群= tf.train.ClusterSpec ({“本地”:【“localhost: 2222”,“localhost: 2223”]})x = tf.placeholder (tf.float32One hundred.)
                   tf.device (“/工作:本地/任务:1”):first_batch =特遣部队。(x, (0]、[50])mean1 = tf.reduce_mean (first_batch)tf.device (“/工作:本地/任务:0”):second_batch =特遣部队。(x, (50]、[-1])非常刻薄的= tf.reduce_mean (second_batch)意味着= (mean1 +非常刻薄)/2
                   tf.Session (“grpc: / / localhost: 2222”)作为税:结果= sess.run(意思是,feed_dict = {x: np.random.random (One hundred.)})打印(结果)

你会发现分布计算过程更容易,如果你把它的地图和减少。首先,“我怎么能把这个问题分成子问题,可以独立解决?”——有你的地图。第二,“我怎么能结合形成一个最终结果的答案?”——你的减少。

在机器学习中,地图的最常见的方法就是把你的数据集。线性模型和神经网络通常很擅长这个,因为他们可以单独训练,然后结合。

1)改变“当地”这个词在ClusterSpec别的东西。你还需要改变脚本中让它工作吗?

2)平均脚本目前依赖的片都是一样的尺寸。尝试用不同的sized-slices,观察误差。解决这个问题通过使用tf.size和下面的公式结合平均片:

overall_average = ((size_slice_1 * mean_slice_1) + (size_slice_2 * mean_slice_2) +…) / total_size

3)您可以指定远程计算机上的设备通过修改设备的字符串。作为一个例子“/工作:本地/任务:0 / gpu: 0”将针对gpu在本地工作。创建一个工作,利用远程GPU。如果你有一个备用第二电脑方便,试图在网络上这样做。