问题:我试图在训练阶段减少增强学习算法的计算时间并优化其特定功能,并注意到一段代码的计算开销太大(下面描述的for循环)。
循环描述
该函数的取值范围为.n=3 (n是RL算法中的代理数),索引是一个包含随机数列表(1024 -固定列表)的列表,以检索一组观察、动作、下一次观察等。但问题是,当自.n(代理数)从3增加到20或48甚至更大时,这个循环需要花费大量时间,因为每个代理必须收集一组1024个数据点(obs、next_obs、actions等)。从它们的缓冲区(self._storage)中将代理的所有数据附加到单个列表中(在for循环中)。因为每个代理没有任何数据依赖项来收集数据。我的疑问是,我们能否尝试在多个线程上执行for循环,或者使用MPI使它们并行运行并更快地收集数据以实现一些加速?
为了更好地理解,我使用Sel.n =3和self.n=6运行整个算法,对于60,000集(循环触发的次数越多),计算时间分别为1758.40秒和4616.31秒。我很高兴回答任何问题。
代码:
for i in range(self.n):
obs, act, rew, obs_next, done = agents[i].replay_buffer.sample_index(index)
obs_n.append(obs)
obs_next_n.append(obs_next)
act_n.append(act)连接器的功能是:
def sample_index(self, idxes):
return self._encode_sample(idxes)
def _encode_sample(self, idxes):
obses_t, actions, rewards, obses_tp1, dones = [], [], [], [], []
for i in idxes:
data = self._storage[i]
obs_t, action, reward, obs_tp1, done = data
obses_t.append(np.array(obs_t, copy=False))
actions.append(np.array(action, copy=False))
rewards.append(reward)
obses_tp1.append(np.array(obs_tp1, copy=False))
dones.append(done)
return np.array(obses_t), np.array(actions), np.array(rewards), np.array(obses_tp1), np.array(dones)另外,
self.replay_buffer = ReplayBuffer(1e6)在这里,ReplayBuffer是一个类
有关循环的更详细信息可以在这里找到:https://github.com/openai/maddpg/blob/master/maddpg/trainer/maddpg.py#L173
索引的截图是:(随机数列表)

发布于 2023-02-12 20:05:54
您认为如何通过并行化来加快循环中附加操作的顺序?它不能,因为附加是严格顺序的。
动态数据结构和并行性不能结合在一起。与动态追加不同,预先分配结果列表,并让迭代将其值插入到适当的位置。
https://codereview.stackexchange.com/questions/283234
复制相似问题