强化学习:手动实现一个并行环境采样的代码 —— SynVectorEnv

代码实现的开源地址:

https://openi.pcl.ac.cn/devilmaycry812839668/SyncVectorEnv


image



这个代码的实现就是对强化学习(on-line)进行并行采样的一种实现的扩展,相关类似的实现在gym中也有,可以参考:


https://gymnasium.farama.org/introduction/speed_up_env/

https://gymnasium.farama.org/tutorials/gymnasium_basics/vector_envs_tutorial/



强化学习(在线强化学习,on-line reinforcement leanring)算法在训练时需要对环境样本进行采样,传统方式采样单进程的非并行采样方式,其采样效率较低,为解决该问题本项目的实现采用同步并行采样的方式,可以大大提高在线强化学习的采样效率。



对该项目的实现进行速度测试,给出下面的数据:

image


可以看到使用一个子进程进行采样的情况下,单step需要使用的时间为0.00025秒,使用两个子进程的单step采样所用时间为0.00030秒,由此我们可以估计得到增加一个子进程进行采样的非同步等待时间为单step下0.0002秒,同步所需要使用的时间为单step下0.00005秒;使用该种方式我们可以以此计算出3子进程到8子进程下所用的单step下的时间以及每增加一个子进程后单step下所需要多花费的等待时间趋近于0.00002秒;而每个单step下非通信同步等待的单进程所用时间大致为0.0002到0.0003之间,由此我们可以估计得到单子进程进行单step采样的时候同步等待所用时间大致为其计算任务所用时间的10%左右,从这一点可以看到如果单step采样所用时间较短的情况下其进行同步所花费的时间设置要占总采样时间的较大部分,这样就会导致CPU的较大比例被空置用来进行多进程的同步等待了,而实际采样所用时间被同步等待给分走了。


在这个项目中同步等待使用的是multiprocess下的queue,而这也已经是python语言下最快的实现方式了,这问题是受python语言特性所限制的,很多商业公司为了避免python实现中的多进程同步所花费的的大量时间而采用C++语言方式的实现,但是这又会增加实现的难度及成本,为此本项目是一种取中间值的方式,在实现难度和整体性能上达到了一个适中的水平。


posted on 2025-01-03 11:18  Angry_Panda  阅读(10)  评论(0编辑  收藏  举报

导航