我有一个收集经验的光线演员(缓冲区)和一个对光线进行优化的光线演员(学习者)和几个仅收集经验的演员。这类似于Ape-X强化学习算法。
我的主要问题是使用学习器从缓冲区中采样需要花费大量时间,因为数据只能以cpu格式从缓冲区传输到学习器(即使学习器和缓冲区位于同一台机器上) 。因此,为了对学习者进行优化,每次调用ray.get(buffer.GetSamples.remote())
之后,我仍然需要将数据推送到GPU。这是非常低效的,并且要花费大量时间来进行优化计算。
在理想情况下,缓冲区将连续地将随机样本推入GPU,并且学习者只需在每次通过时从这些样本中选择一个大块即可。我该如何工作?
此外,将学习者和缓冲区都放入一个ray actor中是行不通的,因为ray(和obv python)似乎在多线程方面存在重大问题,并且以串行方式进行会破坏目标(因为会更慢)。
请注意,这是我here提出的另一个问题的后续措施。
编辑:我应该注意,这是针对PyTorch
答案 0 :(得分:2)
您可以调用.cuda()并将加载的样本推入python队列,然后在另一个线程中使用队列中的GPU样本。
这是Ray中的Ape-X实现如何管理TensorFlow的并发数据加载的方式。