首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种强化学习算法的训练

一种强化学习算法的训练
EN

Code Review用户
提问于 2023-02-12 16:24:08
回答 1查看 57关注 0票数 0

问题:我试图在训练阶段减少增强学习算法的计算时间并优化其特定功能,并注意到一段代码的计算开销太大(下面描述的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秒。我很高兴回答任何问题。

代码:

代码语言:javascript
复制
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)

连接器的功能是:

代码语言:javascript
复制
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)

另外,

代码语言:javascript
复制
self.replay_buffer = ReplayBuffer(1e6)

在这里,ReplayBuffer是一个类

有关循环的更详细信息可以在这里找到:https://github.com/openai/maddpg/blob/master/maddpg/trainer/maddpg.py#L173

索引的截图是:(随机数列表)

EN

回答 1

Code Review用户

发布于 2023-02-12 20:05:54

您认为如何通过并行化来加快循环中附加操作的顺序?它不能,因为附加是严格顺序的。

动态数据结构和并行性不能结合在一起。与动态追加不同,预先分配结果列表,并让迭代将其值插入到适当的位置。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/283234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档