你能解释一下分布式Tensorflow教程的例子吗?

你能解释一下分布式Tensorflow教程的例子吗?,tensorflow,distributed-computing,distributed-system,Tensorflow,Distributed Computing,Distributed System,我对分布式计算的世界有些陌生。我正在阅读tensorflow官方教程中的,但是我对教程的主要示例中发生的事情感到非常困惑 特别是,ps工作和工人如何互动?ps jobs的角色到底是什么?它们在代码中的相应部分相当有限,而且它们似乎做的不多,那么它们的目的是什么呢?我想我不明白我们分布式系统的各个部分是如何协同工作的 如果有人能从不同的进程及其操作的角度解释在最后执行shell命令时会发生什么,那就太好了 以下是供参考的主要代码: import argparse 导入系统 导入tensorflow

我对分布式计算的世界有些陌生。我正在阅读tensorflow官方教程中的,但是我对教程的主要示例中发生的事情感到非常困惑

特别是,ps工作和工人如何互动?ps jobs的角色到底是什么?它们在代码中的相应部分相当有限,而且它们似乎做的不多,那么它们的目的是什么呢?我想我不明白我们分布式系统的各个部分是如何协同工作的

如果有人能从不同的进程及其操作的角度解释在最后执行shell命令时会发生什么,那就太好了

以下是供参考的主要代码:

import argparse
导入系统
导入tensorflow作为tf
标志=无
def main(ux):
ps_hosts=FLAGS.ps_hosts.split(“,”)
worker\u hosts=FLAGS.worker\u hosts.split(“,”)
#从参数server和worker hosts创建集群。
cluster=tf.train.ClusterSpec({“ps”:ps_hosts,“worker”:worker_hosts})
#为本地任务创建并启动服务器。
服务器=tf.train.server(集群,
job\u name=FLAGS.job\u name,
任务索引=标志。任务索引)
如果FLAGS.job_name==“ps”:
server.join()
elif FLAGS.job_name==“worker”:
#默认情况下,将ops分配给本地工作人员。
带tf.装置(tf.train.replica\u装置\u setter(
worker\u device=“/job:worker/task:%d”%FLAGS.task\u索引,
cluster=cluster):
#建立模型。。。
损失=。。。
global\u step=tf.contrib.framework.get\u或\u create\u global\u step()
列车运行=tf.train.ADAGRAD优化器(0.01)。最小化(
损失,全局步=全局步)
#StopAtStepHook处理运行给定步骤后的停止。
hooks=[tf.train.StopAtStepHook(最后一步=1000000)]
#MonitoredTrainingSession负责会话初始化,
#从检查点还原,保存到检查点,完成后关闭
#或者发生错误。
使用tf.train.MonitoredTrainingSession(master=server.target,
is_chief=(FLAGS.task_index==0),
checkpoint_dir=“/tmp/train_log”,
钩子=钩子)通常为:
而不是周一。是否应该停止()
#异步运行培训步骤。
#请参阅“tf.train.syncReplicateSOptimizer”,了解有关如何
#执行“同步”培训。
#mon_sess.run在抢占PS的情况下处理AbortedError。
周一至周六跑步(列车运行)
如果名称=“\uuuuu main\uuuuuuuu”:
parser=argparse.ArgumentParser()
register(“type”,“bool”,lambda v:v.lower()=“true”)
#用于定义tf.train.ClusterSpec的标志
parser.add_参数(
“--ps_主机”,
类型=str,
默认值=”,
help=“以逗号分隔的主机名列表:端口对”
)
parser.add_参数(
“--worker_hosts”,
类型=str,
默认值=”,
help=“以逗号分隔的主机名列表:端口对”
)
parser.add_参数(
“--作业名称”,
类型=str,
默认值=”,
help=“其中一个“ps”,“worker”
)
#用于定义tf.train.Server的标志
parser.add_参数(
“--任务索引”,
类型=int,
默认值为0,
help=“作业中任务的索引”
)
标志,unparsed=parser.parse_known_args()
tf.app.run(main=main,argv=[sys.argv[0]]]+未解析)
以下是shell命令:

$python trainer.py\
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222\
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222\
--ps1.example.com上的作业名称=ps——任务索引=0:
$python trainer.py\
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222\
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222\
--worker0.example.com上的job_name=ps--task_index=1:
$python trainer.py\
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222\
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222\
--worker1.example.com上的job_name=worker--task_index=0:
$python trainer.py\
--ps_hosts=ps0.example.com:2222,ps1.example.com:2222\
--worker_hosts=worker0.example.com:2222,worker1.example.com:2222\
--作业名称=工人--任务索引=1

根据我的理解,ps作业包含不同任务之间的所有共享数据,这些任务可以在不同的机器上运行(并且都共享相同的ps作业)

根据我的理解,ps作业包含不同任务之间的所有共享数据,这些任务可以在不同的机器上运行(并且都共享相同的ps作业)

这是一张情况示意图。你有4个tensorflow过程。每个进程运行TensorFlow工作线程,该线程可以执行TensorFlow计算。此外,其中两个进程还运行一个客户端线程,该线程发出
session.run
请求

每个工作进程在TensorFlow中也是一个“设备”,用于在设备上分割图形执行。您可以告诉TF运行时在worker1设备上执行图形的某些部分,方法是在图形构造期间使用TF.device(“job:worker/task:0”):

tf.train.replica\u device\u setter
中发生了神奇的变化,它取代了带有tf.device注释的手动
,并具有跨设备自动分配变量的效果。更具体地说,当您有两个PS碎片时,一半的变量将进入ps1设备,另一半将进入ps2设备。同时,更新这些变量的图形部分将在每个工作设备上复制

如果您用手动设备规范替换了
复制设备设置器
,您的工作进程大致如下

with tf.device('ps1'):
  var1 = tf.Variable(...)
with tf.device('ps2'):
  var2 = tf.Variable(...)
with tf.device('worker1'):
  update_op1 = var1.assign_add(grad1)
  update_op2 = var2.assign_add(grad2)

while True:
  sess.run([update_op1, update_op2])
通信是自动处理的。当你执行