A3C в Tensorflow - Должен ли я использовать потоки или распределенный API Tensorflow

Я хочу внедрить модель атак асинхронного Advent Actor Critic (A3C) для обучения подкреплению на моей локальной машине (1 процессор, 1 совместимый с Cuda графический процессор). В этом алгоритме несколько "обучающихся" сетей взаимодействуют с копиями среды и периодически обновляют центральную модель.

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

Однако, я недавно немного прочитал о распределенном тензорном потоке, и теперь я немного смущен. Было бы проще/быстрее/лучше реализовать это, используя распределенный API-интерфейс с тензором? В документации и разговорах они всегда упоминают об использовании в многопользовательских средах. Я не знаю, может ли это быть чрезмерным, чтобы использовать его в локальном асинхронном алгоритме.

Я также хотел бы спросить, есть ли способ выгрузить градиенты, рассчитанные каждым рабочим, который будет применяться вместе после n шагов?

Ответ 1

После реализации обоих, в конце концов, я нашел использование потоковой передачи проще, чем распределенный API-интерфейс tensorflow, однако он также работает медленнее. Чем больше процессорных ядер вы используете, тем быстрее распределенный тензорный поток сравнивается с потоками.

Однако это справедливо только для асинхронного обучения. Если доступные ядра процессора ограничены, и вы хотите использовать графический процессор, вы можете использовать синхронное обучение с несколькими рабочими, как это делает OpenAI в A2C. Там только среда распараллеливается (через многопроцессорную обработку), а функция tensorflow использует графический процессор без какой-либо распараллеливания графика. OpenAI сообщила, что их результаты были лучше с синхронным обучением, чем с A3C.

изменить

Вот еще несколько деталей:

Проблема с распределенным тензорным потоком для A3C заключается в том, что перед вызовом этапа обучения вам нужно вызвать несколько проходов forwardorflow forward (чтобы получить действия во время n шагов). Однако, поскольку вы учитесь асинхронно, ваша сеть будет меняться в течение n шагов другими работниками. Таким образом, ваша политика изменится во время n шагов, и шаг обучения будет происходить с неправильными весами. Распределенный тензорный поток не будет препятствовать этому. Поэтому вам нужна глобальная и локальная сеть в распределенном тензорном потоке, что делает реализацию не проще, чем реализацию с потоковой обработкой (и для потоковой передачи вам не нужно учиться, как работать с распределенным тензорным потоком). Runtime разумно, на 8 ядрах процессора или меньше не будет большой разницы.