google-deepmind/reverb
Reverb is an efficient and easy-to-use data storage and transport system designed for machine learning research
Reverb – 面向强化学习的可扩展经验回放服务
是什么 – Reverb 是一个以 Python 为首要设计的库(拥有快速的 C++ 核心),为强化学习(RL)研究提供网络化数据存储服务。它允许运行一个或多个 服务器,用于持有包含 表(例如:转移、轨迹或任意张量)的项目。客户端可通过 gRPC 插入数据,根据可配置的策略进行采样,并更新优先级。其设计模仿了离策略强化学习算法中使用的 经验回放 缓冲区,但 API 足够灵活,也可用于在策略、监督学习或一般的分布式数据工作负载。
核心概念(如 README 所述)
| 概念 | 作用 |
|---|---|
| 服务器 | 持有一个或多个 表;每个表定义容量、采样/移除策略和速率限制。 |
| 表 | 项目 的容器;一个项目引用一个或多个 数据元素(实际的张量)。项目是轻量的,因为它们仅存储引用,允许多个项目共享同一数据元素。 |
| 选择器 | 定义如何选择项目用于采样或移除。内置选择器:Uniform、Prioritized、FIFO、LIFO、MinHeap、MaxHeap。 |
| 速率限制器 | 控制何时允许插入或采样(例如:MinSize、SampleToInsertRatio、Queue、Stack)。 |
| 分片 | 可以运行多个独立的 Reverb 服务器并进行负载均衡;数据不复制,因此系统可水平扩展,但可能丢失数据。 |
| 检查点 | 服务器可以将完整状态转储到磁盘,并在之后恢复,从而为长时间训练提供容错能力。 |
典型工作流(快速入门摘录)
import reverb
# 1️⃣ 定义一个包含单个表的服务器
server = reverb.Server(tables=[
reverb.Table(
name='my_table',
sampler=reverb.selectors.Uniform(), # 用于采样的项目选择方式
remover=reverb.selectors.Fifo(), # 表满时移除项目的策略
max_size=100,
rate_limiter=reverb.rate_limiters.MinSize(1)),
])
# 2️⃣ 连接客户端
client = reverb.Client(f'localhost:{server.port}')
# 3️⃣ 插入数据(单个元素或轨迹)
client.insert([0, 1], priorities={'my_table': 1.0})
# 4️⃣ 采样
samples = list(client.sample('my_table', num_samples=2))
README 还展示了更丰富的 轨迹写入器,允许在提交前构建引用一系列数据元素的项目。
为何使用 Reverb?
- 性能 – 核心为 C++ 并使用 gRPC,同时提供 TensorFlow 操作以实现与
tf.data流水线的零拷贝集成。 - 灵活性 – 可任意组合选择器、速率限制器和表大小;支持 FIFO 队列、优先级回放或自定义堆。
- 分布式训练 – 可在负载均衡器后运行多个服务器;客户端会自动将插入/采样分散到各服务器。
- 持久化 – 可检查点并恢复整个回放缓冲区,而不会丢失优先级或顺序。
- 超越 RL – README 指出,用户已用 Reverb 存储模型权重或其他频繁更新的数据,将其作为轻量级内存分布式文件系统使用。
安装与兼容性
- 通过 pip 安装:
pip install dm-reverb[tensorflow](自动添加匹配的 TensorFlow 版本)或pip install dm-reverb(若自行管理 TF)。 - 夜间构建版本为
dm-reverb-nightly。 - 仅支持 Linux;该库未针对生产环境加固,可能崩溃。
- Reverb 版本与特定 TensorFlow 版本绑定(例如:0.14.0 与 TF 2.14.0 兼容)。
README 中指出的限制
- 非生产就绪 – 专为研究设计;稳定性保证有限。
- 仅支持 Linux – 无 Windows/macOS 原生支持。
- 无内置复制 – 扩展依赖分片;在预期使用场景中,数据丢失可接受。
- 版本耦合 – 必须与轮子中捆绑的 TensorFlow 版本匹配;版本不匹配可能导致安装失败。
何时使用 Reverb
如果你正在构建一个需要快速、分布式回放缓冲区的强化学习系统,且需要优先采样、自定义移除策略或可检查点状态,Reverb 可为你提供开箱即用的服务,而非手动实现。它也适用于任何研究流水线,这些流水线需要在多个进程或机器之间共享大型张量的内存存储。
引用
若在出版物中使用 Reverb,请引用配套论文:
@misc{cassirer2021reverb,
title={Reverb: A Framework For Experience Replay},
author={Albin Cassirer and Gabriel Barth-Maron and Eugene Brevdo and Sabela Ramos and Toby Boyd and Thibault Sottiaux and Manuel Kroiss},
year={2021},
eprint={2102.04736},
archivePrefix={arXiv},
primaryClass={cs.LG}
}
相关
- 项目
- 项目
- 项目
- 项目