Jav*_*dez 11 multithreading tensorflow
我想在我的本地机器(1个CPU,1个cuda兼容GPU)中实现Asynchronous Advantage Actor Critic(A3C)模型以进行强化学习.在该算法中,若干"学习者"网络与环境的副本交互并定期更新中心模型.
我已经看到在同一个图中创建n个"工作者"网络和一个"全局"网络的实现,并使用线程来运行这些.在这些方法中,通过将梯度应用于具有"全局"范围的可训练参数来更新全局网络.
但是,我最近读了一些关于分布式张量流的内容,现在我有点困惑.使用分布式tensorflow API实现这一点会更容易/更快/更好吗?在文档和会谈中,他们总是提到在多设备环境中使用它.我不知道在本地异步算法中使用它是否过分.
我还想问一下,有没有办法批处理每个工人计算出的梯度,在n步之后一起应用?
在实现两者之后,最终我发现使用比分布式tensorflow API更简单的线程,但是它也运行得更慢.您使用的CPU核心越多,分布式张量流与线程相比就越快.
然而,这仅适用于异步训练.如果可用的CPU内核受限并且您想要使用GPU,则可能需要使用与多个工作程序的同步培训,就像OpenAI在其A2C实现中所做的那样.只有环境是并行化的(通过多处理),tensorflow使用GPU而没有任何图形并行化.OpenAI报告说他们的同步训练结果比使用A3C更好.
编辑:
以下是一些更多细节:
A3C的分布式张量流的问题在于,在调用学习步骤之前,需要调用多个张量流前向传递(以在n个步骤中执行操作).但是,由于您以异步方式学习,因此您的网络将在其他工作人员的n个步骤中发生变化.因此,您的政策将在n个步骤中发生变化,学习步骤将以错误的权重发生.分布式张量流不会阻止这种情况.因此,您需要分布式张量流中的全局和本地网络,使得实现不比使用线程的实现更容易(并且对于线程,您不必学习如何使分布式张量流工作).运行时明智,在8个CPU核心或更少的CPU核心上没有太大的区别.