如何有效利用GPU进行强化学习?

19

最近我研究了强化学习,有一个问题一直困扰着我,我找不到答案:使用GPU如何有效地进行培训?据我所知,需要与环境进行不断的交互,这对我来说似乎是一个巨大的瓶颈,因为这个任务通常是非数学/不可并行化的。然而,例如Alpha Go使用多个TPU / GPU。那他们是如何做到的?

2个回答

24
确实,在学习步骤之间,您经常会与环境进行交互,这些交互通常在CPU上运行效果更好,而不是GPU上。因此,如果您的代码执行操作并进行更新/学习步骤的速度非常快(例如,表格强化学习算法),那么尝试将它们放在GPU上可能并不值得。
然而,当您拥有一个庞大的神经网络,每次选择动作或运行学习步骤时都需要经过该网络(这是目前流行的大多数深度强化学习方法的情况),将这些操作放在GPU上而不是CPU上的加速效果通常足够大,值得花费一些努力来运行它们(即使这意味着您需要经常在CPU和GPU之间进行“切换”,并且可能需要将一些数据从内存复制到显存或者反之)。另外,将多个不同剧集的状态进行批处理(无论是真正地使用多个CPU线程并行运行,还是仅仅按顺序在每个剧集中进行一次时间步骤),然后由GPU(或TPU)一次性处理所有状态,这也是相对常见的做法。这是因为通常我们有足够的显存可以在GPU上同时容纳多个状态的前向和后向传递。
最近有一个趋势,人们试图让环境的逻辑尽可能地并行运行在诸如GPU或TPU等设备上。例如,谷歌的brax用于物理模拟,JAX-LOB用于基于强化学习的金融交易。

15

在进行离线策略强化学习时(这意味着您可以使用由“行为”策略生成的转换样本,不同于您当前正在学习的策略),通常会使用经验重播。因此,您可以从这个大缓冲区中获取一堆转换,并使用GPU使用SGD优化学习目标(参见DQN,DDPG)。

RL的CPU-GPU混合方法之一是https://github.com/NVlabs/GA3C。在这里,使用多个CPU与不同的环境实例进行交互。 "Trainer"和"Predictor"进程然后使用多进程队列收集交互,并将它们传递给GPU进行反向传播。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接