如何在 PyTorch 中有效地将缓冲区中的数据传输到 GPU 上?

How can I get data from the buffer efficiently onto the GPU in PyTorch?

我有一个收集经验的光线演员(缓冲区)和一个优化它们的光线演员(学习者)+几个只收集经验的演员。这类似于Ape-X强化学习算法。

我的主要问题是使用l​​earner从buffer中采样需要很多时间,因为数据只能以cpu格式从buffer传输到learner(即使learner和buffer在同一台机器上)。因此,为了 运行 学习器的优化传递,我仍然需要在每次调用 ray.get(buffer.GetSamples.remote()) 之后将数据推送到 GPU。这是非常低效的,并且会占用大量的优化计算时间。

在理想情况下,缓冲区会不断将随机样本推送到 GPU,学习者只需在每次传递时从中选择一个块。我怎样才能使这项工作?

此外,将学习者和缓冲区都放入一个光线演员中是行不通的,因为光线(和 obv python)似乎在多线程方面存在重大问题,并且以串行方式进行时尚达不到目的(因为它会更慢)。

请注意,这是我 提出的另一个问题的后续。

编辑:我应该注意这是针对 PyTorch

您可以调用 .cuda() 并将加载的样本推送到 python 队列,并在另一个线程中使用队列中的这些 GPU 样本。

这就是 Ray 中的 Ape-X 实现如何管理 TensorFlow 的并发数据加载。