Tensorflow 中的 A3C - 我应该使用线程还是分布式 Tensorflow API



我想在我的本地机器(1 个 CPU,1 个兼容 cuda 的 GPU)中实现异步优势 Actor Critic (A3C) 模型以进行强化学习。在此算法中,多个"学习器"网络与环境的副本进行交互,并定期更新中心模型。

我已经看到在同一图内创建n个"worker"网络和一个"全局"网络的实现,并使用线程来运行它们。在这些方法中,通过将梯度应用于具有"全局"范围的可训练参数来更新全局网络。

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

我还想问,有没有办法将每个工人计算的梯度批处理,以便在n个步骤后一起应用?

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

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

编辑:

以下是更多详细信息:

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

最新更新