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 所述)

概念 作用
服务器 持有一个或多个 ;每个表定义容量、采样/移除策略和速率限制。
项目 的容器;一个项目引用一个或多个 数据元素(实际的张量)。项目是轻量的,因为它们仅存储引用,允许多个项目共享同一数据元素。
选择器 定义如何选择项目用于采样或移除。内置选择器:UniformPrioritizedFIFOLIFOMinHeapMaxHeap
速率限制器 控制何时允许插入或采样(例如:MinSizeSampleToInsertRatioQueueStack)。
分片 可以运行多个独立的 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}
}

相关

  • 项目
  • 项目
  • 项目
  • 项目