简介#
INTACT(INtent-To-ACTion)是一款开源的端到端 JEPA 世界模型。它在 LeWM 的基础上增加一个"意图 → 动作"的 Actor,从带动作标注、无奖励的离线轨迹中学习。部署时输入当前画面和目标画面,模型直接输出动作块,不需要 CEM 这类大规模动作搜索。
每个任务只训练 1 个 epoch,不做任何搜索的 Direct 推理在 PushT、Cube、Reacher、TwoRoom 四个仿真任务上的平均成功率为 95.61%,规划侧耗时 3.9–4.8 ms。
资源入口:
1. 概览#
本节介绍 INTACT 的工作原理、两套运行时、发布的模型和环境配置。完成本节后,你可以在自己的 GPU 机器上装好环境、准备好数据,并跑通一次单任务 smoke 训练。
1.1 INTACT 能做什么#
| 工作流 | 做什么 | 见 |
|---|---|---|
| 单任务训练 | 为 PushT、Cube、Reacher 或 TwoRoom 中的一个任务训练一个模型 | 第 2 节 |
| 四任务训练 | 用 4 张 GPU 训练四个任务共享一个 Encoder 的模型 | 第 3 节 |
| 评测 | 用 Direct、CEM 或 Guarded A 推理,按 Official LeWM 或 CLEAR-LeWM 协议判分 | 第 4 节 |
| 复现论文结果 | 下载并校验论文的 72 个 checkpoint,用冻结的论文运行时评测 | 第 5 节 |
| 记录与报告 | 按仓库的复现规范保存运行信息、汇总成功率 | 第 6 节 |
仓库发布的训练配置和评测都针对这四个仿真任务。
1.2 工作原理#
INTACT 保留 LeWM 的 Encoder 和 Forward Predictor,再加一个 Actor:
编码。 ViT-Tiny/14 Encoder 把 224×224 的 RGB 画面编码成 192 维 latent
z_t。Forward Predictor 根据历史 latent 和动作预测下一步 latent,回答"执行这个动作会发生什么"。构造意图。 意图
m_t是两个 latent 之差,有两种实例:局部意图(local intent)
m_t = z_{t+1} − z_t:这一步真实发生的变化,梯度正常回传;目标意图(goal intent)
m_t = sg(z_g) − z_t:当前离目标还差多少,目标一端截断梯度。
读出动作。 两种意图用同一个 Actor、同一种四槽输入
[z_t, m_t, z_t ⊙ m_t, A(a_{t−1})],输出动作的对角高斯分布。A(a_{t−1})是上一步动作的编码。端到端训练。 每个 8 帧窗口有 7 个相邻转移。每个转移都用同一个示范动作,分别计算局部意图和目标意图两项负对数似然,再和 Forward 预测损失、SIGReg 正则一起训练,动作梯度一直回传到 Encoder。两种意图之间不加距离约束。
Direct 推理。 编码当前画面和目标画面,取 Actor 输出的均值作为动作,用 Forward Predictor 向前推一步;重复 5 步得到一个动作块。执行后从新的真实画面重新规划。整个过程不评估任何候选动作序列。
1.3 两套运行时#
| 运行时 | 用途 | 入口 |
|---|---|---|
| 仓库根目录(当前运行时) | 训练新模型;评测用当前代码训练出的模型 | scripts/train.sh、scripts/train_multitask.sh、scripts/eval.sh、clear_eval.py |
paper_runtime/(论文运行时) |
评测论文的 72 个共享 Encoder checkpoint | scripts/eval_paper_direct.sh、scripts/eval_paper_matrix.sh |
两者的 Actor 参数结构不同:论文 checkpoint 使用旧版五槽输入,当前运行时使用四槽输入。不要用 scripts/eval.sh 加载论文 checkpoint,也不要修改 paper_runtime/ 中的文件,它们与论文评测时记录的文件指纹一致。
1.4 发布的模型#
Hugging Face 仓库 INTACT-JEPA/INTACT 的 main 分支有三组模型。E1、E5 分别表示训练 1 个和 5 个 epoch。
| 目录 | 内容 | Actor 输入 | 评测方式 |
|---|---|---|---|
INTACT/ |
单任务 E1 模型,训练种子 0、42、3072,每个种子一个存档,含四个任务 | 四槽,含上一步动作 | 见 5.4 节 |
INTACT-unified/ |
四任务共享 Encoder 的 E5 对照矩阵,共 72 个 checkpoint | 论文运行时的旧版格式 | 用第 5 节的脚本 |
INTACT-no-previous-action/ |
单任务 E1 无历史消融 | 三槽,不含上一步动作 | 仓库未提供评测脚本 |
同一批 72 个论文 checkpoint 还以固定版本 paper-e5-goal-v1 发布,第 5 节的下载脚本使用这个版本。各模型的成功率见 5.5 节。
1.5 系统要求#
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 22.04(发布环境在此验证) |
| Python | 3.10 |
| PyTorch | 2.6.0,CUDA 12.4 版 wheel |
| NVIDIA 驱动 | 兼容 CUDA 12.4。wheel 自带 CUDA 运行库,不需要另装 CUDA Toolkit |
| GPU | 训练和评测都需要 CUDA。单任务训练用 1 张;四任务训练正好 4 张 |
| 系统库 | git ffmpeg zstd libegl1 libgl1 libglfw3 libglew2.2 libosmesa6,用于无头渲染 |
| 磁盘 | 四个任务的数据约 230 GB;PushT 转换期间两种格式并存,另需约 45 GB |
| 其他工具 | jq、curl(仅下载论文 checkpoint 需要);uv(可选) |
1.6 安装#
sudo apt-get update
sudo apt-get install -y \
git ffmpeg zstd libegl1 libgl1 libglfw3 libglew2.2 libosmesa6
git clone https://github.com/zju3dv/INTACT-JEPA.git
cd INTACT-JEPA
bash scripts/install.sh cu124
source .venv/bin/activateinstall.sh 在仓库下创建 .venv,先安装 torch==2.6.0 和 torchvision==0.21.0,再安装 requirements-cu124.lock 中锁定的全部依赖,最后运行 pip check 和 scripts/verify_install.py。机器上有 uv 时用 uv 建环境,没有时用 Python 3.10 自带的 venv 和 pip。
没有 NVIDIA GPU 的机器只能做导入和配置检查,不能训练或评测:
bash scripts/install.sh cpu注意 安装完成后,不要再单独安装未锁定版本的 PyTorch 或 torchvision。CPU 版和 CUDA 版 wheel 混装,是导入时缺少算子的常见原因。安装脚本不能用时,按 docs/INSTALL.md 的 "Manual equivalent" 一节手动安装。
1.7 配置本机路径#
cp .env.example .env编辑 .env,填写四个变量:
| 变量 | 作用 |
|---|---|
INTACT_PYTHON |
所有启动脚本使用的 Python,填 .venv/bin/python 的绝对路径 |
LOCAL_DATASET_DIR |
数据根目录,其下有 datasets/ 目录 |
INTACT_OUTPUT_HOME |
输出根目录,存放日志、checkpoint 和评测结果 |
MUJOCO_GL |
无头渲染后端,GPU 机器用已测试的 egl |
当前 shell 中已经导出的同名变量优先于 .env。加载并检查实际生效的路径:
source scripts/fleet_env.sh
printf 'Python: %s\nData: %s\nOutput: %s\n' \
"$INTACT_PYTHON" "$LOCAL_DATASET_DIR" "$INTACT_OUTPUT_HOME"fleet_env.sh 会把 stable-worldmodel 的缓存根目录 STABLEWM_HOME 设为 INTACT_OUTPUT_HOME。下文出现的 checkpoint 相对路径,都以 $INTACT_OUTPUT_HOME/checkpoints/ 为起点。
提示 少数命令按
STABLEWM_HOME而不是LOCAL_DATASET_DIR找数据(1.8 节的格式转换、5.2 节的论文评测)。把LOCAL_DATASET_DIR和INTACT_OUTPUT_HOME设成同一个目录,可以省去这两处的额外参数。
1.8 准备数据#
INTACT 使用 LeWM 官方数据集,训练脚本不会自动下载。四个压缩包都在 LeWM 的 Hugging Face 合集中:
| 任务 | 数据集仓库 | 压缩包 | 大小 | 解压后得到 |
|---|---|---|---|---|
| PushT | quentinll/lewm-pusht |
pusht_expert_train.h5.zst |
13.1 GB | pusht_expert_train.h5 |
| Cube | quentinll/lewm-cube |
cube_single_expert.tar.zst |
46.2 GB | cube_single_expert.h5 |
| Reacher | quentinll/lewm-reacher |
reacher.tar.zst |
23.8 GB | reacher.h5 |
| TwoRoom | quentinll/lewm-tworooms |
tworoom.tar.zst |
3.4 GB | tworoom.h5 |
下载并解压到 $LOCAL_DATASET_DIR/datasets/。hf 命令随锁定的 huggingface_hub 一起装在 .venv 中:
source scripts/fleet_env.sh
mkdir -p "$LOCAL_DATASET_DIR/datasets/ogbench"
cd "$LOCAL_DATASET_DIR/datasets"
# 下载
hf download quentinll/lewm-pusht pusht_expert_train.h5.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-cube cube_single_expert.tar.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-reacher reacher.tar.zst --repo-type dataset --local-dir .
hf download quentinll/lewm-tworooms tworoom.tar.zst --repo-type dataset --local-dir .
# 解压;Cube 要放进 ogbench/ 子目录
zstd -d pusht_expert_train.h5.zst
tar --zstd -xf cube_single_expert.tar.zst -C ogbench
tar --zstd -xf reacher.tar.zst
tar --zstd -xf tworoom.tar.zstPushT 训练读取 Lance 格式,需要把 HDF5 转换一次。回到仓库目录运行:
cd <INTACT-JEPA 仓库目录>
source scripts/fleet_env.sh
STABLEWM_HOME="$LOCAL_DATASET_DIR" "$INTACT_PYTHON" -m stable_worldmodel.cli convert \
pusht_expert_train pusht_expert_train.lance \
--source-format hdf5 --dest-format lance转换命令在 $STABLEWM_HOME/datasets/ 下找源文件并写出结果。命令前的 STABLEWM_HOME="$LOCAL_DATASET_DIR" 让它在数据目录里转换;两个根目录相同时可以省略。
完成后的目录布局:
$LOCAL_DATASET_DIR/
└── datasets/
├── pusht_expert_train.h5 # 评测读取
├── pusht_expert_train.lance/ # 训练读取
├── ogbench/
│ └── cube_single_expert.h5
├── reacher.h5
└── tworoom.h5注意 转换后不要删除
pusht_expert_train.h5。训练读取.lance,但 Official 评测按pusht_expert_train.h5读取起点和目标状态。
注意 Reacher 的评测配置(
config/eval/reacher.yaml)读取的数据集是dmc/reacher_random,即datasets/dmc/reacher_random.h5,不是上面布局中的reacher.h5。如果评测 Reacher 时提示找不到这个文件,说明本机缺少它。
1.9 跑通快速测试#
在仓库根目录依次运行三项检查,再跑一次 smoke 训练:
source scripts/fleet_env.sh
"$INTACT_PYTHON" scripts/verify_install.py --require-cuda
"$INTACT_PYTHON" scripts/verify_data.py
bash scripts/check_fleet.sh
CUDA_VISIBLE_DEVICES=0 bash scripts/train.sh goal pusht \
--smoke --run-name smoke_goal_pusht| 命令 | 检查内容 | 通过的标志 |
|---|---|---|
verify_install.py --require-cuda |
依赖能否导入、关键包版本、四个仿真环境是否注册、CUDA 是否可用 | INTACT install check: PASS |
verify_data.py |
四个数据路径是否存在;不读取数据内容,也不校验哈希 | INTACT data layout: PASS |
check_fleet.sh |
Python、四个训练数据路径、核心库导入和可见 GPU 数 | Fleet preflight: OK |
train.sh … --smoke |
用 1 个 batch(batch size 2)走一遍真实的数据、模型、优化器和保存流程 | 最后一行是 Training complete: …/checkpoints/smoke_goal_pusht |
smoke 只确认代码路径能跑通,不代表模型精度。有 4 张 GPU 时,再检查四任务训练:
CUDA_VISIBLE_DEVICES=0,1,2,3 bash scripts/train_multitask.sh \
--smoke --run-name smoke_multitask_goal注意 输出目录不会被覆盖。同名日志已存在时,启动脚本直接退出并提示
Log already exists。再次运行时换一个--run-name。
1.10 输出目录#
$INTACT_OUTPUT_HOME/
├── logs/
│ └── <run>.log # 训练脚本的完整输出
├── checkpoints/
│ ├── <run>/ # 单任务训练(第 2 节)
│ ├── <run>_<task>/ # 四任务训练,每个任务一个目录(第 3 节)
│ └── recovery_<单元前缀>_<task>_s<seed>/ # 下载的论文 checkpoint(第 5 节)
└── <run>/ # 评测结果与视频(4.4 节)2. 单任务训练#
本节为一个任务训练一个 INTACT 模型,即论文中的单任务 E1 设置。命令都在仓库根目录运行;train.sh 会自行加载 .env。
2.1 选择任务和意图坐标#
train.sh 的前两个参数依次是意图坐标和任务。
| 任务参数 | 数据配置 | 训练数据 | 评测环境 |
|---|---|---|---|
pusht |
pusht |
pusht_expert_train.lance |
swm/PushT-v1 |
cube |
ogb |
ogbench/cube_single_expert.h5 |
swm/OGBCube-v0 |
reacher |
dmc |
reacher.h5 |
swm/ReacherDMControl-v0 |
tworoom |
tworoom |
tworoom.h5 |
swm/TwoRoom-v1 |
| 意图坐标 | 目标意图的计算 | 用途 |
|---|---|---|
goal(默认) |
z_g − z_t(goal displacement) |
主结果使用的坐标 |
waypoint |
z_g − z_t 除以剩余步数 |
论文中的对照坐标 |
2.2 启动训练#
CUDA_VISIBLE_DEVICES=0 bash scripts/train.sh goal pusht \
--run-name intact_goal_pusht_s3072_e1 \
seed=3072 trainer.max_epochs=1把 pusht 换成 cube、reacher 或 tworoom 训练其他任务;把 goal 换成 waypoint 训练对照坐标。论文的单任务设置是用全部数据训练 1 个 epoch,即上面的命令。
train.sh 自己识别以下选项,其余参数原样转给 Hydra:
| 选项 | 作用 | 默认值 |
|---|---|---|
--run-name NAME |
checkpoint 目录和日志的名称 | intact_<坐标>_<任务>_s<种子>_e<epoch 数>,smoke 时末尾加 _smoke |
--output-home PATH |
本次运行的输出根目录,覆盖 INTACT_OUTPUT_HOME |
.env 中的值 |
--smoke |
只训练 1 个 batch,batch size 为 2,不跑验证 | 关闭 |
2.3 调整训练参数#
Hydra 覆盖项写在命令末尾,格式为 键=值,例如 loader.num_workers=4。常用参数如下,默认值来自 config/train/intact_goal.yaml:
| 参数 | 作用 | 默认值 |
|---|---|---|
seed |
训练种子 | 3072 |
trainer.max_epochs |
训练 epoch 数 | 1 |
loader.batch_size |
batch size | 256 |
loader.num_workers |
DataLoader 进程数 | 6 |
optimizer.lr |
AdamW 学习率,全程不变 | 5e-4 |
optimizer.weight_decay |
权重衰减 | 1e-3 |
trainer.precision |
训练精度 | bf16-mixed |
loss.forward_weight |
Forward 预测损失权重 | 1.0 |
loss.sigreg.weight |
SIGReg 正则权重 | 0.02 |
loss.intent.local_weight |
局部意图负对数似然权重 | 0.1 |
loss.intent.goal_weight |
目标意图负对数似然权重 | 0.05 |
num_frames |
每个训练窗口的帧数 | 8 |
history_size |
Forward Predictor 使用的历史帧数 | 3 |
wandb.enabled |
是否记录到 Weights & Biases | false |
注意 训练固定使用 Math SDPA(
sdpa_backend: math)。要和论文结果对比时,保持以上默认值,只改seed。换种子时同时换--run-name,或者不写--run-name,让脚本按种子自动命名;沿用旧名称会因目录已存在而停止。
2.4 查看训练进度#
脚本启动时打印本次的意图坐标、任务、run 名称、数据目录、输出目录和日志路径。训练在第 1 步、每 100 步和最后一步各输出一行进度:
TRAIN_PROGRESS={"epoch": 1, "global_step": 100, "loss": ..., "lr": ..., "eta_seconds": ...}同样的记录逐行写入 checkpoints/<run>/metrics/train.jsonl。run_metadata.json 中的 status 依次为 configured、running,正常结束时为 complete,出错时为 failed,并记下异常类型。训练成功时,最后一行是:
Training complete: <INTACT_OUTPUT_HOME>/checkpoints/<run>2.5 训练产物#
$INTACT_OUTPUT_HOME/checkpoints/<run>/ 中有:
| 文件 | 内容 |
|---|---|
weights_epoch_<N>.pt |
第 N 个 epoch 结束时的模型权重 |
config.json |
模型结构配置,评测加载 checkpoint 时需要 |
train_config.yaml |
本次训练的完整配置 |
run_metadata.json |
意图坐标、种子、任务、数据集、动作维度、优化器、git 提交号、主机名和运行状态 |
metrics/train.jsonl |
训练进度记录 |
完整的终端输出在 $INTACT_OUTPUT_HOME/logs/<run>.log。checkpoint 目录已有文件时,训练会报 FileExistsError 并停止,不会覆盖旧结果。
3. 多任务训练#
本节训练论文中的四任务共享 Encoder 模型(E5 设置)。4 个进程各负责一个任务、各占一张 GPU,共享同一个 Encoder 和 projector;Forward Predictor、动作编码器和 Actor 按任务分开。
3.1 准备#
四个数据集都已就位,
bash scripts/check_fleet.sh通过。有 4 张可用 GPU。设置了
CUDA_VISIBLE_DEVICES时必须正好列出 4 张,否则脚本直接退出。进程与任务的对应关系固定:rank 0 为 PushT,rank 1 为 Cube,rank 2 为 Reacher,rank 3 为 TwoRoom。
3.2 启动训练#
CUDA_VISIBLE_DEVICES=0,1,2,3 bash scripts/train_multitask.sh \
--run-name intact_multitask_goal_s3072_e5脚本用 torch.distributed.run 在本机启动 4 个进程,每一步同步一次共享部分的梯度。默认配置为:fused AdamW,学习率 5e-4 全程不变,权重衰减 1e-3,SIGReg 权重 0.03,5 个 epoch,每个任务 batch size 256,Math SDPA,启用确定性算法。
3.3 调整参数#
| 选项 | 作用 | 默认值 |
|---|---|---|
--run-name NAME |
本次运行的名称 | intact_multitask_goal_s3072_e5,smoke 时末尾加 _smoke |
--output-home PATH |
输出根目录,覆盖 INTACT_OUTPUT_HOME |
.env 中的值 |
--epochs N |
epoch 数 | 5 |
--max-steps N |
每个 epoch 最多训练的步数 | 不限 |
--batch-size N |
每个任务的 batch size | 256 |
--num-workers N |
每个进程的 DataLoader 进程数 | 6 |
--config PATH |
换用另一份多任务 YAML | config/train/intact_multitask.yaml |
--smoke |
1 个 epoch、1 步、每个任务 batch size 2 | 关闭 |
注意 复现论文的共享 Encoder 结果时,不要调小
--batch-size。显存不够而改动了 batch size 的结果,要在报告中写明。
3.4 查看进度和产物#
每个进程按同样的节奏输出一行进度,并写入各自的记录文件:
MULTITASK_PROGRESS={"task": "pusht", "rank": 0, "global_step": 100, ...}每个 epoch 结束时,脚本先确认 4 个进程的共享参数哈希一致(不一致会报 Shared states diverged 并停止),再为每个任务保存 checkpoint,最后打印 MULTITASK_EPOCH_COMPLETE=。产物布局:
$INTACT_OUTPUT_HOME/checkpoints/
├── intact_multitask_goal_s3072_e5/ # 整次运行的记录
│ ├── multitask_config.yaml
│ ├── metrics/rank_<r>_<task>.jsonl # 各进程的训练进度
│ ├── epoch_<e>/rank_<r>_<task>.json
│ └── multitask_metadata_epoch_<e>.json
├── intact_multitask_goal_s3072_e5_pusht/ # 每个任务一个 checkpoint 目录
│ ├── weights_epoch_1.pt … weights_epoch_5.pt
│ ├── config.json
│ ├── train_config.yaml
│ ├── multitask_metadata_epoch_<e>.json
│ └── run_metadata.json
├── intact_multitask_goal_s3072_e5_cube/
├── intact_multitask_goal_s3072_e5_reacher/
└── intact_multitask_goal_s3072_e5_tworoom/提示 任务目录里每个 epoch 有一个
.pt文件,评测时要写到具体文件,例如intact_multitask_goal_s3072_e5_pusht/weights_epoch_5.pt。只写目录会因为目录里有多个.pt而报错。
4. 评测#
本节在仿真环境中评测 checkpoint。scripts/eval.sh 是唯一的评测入口,按 Official LeWM 协议判分;CLEAR-LeWM v0.8 协议另用 clear_eval.py,见 4.5 节。
4.1 选择推理方式#
MODE |
使用 Actor | 搜索 | 每次规划的候选序列 | 用途 |
|---|---|---|---|---|
direct |
是 | 无 | 0 | INTACT 原生的零搜索控制 |
cem |
否 | CEM,300 条 × 30 轮 | 9,000 | 关闭 Actor 的表征对照基线 |
guarded_a |
是 | 以 Direct 计划为中心的局部 CEM,128 条 × 3 轮 | 384 | 可选的局部验证 |
Guarded A 的规划长度 H=5、重规划长度 RH=5,初始采样标准差 0.25(原始动作空间),每轮保留前 16 条。最后对均值计划做一次确定性复评,这一次单独记录,不计入 384 条候选。
注意 Guarded A 的参数被评测代码锁定。通过 Hydra 改动其中任何一项(例如
solver.num_samples),评测都会报Guarded A configuration mismatch并停止。
4.2 运行评测#
bash scripts/eval.sh direct pusht \
intact_goal_pusht_s3072_e1/weights_epoch_1.pt 42 100| 参数 | 说明 | 默认值 |
|---|---|---|
MODE |
direct、cem 或 guarded_a |
必填 |
TASK |
pusht、cube、reacher 或 tworoom |
必填 |
CHECKPOINT |
相对 $INTACT_OUTPUT_HOME/checkpoints/ 的 .pt 路径,同一目录下要有 config.json |
必填 |
SEED |
评测种子,只接受 0、1、42 |
0 |
NUM_EVAL |
评测的 episode 数,同时也是并行的仿真环境数 | 100 |
第 6 个参数起是 Hydra 覆盖项。每个 episode 从专家数据中随机抽一个起点,以 25 步之后的状态为目标,最多执行 50 步。
论文协议对每个 checkpoint 评测三个种子,每个种子 100 个 episode:
for seed in 0 1 42; do
bash scripts/eval.sh direct pusht \
intact_goal_pusht_s3072_e1/weights_epoch_1.pt "$seed" 100
done评测四任务模型时,任务参数要和 checkpoint 目录对应:
bash scripts/eval.sh direct cube \
intact_multitask_goal_s3072_e5_cube/weights_epoch_5.pt 0 1004.3 动作历史的处理#
direct 和 guarded_a 使用同一套因果动作历史:
在抽到的起点
t,Actor 第一次读到的是数据集中t之前的 5 个动作rows[t-5:t]。只有起点前不足 5 步(已到真实 episode 开头)时,才用原始零动作左侧补齐。之后每一步,把控制器实际执行的动作移入历史。
当前数据行的动作
row[t]和目标动作都不会提供给 Actor。
cem 模式关闭 Actor,不使用动作历史。Official 和 CLEAR 是两种判分协议,不是两种历史模式。
4.4 读取评测结果#
结果写在 $INTACT_OUTPUT_HOME/<run>/ 下,不在 checkpoints/ 目录里:
$INTACT_OUTPUT_HOME/intact_goal_pusht_s3072_e1/
├── pusht_direct_s42_n100_results.txt # 配置与指标;重复运行会追加到同一文件
├── pusht_direct_s42_n100_results.txt.json # 机器可读记录
└── *.mp4 # 评测视频.txt.json 记录了推理方式、判分协议、checkpoint 的 SHA-256、评测种子、配置哈希、SDPA 设置、主机与 GPU、评测代码文件的哈希、指标、抽到的 episode 与起点,以及规划耗时和候选数量的汇总(总和与均值)。
4.5 用 CLEAR-LeWM v0.8 评测#
CLEAR-LeWM 是单独发布版本的评测器,复位清单和成功判据都与 Official 不同。先按它的说明安装其固定版本的环境,再在 INTACT 仓库根目录运行:
export CLEAR_LEWM_ROOT=/path/to/CLEAR-LeWM-v0.8
export CLEAR_LEWM_PYTHON="$CLEAR_LEWM_ROOT/.venv/bin/python"
MANIFEST="$CLEAR_LEWM_ROOT/manifests/v0.8/pusht/moderate-seed42-n100.json"
CHECKPOINT=intact_goal_pusht_s3072_e1/weights_epoch_1.pt
"$CLEAR_LEWM_PYTHON" clear_eval.py \
--clear-root "$CLEAR_LEWM_ROOT" \
--manifest "$MANIFEST" \
--policy "$CHECKPOINT" \
--output results/pusht-clear-direct.json \
--mode direct/path/to/CLEAR-LeWM-v0.8 换成本机的 CLEAR-LeWM 目录。--mode 可选 direct、pure_cem、guarded_a。
注意 Official 和 CLEAR 的成功率回答的是不同的问题,要分开报告,不要合并到同一个平均值里。
5. 论文模型#
本节下载论文的四任务共享 Encoder checkpoint,用冻结的论文运行时复现论文主表,并说明 Hugging Face 上单任务模型的使用方式。
5.1 下载并校验#
论文矩阵有 6 个对照单元,每个单元 3 个训练种子(0、42、3072),每个种子 4 个任务,共 72 个 checkpoint:
| 单元 ID | 论文中的名称 | 原生推理方式 |
|---|---|---|
lewm |
LeWM | CEM 300×30 |
inverse_only |
Inverse only | Direct |
waypoint_intent |
Waypoint intent only | Direct |
goal_intent |
Goal intent only | Direct |
waypoint_intact |
Waypoint INTACT | Direct |
goal_intact |
Goal-displacement INTACT | Direct |
source scripts/fleet_env.sh
# goal_intact 单元、训练种子 0(第一个参数是种子时,默认下载 goal_intact)
bash scripts/download_paper_checkpoints.sh 0
# 某个单元的三个种子
bash scripts/download_paper_checkpoints.sh waypoint_intact all
# 全部 72 个
bash scripts/download_paper_checkpoints.sh matrix all脚本从 INTACT-JEPA/INTACT 的 paper-e5-goal-v1 版本匿名下载,先核对 SHA256SUMS 本身和每个存档的哈希,解压到 $STABLEWM_HOME(即 INTACT_OUTPUT_HOME),再逐个核对 checkpoint 的大小、哈希和配套文件。成功时最后一行是 Paper checkpoints installed under …/checkpoints。
想放到别的目录,在最后加一个路径参数,例如
bash scripts/download_paper_checkpoints.sh matrix all /path/to/cache。需要换镜像时,设置
INTACT_HF_REPO、INTACT_CHECKPOINT_REVISION或INTACT_CHECKPOINT_BASE_URL。
5.2 评测论文 checkpoint#
source scripts/fleet_env.sh
# 只评测 goal_intact:TASK TRAIN_SEED [EVAL_SEED] [NUM_EVAL]
bash scripts/eval_paper_direct.sh pusht 0 0 100
# 评测任意单元:CELL TASK TRAIN_SEED [EVAL_SEED] [NUM_EVAL]
bash scripts/eval_paper_matrix.sh waypoint_intent pusht 0 0 100
bash scripts/eval_paper_matrix.sh lewm reacher 3072 42 100训练种子只能是 0、42、3072;评测种子默认 0,episode 数默认 100。eval_paper_matrix.sh 对 lewm 使用 CEM 300×30,对其余五个单元使用零搜索 Direct。两个脚本都会先核对 checkpoint 哈希,再把 paper_runtime/ 放到 PYTHONPATH 最前面运行评测。
脚本从 $STABLEWM_HOME/checkpoints/ 读取 checkpoint。下载时指定了别的目录,就先把 PAPER_CHECKPOINT_HOME 设为那个目录,即 checkpoints/ 的上一级。结果写在 $STABLEWM_HOME/<checkpoint 目录名>/,文件名为 pusht_results.txt、ogb_cube_results.txt、dmc_results.txt 或 tworoom_results.txt,另有同名 .json。
注意 论文评测脚本按
$STABLEWM_HOME/datasets/找数据,不读LOCAL_DATASET_DIR。两个根目录不同时,在命令末尾加cache_dir="$LOCAL_DATASET_DIR",例如bash scripts/eval_paper_direct.sh pusht 0 0 100 cache_dir="$LOCAL_DATASET_DIR"。eval_paper_matrix.sh要先写全前 5 个参数,再加这一项。
5.3 对照论文数值#
goal_intact 单元各训练种子的 Official Direct 成功率(%),每格为评测种子 0、1、42 各 100 个 episode 的平均:
| 训练种子 | PushT | Cube | Reacher | TwoRoom | 宏平均 |
|---|---|---|---|---|---|
| 0 | 85.00 | 100.00 | 96.33 | 85.33 | 91.67 |
| 42 | 86.67 | 100.00 | 97.33 | 81.33 | 91.33 |
| 3072 | 86.67 | 100.00 | 98.00 | 78.00 | 90.67 |
| 均值 ± 样本标准差 | 86.11 ± 0.96 | 100.00 ± 0.00 | 97.22 ± 0.84 | 81.56 ± 3.67 | 91.22 ± 0.51 |
六个单元的完整结果见 5.5 节。
5.4 使用发布的单任务 E1 模型#
hf download INTACT-JEPA/INTACT --include "INTACT/*" --local-dir checkpoints-release
cd checkpoints-release/INTACT
sha256sum -c SHA256SUMS目录中有三个存档 intact-goal-e1-single-seed<种子>.tar.gz(每个约 310 MB)。每个存档含四个任务的权重,路径为 checkpoints/intact_goal_<task>_s<种子>_p77_v1/weights_epoch_1.pt,解压到 $INTACT_OUTPUT_HOME 后就位于 checkpoints/ 之下。RESULTS.csv 给出这批存档 36 个评测格(任务 × 训练种子 × 评测种子)各 100 个 episode 的成功数,可以逐格对照自己的评测。
注意 这批存档只包含
weights_epoch_1.pt,没有config.json;scripts/eval.sh加载.pt时要求同一目录下有config.json,所以解压后不能直接评测。
提示
INTACT/存档自带的MANIFEST.json记录的宏平均是 95.75%,对应这三个训练种子。项目公布的 95.61% 来自另一组训练种子(3072、3073、3074),以AUDITED_RESULTS_20260914.json为准。
INTACT-unified/ 与 paper-e5-goal-v1 是同一批 72 个论文 checkpoint,用 5.1 节的脚本下载即可。INTACT-no-previous-action/ 的 Actor 只有三槽输入,与当前运行时的四槽 Actor 不同,仓库没有提供它的评测脚本。
5.5 结果参考#
以下均为 Official LeWM 协议下的成功率(%),± 为训练种子间的样本标准差。
项目当前结果
| 设置 | 推理方式 | 宏平均 |
|---|---|---|
| 单任务 E1 INTACT | Direct,零搜索 | 95.61 ± 0.59 |
| 单任务 E1 INTACT | Guarded A 128×3 | 96.58 ± 0.44 |
| 四任务共享 Encoder E5 INTACT | Direct,零搜索 | 91.22 ± 0.51 |
| 无历史 E1 消融 | Direct,零搜索 | 94.25 ± 0.08 |
单任务 E1 各任务结果(训练种子 3072、3073、3074)
| 推理方式 | 每次规划的候选序列 | PushT | Cube | Reacher | TwoRoom | 宏平均 |
|---|---|---|---|---|---|---|
| Direct | 0 | 87.44 ± 1.26 | 100.00 ± 0.00 | 97.33 ± 0.00 | 97.67 ± 1.20 | 95.61 ± 0.59 |
| Guarded A 128×3 | 384 | 91.56 ± 0.69 | 99.67 ± 0.33 | 97.56 ± 0.51 | 97.56 ± 1.26 | 96.58 ± 0.44 |
| 关闭 Actor 的 CEM 300×30 | 9,000 | 88.44 ± 1.17 | 68.44 ± 0.77 | 83.67 ± 0.67 | 82.89 ± 0.84 | 80.86 ± 0.51 |
四任务共享 Encoder E5 论文矩阵(训练种子 0、42、3072)
| 单元 | 推理方式 | PushT | Cube | Reacher | TwoRoom | 宏平均 |
|---|---|---|---|---|---|---|
| LeWM | CEM 300×30 | 74.56 | 67.33 | 83.11 | 39.67 | 66.17 |
| Inverse only | Direct | 36.11 | 67.56 | 90.56 | 78.56 | 68.19 |
| Waypoint intent only | Direct | 58.89 | 100.00 | 65.89 | 72.11 | 74.22 |
| Goal intent only | Direct | 81.78 | 100.00 | 88.67 | 69.22 | 84.92 |
| Waypoint INTACT | Direct | 71.22 | 99.00 | 58.22 | 77.22 | 76.42 |
| Goal-displacement INTACT | Direct | 86.11 | 100.00 | 97.22 | 81.56 | 91.22 |
单任务的完整推理方式对照和共享 Encoder 主要单元的方差见仓库的 docs/RESULTS.md;六个单元的样本标准差和每个 checkpoint 的哈希见 checkpoints/PAPER_E5_MATRIX_MANIFEST.json。
6. 结果报告#
本节说明报告 INTACT 结果时要保留哪些信息、怎样汇总成功率,依据是仓库的 docs/REPRODUCIBILITY.md。
6.1 保留运行信息#
每个报告的结果都要能追溯到以下信息。训练和评测脚本会尽量自动记录(见 2.5 节的 run_metadata.json 和 4.4 节的 .txt.json),缺的部分手动补全:
源码提交号和解析后的完整配置
数据集、判分协议和任务
训练种子、评测种子、epoch 数、每个任务的 batch size
推理方式和 SDPA 后端
checkpoint 的 SHA-256 与训练完成状态
评测器的机器可读输出
6.2 汇总成功率#
对每个独立训练的 checkpoint,先平均它在评测种子 0、1、42 上的成功率(每个种子 100 个 episode)。
再对训练种子求均值和样本标准差,写成"均值 ± 标准差"。
单任务和共享 Encoder 两组结果分开报告。
Official 和 CLEAR-LeWM 的结果分开报告。
没有跑或主动停止的格子写
--,不要写0。事后挑选的研究和早期试验单独标注,不混入受控对比。
6.3 解读延迟和候选数#
3.9–4.8 ms 是规划侧耗时,不包含环境渲染、观测传输等开销,不能当作端到端的机器人控制延迟。
候选数指每次规划评估的动作序列条数,不是环境步数。
公开的 LeWM 论文数值使用它自己的 10 epoch + CEM 协议,只作背景参考,不是配对对照;受控对照以 5.5 节的论文矩阵为准。