TensorFlow对“参数服务器”一无所知,但它支持在不同进程中跨多个设备运行图形。其中一些进程的设备名称以开头"/job:ps"
,并且其中包含变量。工人负责培训过程,当他们运行培训过程时,train_op
将导致"/job:ps"
设备上发生工作,这将更新共享变量。
该server.join()
方法只是告诉TensorFlow阻塞并监听请求,直到服务器关闭为止(这意味着它永远永久阻塞,或者直到您终止进程为止,因为当前尚未实现干净关闭)。
在我上一个答案的示例中,PS任务是被动的,并且一切都由…中的工作程序任务控制## some training code
。如果您将代码拆分到多个设备上,TensorFlow将添加适当的通信,这将扩展到不同进程中的设备。该with tf.device(tf.train.replica_device_setter(...)):
块告诉TensorFlow通过将其设备设置为"/job:ps/task:{i}"
(对于的不同值{i}
,以循环方式选择)将每个变量置于不同的PS任务上。
当您调用时sess.run(train_op)
,TensorFlow将运行一个依赖并更新变量的图,并包括更新变量的操作。这部分计算将在"/job:ps"
设备上进行,因此这些设备将充当参数服务器。