【问题标题】:A3C in Tensorflow - Should I use threading or the distributed Tensorflow APITensorflow 中的 A3C - 我应该使用线程还是分布式 Tensorflow API
【发布时间】:2018-01-17 23:02:34
【问题描述】:

我想在我的本地机器(1 个 CPU,1 个与 cuda 兼容的 GPU)中实现用于强化学习的 Asynchronous Advantage Actor Critic (A3C) 模型。在该算法中,多个“学习者”网络与环境副本交互并定期更新中心模型。

我见过在同一个图中创建 n 个“工作”网络和一个“全局”网络并使用线程来运行它们的实现。在这些方法中,通过对具有“全局”范围的可训练参数应用梯度来更新全局网络。

但是,我最近阅读了一些关于分布式张量流的信息,现在我有点困惑。使用分布式 tensorflow API 实现它会更容易/更快/更好吗?在文档和谈话中,他们总是明确提到在多设备环境中使用它。我不知道在本地异步算法中使用它是否有点过头了。

我也想问一下,有没有办法将每个worker计算的梯度批量化,在n步后一起应用?

【问题讨论】:

标签: multithreading tensorflow


【解决方案1】:

在实现两者之后,最后我发现使用线程比分布式 tensorflow API 更简单,但是它运行速度也更慢。与线程相比,您使用的 CPU 内核越多,分布式 tensorflow 就越快。

但这仅适用于异步训练。如果可用的 CPU 内核有限并且您想使用 GPU,您可能希望使用多个工作人员的同步训练,就像 OpenAI 在他们的 A2C implementation 中所做的那样。只有环境是并行化的(通过多处理),而 tensorflow 使用 GPU 而没有任何图形并行化。 OpenAI 报告说,他们的同步训练结果比 A3C 更好。

编辑:

这里有更多细节:

A3C 的分布式张量流的问题在于,在调用学习步骤之前,您需要调用多个张量流前向传递(以获取 n 步期间的操作)。但是,由于您是异步学习的,因此您的网络将在其他工作人员的 n 步中发生变化。因此,您的策略将在 n 步期间发生变化,并且学习步骤将以错误的权重发生。分布式张量流不会阻止这种情况。因此,您还需要分布式张量流中的全局和本地网络,使实现并不比线程实现更容易(并且对于线程,您不必学习如何使分布式张量流工作)。运行时方面,在 8 个或更少的 CPU 内核上不会有太大差异。

【讨论】:

  • 为什么不用多进程实现和求和更新而不是多线程呢?由于多进程使用多个内核,这会更快吗?
  • @SridharThiagarajan Tensorflow 不支持多处理。线程版本的 tensorflow 部分将使用多个核心。但是 python 部分不会,所以它不能很好地扩展。
猜你喜欢
  • 1970-01-01
  • 2018-12-07
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
相关资源
最近更新 更多