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

时间:2018-01-05 09:57:20

标签: multithreading tensorflow

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

修改

以下是一些更多细节:

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