Skip to main content

用 C++ 和 Cython 编写的用于强化学习的 ReplayBuffer

项目描述

图像 图像 图像 图像 图像

图像 图像 图像

图像

概述

cpprb 是一个 python ( CPython ) 模块,为强化学习提供重放缓冲区类。

主要目标用户是研究人员和图书馆开发人员。

您可以与您最喜欢的深度学习库(例如TensorFlowPyTorch )一起构建自己的强化学习算法。

cpprb 强调速度、灵活性和内存效率。

通过利用Cython,复杂的计算(例如,用于优先体验重放的分段树)被卸载到 C++ 上。(名称 cpprb 来自“C++ Replay Buffer”。)

在 API 方面,最初 cpprb 指的是OpenAI Baselines的实现。当前版本的 cpprb 具有更大的灵活性。可以存储任意数量的任何NumPy兼容类型(只要内存容量足够)。例如,您也可以存储下一个动作和下一个观察。

安装

cpprb 安装前需要以下软件。

  • C++17 编译器(用于从源代码安装)
    • GCC(可能是 7.2 和更新版本)
    • Visual Studio(2017 Enterprise 很好)
  • 蟒蛇 3
  • 点子

此外,这里是用户对Ubuntu安装的良好反馈。(谢谢!)

PyPI安装(推荐)

以下命令将 cpprb 与其他依赖项一起安装。

pip install cpprb

根据您的环境,您可能需要sudo--user标记进行安装。

在支持的平台(Linux x86-64、Windows amd64 和 macOS x86 64)上,可以使用托管在 PyPI 上的二进制包,因此您不需要 C++ 编译器。在其他平台上,如 32 位或 arm 架构的 Linux 和 Windows,不能从二进制安装,需要自己编译。请耐心等待,我们计划在未来支持更广泛的平台。

如果您在从二进制安装时遇到任何麻烦,您可以通过将--no-binary选项传递给上述 pip 命令来回退到源安装。(为了避免安装 NumPy 源码,最好先安装 NumPy。)

pip install numpy
pip install --no-binary cpprb

从源代码安装

首先,手动下载源代码或克隆存储库;

git clone https://gitlab.com/ymd_h/cpprb.git

然后就可以用同样的方法安装了;

cd cpprb
pip install .

对于此安装,您需要在安装过程中将扩展 Python (.pyx) 转换为 C++ (.cpp),这比从 PyPI 安装需要更长的时间。

用法

基本用法

基本用法如下;

  1. 创建重播缓冲区 ( ReplayBuffer.__init__)
  2. 添加过渡 ( ReplayBuffer.add)
    1. 在剧集结束时重置 ( ReplayBuffer.on_episode_end)
  3. 样本转换 ( ReplayBuffer.sample)

示例代码

这是一个用于存储标准环境(又名obsactrewnext_obsdone)的简单示例。

from cpprb import ReplayBuffer

buffer_size = 256
obs_shape = 3
act_dim = 1
rb = ReplayBuffer(buffer_size,
		  env_dict ={"obs": {"shape": obs_shape},
			     "act": {"shape": act_dim},
			     "rew": {},
			     "next_obs": {"shape": obs_shape},
			     "done": {}})

obs = np.ones(shape=(obs_shape))
act = np.ones(shape=(act_dim))
rew = 0
next_obs = np.ones(shape=(obs_shape))
done = 0

for i in range(500):
    rb.add(obs=obs,act=act,rew=rew,next_obs=next_obs,done=done)

    if done:
	# Together with resetting environment, call ReplayBuffer.on_episode_end()
	rb.on_episode_end()

batch_size = 32
sample = rb.sample(batch_size)
# sample is a dictionary whose keys are 'obs', 'act', 'rew', 'next_obs', and 'done'

施工参数

(另见API 参考

姓名 类型 可选的 说明
size int 缓冲区大小
env_dict dict 是(但无法使用) 环境定义(见这里
next_of str或类似数组的str 是的 内存压缩(见这里
stack_compress str或类似数组的str 是的 内存压缩(见这里
default_dtype numpy.dtype 是的 回退数据类型
Nstep dict 是的 Nstep 配置(见这里
mmap_prefix str 是的 mmap 文件前缀(见这里

笔记

灵活的环境值由env_dict创建缓冲区时定义。详细信息在文档中进行了描述。

ReplayBuffer.add由于存储值具有灵活的名称,因此您必须按关键字传递给 成员。

特征

cpprb 提供用于构建以下算法的缓冲区类。

算法 cpprb 类
体验重播 ReplayBuffer LJ林
优先体验重播 PrioritizedReplayBuffer T. 肖尔等。人。
多步(Nstep)学习 ReplayBuffer,PrioritizedReplayBuffer  
多进程学习 (Ape-X) MPReplayBuffer MPPrioritizedReplayBuffer D.霍根等。人。
大批量体验回放 (LaBER) LaBERmean, LaBERlazy,LaBERmax T. Lahire 等人。
反向体验回放 (RER) ReverseReplayBuffer E.罗蒂诺夫
事后经验回放 (HER) HindsightReplayBuffer M. Andrychowicz 等人。

cpprb 功能及其用法在以下页面中进行了描述:

设计

面向列且灵活

cpprb 最独特的设计之一是面向列的灵活定义的转换。据我们所知,其他重放缓冲区实现采用面向行的灵活转换(又名转换类数组)或面向列的非灵活转换。

在深度强化学习中,抽样批次被划分为变量(即obsact等)。如果采样批次是面向行的,用户(或库)需要将其转换为面向列的批次。(也见文档

批量插入

cpprb 可以同时接受多个转换的添加。当批量转换从本地缓冲区移动到全局缓冲区时,这种设计很方便。此外,它更有效,因为不仅删除了纯 Pythonfor循环,而且还抑制了 PER 的不必要的优先级更新。(也见文档

最小依赖

我们尽量减少依赖。在执行过程中只需要 NumPy。小依赖总是更可取以避免依赖地狱。

为 cpprb 做贡献

非常欢迎任何贡献!

使社区更大

更大的社区使开发更加活跃并改进 cpprb。

论坛问答

当您有任何问题或要求时,您可以查看GitHub.com 上的讨论。如果您仍然找不到任何信息,您可以发布自己的信息。

我们在 GitLab.com 上保留问题,仍然允许用户打开问题,但是,我们主要将该位置用作开发问题跟踪器。

合并请求(拉取请求)

cpprb 遵循当地规则:

  • 分店名称
    • “HotFix * **” 用于错误修复
    • "Feature * **" 用于新功能实现
  • 文档字符串
  • 单元测试
    • 将测试代码放在“test/”目录下
    • 可以通过python -m unittest <Your Test Code>命令测试
    • GitLab CI 上的持续集成由.gitlab-ci.yaml
  • 打开一个问题并将其关联到合并请求

此处描述了针对初学者的分步说明。

链接

cpprb 网站

cpprb 用户的存储库

Kaggle 比赛中的示例用法

日本文件

执照

cpprb 在 MIT 许可下可用。

MIT License

Copyright (c) 2019 Yamada Hiroyuki

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

引文

如果您在论文中引用 cpprb,我们将非常高兴。

@misc{Yamada_cpprb_2019,
author = {Yamada, Hiroyuki},
month = {1},
title = {{cpprb}},
url = {https://gitlab.com/ymd_h/cpprb},
year = {2019}
}