Tensorflow多线程数据竞争

时间:2018-02-12 21:14:44

标签: tensorflow

Tensorflow中的最佳做法是在同时读取和更新权重时避免不一致的权重?

目前我在棋盘游戏上进行简单的Q-Learning。典型的步骤是:使用NN选择最佳步骤,使用奖励+选择步骤的Q值来更新当前值。

由于它按顺序发生,我的GPU使用率非常低(大约10%)。为了加快速度,我计划运行多个代理,并使用队列来存储数据点,批量处理它们以更新权重。

Tensorflow提供了SyncReplicasOptimizer,但是根据文档,它有一个屏障,等待所有工作人员在每一步完成,更新权重,然后恢复所有工作人员。当所有其他线程都在等待最长的工作时,这仍然会导致GPU利用率低。

我希望通过移除屏障来实现更高的速度。这意味着,当教练员线程正在更新权重时,工作人员正在读取NN的权重来计算分数。

避免数据竞争但仍能实现完整的GPU利用率的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

您可以使用两个独立的网络。

一个构建在GPU上的backprop发生的地方。另一个是在CPU上构建的,操作在所有代理线程之间共享,因此他们可以使用它来获取分数并采取最佳操作。

每次k次迭代后,您可以使用tf.assign将GPU网络的权重分配给CPU网络。

这允许更高的GPU利用率和更好的收敛,因为CPU网络充当很少更新的目标网络,因此导致损失的变化较小。