LingBot-VA 是一个基于 Wan2.2 视频扩散技术栈构建的自回归视频-action 世界模型 policy。它在一个自回归序列中交错预测 未来的视频潜变量和机器人 action(“VA” = Video-Action)。LeRobot 集成将 LingBot-VA 接入标准的训练、评估和处理器 接口。
LingBot-VA 是一个双流”Transformer 混合”架构:视频/潜变量流
(patch_embedding_mlp → blocks → proj_out)和 action 流
(action_embedder → blocks → action_proj_out)共享相同的 30 个 Transformer 块和
文本条件。
| 组件 | 类别 | 作用 |
|---|---|---|
| DiT 骨干网络(可训练) | WanTransformer3DModel | 约 5B 参数的双流 Transformer。 |
| VAE(冻结) | AutoencoderKLWan | Wan2.2 VAE,z_dim=48。从源仓库按需拉取。 |
| 文本编码器(冻结) | UMT5EncoderModel | UMT5-XXL,d_model=4096。从源仓库按需拉取。 |
在 inference 时,policy 为每个块运行一个自回归循环:它使用两个独立的流匹配调度器对视频潜变量流 (CFG,约 20 步)和 action 流(约 50 步)进行去噪,并在各块之间维护 KV 缓存。在执行块时, 真实观测到的关键帧会被反馈回 KV 缓存中(闭环世界建模)。
policy.type=lingbot_va 配置。select_action 接口背后进行自回归双流 inference
(单环境评估,--eval.batch_size=1)。lerobot-eval 在 LIBERO 和 RoboTwin 上进行评估。policy.forward)进行训练/fine-tune,见下文。pip install -e ".[lingbot_va]"上游发布的 checkpoint 已转换为 LeRobot 格式并推送到 Hub:
| 变体 | LeRobot checkpoint |
|---|---|
| LIBERO-Long 后训练 | lerobot/lingbot_va_libero_long |
| RoboTwin 后训练 | lerobot/lingbot_va_robotwin |
| 预训练基础模型 | lerobot/lingbot_va_base |
LeRobot 的 model.safetensors 中只存储可训练的约 5B Transformer。冻结的 VAE + UMT5 + tokenizer(约 20 GB)在加载时从 config.wan_pretrained_path 拉取(默认为源 robbyant/* 仓库)。
UMT5-XXL 文本编码器默认在 CPU 上运行(config.text_encoder_device),因此 5B
Transformer + VAE 可以装入单个 24–32 GB 的 GPU。
lerobot-eval \
--policy.path=lerobot/lingbot_va_libero_long \
--policy.device=cuda \
--env.type=libero --env.task=libero_10 \
--env.observation_height=128 --env.observation_width=128 \
--eval.n_episodes=50 --eval.batch_size=1 \
--output_dir=outputs/eval/lingbot_va_liberoLingBot-VA 的流式 inference(KV 缓存 + observation 关键帧反馈)已为
单环境评估实现;请使用 --eval.batch_size=1。
RoboTwin 2.0 需要 SAPIEN + CuRobo simulation 器技术栈。你可以使用 benchmark Docker 镜像
(docker/Dockerfile.benchmark.robotwin,这也需要 warp-lang==1.3.1,以及使用 TORCH_CUDA_ARCH_LIST 中的
GPU 计算能力构建的 CuRobo)。RoboTwin 采用end-effector 位姿
控制,因此使用 --env.action_mode=ee 运行:policy 预测每只手臂的 xyz+quaternion+gripper 增量(robotwin_tshape 潜变量布局),这些增量叠加到 episode 的初始 end-effector 位姿上,并通过 CuRobo IK 执行。
lerobot-eval \
--policy.path=lerobot/lingbot_va_robotwin \
--policy.device=cuda \
--env.type=robotwin --env.task=beat_block_hammer --env.action_mode=ee \
--eval.n_episodes=10 --eval.batch_size=1 \
--output_dir=outputs/eval/lingbot_va_robotwin设置 --policy.save_predicted_video=true 可额外将预测的视频
潜变量进行 VAE 解码,并在环境渲染的 eval_episode_*.mp4 视频旁边写入 pred_episode_*.mp4。
在 lerobot-train 期间的周期性评估中,该标志同样适用。
LingBotVAPolicy.forward(batch) 实现了论文中的双流流匹配损失
(latent_loss + action_loss,按时间步加权,action 掩码):它将相机片段 VAE 编码为视频潜变量,将任务 UMT5 编码,为两个流添加噪声,运行
Transformer 的块因果训练过程并返回 (loss, metrics)。优化器预设为 AdamW,
采用线性预热后恒定的调度(与上游一致)。
要求:
--policy.attn_mode=flex 构建 policy(默认的 torch SDPA 仅用于 inference)。--policy.use_peft=true)和/或优化器卸载进行 fine-tune。get_optim_params 只返回
可训练(例如适配器)参数;VAE + UMT5 文本编码器保持冻结。lerobot-train \
--policy.path=lerobot/lingbot_va_libero_long --policy.attn_mode=flex \
--policy.use_peft=true \
--dataset.repo_id=<your LeRobot-format dataset> \
--batch_size=1 --steps=... --output_dir=outputs/train/lingbot_vadataset 必须提供相机片段(每个相机的时间窗口,VAE 编码为 frame_chunk_size 个潜变量帧)以及每个样本的 frame_chunk_size * action_per_frame 个 action 步。
LingBot-VA 是一个end-effector(笛卡尔)位姿policy,它预测 EEF 位姿 + gripper,而非
关节位置。action 位于固定的多形态 30 维布局中;将你的机器人的 action 维度映射到这些通道中,并用 0 填充其余部分(used_action_channel_ids 会选择
某个给定 checkpoint 实际使用的通道):
| 通道 | 含义 |
|---|---|
| 0–6 | 左臂 end-effector 位姿 |
| 7–13 | 右臂 end-effector 位姿 |
| 14–20 | 左臂关节(已发布的 checkpoint 未使用) |
| 21–27 | 右臂关节(已发布的 checkpoint 未使用) |
| 28 | 左 gripper |
| 29 | 右 gripper |
0–6:6 自由度 EEF 增量(xyz + 旋转)+ gripper(单臂)。[0–6, 28, 7–13, 29]:左 EEF(xyz + 四元数)+ 左 gripper +
右 EEF + 右 gripper(16 维)。环境通过
CuRobo IK 将这些位姿转换为关节轨迹——永远不预测关节。在 fine-tune 这些 checkpoint 之前,关节空间 dataset(或不同的 EEF 约定)必须重新映射到此模式中。
相机顺序是固定且对顺序敏感的,每个相机的潜变量按 obs_cam_keys 顺序在空间上拼接,因此物理相机→槽位的映射必须与训练匹配:
| benchmark | obs_cam_keys(按顺序) | camera_layout |
|---|---|---|
| LIBERO | observation.images.image(agentview / 第三人称),observation.images.image2(手眼腕部相机) | width_concat(潜变量在宽度方向上拼接) |
| RoboTwin | observation.images.head_camera、observation.images.left_camera、observation.images.right_camera | robotwin_tshape(下方为全分辨率头部相机,上方为两个半分辨率腕部相机) |
第一个相机是外部/头部视角,其余为腕部视角。
| 键 | 值 |
|---|---|
| 高度 × 宽度 | 128 × 128 |
| 相机 | observation.images.image(agentview),observation.images.image2(手眼相机) |
| 使用的 action 通道 | 0–6(7 自由度手臂 + gripper) |
| action_per_frame / frame_chunk_size | 4 / 4 |
| attn_window | 30 |
| 视频/action 去噪步数 | 20 / 50 |
| guidance_scale / action_guidance_scale | 5 / 1 |
| snr_shift / action_snr_shift | 5.0 / 0.05 |
这些是 LingBotVAConfig 的默认值;你可以通过 --policy.<name>=... 覆盖其中任何一个。
torch SDPA 后端(始终可用)。 flashattn 和 flex 后端是可选的;flex 仅在训练时需要。LingBot-VA 在 Apache-2.0 许可下发布。请参阅 上游仓库。
在 GitHub 上更新