LingBot-VA

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(冻结)AutoencoderKLWanWan2.2 VAE,z_dim=48。从源仓库按需拉取。
文本编码器(冻结)UMT5EncoderModelUMT5-XXL,d_model=4096。从源仓库按需拉取。

在 inference 时,policy 为每个块运行一个自回归循环:它使用两个独立的流匹配调度器对视频潜变量流 (CFG,约 20 步)和 action 流(约 50 步)进行去噪,并在各块之间维护 KV 缓存。在执行块时, 真实观测到的关键帧会被反馈回 KV 缓存中(闭环世界建模)。

LeRobot 集成涵盖的内容

  • 通过 LeRobot 进行标准的 policy.type=lingbot_va 配置。
  • Hub 上开箱即用的 LeRobot 格式 checkpoint(由上游发布的 checkpoint 转换而来)。
  • 在标准 select_action 接口背后进行自回归双流 inference (单环境评估,--eval.batch_size=1)。
  • 可选择在评估/训练期间保存 policy 的预测(想象)视频
  • 使用 lerobot-eval 在 LIBERO 和 RoboTwin 上进行评估。
  • 通过双流流匹配损失(policy.forward)进行训练/fine-tune,见下文。

安装

  1. 按照安装指南安装 LeRobot。
  2. 安装 LingBot-VA 额外扩展:
pip install -e ".[lingbot_va]"

checkpoint

上游发布的 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。

评估(LIBERO)

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_libero

LingBot-VA 的流式 inference(KV 缓存 + observation 关键帧反馈)已为 单环境评估实现;请使用 --eval.batch_size=1

评估(RoboTwin)

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 期间的周期性评估中,该标志同样适用。

训练/fine-tune

LingBotVAPolicy.forward(batch) 实现了论文中的双流流匹配损失 (latent_loss + action_loss,按时间步加权,action 掩码):它将相机片段 VAE 编码为视频潜变量,将任务 UMT5 编码,为两个流添加噪声,运行 Transformer 的块因果训练过程并返回 (loss, metrics)。优化器预设为 AdamW, 采用线性预热后恒定的调度(与上游一致)。

要求:

  • 块因果掩码使用 PyTorch 的 flex-attention,因此训练时应使用 --policy.attn_mode=flex 构建 policy(默认的 torch SDPA 仅用于 inference)。
  • 完整的 5B DiT 在 AdamW 下无法装入单个 24–32 GB GPU;请使用 LoRA--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_va

dataset 必须提供相机片段(每个相机的时间窗口,VAE 编码为 frame_chunk_size 个潜变量帧)以及每个样本的 frame_chunk_size * action_per_frame 个 action 步。

数据格式(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
  • LIBERO 使用通道 0–6:6 自由度 EEF 增量(xyz + 旋转)+ gripper(单臂)。
  • RoboTwin 使用通道 [0–6, 28, 7–13, 29]:左 EEF(xyz + 四元数)+ 左 gripper + 右 EEF + 右 gripper(16 维)。环境通过 CuRobo IK 将这些位姿转换为关节轨迹——永远不预测关节。

在 fine-tune 这些 checkpoint 之前,关节空间 dataset(或不同的 EEF 约定)必须重新映射到此模式中。

相机顺序是固定且对顺序敏感的,每个相机的潜变量按 obs_cam_keys 顺序在空间上拼接,因此物理相机→槽位的映射必须与训练匹配:

benchmarkobs_cam_keys(按顺序)camera_layout
LIBEROobservation.images.image(agentview / 第三人称),observation.images.image2(手眼腕部相机)width_concat(潜变量在宽度方向上拼接)
RoboTwinobservation.images.head_cameraobservation.images.left_cameraobservation.images.right_camerarobotwin_tshape(下方为全分辨率头部相机,上方为两个半分辨率腕部相机)

第一个相机是外部/头部视角,其余为腕部视角。

inference 超参数(LIBERO)

高度 × 宽度128 × 128
相机observation.images.image(agentview),observation.images.image2(手眼相机)
使用的 action 通道0–6(7 自由度手臂 + gripper)
action_per_frame / frame_chunk_size4 / 4
attn_window30
视频/action 去噪步数20 / 50
guidance_scale / action_guidance_scale5 / 1
snr_shift / action_snr_shift5.0 / 0.05

这些是 LingBotVAConfig 的默认值;你可以通过 --policy.<name>=... 覆盖其中任何一个。

备注

  • 注意力后端: inference 使用 torch SDPA 后端(始终可用)。 flashattnflex 后端是可选的;flex 仅在训练时需要。
  • 模型大小: DiT 约有 5B 参数,冻结的 VAE+UMT5 再增加约 20 GB;inference 大约需要 18–24 GB 的显存。

许可证

LingBot-VA 在 Apache-2.0 许可下发布。请参阅 上游仓库

在 GitHub 上更新