Do World Action Models Really Need Video Generation, or Just Image Editing? · SJTU / EIT / Tencent RoboticsX / THU · arXiv 2606.19531 (2026)
世界动作模型(WAM)真的需要"生成未来视频"吗?还是只要"想象一张编辑后的目标图"就够了? ImageWAM 用图像编辑模型替代视频生成:只建模 current→target 单帧变换,推理时甚至不解码那张目标图,而是把图像编辑去噪过程中产生的 KV cache 直接当作紧凑的"世界-动作上下文",喂给 flow-matching 动作专家。结果:追平视频 WAM,FLOPs 降到 1/6、延迟降到 1/4。
arXiv:2606.19531v1);架构机制核对自仓库 src/imagewam/models/backbones/(mot.py/action_dit_omnigen2.py/omnigen2_video_expert.py)。解读与类比为学习者视角。原文:arXiv · 项目页 · 代码(HF collection: yuyangalin/imagewam)。| 项 | 内容 |
|---|---|
| 标题 | ImageWAM: Do World Action Models Really Need Video Generation, or Just Image Editing? |
| 单位 | 上海交大 / 东方理工(EIT) / 腾讯 RoboticsX / 清华 / 中关村学院 |
| 核心思想 | 用图像编辑模型(而非视频生成)当 WAM backbone;推理只跑一步编辑分支取 KV cache,不解码目标图 |
| 三个变体 | FLUX.2 ImageWAM(4B/9B,最强) · OmniGen2 ImageWAM · Ovis-U1 ImageWAM(1.1B DiT,最小) |
| 动作头 | flow-matching Action Expert(DiT),通过 joint attention 读取编辑分支 KV |
| 关键结果 | RoboTwin2.0-Rand 93.56 · LIBERO 平均 98.4 · LIBERO-Plus 83.1(FLUX.2 4B) · 真机 84.5(π0 55.8) |
| 复现验证 | LIBERO 4套件 97.9%(论文98.4%) · 8×H20 · 1000 episodes · 32分钟 · 0 crash |
| 效率 | 延迟 1081ms→263ms,FLOPs 63.65→9.72(约视频 WAM 的 1/6) |
| 是否需额外具身预训练 | 否(P.T.=✗),只在下游 benchmark 演示上训练即超越众多需预训练的 baseline |
先厘清概念梯队:VLA(vision-language-action) 直接从"观测+指令"预测动作;WAM(world action model) 在中间插入一步"视觉想象",先想象未来、再据此产生动作(reason-before-act)。主流 WAM 用视频生成来做这步想象。
论文指出,用视频生成当 WAM backbone 有三个结构性缺陷:
| 缺陷 | 说明 |
|---|---|
| ① 推理昂贵 | 要预测/处理跨多帧的稠密时空 token,去噪+解码开销大(表5:1081ms / 63.65 TFLOPs) |
| ② 浪费在动作无关细节 | 视频生成会精细建模与动作无关的时序外观(背景、纹理、光影变化),这些对"该怎么动"没有帮助 |
| ③ 长时想象误差误导动作 | 长 horizon 的想象帧含几何畸变、空间布局不一致的伪影(图5),而动作是 conditioned 在这些帧上的 → 伪影会把动作带偏 |
作者把操作任务重新表述为:给定当前图 + 语言指令,产生一张"任务完成后的目标图"。这恰好就是图像编辑(text-guided image editing)做的事——按指令修改源图、保留无关内容。于是他们只建模端点帧:
ôedit 是一张 source-conditioned 的单帧,概括了"当前观测在该任务指令下应发生的视觉变换"。
❄ 冻结(VLM/多模态理解模块) 🔥 可训(diffusion 编辑分支 + 动作专家)
基于现成图像编辑模型(OmniGen2 / Ovis-U1 / FLUX.2)。输入当前观测 ot + 指令 l,本职是去噪生成"编辑后目标帧"。ImageWAM 复用它去噪过程中每层 transformer 的 KV cache 作为条件,而不只是拿它解码一张图。
一个 flow-matching 的 DiT(见 ActionDiTOmnigen2)。把动作 chunk 编码成 token,通过 joint attention 读取编辑分支的 KV cache,预测动作速度场。
编辑模型里负责编码指令/视觉上下文的 VLM 部分保持冻结,提供稳定的语言-视觉条件;只训练 diffusion 生成分支和动作专家。
这是全文最关键、也最容易误解的一步。请分三层理解。
编辑分支是一个多层 transformer。去噪时,视觉 latent 先与指令(经冻结 VLM)交互,然后逐层做 attention。每一层 ℓ 都会算出 Key/Value 张量。ImageWAM 把这些逐层 KV 收集起来:
τ 是随机采样的编辑去噪时间步。因为这份 cache 是在"视觉 latent 已经和指令充分交互之后"算出来的,所以它已经编码了"任务条件下的视觉变换信息",而无需把最终目标图解码出来。
关键实现在 mot.py(Mixture-of-Transformers)。编辑专家和动作专家逐层并行前进,在每层的 attention 里,动作 token 的 Query 去 attend 拼接了编辑分支 K/V 的联合序列:
也就是说,动作 token 不是"看一张图",而是"直接钻进编辑模型的中间推理里,读它每一层关于'该怎么变'的内部表征"。这就是论文说的 transfers the image editing model's internal reasoning process to robot control。
为公平对比,作者还实现了 Fast-WAM 式的视频 WAM 变体:未来视频 token 只在训练时用于 video co-training,推理时移除,动作专家仅用"当前观测+指令"产生的 KV。这给出一个"和 ImageWAM 一样没有未来 token"的视频 WAM 基线。ImageWAM 在此基础上进一步把"视频"换成"图像编辑"。
让编辑分支学会预测任务相关的端点帧。目标帧 ot+H+1 经 VAE 编码成 latent z*;采噪声 εz、图像流时间 r,构造插值 latent,diffusion 分支预测速度场(flow matching):
这个目标保住编辑分支"预测任务相关未来视觉状态"的能力,也逼它的 KV cache 编码有用的变换信息。
动作 chunk a* 采噪声 εa、动作流时间 s,构造插值,动作专家conditioned 在编辑 cache Ceditτ 上预测动作速度场:
注意两个不同的"时间":s 是动作 flow-matching 时间,τ 是图像编辑去噪时间步。训练时随机采 τ,让动作专家见到去噪不同阶段的 cache。
推理时既不做完整未来视频生成,也不解码完整编辑图。固定一个编辑去噪时间步 τ*,只跑一次编辑分支 forward 取 cache,然后动作专家据此去噪产生动作:
关键差异:ImageWAM 不用额外具身预训练(P.T.=✗),只在下游 benchmark 演示上训练,却超越许多需要预训练的 VLA/WAM。评测 benchmark:LIBERO、LIBERO-Plus、RoboTwin 2.0,外加真机 Dobot XTrainer 双臂 4 任务。
| 评测块 | Benchmark / 平台 | 任务与数据 | 为什么这样测 | 本地复现对齐 |
|---|---|---|---|---|
| 标准仿真 | LIBERO | Spatial/Object/Goal/Long 四套件;每套件 10 tasks;每任务 500 demos;2 视角拼接 224×448,动作 chunk=16。 | 确认“图像编辑式 WAM”在常规 VLA benchmark 上不掉点,并与 π0/π0.5/Motus/FastWAM 对齐。 | 已用官方 FLUX.2 4B checkpoint 跑全量 LIBERO:97.9%,论文 98.4%,差 -0.5pp,基本对上。 |
| 强 OOD 仿真 | LIBERO-Plus | Camera/Robot/Language/Light/Background/Noise/Layout 七类扰动。 | 检验 ImageWAM 是否真的利用“任务相关视觉变化”而不是记住固定视角/背景。 | 未本地复现;页面记录论文表格。 |
| 双臂仿真 | RoboTwin 2.0 | 单策略覆盖所有任务;clean + randomized;论文训练含 2500 clean + 25000 randomized trajectories,评测每任务 100 trials。 | 验证图像编辑先验在更复杂双臂和强随机化设置下是否成立。 | 未本地复现;训练成本约 8×H20 5 天。 |
| 真实双臂 | Dobot XTrainer | 4 个真机任务,每任务约 100 demos,评测 50 trials/任务;覆盖长程、可变形、遮挡、精细控制。 | 验证不用额外具身预训练的 ImageWAM 是否能在真实机器人上超过 VLA/WAM 基线。 | 未复现;硬件与数据不可用。 |
| 效率测试 | 同模型推理链路 | 比较完整图像编辑、KV cache、prefix-only attention、torch.compile、CUDA graph。 | 证明 ImageWAM 的卖点不仅是成功率,也包括不解码目标图带来的闭环效率。 | 本地 LIBERO 复现未报告独立延迟;论文表格为准。 |
| 方法 | P.T. | Clean | Rand. | Avg |
|---|---|---|---|---|
| π0 | ✓ | 65.92 | 58.40 | 62.16 |
| π0.5 | ✓ | 82.74 | 76.76 | 79.75 |
| Motus | ✓ | 88.66 | 87.02 | 87.80 |
| FastWAM | ✗ | 91.88 | 91.78 | 91.83 |
| ImageWAM | ✗ | 93.20 | 93.56 | 93.38 |
LIBERO 四套件平均:ImageWAM 98.4(π0.5 96.9,与视频 WAM 相当)。LIBERO-Plus(更强分布偏移,含 Camera/Robot/Language/Light/Background/Noise/Layout 七类扰动)三变体平均成功率:
| 方法 | P.T. | Camera | Robot | Language | Light | Backgr. | Noise | Layout | Avg |
|---|---|---|---|---|---|---|---|---|---|
| OpenVLA-OFT | ✓ | 56.4 | 31.9 | 79.5 | 88.7 | 93.3 | 75.8 | 74.2 | 69.6 |
| π0 | ✓ | 13.8 | 6.0 | 58.8 | 85.0 | 81.4 | 79.0 | 68.9 | 53.6 |
| FastWAM | ✗ | 16.4 | 44.5 | 68.9 | 78.2 | 53.7 | 37.7 | 60.7 | 51.5 |
| ImageWAM(OmniGen2) | ✗ | 80.0 | 49.2 | 70.9 | 82.6 | 69.4 | 77.1 | 71.8 | 71.8 |
| ImageWAM(Ovis-U1) | ✗ | 63.3 | 58.4 | 75.4 | 86.3 | 66.7 | 75.2 | 74.6 | 71.2 |
| ImageWAM(FLUX.2 4B) | ✗ | 80.8 | 50.3 | 91.4 | 98.1 | 85.5 | 93.8 | 80.5 | 83.1 |
| 方法 | 真机 Avg | 延迟 | TFLOPs | 中间态 |
|---|---|---|---|---|
| π0 | 55.8 | — | — | — |
| π0.5 | 72.3 | — | — | — |
| FastWAM-IDM | 79.0 | 1081 ms | 63.65 | Video |
| FastWAM(1 Step) | 302 ms | 13.21 | Cache | |
| ImageWAM | 84.5 | 263 ms | 9.72 | Cache |
真机四任务(叠三碗/叠毛巾/开抽屉存马克笔/挂杯)ImageWAM 全部最优,T2(叠毛巾,可形变物体)增益最大(+9 vs FastWAM)。
来源:PDF §5.2 训练细节 + 表8(通用超参)/表9(数据集配置)/表10(训练成本)。
| 项 | 配置 |
|---|---|
| 训练 GPU | 8× NVIDIA H20(所有变体统一) |
| 分布式策略 | DeepSpeed ZeRO-1;FLUX.2 9B 因显存改用 ZeRO-2 |
| 精度 / 优化器 | bf16 · AdamW(β=0.9,0.95) · lr 1e-4 · warmup-cosine · grad clip 1.0 |
| 推理硬件(测效率) | 单卡 A6000 |
| Benchmark | 模型 | 时长 | Batch/GPU |
|---|---|---|---|
| LIBERO | OmniGen2 | 18 小时 | 12 |
| LIBERO | Ovis-U1 | 18 小时 | 16 |
| LIBERO | FLUX.2 4B | 18 小时 | 10 |
| LIBERO | FLUX.2 9B | 1.6 天 | 12 |
| RoboTwin | OmniGen2 / FLUX.2 4B | 5 天 | 48† |
| Real-World | OmniGen2 | 18 小时 | 16 |
† 有效 per-GPU batch,含 3 步梯度累积。LIBERO 训 10 epoch、RoboTwin 5 epoch、真机 10 epoch。
🟢实测复现 在 ICL(8× NVIDIA H20, 96GB/卡)上,用官方 release checkpoint ImageWAM-FLUX.2-4B-LIBERO 完成全量 LIBERO 4 套件评测。总成功率 97.9%,论文报告 98.4%,差异 0.5pp 在统计波动范围内,复现成功。
条形 = 实测 | 橙线 = 论文报告(98.4% 平均)
颜色深度 = 成功率(绿=100%,黄=92-96%,橙=84-88%)
hover 查看具体数值。8 个非满分任务(共 21/1000 失败 trial),最低 84%(spatial task5: "pick up bowl on ramekin"——需精准定位堆叠物体)
| 套件 | 论文报告 | 我们复现 | 差异 | 判定 |
|---|---|---|---|---|
| libero_spatial | — | 96.8% | — | — |
| libero_object | — | 98.4% | — | — |
| libero_goal | — | 98.0% | — | — |
| libero_10 | — | 98.4% | — | — |
| Overall | 98.4% | 97.9% | -0.5pp | 复现成功 |
| 项 | 配置 |
|---|---|
| 硬件 | 8× NVIDIA H20 (96GB/卡), ICL 集群 |
| Checkpoint | ImageWAM-FLUX.2-4B-LIBERO 官方 release (model.pt, 9.04GB) |
| 骨干 | FLUX.2-klein-base-4B + FLUX.2-dev AE + Qwen3-4B |
| 评测规模 | 4 套件 × 10 任务 × 25 trials = 1000 episodes |
| 并行策略 | max_tasks_per_gpu=4, chunk_size=1 → 32 并发 + 8 pending |
| GPU 峰值显存 | 74.6 GB / 卡(4 任务共享时) |
| 渲染 | MUJOCO_GL=osmesa (headless, 无显示器) |
| action_horizon | 16 步 |
| replan_steps | 12 步 |
| 总耗时 | ~32 分钟 (15:55 → 16:27) |
| # | 问题 | 根因 | 解决 |
|---|---|---|---|
| 1 | uv sync 编译 mmcv-full 失败 | 只需 shared extra,uv sync 会锁全量(含 dim/mmcv) | 改用 uv pip install -e ".[shared]" |
| 2 | LIBERO editable 安装后 import 失败 | 顶层 libero/ 无 __init__.py → MAPPING 空 | PYTHONPATH 注入 third_party/LIBERO |
| 3 | 推理时 No module named 'hydra' | worker 子进程用系统 python | .env.local 补 PYTHON_BIN 指向 .venv |
[shared] extra,不碰 dim/mmcv.env.local 必须设 PYTHON_BIN + LIBERO_WORKER_ENV_SOURCEecho N | python -c 'import libero.libero' 预生成 configget_libero_image() 的 [::-1,::-1] 180° 旋转是正确的(抽帧验证为正立场景)# SSH 连接开发机
ssh -p 443 root@10.82.96.110
# 环境准备
cd /robot/bionic-control-data/czy/projects/ImageWAM
source .venv/bin/activate
unset ALL_PROXY HTTP_PROXY HTTPS_PROXY http_proxy https_proxy all_proxy
export MUJOCO_GL=osmesa PYOPENGL_PLATFORM=osmesa
export PYTHONPATH=$PWD/third_party/LIBERO
# 完整评测(默认参数 = 4套件 × 25 trials × 8 GPUs)
bash scripts/flux2/run_eval_flux2_libero.sh
# Smoke 快速验证(2 分钟)
NUM_GPUS=2 TASK_SUITE_NAMES='[libero_spatial]' NUM_TRIALS=2 \
bash scripts/flux2/run_eval_flux2_libero.sh
🟢实践指南 本节基于代码仓库的训练流程分析 + 论文真机实验配置,给出从真机数据到 ImageWAM 部署的完整路径。
是的,标准的 state-action episode + 相机图像 + 语言指令就是全部。不需要特殊标注、不需要人类视频、不需要仿真对。
| 数据项 | 格式 | 说明 |
|---|---|---|
| 相机图像序列 | RGB 视频/图像帧(≥1个视角) | 主相机(固定/第三人称)+ 可选腕部相机 |
| 动作序列 | 每时间步的 action 向量 | 7-DoF(单臂EE) 或 14-DoF(双臂EE):xyz + rpy/quat + gripper |
| 状态序列 | 每时间步的 state 向量 | 关节角/末端位姿 + gripper 状态 |
| 语言指令 | 一条自然语言字符串 | 描述该 episode 完成的任务,如 "把杯子放到盘子上" |
ImageWAM 内部有两个可训组件,它们联合训练(同一份数据,一个 loss 函数同时优化两者):
训练目标:从"当前帧 + 指令"预测"任务完成后的目标帧"
用到的数据:
它学到的:理解"pick up the bowl"意味着碗从桌上移到了盘子里的视觉变换
训练目标:给定编辑分支 KV cache + 当前观测 + 本体感知,预测 action chunk(16步)
用到的数据:
它学到的:在"世界想象的条件"下执行具体的运动控制
| 配置 | 单臂 + 夹爪 | 双臂 + 夹爪 |
|---|---|---|
| ACTION_DIM | 7(xyz + rpy + gripper) | 14(左臂7 + 右臂7) |
| 状态维度 | 8(7关节角 + gripper) | 16(双臂各8) |
| delta_action_dim_mask | [true×6, false](位姿用delta,gripper用绝对) | [true×6, false, true×6, false] |
| 相机建议 | 固定相机 + 腕部相机(横向拼接 224×448) | 固定相机 + 双腕部相机(或固定+1腕,见下) |
| 训练时长参考 | ~18h(8×H20,论文真机规模) | ~18-24h(数据可能更多) |
| 模型变体推荐 | FLUX.2 4B(最强) | FLUX.2 4B(显存够,14-DoF 论文 RoboTwin 验证过) |
| 方案 | 相机数 | 拼接方式 | 输入尺寸 | 适用 |
|---|---|---|---|---|
| A(标准) | 固定 + 腕部 | horizontal(左右拼接) | 224 × 448 | 单臂 |
| B(紧凑) | 固定 + 左腕 + 右腕 | robotwin layout(compact_288x256) | 288 × 256 | 双臂 |
| C(简单) | 仅固定相机 | 无拼接 | 224 × 224 | 任务简单时 |
ImageWAM 对图像方向敏感——确保送入模型的图像是正立的(桌面在下)。训练和推理必须一致。
将真机采集的 episodes 转为 LeRobot v2/v3 格式(parquet + mp4)。每条 episode 必须有:
# 1. 预计算 Qwen3 文本 embedding cache(只需跑一次,加速后续训练)
GPU_PER_NODE=8 TASK_TYPE=real FLUX2_VARIANT=4b PRECOMPUTE_QWEN3_CACHE=true \
bash scripts/flux2/run_train_flux2_klein_imagewam.sh
# 2. ActionDiT 初始化权重(自动从 FLUX.2 骨干提取,无需手动)
# 脚本检测 ACTION_INIT 不存在时自动调用 preprocess_action_dit_flux2.py
# 环境变量
export DATA_ROOT="/path/to/your/real_data"
export FLUX2_SRC="./third_party/flux2"
export FLUX2_AE_MODEL_PATH="./checkpoints/flux2/FLUX.2-dev/ae.safetensors"
# 启动训练(8×H20,ZeRO-1,~18h)
GPU_PER_NODE=8 \
TASK_TYPE=real \
FLUX2_VARIANT=4b \
bash scripts/flux2/run_train_flux2_klein_imagewam.sh
# 使用训练产出的 checkpoint
export CKPT_PATH="./runs/train/YYYYMMDD_HHMMSS/checkpoints/checkpoint_best.pt"
export DATASET_STATS_PATH="./runs/train/YYYYMMDD_HHMMSS/dataset_stats.json"
# 推理延迟: ~263ms/step(单卡 A6000),满足实时控制
# action_horizon=16, replan_steps=12(每 12 步 replan 一次)
| 参数 | 值 | 来源/说明 |
|---|---|---|
| learning_rate | 1e-4 | 论文所有实验统一值 |
| num_epochs | 10 | 论文 LIBERO/真机统一 10 epoch |
| batch_size (per GPU) | 10-12 | H20 96GB 下 FLUX.2 4B 的极限 |
| gradient_accumulation | 1-3 | 有效 batch = per_gpu × 8卡 × accum |
| optimizer | AdamW (β=0.9, 0.95) | 标准配置 |
| lr_scheduler | cosine | warmup 5% |
| weight_decay | 1e-2 | 论文配置 |
| mixed_precision | bf16 | H20 原生支持 |
| ZERO_STAGE | 1(4B)/ 2(9B) | 4B 足够 ZeRO-1 |
| action_horizon | 16 | 预测 16 步动作 |
| replan_steps | 12 | 执行 12 步后重新规划 |
| endpoint_frames_only | true | ImageWAM 核心:只取首末帧 |
| 数据规模 | 任务数 | 预期效果 | 参考 |
|---|---|---|---|
| 50 eps/task × 4 tasks = 200 | 4 | ~80-85% 成功率 | 论文真机 84.5%(4任务) |
| 50 eps/task × 10 tasks = 500 | 10 | ~85-95% | 类比 LIBERO-10 |
| 50 eps/task × 40+ tasks | 40+ | ~95%+ | LIBERO 规模(我们复现 97.9%) |
| 方案 | 是否需要预训练 | 数据要求 | 推理延迟 | 真机效果 |
|---|---|---|---|---|
| π0 / π0.5 | 是(大规模多机器人数据) | 预训需 10k+ hrs | ~300ms | 55.8-72.3% |
| ACT / Diffusion Policy | 否 | 同 | ~50-100ms | 无 WAM 加持 |
| FastWAM(视频WAM) | 否 | 同 | 1081ms | 79.0% |
| ImageWAM | 否 | 同(state-action eps) | 263ms | 84.5% |
| # | 坑 | 解决 |
|---|---|---|
| 1 | uv sync 拉全量依赖编译失败 | 只装 [shared] extra:uv pip install -e ".[shared]" |
| 2 | LIBERO/第三方包 editable 安装后 import 失败 | 用 PYTHONPATH 注入,不改第三方代码 |
| 3 | 多进程 worker 找不到 venv | .env.local 设 PYTHON_BIN 指向 .venv/bin/python |
| 4 | HF gated 模型下载权限 | 需要 token + 已接受 license 双重验证 |
| 5 | 图像方向不一致导致成功率为0 | 确保训练/推理图像都是正立的(抽帧验证) |
| 6 | checkpoint 文件名与文档不一致 | 以 ls 实际文件为准,不信 README |
"预测未来图像/视频到底有没有用?"是当前 WAM 领域最核心的争论。ImageWAM、DiT4DiT、DynaGuide 分别给出了三种不同但互补的答案。
| 维度 | ImageWAM | DiT4DiT | DynaGuide |
|---|---|---|---|
| 核心主张 | 图像编辑的 KV cache 比视频/图像像素更有用 | 视频生成的中间特征比像素输出更有用 | 动态模型的梯度比条件化训练更灵活 |
| 生成模型角色 | 编辑分支跑一步 forward,取逐层 KV | 视频 DiT 做 teacher,蒸馏特征给 action DiT | 动态模型预测未来潜在状态,梯度引导去噪 |
| 推理时生成图像? | 否(只取 KV cache) | 否(teacher 推理时丢弃) | 否(只在潜在空间预测) |
| 像素输出 | 不需要 | 不需要 | 不需要 |
| 生成模型骨干 | FLUX.2(图像编辑) | Cosmos-Predict2.5-2B(视频生成) | 自训动态模型(DinoV2 潜在空间) |
| 训练时用视觉监督? | 是(L_img 监督编辑分支) | 是(视频生成监督 Video DiT) | 是(动态模型单独训预测未来潜在) |
| 动作模型 | flow-matching Action DiT | flow-matching Action DiT | 预训练 Diffusion Policy(不修改) |
| 预训练要求 | 无具身预训练(P.T.=✗) | 视频预训练(Cosmos),可选具身预训练 | 需预训练策略 + 动态模型 |
"图像编辑模型去噪一步产生的 KV cache 已经编码了足够的'视觉变换信息',不需要解码成图。而且图像编辑比视频生成更适合——因为操作本质是 source→target 的单帧变换。"
推理保留编辑分支(取 KV),263ms
"视频生成模型的中间去噪特征是最好的动态表征。但推理时不需要整个视频模型——用蒸馏把知识压缩到 action DiT 里就行。视频生成是 scaling proxy,不是推理工具。"
推理只跑 action DiT(teacher 丢弃),更快
"不修改策略,只用外部动态模型的梯度在去噪过程中'拉'动作方向。动态模型在 DinoV2 潜在空间预测未来,不生成像素。策略和引导完全解耦。"
推理:策略去噪 + 动态模型梯度引导
表面上 DiT4DiT 说"预测图像没必要"而 ImageWAM 还用了图像编辑模型,看似矛盾。但实际上:
| 预测像素有必要吗? | 生成模型有必要吗? | 训练时视觉监督有必要吗? | |
|---|---|---|---|
| DiT4DiT | ❌ 推理不需要 | ✅ 训练时 teacher 需要 | ✅ 视频生成是最好的 proxy |
| ImageWAM | ❌ 推理不解码 | ✅ 推理时保留编辑分支取 KV | ✅ L_img 监督编辑分支 |
| DynaGuide | ❌ 完全在潜在空间 | ✅ 动态模型相当于轻量世界模型 | ✅ 动态模型需要训 |
| 指标 | ImageWAM (FLUX.2 4B) | DiT4DiT (Cosmos 2B) | DynaGuide |
|---|---|---|---|
| LIBERO 平均 | 98.4% | 98.6% | —(未评测) |
| RoboCasa-GR1 | — | 50.8% | — |
| RoboTwin-Rand | 93.56 | — | — |
| CALVIN | — | — | 70%(引导成功率) |
| 真机 | 84.5%(4任务) | G1 humanoid(7任务) | 72-80%(cup preference) |
| 推理延迟 | 263ms | 更快(无 teacher) | 较慢(多步梯度计算) |
| 训练 GPU | 8×H20, 18h | 32 GPU | 中等 |
| 具身预训练 | 不需要 | 可选(GR1 数据) | 不需要 |
| 场景 | 最佳选择 | 原因 |
|---|---|---|
| 固定任务集、追求效果 | ImageWAM | 无预训练、效果最强(LIBERO 98.4%, 真机 84.5%)、推理实时 |
| 大规模预训练、追求泛化 | DiT4DiT | 视频做 scaling proxy,10× 数据效率,zero-shot 潜力 |
| 已有预训策略、推理时灵活引导 | DynaGuide | 不改策略,即插即用,支持正负多目标引导 |
| 资源有限(8 GPU 以下) | ImageWAM (Ovis-U1) | 1.1B DiT 最小变体 |
| 人形机器人高自由度 | DiT4DiT | 已在 29-DoF GR1 上验证 |
🟢源码核对 仓库 ~/projects/ImageWAM/,推荐从 FLUX.2 变体入手。核心在 src/imagewam/models/backbones/。
mot.py(Mixture-of-Transformers)是 KV 融合的落点。它校验所有 expert 层数/头数一致,逐层并行推进,在 _mixed_attention 里把动作 Query 与拼接后的 K/V 一起做 attention:
def _mixed_attention(self, q_cat, k_cat, v_cat, attention_mask, ...):
# q_cat: 动作 token 的 Query
# k_cat / v_cat: [K_action ; K_edit] / [V_action ; V_edit] ← 编辑分支 KV 拼进来
key_len = k_cat.shape[1]
H, H_kv, D = self.num_heads, self.num_kv_heads, self.attn_head_dim
...
out = F.scaled_dot_product_attention(q, k, v, attn_mask=attn_mask, enable_gqa=enable_gqa)
# 动作 token 通过 joint attention 读取编辑分支的逐层 KV
这正是式(5)-(9)里 "动作专家 conditioned 在 Cedit" 的实现:不是把 cache 拼成一个 context 向量,而是在每层 attention 里把编辑分支的 K/V 拼到动作 token 的注意力键值上。
action_dit_omnigen2.py 的 ActionDiTOmnigen2:动作经 action_encoder(Linear) 变 token,加 RoPE 与 timestep 调制,过若干 OmniGen2TransformerBlock,head 输出动作维度的速度场。它声明 block_protocol="omnigen2" 以便和编辑专家在 MoT 中对齐拼接。
class ActionDiTOmnigen2(nn.Module):
block_protocol = "omnigen2"
def __init__(self, action_dim, ..., num_layers=26, ...):
self.action_encoder = nn.Linear(action_dim, hidden_dim)
self.blocks = nn.ModuleList([OmniGen2TransformerBlock(...) for _ in range(num_layers)])
self.head = LuminaLayerNormContinuous(..., out_dim=action_dim) # 输出动作速度场
omnigen2_video_expert.py 的 OmniGen2VideoExpert 包住 OmniGen2Transformer2DModel,暴露 blocks/num_heads/num_kv_heads/RoPE,供 MoT 逐层取 KV。仓库还提供 action_dit_flux2.py/ovis_u1_video_expert.py 等对应三个变体。
imagewam.py(204KB,主 pipeline 组装) · mot.py(joint attention 核心) · imagewam_cache_idm.py / imagewam_noise_idm.py(cache 版 / noise 版 IDM 变体) · lora.py(编辑分支 LoRA 适配)。数据侧 README 提及 no-ops 过滤与 FastWAM 预处理数据。"世界模型是否必须=预测未来视频"是当前具身领域的一个隐含假设。ImageWAM 通过把 WAM 的中间态从"视频"退化到"单张编辑目标帧",再退化到"根本不解码、只取 KV cache",一步步逼问:reason-before-act 真正需要的是"想象的像素",还是"想象过程中的中间表征"?答案偏向后者。