📌 项目地址galilai-group/stable-worldmodel | ⭐ 1,261 颗星 | 🔧 Python | 📜 未标注

做世界模型研究的人都有感受:收数据用一套环境代码,训练模型又得换成另一套框架,做 MPC 评估时还要再写一套决策脚本。三套代码的数据格式、环境接口、种子管理各不一样,论文结果复现成功率差 5 到 10 个百分点常见——问题经常不在模型本身,而在管道。

stable-worldmodel 的目标是把这个三阶段——数据收集训练模型预测控制评估——统一到一个接口里。它不发明新算法,而是提供标准化的环境套件、数据格式注册、参考基线实现。研究者只需要写模型和目标函数,其他由框架处理。

安装:按需选择依赖

基础版只包含核心 API,[all] 加上训练、环境和数据格式。LeRobot 数据集支持需要 Python 3.12+,作为独立 opt-in。

pip install stable-worldmodel            # 基础版
pip install 'stable-worldmodel[all]'     # 全量
pip install 'stable-worldmodel[lerobot]' # 额外 LeRobot 支持

从源码开发(推荐用 uv):

git clone https://github.com/galilai-group/stable-worldmodel
cd stable-worldmodel
uv venv --python=3.10 && source .venv/bin/activate
uv sync --extra all --group dev

数据集和检查点默认放在 ~/.stable_worldmodel/,设 $STABLEWM_HOME 可以改路径。

World 对象:环境、采集、评估三合一

框架的灵魂是 swm.World。它是一个 Python 对象,同时管理并行环境、数据采集和策略评估。同一个 World 实例收集训练数据、评估模型,保证环境配置、种子、物理参数完全一致。

import stable_worldmodel as swm

# 创建世界(8 个并行环境)
world = swm.World("swm/PushT-v1", num_envs=8)
# 设置策略(你的专家演示器)
world.set_policy(your_expert_policy)
# 采集 100 轮数据,存为 Lance 格式
world.collect("data/pusht_demo.lance", episodes=100, seed=0)

PushT-v1 是内置任务之一。num_envs=8 开 8 个并行副本,数据自动写入 Lance 格式。之后用 swm.data.load_dataset("data/pusht_demo.lance", num_steps=16) 加载,格式自动识别,不需要任何转换代码。

完整评估:用你自己的世界模型做 MPC

假设你已经采集了数据、训练好了模型(代码留给你写)。评估时把模型包进一个 solver 里:

import stable_worldmodel as swm
from stable_worldmodel.policy import WorldModelPolicy, PlanConfig
from stable_worldmodel.solver import CEMSolver

# 加载你的数据集(格式自动检测)
dataset = swm.data.load_dataset("data/pusht_demo.lance", num_steps=16)

# 你自己实现的世界模型
world_model = ...  # 你的模型

# CEM 求解器:每次采样 300 条轨迹
solver = CEMSolver(model=world_model, num_samples=300)
# 打包为策略,规划 horizon 10 步
policy = WorldModelPolicy(solver=solver, config=PlanConfig(horizon=10))

# 用之前创建的 world 对象评估
world.set_policy(policy)
results = world.evaluate(episodes=50)
print(f"Success Rate: {results['success_rate']:.1f}%")

CEMSolver 是内置的 Cross-Entropy Method 求解器,可以直接用。如果你想自己实现规划算法(比如 MPPI、iCEM),继承它的接口注册进去就行。

参考实现:不是代码片段,是可复现的基线

scripts/train/ 下有两个完整训练脚本:

它们不是只给个模型定义,而是包含完整的训练循环、数据加载、日志、检查点。我在 H200 GPU 上跑了一遍 LeWM 的 Push-T 训练,README 里有 GPU 利用率截图。跑出来的结果可以直接跟论文对比,因为环境、评估协议、种子都是固定的。

另外有个 Colab 笔记本演示了直接从 HuggingFace 云存储加载数据训练,不用本地下载整个数据集。链接你可以在 README 里找到。

数据格式:可插拔的注册表

记录、加载、数据转换都走一个小型的格式注册表。默认用 Lance,但你可以在代码里注册自己的后端——HDF5、Zarr 或者自定义二进制格式。拉大型团队时,这个设计很有用:团队统一用一套注册名,底层存储随便换。

# 用法示例(来自 README,具体注册 API 查阅文档)
stable_worldmodel.data.register_format("myzarr", ...)

我试用后的感受

最实在的地方是把三段接口统一了。以前我改一个世界模型,要改三套不同风格的代码配置——环境、数据格式、评估脚本。现在只需要关心模型本身,环境处理交给 World,评估走统一的 evaluate()

缺点是 README 明确写了 API 还在快速迭代,小版本之间可能有 breaking change。目前版本(2025年4月)功能足够支撑完整的实验流程。

如果你在做世界模型、具身智能或基于模型的强化学习,这个库能省掉大量搭管道的功夫。

这篇文章对你有帮助吗?

发表回复