Как эффективно получить данные из буфера на графический процессор в PyTorch? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть лучевой актер, который собирает опыт (буфер) и лучевой актер, который оптимизирует их (ученик) + несколько актеров, которые только собирают опыт. Это похоже на алгоритм обучения подкрепления Ape-X.

Моя основная проблема заключается в том, что использование ученика для выборки из буфера занимает много времени, потому что данные могут передаваться только из буфера ученику в формате процессора (даже если ученик и буфер находятся на одной машине) , Следовательно, для того, чтобы выполнить этап оптимизации для учащегося, мне все равно нужно будет отправлять данные в графический процессор после каждого звонка ray.get(buffer.GetSamples.remote()). Это очень неэффективно и отнимает много времени от оптимизационных расчетов.

В идеальном мире буфер будет непрерывно отправлять случайные выборки в графический процессор, и учащийся может просто выбрать кусок из этих при каждом проходе. Как я могу сделать эту работу?

Кроме того, помещение и ученика, и буфера в один лучевой актер не работает, потому что у луча (и obv python), кажется, есть значительные проблемы с многопоточностью, и выполнение этого последовательным способом наносит ущерб цели (как это будет еще медленнее).

Обратите внимание, что это продолжение моего вопроса здесь .

РЕДАКТИРОВАТЬ: я должен отметить, что это для PyTorch

1 Ответ

2 голосов
/ 23 июня 2019

Вы можете вызывать .cuda () и помещать загруженные сэмплы в очередь Python, а в другом потоке использовать эти сэмплы GPU из очереди.

Вот как реализация Ape-X в Ray управляет одновременнымзагрузка данных для TensorFlow.

...