如何使此RL代码获得GPU支持?

时间:2019-08-22 07:02:00

标签: python tensorflow gpu reinforcement-learning

https://github.com/keon/deep-q-learning/blob/master/dqn.py#L52

def replay(self, batch_size):
    minibatch = random.sample(self.memory, batch_size)
    for state, action, reward, next_state, done in minibatch:
        target = reward
        if not done:
            target = (reward + self.gamma *
                      np.amax(self.model.predict(next_state)[0]))
        target_f = self.model.predict(state)
        target_f[0][action] = target
        self.model.fit(state, target_f, epochs=1, verbose=0)

此代码似乎无法从GPU获得帮助,因为它每次执行一次都会训练数据。

self.model.fit(state, target_f, epochs=1, verbose=0)

如何更改此代码以进行并行训练,然后从GPU获得帮助?

1 个答案:

答案 0 :(得分:1)

在强化学习(RL)中,每个样本步骤通常需要大量CPU计算(当然,这取决于环境,某些环境也可以使用GPU)。 RL模型很难理解奖励以及导致该特定奖励的动作,因为好的奖励可能取决于更早的动作。因此,我们在进行RL时需要一个简单的模型体系结构(权重浅且更少),否则训练时间将变慢。因此,您的系统瓶颈很可能会收集样本,而不是训练数据。 另请注意,并非所有Tensorflow架构都能在GPU上很好地扩展。像大多数“图像”案例一样,具有大量权重的深层模型可以很好地缩放(例如带有NNIST的CNN和MLP网络),而与时间相关的RNN具有较小的提速潜力(请参见this stackexchange question)。因此,在使用GPU时要相应地设置您的期望。

通过我的RL经验,我发现我可以分享一些可能的提速,并且希望看到更多建议!

  1. 单个示例步骤可以通过创建多个并行运行的环境来加快速度,这些环境等于CPU内核的数量(在python中有一些用于并行处理的软件包,您可以为此使用)。这有可能加速与CPU内核数量成比例的采样数据。
  2. 在采样之间,您必须对下一个动作进行模型预测。不必在每个步骤都调用model.predict,而是可以为所有并行状态调用单个model.predict(使用等于并行环境数量的batch_size)。由于有更多的优化选项,这将加快预测时间。

  3. 从更新模型权重到预测的变化令人惊讶地缓慢。希望将来会加快速度?但是,尽管变化像今天一样缓慢,但是您可以通过保持模型不变并进行大量采样和预测(例如整个情节或情节中的多个步骤)来加快训练速度,然后在所有新收集的模型上训练模型之后的数据。在我的情况下,这会导致GPU利用率定期升高。

  4. 由于采样很可能是瓶颈,因此您可以进行状态,动作和奖励的历史回购。比训练时,您可以从此仓库中随机抽样数据,并将其与新收集的数据一起训练。在RL中称为“体验重播”。

  5. 也许最有趣,最大的改进潜力是使用更先进的RL学习体系结构。例如,使用并调整由奖励计算的“广义优势估算”来更改损失函数(例如,检出PPO)。或通过例如包含与RNN,VAC的时间相关性或像here一样将它们组合在一起来更改模型。

希望这可以帮助您加快培训时间,并可能会更多地利用GPU。