LIBERO-Spatial 双相机 GRPO 复现

最新可续训权重:第 60 步

最新完整策略断点为 weights/policy/global_step_60/。第 60 步之后的训练请从这份断点恢复。 它包含完整模型权重、优化器状态及 8 个 DCP 分片;真实 LIBERO-Spatial 10 个任务 × 50 次评估成功率为 77.2%(386/500)。 latest_policy.json 记录最新断点、评估结果和续训入口。40、45、50 步用于历史对比。

下载并执行下文的 restore、check 后,完整的下一轮实验使用以下入口:

screen -dmS spatial-cycle60 bash -c \
  'bash reproduction/run_world_model_cycle.sh "$PWD/runs/cycle60"'
screen -r spatial-cycle60

它依次执行:60 步策略采集 500 条真实双相机轨迹 → 更新 Wan/Cosmos → 打包本轮新模型 → 策略从 60 步继续到 80 步。完整配方见“后续世界模型更新”。

以下单条命令只续训 GRPO,不采集数据或更新世界模型;使用包内 Wan 1000/Cosmos 2000:

screen -dmS spatial-grpo60-to80 bash -c \
  'python3 reproduction/portable.py train --resume 60 --target 80 --output "$PWD/runs/resume60_to80"'
screen -r spatial-grpo60-to80

--target 80 表示训练至总步数 80,即新增 20 步;恢复优化器时使用完整断点目录。

本发布包对应 π0.5 + Wan 主视角 + Cosmos-WoVR 腕部视角,在另一台 Linux 服务器上启动八卡 GRPO。训练使用世界模型生成的观测;成功率是在真实 LIBERO 仿真器中,以固定初始状态、10 个任务 × 50 次试验统计的 success-once。

包中内容

  • source/:本次源码快照,包含项目覆盖层及实际使用的 RLinf、Cosmos、OpenPI、 DiffSynth、LIBERO 源码与仿真资源。
  • runtime/:Python 3.11/3.10 解释器及两个环境实际使用的依赖层。恢复时保持层的 顺序,不使用包含重复版本的 pip freeze 输出来重建环境。
  • weights/pi05/global_step_12000/:匹配的 few-shot SFT 初始化权重和统计量。
  • weights/policy/global_step_40/、global_step_50/、global_step_60/:可供原生 RLinf 续训的 完整策略权重及 DCP 训练状态。global_step_45/ 只有完整策略权重,可用于评估 或模型初始化,不用于恢复优化器状态。
  • weights/wan_step1000/、weights/cosmos_step2000/:本轮 GRPO 使用的世界模型 推理权重。它们的世界模型训练优化器状态不在本发布包中。
  • assets/:Wan 基础包及 VAE、奖励模型、Cosmos VAE、T5 缓存、统计量与 tokenizer。
  • data/:KIR 使用的 500 条 Spatial 双视角源轨迹,以及 Wan 初始观测资源。
  • config/:实际运行配置和原始 KIR 索引;恢复程序会重定位路径,核对大小和内容 校验和,并更新本地文件指纹,不重新选择关键帧。
  • evidence/:评估结果、模型配对元数据、环境版本清单与实验谱系。

参考检查点的真实 Spatial 成功率:40 步 365/500(73.0%),45 步 370/500(74.0%),50 步 349/500(69.8%),最新 60 步 386/500(77.2%)。40 步由前一轮世界模型训练得到; 40→60 的本轮续训使用新 Wan 1000 步和新 Cosmos 2000 步。

目标服务器

二进制环境适用于 Linux x86_64,参考系统为 Ubuntu 22.04 / glibc 2.35, 8 张 A800 80 GiB,驱动 595.45.04。另一种 CPU 架构、较旧 glibc、不同 CUDA 驱动或其他显卡需要额外验证。请预留发布包下载空间和约 45 GiB 的环境解压空间, 另为训练日志、视频与完整检查点预留至少 100 GiB。

系统依赖示例:

sudo apt-get update
sudo apt-get install -y zstd screen ffmpeg libegl1 libgl1 libglfw3 \
  libglib2.0-0 libsm6 libxrender1 libxext6 libosmesa6

下载、恢复与检查

先用服务器已有的 Python 安装下载工具,下载公开仓库。下载凭据不属于发布包。

python3 -m pip install 'huggingface_hub>=0.36'
python3 -c "from huggingface_hub import snapshot_download; snapshot_download('dyk111zn/GRPO-LIBERO-Spatial-Reproduction', local_dir='spatial-reproduction')"
cd spatial-reproduction
python3 reproduction/portable.py restore
python3 reproduction/portable.py check

restore 默认验证所有发布文件的 SHA-256。check 使用恢复后的两个解释器, 检查源码导入、配置、世界模型分片、策略、统计量、KIR 数据与相机/动作约定, 不会启动 GPU 训练。恢复后移动整个目录时,重新执行 restore 以更新路径。

启动 GRPO

历史复现示例:使用第 40 步完整策略及新世界模型,继续到第 60 步。 第 60 步之后的续训使用上面的最新 60 步断点。

screen -dmS spatial-grpo bash -c \
  'python3 reproduction/portable.py train --resume 40 --target 60 --output "$PWD/runs/resume40_to60"'
screen -r spatial-grpo

使用第 50 步完整断点继续到第 60 步:

python3 reproduction/portable.py train --resume 50 --target 60 \
  --output "$PWD/runs/resume50_to60"

从 SFT 12k 初始化,使用当前新世界模型开始一个新的 20 步实验:

python3 reproduction/portable.py train --steps 20 --output "$PWD/runs/new20"

新的 SFT→20 实验与历史策略 0→20 的世界模型和谱系不同,不能把两者当成相同实验。 原生 DCP 恢复模型、优化器等已保存状态;本发布不承诺跨服务器逐比特复现采样序列。

默认使用 0–7 号卡,每 5 步保存策略并做真实 Spatial 评估,每 10 步及最后一步 保存完整训练状态。启动前会检查 GPU 占用。计算进程保留可复用显存缓存, 稳态目标约 75 GiB,启动目标约 65 GiB,设备余量配置 3.5 GiB。 这些缓存会被计算复用;设备独占仍需服务器调度器保证。

评估发布的策略

python3 reproduction/portable.py eval --checkpoint 60 --output "$PWD/runs/eval60"

该入口只做真实 LIBERO 评估,不执行 GRPO 更新;沿用八卡启动器,因此仍会加载 世界模型与策略。复现入口显式使用独立评估驱动,调用同一个真实 LIBERO 评估器, 不会进入训练循环。所选策略检查点记在 runs/launch_eval.json,报告步骤沿用策略步数。

后续世界模型更新

完整入口为 reproduction/run_world_model_cycle.sh,从恢复好的发布包根目录执行, 需要八张可用 GPU。每个原生入口启动前都会检查占用;指定的卡有其他作业时退出。 采集和世界模型训练均使用实际计算进程持有的可复用显存缓存,保留 3.5 GiB 设备余量。

先查看命令计划,不启动 GPU 任务:

bash reproduction/run_world_model_cycle.sh --dry-run "$PWD/runs/cycle60"

正式执行上面的 screen -dmS spatial-cycle60 ... 命令。各阶段为:

  1. 采集真实数据:八卡使用 weights/policy/global_step_60/,在 LIBERO-Spatial 的 10 个任务上各采集 50 条轨迹。保留成功和失败,mode=train,每条最多 240 步, 每次执行 8 个动作;主相机、腕部相机、动作和仿真状态按同一帧索引保存。 结果在 runs/cycle60/collection/。
  2. 准备训练集:新采集的 500 条轨迹与包内 data/kir_sources/ 的 500 条公开 Spatial 轨迹组成新数据/回放数据,验证比例 0.2;训练采样的新数据比例为 0.5。 生成 runs/cycle60/manifest.json 并校验文件。历史每轮采集的原始数据未随包发布; 此处回放来源是包内公开轨迹。
  3. 更新两个世界模型:Wan/Cosmos 各四卡并行,梯度累计 4 次,有效 batch 各为 16, 学习率 1e-6,Cosmos 使用 v3-reconstructed 配方,目标 2000 步, 显式设置 --save-interval 1000。从包内 Wan 1000/Cosmos 2000 的模型参数初始化, 为本轮数据建立新的世界模型优化器;历史世界模型优化器状态不在发布包中。
  4. 选择并打包新模型:使用 wm_update_until_cosmos.py 控制两个训练组。 Cosmos 完成 2000 步后,请求 Wan 在下一个完整优化器更新后保存并结束, 不强制 Wan 达到 2000 步。读取 train/selected_world_models.json,打包生成 runs/cycle60/model_pair/pair.json。视频指标可另行评估,不阻塞接续。
  5. 继续 GRPO:恢复第 60 步策略的完整 DCP 和优化器状态,用本轮新模型训练至 总步数 80;第 70、80 步保存完整策略训练状态,每 5 步保存策略并做真实 Spatial 10×50 评估。结果在 runs/cycle60/grpo/。

reproduction/world_model.py 为原生采集和更新工具设置本地恢复后的源码、解释器、 模型和数据路径。也可分阶段执行;例如本轮世界模型已训练完:

python3 reproduction/world_model.py package \
  --selection "$PWD/runs/cycle60/train/selected_world_models.json" \
  --output "$PWD/runs/cycle60/model_pair"

python3 reproduction/portable.py train --resume 60 --target 80 \
  --model-pair "$PWD/runs/cycle60/model_pair/pair.json" \
  --output "$PWD/runs/cycle60/grpo"

--model-pair 会同时切换 Wan 和 Cosmos,并复用冻结的 VAE、奖励模型和初始观测资源。 不用该参数时,继续使用发布包内的世界模型。完整入口使用种子 20261021; 通过 WM_CYCLE_GPUS、WM_CYCLE_SEED 可调整物理卡号和本轮随机种子。

原服务器的邮件配置、token、登录缓存、Ray 临时目录、活动进程和未完成检查点均 不属于发布包。新服务器需要邮件通知时,另行配置现有 watch_training_email.py。

来源与许可证

Built on NVIDIA Cosmos。每个上游组件和权重保留自身许可证,见 LICENSES/, 包括 NVIDIA 模型条款、Apache-2.0、Gemma 条款及 LIBERO 数据集的 CC BY 4.0。 没有给全部内容重新指定统一许可证。

来源包括 Pi05 few-shot、 Wan Spatial、 Cosmos Predict2、 Cosmos Policy、 LIBERO-Cosmos-Policy 数据 和 LIBERO。

Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading

Model tree for dyk111zn/GRPO-LIBERO-Spatial-Reproduction

Finetuned
(1)
this model