GenieRedux 本地部署指南:用 RetroAct 数据集训练你的第一个世界模型

GenieRedux 本地部署指南:用 RetroAct 数据集训练你的第一个世界模型

写在前面

如果你想理解世界模型是怎么训练的,光看论文不够。跑一遍代码,观察训练过程,才能真正理解每个组件在做什么。

GenieRedux 是目前最完整的开源世界模型训练框架。代码质量不错,文档也算清晰。这篇文章带你走一遍部署流程。

硬件需求

先说结论:这不是笔记本能跑的东西。

最低配置(能跑但很慢):

  • GPU:16GB 显存以上(3090、4090 或更好)
  • RAM:32GB
  • 存储:100GB 可用空间

推荐配置:

  • 多张 GPU(论文用的是多卡训练)
  • 64GB RAM
  • SSD 存储

如果你只有一张消费级显卡,可以跑,但要降低 batch size,效果会打折扣。

环境准备

1. 克隆仓库

git clone https://github.com/insait-institute/GenieRedux.git
cd GenieRedux

2. 安装 Conda 环境

项目提供了一个安装脚本:

bash install.sh

这个脚本会创建三个 Conda 环境:

  • retro_datagen:数据生成环境,包含 Stable-Retro
  • genie_redux:模型训练和评估环境
  • auto_explore:探索智能体训练环境

安装过程可能需要 10-20 分钟,取决于网速和机器配置。

3. 获取游戏 ROM

这是最麻烦的一步。GenieRedux 用 Stable-Retro 模拟器运行复古游戏,但 ROM 文件需要你自己准备。

为什么不直接提供?版权问题。NES、SNES、Genesis 的游戏 ROM 是有版权的。

怎么获取:

  1. 如果你有原版卡带,可以用设备 dump ROM
  2. 网上有一些公开的 ROM 资源,但合法性模糊
  3. 部分游戏有官方重制版,购买后可以提取 ROM

获取后,用 Stable-Retro 导入:

conda activate retro_datagen
python -m retro.import /path/to/your/roms/

建议先用几个游戏测试流程,确认跑通后再扩展。

数据生成

生成预训练数据

conda activate retro_datagen
python run.py generate config=retro_act/pretrain

这个命令会:

  1. 启动模拟器
  2. 用随机动作玩游戏
  3. 录制每一帧画面和对应的动作
  4. 保存到 data_generation/datasets/ 目录

默认配置会生成多个游戏的数据。如果你的 ROM 不全,可以修改配置文件只生成有 ROM 的游戏。

配置文件在 data_generation/configs/ 目录下。关键参数:

  • n_sessions:每个游戏生成多少个 episode
  • n_steps_max:每个 episode 最多多少步
  • image_size:画面分辨率(默认 64x64)

训练分词器

分词器(Tokenizer)把画面压缩成离散的 token。这是训练的第一步。

conda activate genie_redux
python run.py genie_redux train config=tokenizer.yaml \
    train.num_processes=6 \
    train.batch_size=7 \
    train.grad_accum=2

参数说明:

  • num_processes:数据加载的进程数,根据 CPU 核心数调整
  • batch_size:每个 GPU 的 batch 大小,根据显存调整
  • grad_accum:梯度累积步数

默认训练 150k 步。在单张 4090 上大概需要 10-20 小时。

训练过程中会保存 checkpoint 到 checkpoints/tokenizer/ 目录。

训练动力学模型

分词器训练完成后,训练动力学模型:

python run.py genie_redux train config=genie_redux_guided_pretrain.yaml \
    train.num_processes=7 \
    train.batch_size=4 \
    train.grad_accum=3 \
    tokenizer_fpath=checkpoints/tokenizer/tokenizer/model-150000.pt

这一步训练的是 GenieRedux-G,需要提供动作标签。如果你想训练不需要动作标签的版本(带 LAM),用 config=genie_redux.yaml

训练时间更长,可能需要 1-3 天,取决于硬件和数据量。

评估模型

训练完成后,可以评估效果:

python run.py genie_redux eval \
    config=genie_redux_guided_pretrain.yaml \
    eval.action_to_take=-1 \
    eval.model_fpath=checkpoints/genie_redux_guided/genie_redux_guided_pretrain/model-180000.pt \
    eval.inference_method=one_go

action_to_take=-1 表示用真实的动作序列评估。设置成 0-4 可以测试特定动作的效果。

评估会输出几个指标:

  • PSNR:峰值信噪比,衡量重建质量
  • SSIM:结构相似性
  • FID:生成图像和真实图像的分布距离
  • ΔPSNR:控制性指标

同时会生成可视化结果,保存在 outputs/evaluation/ 目录。

常见问题

Q:显存不够怎么办?

降低 batch_size,增加 grad_accum。比如 batch_size=2, grad_accum=8 和 batch_size=16, grad_accum=1 的总 batch 是一样的,只是速度慢一些。

Q:只有部分游戏的 ROM 能跑吗?

可以。修改配置文件,只包含你有 ROM 的游戏。或者在生成数据时指定游戏列表。

Q:训练到一半中断了怎么办?

Checkpoint 会自动保存。在训练命令里加 model_fpath=上次的checkpoint路径 可以继续训练。

Q:效果很差怎么办?

先检查数据生成是否正确。查看 data_generation/datasets/ 里的数据,确认画面和动作是对的。

如果数据没问题,可能是训练步数不够。150k 是论文推荐的最低步数,你可能需要更多。

探索智能体(可选)

如果你想用 AutoExplore 收集更好的训练数据:

conda activate auto_explore
python run.py auto_explore train \
    common.root_dpath=checkpoints/auto_explore \
    world_model.root_dpath=checkpoints/genie_redux_guided \
    world_model.model_dname=genie_redux_guided \
    world_model.model_fname=model-100000.pt \
    collection.games='["SuperMarioBros-Nes"]'

AutoExplore 会用已经训练好的世界模型来指导探索。它会倾向于去模型预测不准的区域,收集更有价值的数据。

下一步

跑通基础流程后,可以尝试:

  1. 增加数据量和训练步数,看效果能提升多少
  2. 在新游戏上微调模型
  3. 修改模型架构,做消融实验
  4. 读懂代码,理解每个模块的作用

GenieRedux 的代码结构比较清晰,适合学习世界模型的内部机制。

预期效果

说实话,最终效果和 DeepMind 的 Genie 3 差距很大。分辨率低、一致性短、泛化能力有限。

但作为学习材料,它是够用的。你能理解:

  • 视频分词器是怎么把画面压缩成 token 的
  • 动力学模型是怎么预测下一帧的
  • 隐动作模型是怎么从画面推断动作的

这些理解比最终效果更有价值。

← 返回博客列表