EO-1

EO-1 是一种用于机器人控制的视觉-语言-action policy。LeRobot 实现将 EO-1 与标准的 LeRobot 训练、评估、处理器接口集成在一起。

模型概述

EO-1 使用 Qwen2.5-VL 骨干网络进行视觉-语言理解,并添加了一个连续 flow-matching action 头用于机器人控制。policy 将每个机器人控制样本格式化为多模态对话:相机图像传递给 Qwen2.5-VL,机器人 state 用 EO-1 state token 表示,未来 action chunk 用 EO-1 action token 表示。

An overview of EO-1

训练期间,EO-1 学习在 action token 位置对连续 action chunk 进行去噪。inference 期间,它采样一个 action chunk,返回连续 action,并在再次采样之前从该块中执行 n_action_steps

LeRobot 集成涵盖的内容

  • 通过 LeRobot 进行标准 policy.type=eo1 配置
  • 通过 policy 处理器进行 Qwen2.5-VL 图像和文本预处理
  • 连续 flow-matching action prediction
  • 通过 LeRobot policy API 保存/加载 checkpoint
  • 使用 lerobot-train 进行训练,使用 lerobot-eval 进行评估

更广泛的 EO-1 项目还包括交错视觉-文本-action 预训练和多模态 inference 工作流。本页面专注于 LeRobot 的机器人控制 policy 路径。

安装要求

  1. 按照安装指南安装 LeRobot。

  2. 运行以下命令安装 EO-1 依赖:

    pip install -e ".[eo1]"
  3. 如果你想在 LIBERO 上训练或评估,请同时安装 LIBERO 依赖:

    pip install -e ".[eo1,libero]"

EO-1 可以通过 policy.attn_implementation=sdpa 使用标准的 PyTorch 缩放点积注意力后端。如果你的环境安装了兼容的 flash_attn,你可以请求使用 policy.attn_implementation=flash_attention_2

数据要求

EO-1 需要具备以下特征的 LeRobot dataset:

  • 至少一个视觉 observation,例如 observation.images.image
  • observation.state
  • action
  • 通过 dataset task 字段提供的语言任务指令

如果你的 dataset 使用不同的 observation 名称,请使用 rename_map 将它们与你的训练或评估设置所期望的名称对齐。

使用方法

要在 LeRobot 配置中使用 EO-1,请将 policy 类型指定为:

policy.type=eo1

使用转换后的发布 checkpoint,从 EO-1 的交错视觉-文本-action 预训练开始:

--policy.path=lerobot/eo1-base

lerobot/eo1-baseIPEC-COMMUNITY/EO-1-3B 的原生 LeRobot 转换版本。它保留了已发布的 Qwen 视觉-语言权重和训练好的 flow-matching action 头。其 action chunk 大小为 16,与上游 checkpoint 一致。若要仅从原始 Qwen 骨干网络初始化,请省略 policy.path 并设置 policy.vlm_base=Qwen/Qwen2.5-VL-3B-Instruct

使用以下命令加载另一个经过 fine-tune 的 LeRobot 格式 EO-1 checkpoint:

policy.path=your-org/your-eo1-checkpoint

文本生成与交互式控制

EO-1 通过共享的 policy 文本契约暴露 Qwen 骨干网络。运行时添加 query_kindtext,然后运行常规的 EO-1 输入处理器:

request = {
    **observation,
    "query_kind": "vqa",
    "text": "Which object is closest to the gripper?",
}
processed_batch = preprocessor(request)
answer = policy.generate_text(processed_batch)

vqa 保留调用者的问题。next_subtask 应用 EO-1 policy 配置中存储的方案。EO-1 继承 generate_text(processed_batch),并覆盖 supports_text_generationgenerate_text;不会加载单独的 VLM。

借助交互式语言运行时,EO-1 可以生成一个子任务,并根据当前子任务重新构建其 action 提示词:

lerobot-rollout \
  --policy.path=your-org/your-eo1-checkpoint \
  --policy.device=cuda \
  --task="clear the table" \
  --interactive=true

/start 之后,使用 /vqa <question>/autosteer <goal>/subtask <text>

训练

训练命令示例

lerobot-train \
  --dataset.repo_id=your_org/your_dataset \
  --policy.path=lerobot/eo1-base \
  --policy.dtype=bfloat16 \
  --policy.attn_implementation=sdpa \
  --policy.gradient_checkpointing=false \
  --output_dir=./outputs/eo1_training \
  --job_name=eo1_training \
  --steps=300000 \
  --batch_size=16 \
  --policy.device=cuda

使用语言标注进行训练

EO1Config 包含一个从 LeRobot 可选语言列进行训练的方案。内置联合方案会在同一个序列中监督选定的助手响应及其连续 action chunk:

lerobot-train \
  --dataset.repo_id=your_org/your_language_annotated_dataset \
  --policy.type=eo1 \
  --policy.text_loss_weight=0.01 \
  --policy.flow_loss_weight=1.0 \
  --policy.device=cuda \
  --batch_size=1 \
  --steps=20000

目标助手轮次接收下一个 token 的交叉熵损失,而 low_level 方案流则接收 flow action 监督。一行数据可以接收任一种目标或两者兼有。用户提示词、图像、state token、action token 和填充都被排除在文本损失之外。设置 policy.recipe=null 可禁用方案渲染,并使用原始的仅 action 训练路径。

关于标注模式和方案结构,请参阅语言列与方案recipe_path 可以指向显式的外部 YAML 覆盖;LeRobot 不提供共享的默认方案文件。默认系统提示词是 EO1 方案的一部分,可以被自定义的系统轮次替换。没有系统轮次的渲染输入(包括 VQA 提示词)会保持没有系统提示词的 state。没有渲染消息的仅 action 路径会保留默认系统提示词。EO1PrepareModelMessagesStep 在 Qwen 格式化和分词之前将图像和 state/action token 添加到渲染消息中。

关键训练参数

参数默认值描述
policy.pathlerobot/eo1-base已发布的 EO-1 权重,转换为原生 LeRobot 格式
policy.vlm_baseQwen/Qwen2.5-VL-3B-Instruct仅在无 policy.path 训练时使用的 Qwen 处理器/骨干网络
policy.dtypeauto骨干网络数据类型请求:autobfloat16float32
policy.attn_implementationNone可选 Qwen 注意力后端,例如 sdpa
policy.gradient_checkpointingfalse降低训练期间的内存使用
policy.chunk_size8每个 action chunk 预测的未来 action 数量
policy.n_action_steps8从采样 action chunk 中消费的 action 数量
policy.num_denoise_steps10采样期间使用的 flow-matching 去噪步数
policy.max_state_dim32state 补零维度
policy.max_action_dim32action 补零维度
policy.force_fp32_autocasttrue即使骨干网络使用混合精度,也让 flow 头保持在 fp32
policy.supervise_padding_action_dimstrue控制是否监督补零的 action 维度
policy.supervise_padding_actionstrue控制是否监督补零的未来 action 行
policy.recipe_pathNone启用由方案驱动的文本和逐样本 action 监督
policy.text_loss_weight0.01受监督的助手 token 交叉熵损失的权重
policy.flow_loss_weight1.0连续 flow action 损失的权重
policy.tokenizer_max_length1000联合视觉-语言-action sequence 的最大长度

评估

一旦拥有 LeRobot 格式的 checkpoint,就可以通过 lerobot-eval 评估 EO-1:

lerobot-eval \
  --policy.path=your-org/your-eo1-checkpoint \
  --env.type=libero \
  --env.task=libero_object \
  --eval.batch_size=1 \
  --eval.n_episodes=20

对于相机名称与 checkpoint 配置不同的 dataset 或环境,请传递 rename_map

lerobot-eval \
  --policy.path=your-org/your-eo1-checkpoint \
  --env.type=libero \
  --env.task=libero_object \
  --rename_map='{"observation.images.image2":"observation.images.wrist_image"}'

配置说明

图像处理

EO-1 使用 Qwen2.5-VL 处理器。policy.image_min_pixelspolicy.image_max_pixels 设置控制图像在视觉 token 传入骨干网络之前的缩放边界。

state 与 action 维度

policy 会在将 state 和 action 向量送入 EO-1 flow 头之前,将它们补零到 policy.max_state_dimpolicy.max_action_dim。预测结果会在 policy 返回之前裁剪回原始的 action 维度。

注意力后端

对于可移植的设置,请使用 policy.attn_implementation=sdpa。仅当 flash_attn 已安装且与你的环境兼容时,才使用 flash_attention_2

参考

引用

@article{eo1,
  title={EO-1: Interleaved Vision-Text-Action Pretraining for General Robot Control},
  author={Delin Qu and Haoming Song and Qizhi Chen and Zhaoqing Chen and Xianqiang Gao and Xinyi Ye and Qi Lv and Modi Shi and Guanghui Ren and Cheng Ruan and Maoqing Yao and Haoran Yang and Jiacheng Bao and Bin Zhao and Dong Wang},
  journal={arXiv preprint},
  year={2025},
  url={https://arxiv.org/abs/2508.21112}
}

许可证

此 LeRobot 集成遵循 LeRobot 使用的 Apache 2.0 许可证。关于已发布的 EO-1 checkpoint 和数据的许可证,请查看上游 EO-1 模型和 dataset 页面。

在 GitHub 上更新