113) ускорение PPO+Transformer Atari Frostbite
Помощь по ускорению пришла нежданно-негаданно. Оказалось, что внутри ALE уже есть AtariVectorEnv, который умеет хорошо в параллелизацию: на каждый енв запускается отдельный нативные поток (не процесс) из C++ кода, который этот енв только и обсчитывает. Прикрутил к пайплайну, и в итоге родился 17e_ppo_tr_atari_mp_07.ipynb:
1) rollout воркеров не стало. Используется простая модель: агент в основном процессе + 32 параллельных енва. 32 енва обсчитываются параллельно, потом агент за один раз для всех них вычисляет необходимое
2) логика роллаута вынесена в отдельный класс RolloutManager. Это позволяет роллаут делать хоть в воркере, хоть в основном процессе. Оствил в основном процессе, т.к. это экономит и память, и где-то на несколько процентов получается быстрее по SPS.
3) запись видео сначала была через SyncVectorEnv + враппер RecordVideo, т.к. такая композиция позволяла записывать видео с самой мякотки и в оригинальном FPS (30). Но по причинам, которые будут изложены в следующей записи, от этой связки пришлоссь отказаться. Теперь запись видео делается не через враппер, а просто императивно в capture_video_of_test_rollout. Оказалось, что запись видео вообще трививальная задача - тупо сохрани все кадры и потом оформи их в клип. Всё.
4) пришлось пачтить ALE (форк https://github.com/kocherovms/Arcade-Learning-Environment), т.к. AtariVectorEnv не поддерживал AutoResetmode::Disabled. А у меня многое на это завязано - в частности вычисление life_r/episode_r в независимости от is_episodic_life
Главное. Ускорение составило 1,4х. Просто, на ровном месте.
