我正在使用ps和worker建立一个分布式张量流。当前,tf.train.Server必须接受ClusterDef才能在程序启动之前定义整个群集。
如果我仅使用ps来存储和更新变量,请使用worker进行训练。为什么PS必须在启动之前必须知道工作程序主机地址。
假设我要设置1 ps和2个worker,cluster_def显示如下
对于PS:
cluster = tf.train.ClusterSpec({'ps': {0: 'ps0:2222'}})
对于worker0:
cluster = tf.train.ClusterSpec({'ps': {0: 'ps0:2222'}, 'worker': {0: 'localhost:0'}})
对于worker1:
cluster = tf.train.ClusterSpec({'ps': {0: 'ps0:2222'}, 'worker': {1: 'localhost:0'}})
我不需要在worker1和worker0之间进行通信,如果我对此进行配置,则PS和worker可以启动,但是当使用train_op调用sess.run时,将导致以下错误:
tensorflow.python.framework.errors_impl.InternalError: No worker known as /job:worker/replica:0/task:0
[[Node: gradients/LinearRegression/xw_plus_b_grad/BiasAddGrad_S29 = _Recv[client_terminated=false, recv_device="/job:ps/replica:0/task:0/device:CPU:0", send_device="/job:worker/replica:0/task:0/device:CPU:0", send_device_incarnation=-801089107413104296, tensor_name="edge_78_gradients/LinearRegression/xw_plus_b_grad/BiasAddGrad", tensor_type=DT_FLOAT, _device="/job:ps/replica:0/task:0/device:CPU:0"]()]]
当GrpcServer :: Init,PS不知道任何工作程序信息,似乎其channel_cache为空时,RpcRemoteRendezvous :: RecvFromRemoteAsync似乎找不到工作程序通道并引发错误。有趣的是,工作者可以连接到ps来获取变量以进行正向计算。
我不知道我们是否有计划支持这种用法。我不知道这里的错误是错误还是设计错误?