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

How to make this RL code get GPU support?

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 获得帮助?

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

根据我的 RL 经验,我想出了一些我可以分享的可能的加速,并希望看到更多建议!

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

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

  4. 由于抽样很可能是瓶颈,您可以制作状态、动作、奖励的历史回购。在训练时,您可以从这个 repo 中随机抽取数据,并将其与新收集的数据一起训练。这在 RL 中称为 "Experience Replay"。

  5. 也许最有趣、最大的改进潜力是使用更先进的 RL 学习架构。更改损失函数的示例(查看 PPO for example), using and tuning the "generalized advantage estimation" calculated by the rewards. Or changing the model by for example including time dependencies with RNN, VAC or combining them all like here

希望这可以帮助您加快训练时间,并可能提高 GPU 的利用率。