Tensorflow中的最佳做法是在同时读取和更新权重时避免不一致的权重?
目前我在棋盘游戏上进行简单的Q-Learning。典型的步骤是:使用NN选择最佳步骤,使用奖励+选择步骤的Q值来更新当前值。
由于它按顺序发生,我的GPU使用率非常低(大约10%)。为了加快速度,我计划运行多个代理,并使用队列来存储数据点,批量处理它们以更新权重。
Tensorflow提供了SyncReplicasOptimizer,但是根据文档,它有一个屏障,等待所有工作人员在每一步完成,更新权重,然后恢复所有工作人员。当所有其他线程都在等待最长的工作时,这仍然会导致GPU利用率低。
我希望通过移除屏障来实现更高的速度。这意味着,当教练员线程正在更新权重时,工作人员正在读取NN的权重来计算分数。
避免数据竞争但仍能实现完整的GPU利用率的最佳做法是什么?
答案 0 :(得分:1)
您可以使用两个独立的网络。
一个构建在GPU上的backprop发生的地方。另一个是在CPU上构建的,操作在所有代理线程之间共享,因此他们可以使用它来获取分数并采取最佳操作。
每次k
次迭代后,您可以使用tf.assign
将GPU网络的权重分配给CPU网络。
这允许更高的GPU利用率和更好的收敛,因为CPU网络充当很少更新的目标网络,因此导致损失的变化较小。