【问题标题】:Enforcing local device placement in Tensorflow在 Tensorflow 中强制执行本地设备放置
【发布时间】:2017-08-14 01:38:47
【问题描述】:

我正在尝试创建一个分布式 Tensorflow 应用程序,其中包含一个服务器和一个或多个使用它的客户端。

指定哪些变量或操作应该放在服务器中很容易。只需使用定义“服务器”作业的 ClusterSpec 启动 tf.train.Server 并执行以下操作:

with tf.device('/job:server/task:0'):
  server_vars = ...
  server_ops = ...

但是,如果我想将其他 var 或 ops 放在客户端做同样的事情,那么我不得不为每个客户端定义一个新作业,为其启动一个新的 tf.train.Server,定义新的 var和操作放置在每个特定客户端上,并在 ClusterSpec 中包含所有客户端地址和端口。

有什么方法可以使用 tf.device 在本地放置 ops 和 vars?不一定适用于任何特定设备(CPU、GPU),但不一定适用于远程服务器。

# No device is specified, so it's up to TF to decide where to place it.
# Let's say it decides to place it locally. How can we enforce that?
# Is there a tf.device(/local/) or similar?
client_vars = ...
client_ops = ...

with tf.Session('grpc://%s' % SERVER) as session:
  # Do stuff.
  # Can we run client ops from this session?

注意:我假设服务器是被动工作的,从不尝试直接访问任何客户端操作或变量。相反,客户端访问服务器操作和变量。

【问题讨论】:

  • 没有device/local。您可以使用tf.device(/job:../task:/...) 语法在本地放置操作,因为客户端知道它正在运行哪个作业/任务
  • 但这迫使我在客户端启动一个 tf.train.Server 并打开一个会话以便在本地运行它的操作,不是吗?这实际上对我来说很成问题,因为例如 Tensorflow C API(用于 Windows)不支持启动服务器。

标签: tensorflow


【解决方案1】:

如果您没有在本地运行 tf.Server,那么在本地运行 ops 的唯一选择是创建一个本地会话 tf.Session() 并在该会话中运行 ops。不同的会话不能直接通信。如果您使用分布式 TensorFlow,则必须从分布式会话中获取数据并自己输入本地会话。 (反之亦然)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2018-06-18
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多