一句话定位
Madrona 是斯坦福 + 佐治亚理工做的一款把游戏业界的 Entity-Component-System(ECS)架构完整搬上 GPU 的研究型引擎:开发者用「每 world / 每 agent / 每 object 一个函数」的无并行心智负担写法定义环境逻辑,引擎把这些系统编译进单个 CUDA megakernel 批量执行成千上万个并行 world,在单张 RTX 4090 上把 OpenAI Hide-and-Seek 跑到 190 万步/秒,比强 CPU 基线快 11 倍、比开源参考实现快约 270 倍。
背景与定位
批量仿真(batch simulation)——用一个引擎同时步进成千上万个独立环境——是近年 RL/embodied 高吞吐训练的共同思路,此前的实现如 Isaac Gym(3D 刚体物理专用)、Brax(可微物理专用)、CuLE/Atari GPU emulation 等无一例外是”为单一任务领域重写一次仿真器”:换个任务就要从零再造一个高性能仿真器,门槛远高于用 Unity/Unreal 这类通用游戏引擎写新游戏逻辑。Madrona 要解决的正是这道”可编程性 vs 高性能”的两难:能不能像写游戏一样声明环境状态和逻辑,同时仍然拿到 GPU 批量仿真的两三个数量级加速?
作者的核心洞察是:游戏业界近年流行的 ECS 设计模式(组件与逻辑分离、天然支持多核并行,Unity DOTS / Unreal 均已采用)本身就适合往 GPU 批量仿真方向映射——ECS 强加的”状态结构”(entity 归档 archetype、component 列存、system 按 query 匹配实体)恰好给了引擎足够信息去做内存管理、工作量摊销与跨环境的一致性并行调度。Madrona 因而定位为通用、可编程的 ECS 批量仿真引擎(游戏引擎),而非某个具体的 RL 环境或基准。相关工作还包括分布式调度黑盒仿真器的 IMPALA/SEED RL/EnvPool 一系(不改仿真器本身,天花板受限于原始仿真器速度),以及 JAX/PyTorch 等数组式编程路线(表达复杂数据结构与控制流笨拙,因此已有的数组式仿真器如 Brax 往往回避复杂状态)。2024 年作者团队又推出配套的高吞吐批渲染器(SIGGRAPH Asia 2024, Rosenzweig et al.),补上”pixels-to-actions”训练所需的渲染管线,是本作的直接后续。
模型架构
Madrona 是一套仿真引擎而非神经网络模型,核心是”ECS 抽象 + GPU 映射机制”三层设计。
ECS 编程模型:状态组织为 entity 的集合,同构 entity(相同 component 组合)归为一个 archetype(论文示例 HideSeek 的 Agent、Obstacle、CollisionPair 三种 archetype);system 是定义在一组 component 上的数据并行计算,由一个 query(决定匹配哪些 archetype/entity)加一个逐 entity 调用的函数构成;system 之间的依赖关系构成一张 system computation graph(DAG),定义一次仿真步的全部计算(HideSeek 的完整 task graph 约 200 个节点)。系统执行中可以动态创建/销毁 entity(如 FindOverlaps 系统按 BVH 重叠动态生成 CollisionPair entity)。
存储:archetype 级中心化列存。每个 archetype 一张跨所有并行环境共享的表(column store),并隐式附加 EnvID 分量把每行 entity 映射回所属环境。这一设计带来三个性能收益:① 同一 warp 内相邻线程处理表中相邻行时天然保持数据访问一致性,即使这些行属于不同环境(若按环境分表,则环境内 entity 数少时会造成 warp 内跨表访存);② 动态创建/销毁的过度分配开销在所有环境间摊销,避免每环境独立分表造成的内存碎片;③ 支持与学习框架的零拷贝张量导出(组件列存内存直接 alias 成 PyTorch tensor,无需拷贝)。表通过按需分页的大块虚拟内存增长(借用原本给 virtual texturing 用的机制),删除用 EnvID = -1 作哨兵值标记,再周期性对 EnvID 列做并行 radix sort 把已删除行移到表尾并截断回收,顺带提升按 EnvID 访问环境级全局状态时的数据一致性。
GPU 映射:单 CUDA megakernel + 任务图调度。所有 ECS system 连同管理组件访问的包装代码一起编译进单个 CUDA kernel(而非每个 system 单独 launch kernel,避免大量低成本 system 因 kernel 启动开销和 CPU-GPU 同步而拖垮吞吐,尤其是 NarrowPhase 这类下游动态数量的 system);调度用 persistent-threads 风格,GPU 上所有 warp 协同处理任务图的同一节点后再整体推进到下一节点,允许在节点间安全插入内存重映射、表压缩等引擎级全局操作而无需担心与用户 system 代码的竞态。System 到 GPU 线程的映射:每个 system 调用被展开成 N 次 entry-function 调用(N = 匹配到的 entity 总行数),默认每个 GPU 线程处理一行;应用可选择性升级到 warp 级(32 线程)或 thread-block 级(256 线程)协作并行,论文举例窄相碰撞检测按 32 个 CollisionPair 一组用整个 warp 协同处理(凸包数据加载进 shared memory,内层循环 warp 内并行,最终接触点生成串行分给 32 对)。
Profile-Guided Optimization(PGO):megakernel 中所有 system 共享同一套逐线程寄存器分配,当 task graph 里系统的寄存器需求/内存延迟特征差异大时会造成 GPU 占用率不足或寄存器溢出。Madrona 可选地编译多套不同寄存器分配的 megakernel 变体,先做小规模 up-front profiling(每种寄存器配置跑少量步、用内置低开销 tracing 记录逐 system 执行时间),再据此决定何时切换寄存器配置、拆分成多次 kernel launch,拆分与否的取舍是”寄存器收益 vs 额外 launch 开销”。HideSeek 场景下默认寄存器上限 255/线程,PGO 把 megakernel 拆成 5 个子段,寄存器分配低至 64/线程。
数据
Madrona 是仿真引擎论文,无预训练数据集;“数据”体现为它承载的基准环境规模与吞吐能力(即可生成的经验规模):
- HideSeek:3 hider + 2 seeker 的 3D 竞技环境(复现 OpenAI Emergent Tool Use,Baker et al. 2020),含刚体物理、碰撞、LIDAR 光线投射的 360° 深度图、agent 间两两可见性计算;变体最多支持 40 个 agent。
- Overcooked:2D 网格多智能体协作烹饪环境(Carroll et al. 2019 的 Human-AI 协调基准),采用标准”lossless state encoding”供 CNN 使用。
- Hanabi:2–5 智能体合作卡牌游戏(Bard et al. 2020),最优策略据引用文献需要 数百亿(tens of billions)环境步才能训练到位。
- Cartpole:经典 RL “hello world”环境,无内部并行性,用于测试引擎在极简任务上的饱和行为。
- 峰值批大小(吞吐评测所用):HideSeek 32K、Overcooked 64K、Hanabi 128K、Cartpole 1024K 个并行环境实例。
- 规模化训练的数据量估算:论文估计,复现 Baker et al. [2020] 描述的全部七个阶段涌现式工具使用需要 1150 亿(115 billion)环境步,单张 RTX 4090 用 BATCH-ECS-GPU 约 1.5 天可以生成完这么多经验(首个”搭建堡垒/用坡道翻墙”雏形在 4 小时内出现),而用 OpenAI 开源仿真器在 32 线程 13900K 上跑到同样早期里程碑需要 40 天。
训练方法
Madrona 本身不训练模型,而是作为经验生成引擎接入外部训练循环(“训练方法”体现为引擎-学习框架的对接与自身的编译期优化):
- 应用侧定义:先声明 component(名字+类型)与使用这些 component 的 archetype,再把 ECS system 写成接受组件数据作为参数的 C++ 函数(论文用 Python 伪代码展示,实际实现是 C++;只要有合适 GPU 编译器,理论上可为任意语言写 binding)。
- 与学习循环对接(Listing 1 描述的流程):初始化阶段定义 component/archetype、构建 system computation graph、实例化 N 个并行环境;随后把策略的动作张量绑定为 Action 之类的外部 component 输入(
HSBindExternalComponents),并导出 observation/reward 张量指针;主循环里策略推理与MadronaGPUStep(envs, graph)交替执行,Madrona 接管 entity 状态管理与 system 并行执行,应用仍保留策略推理与优化方式的完全自主权。 - 动作生成为分量数据:这个交互模式不预设任何具体动作空间形式(离散 token / 连续 / 扩散等),由应用自行在 Action component 里定义,由外部策略产出后经零拷贝张量绑定注入。
- PGO 作为引擎自身的”训练”(离线编译优化):见上方模型架构一节,是 Madrona 针对 megakernel 寄存器分配所做的、面向自身执行效率的一次性 profile-then-compile 流程,而非针对下游策略的训练算法。
Infra(训练 / 推理工程)
- 硬件:单张 NVIDIA GeForce RTX 4090(消费级 GPU);CPU 对照为 Intel Core i9-13900K(32 线程)。全部实验都在单 GPU、单机上完成,论文未涉及多 GPU / 分布式训练基础设施。
- 峰值吞吐(Table 1,环境步/秒,含环境生成+仿真+观测/奖励生成,不含策略推理):
- HideSeek(32K batch):190 万(1.9×10⁶)
- Overcooked(64K batch):4000 万(4.0×10⁷)
- Hanabi(128K batch):2100 万(2.1×10⁷)
- Cartpole(1024K batch):34 亿(3.4×10⁹)
- 对照配置吞吐(同一 HideSeek 任务,四种后端):BATCH-ECS-GPU 1.9×10⁶ ; 朴素单线程/环境的 ECS-GPU 4.5×10⁴(慢 42×,受限于内存碎片只能跑约 8K 并行环境,GPU 计算/带宽利用率仅 1.9%);ECS-CPU(Madrona 单线程 C++ 实现,32 线程并发跑,视为很强的 CPU 基线)1.6×10⁵;开源参考实现 REF-CPU(OpenAI MuJoCo+Python)6.9×10³。BATCH-ECS-GPU 相对 ECS-CPU 快 11×,相对 REF-CPU 快约 270×;开源参考实现整体比 ECS-CPU 慢 23×(HideSeek)到 320×(Hanabi)。
- Overcooked / Hanabi 相对强 CPU 基线加速:33× / 5×(Table 1)。Hanabi 因无 intra-environment 并行性和高频内存访问,BATCH-ECS-GPU 在此任务上仅达 6% 计算利用率但 >90% 显存带宽利用率。
- PGO 效果(Table 2,HideSeek):开启 PGO 后吞吐从 1.4×10⁶ 提升到 1.9×10⁶(+35%),计算利用率从 22% → 33%,L2 带宽利用率从 46% → 69%(对照 naive ECS-GPU 仅 1.9%/1.9%)。
- 批大小敏感性(Figure 3):HideSeek 在批大小降到 8K 时仍保有 >75% 峰值吞吐;Overcooked 在 16K 批量下已达约 90% 峰值;Cartpole 需 约 524K 环境才能饱和 GPU。BATCH-ECS-GPU 超过 ECS-CPU 的交叉点:HideSeek 约 500 个环境,Overcooked 约 200 个环境。
- 单步执行剖面(Figure 5,16K 批量 HideSeek):一步仿真耗时 7.9 ms,覆盖 128 个 SM;task graph 约 200 节点中,仅有单环境一次调用的 system(约束求解器、速度过滤)在无 intra-env 并行时才出现 SM 空闲。
- 推理端 FPS/控制频率:论文未针对具体机器人/控制系统给出统一控制 Hz 或部署延迟指标(Madrona 是环境仿真引擎,非策略推理引擎)。
- 单独说明——批渲染器(非本论文,SIGGRAPH Asia 2024 后续工作,来自项目页 FAQ):在 RTX 4090 与 H100 上,几何简单场景(如 HideSeek)渲染帧率超过 30 万 FPS,几何复杂场景(Habitat Synthetic Scene Dataset,平均约 700 万三角面/场景)约 3 万 FPS——这是后续论文的结果,不计入本文的吞吐数字。
评测 benchmark
全部数字来自论文一手实验(Table 1、Table 2、Figure 3-5),详见上方”Infra”一节的具体数值,汇总要点:
- 四环境 × 四配置吞吐总表(Table 1):BATCH-ECS-GPU 相较 ECS-GPU(naive GPU 无批量)加速 42×(HideSeek)、约 36×(Overcooked)、5×(Hanabi)、24×(Cartpole);相较开源参考实现(REF-CPU)加速两到三个数量级。
- Agent 数量扩展性(Figure 4,HideSeek/Overcooked/Micro 三个任务):因需计算 pairwise 观测,总工作量随 agent 数呈二次增长,人均吞吐在 agent 数超过约 10 后开始下降,但总 agent-steps/秒在 40 个 agent 时仍高于 2 个 agent 的情形;不含 pairwise 依赖的合成微基准 Micro 中,人均吞吐随 agent 数线性增长直到 250 agent/环境 打满 GPU。
- 未做:论文未与 Isaac Gym / Brax 等物理专用批量仿真器做直接吞吐对比(仅在相关工作中定性讨论),也未报告下游 RL 策略的最终任务成功率/回报曲线——评测聚焦纯仿真吞吐与 GPU 利用率,不是策略学习效果。
创新点与影响
贡献:① 首次证明 ECS 设计模式可以完整映射到 GPU 并支撑批量强化学习环境仿真,论文自陈”据我们所知是第一个完全部署在 GPU 上的 ECS 架构”;② 提供了首个可编程、领域无关的高性能批量仿真引擎(此前的批量仿真器都是为单一任务领域重写,如 Isaac Gym 之于 3D 物理、Shacklett et al. 2021 之于点目标导航),让研究者能像用 Unity/Unreal 写游戏那样写新环境,同时拿到两三个数量级的 GPU 加速;③ 单表跨环境列存 + 隐式 EnvID + megakernel + PGO 的组合设计,系统性解决了动态实体创建/删除、跨系统零拷贝张量导出、以及”多环境×多智能体×动态数量事件”场景下 GPU 一致性执行的一揽子工程难题;④ 开源发布,降低了没有超算资源的团队做高吞吐 embodied/RL 环境研究的门槛。
论文自陈的局限:尚未穷尽系统调度优化空间(“we have not yet considered the full range of possible system scheduling optimizations”);当前计算模式 GPU 编程 API(区别于图形 API)不允许 CUDA kernel 直接发起光线查询、BVH 构建 API 也只能从 CPU 端调用,导致 HideSeek 的 LIDAR/深度可见性计算只能用软件光线投射实现,未能利用 RTX 硬件光追单元;随着未来环境复杂度(更精细几何、更高分辨率观测、更多 agent)增长,预期 GPU-CPU 性能差距会进一步拉大,也会让多 GPU 配置更有必要(论文未实现,列为展望)。项目页 FAQ 中另补充说明当前物理仅支持 XPBD 刚体接触(不适合 MuJoCo/Isaac Gym 擅长的高精度可变形/接触密集操作任务),且逻辑编写限定 C++(Python 仅能桥接末端如奖励计算)。
影响:作者团队 2024 年发布配套的高吞吐批渲染器(SIGGRAPH Asia 2024,Rosenzweig et al.)补齐”pixels-to-actions”渲染短板;Madrona 已被用于重建 Escape Room、Overcooked、Hanabi、Cartpole 等多个环境,并成为后续把仿真器接到 MJX 等外部物理引擎(Madrona MJX)的基础设施底座,是 sim-infra 方向”通用可编程 GPU 批量仿真引擎”这一子领域较早的系统性工作。发布博客中给出一个独立于论文本身的真实迁移案例作为佐证:Bidipta Sarkar 把 Overcooked-AI 移植到 Madrona 后,端到端训练获得 60× 加速,训练耗时从一小时以上缩短到不到一分钟。
原始链接
- 论文 PDF(SIGGRAPH 2023 / ACM TOG 42(4)):https://madrona-engine.github.io/shacklett_siggraph23.pdf
- 项目页:https://madrona-engine.github.io/
- 引擎介绍博客(v0.1 发布):https://madrona-engine.github.io/blog.html
- GitHub 仓库:https://github.com/shacklettbp/madrona
- 批渲染器后续工作(SIGGRAPH Asia 2024,项目页链接):https://madrona-engine.github.io/renderer.html
一手源存档(sources/)
- madrona-engine—project-page — 项目主页快照(简介、FAQ、引用)
- madrona-engine—blog — v0.1 发布博客快照
- madrona-engine—github-readme — GitHub README 快照(Key Features、依赖、代码组织)
- 论文全文见上方 PDF 链接(一手 PDF,不入 git)