我想在我的本地计算机(1个CPU,1个cuda兼容GPU)中实施异步优势演员评论家(A3C)模型以进行强化学习。在这种算法中,几个“学习者”网络与环境的副本进行交互,并定期更新中心模型。
我已经看到了在同一图中创建n个“工作”网络和一个“全局”网络并使用线程来运行它们的实现。在这些方法中,通过将梯度应用于具有“全局”范围的可训练参数来更新全局网。
但是,我最近阅读了一些有关分布式张量流的信息,现在我有点困惑。使用分布式tensorflow API实施此操作会更容易/更快/更好吗?他们在文档和讲座中总是明确提到在多设备环境中使用它。我不知道在本地异步算法中使用它是否过大。
我也想问一下,有没有办法在n个步骤之后将每个工人计算出的梯度进行批处理?
两者都实现之后,最终我发现使用线程要比分布式tensorflow API更简单,但是运行速度也较慢。与线程相比,您使用的CPU内核越多,分布式张量流就变得越快。
但是,这仅适用于异步训练。如果可用的CPU内核受到限制,并且您想使用GPU,则可能需要对多个工作人员使用同步训练,就像OpenAI在其A2C实现中所做的那样。那里只有环境被并行化(通过多处理),并且tensorflow使用GPU而没有任何图形并行化。OpenAI报告说,同步训练的结果要优于A3C。
编辑:
以下是更多详细信息:
A3C的分布式张量流的问题在于,您需要在调用学习步骤之前调用多个张量流正向传递(以在n个步骤中获取操作)。但是,由于您异步学习,因此在其他工作人员的n个步骤中,您的网络将发生变化。因此,您的政策将在n个步骤中发生变化,并且学习步骤将以错误的权重发生。分布式张量流不会阻止这种情况。因此,您还需要分布式张量流中的全局和本地网络,这使得实现不比带有线程的实现容易(对于线程而言,您不必学习如何使分布式张量流工作)。在运行时方面,在8个或更少的CPU内核上,不会有太大差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句