用 C++ 和 Cython 编写的用于强化学习的 ReplayBuffer
项目描述
概述
cpprb 是一个 python ( CPython ) 模块,为强化学习提供重放缓冲区类。
主要目标用户是研究人员和图书馆开发人员。
您可以与您最喜欢的深度学习库(例如TensorFlow、PyTorch )一起构建自己的强化学习算法。
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 安装需要更长的时间。
用法
基本用法
基本用法如下;
- 创建重播缓冲区 (
ReplayBuffer.__init__) - 添加过渡 (
ReplayBuffer.add)- 在剧集结束时重置 (
ReplayBuffer.on_episode_end)
- 在剧集结束时重置 (
- 样本转换 (
ReplayBuffer.sample)
示例代码
这是一个用于存储标准环境(又名obs、
act、rew、next_obs和done)的简单示例。
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 最独特的设计之一是面向列的灵活定义的转换。据我们所知,其他重放缓冲区实现采用面向行的灵活转换(又名转换类数组)或面向列的非灵活转换。
在深度强化学习中,抽样批次被划分为变量(即obs、act等)。如果采样批次是面向行的,用户(或库)需要将其转换为面向列的批次。(也见文档)
批量插入
cpprb 可以同时接受多个转换的添加。当批量转换从本地缓冲区移动到全局缓冲区时,这种设计很方便。此外,它更有效,因为不仅删除了纯 Pythonfor循环,而且还抑制了 PER 的不必要的优先级更新。(也见文档)
最小依赖
我们尽量减少依赖。在执行过程中只需要 NumPy。小依赖总是更可取以避免依赖地狱。
为 cpprb 做贡献
非常欢迎任何贡献!
使社区更大
更大的社区使开发更加活跃并改进 cpprb。
- Star GitLab 存储库(和/或GitHub 镜像)
- 使用 cpprb 发布您的代码
- 将此存储库分享给您的朋友和/或关注者。
论坛问答
当您有任何问题或要求时,您可以查看GitHub.com 上的讨论。如果您仍然找不到任何信息,您可以发布自己的信息。
我们在 GitLab.com 上保留问题,仍然允许用户打开问题,但是,我们主要将该位置用作开发问题跟踪器。
合并请求(拉取请求)
cpprb 遵循当地规则:
- 分店名称
- “HotFix * **” 用于错误修复
- "Feature * **" 用于新功能实现
- 文档字符串
- 必须用于外部 API
- 麻木风格
- 单元测试
- 将测试代码放在“test/”目录下
- 可以通过
python -m unittest <Your Test Code>命令测试 - GitLab CI 上的持续集成由
.gitlab-ci.yaml
- 打开一个问题并将其关联到合并请求
此处描述了针对初学者的分步说明。
链接
cpprb 网站
cpprb 用户的存储库
- keiohta/TF2RL: TensorFlow2.x 强化学习
Kaggle 比赛中的示例用法
日本文件
- 【强化学习】cpprbで体验回放を简単に!| 奇塔
- 【强化学习】Ape-Xの高速な実装を简単に!| 奇塔
- 【强化学习】自作ライブラリでDQN | 奇塔
- 【强化学习】Ape-Xの高速化を実现| 曾
- 【强化学习】cpprb に迁移のファイル保存机能を追加| 曾
执照
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}
}