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获得帮助?
答案 0 :(得分:1)
在强化学习(RL)中,每个样本步骤通常需要大量CPU计算(当然,这取决于环境,某些环境也可以使用GPU)。 RL模型很难理解奖励以及导致该特定奖励的动作,因为好的奖励可能取决于更早的动作。因此,我们在进行RL时需要一个简单的模型体系结构(权重浅且更少),否则训练时间将变慢。因此,您的系统瓶颈很可能会收集样本,而不是训练数据。 另请注意,并非所有Tensorflow架构都能在GPU上很好地扩展。像大多数“图像”案例一样,具有大量权重的深层模型可以很好地缩放(例如带有NNIST的CNN和MLP网络),而与时间相关的RNN具有较小的提速潜力(请参见this stackexchange question)。因此,在使用GPU时要相应地设置您的期望。
通过我的RL经验,我发现我可以分享一些可能的提速,并且希望看到更多建议!
在采样之间,您必须对下一个动作进行模型预测。不必在每个步骤都调用model.predict,而是可以为所有并行状态调用单个model.predict(使用等于并行环境数量的batch_size)。由于有更多的优化选项,这将加快预测时间。
从更新模型权重到预测的变化令人惊讶地缓慢。希望将来会加快速度?但是,尽管变化像今天一样缓慢,但是您可以通过保持模型不变并进行大量采样和预测(例如整个情节或情节中的多个步骤)来加快训练速度,然后在所有新收集的模型上训练模型之后的数据。在我的情况下,这会导致GPU利用率定期升高。
由于采样很可能是瓶颈,因此您可以进行状态,动作和奖励的历史回购。比训练时,您可以从此仓库中随机抽样数据,并将其与新收集的数据一起训练。在RL中称为“体验重播”。
也许最有趣,最大的改进潜力是使用更先进的RL学习体系结构。例如,使用并调整由奖励计算的“广义优势估算”来更改损失函数(例如,检出PPO)。或通过例如包含与RNN,VAC的时间相关性或像here一样将它们组合在一起来更改模型。
希望这可以帮助您加快培训时间,并可能会更多地利用GPU。