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 表示。
训练期间,EO-1 学习在 action token 位置对连续 action chunk 进行去噪。inference 期间,它采样一个 action chunk,返回连续 action,并在再次采样之前从该块中执行 n_action_steps。
policy.type=eo1 配置lerobot-train 进行训练,使用 lerobot-eval 进行评估更广泛的 EO-1 项目还包括交错视觉-文本-action 预训练和多模态 inference 工作流。本页面专注于 LeRobot 的机器人控制 policy 路径。
按照安装指南安装 LeRobot。
运行以下命令安装 EO-1 依赖:
pip install -e ".[eo1]"如果你想在 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.images.imageobservation.stateactiontask 字段提供的语言任务指令如果你的 dataset 使用不同的 observation 名称,请使用 rename_map 将它们与你的训练或评估设置所期望的名称对齐。
要在 LeRobot 配置中使用 EO-1,请将 policy 类型指定为:
policy.type=eo1使用转换后的发布 checkpoint,从 EO-1 的交错视觉-文本-action 预训练开始:
--policy.path=lerobot/eo1-base
lerobot/eo1-base 是 IPEC-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_kind 和 text,然后运行常规的 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_generation 和 generate_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=cudaEO1Config 包含一个从 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.path | lerobot/eo1-base | 已发布的 EO-1 权重,转换为原生 LeRobot 格式 |
policy.vlm_base | Qwen/Qwen2.5-VL-3B-Instruct | 仅在无 policy.path 训练时使用的 Qwen 处理器/骨干网络 |
policy.dtype | auto | 骨干网络数据类型请求:auto、bfloat16 或 float32 |
policy.attn_implementation | None | 可选 Qwen 注意力后端,例如 sdpa |
policy.gradient_checkpointing | false | 降低训练期间的内存使用 |
policy.chunk_size | 8 | 每个 action chunk 预测的未来 action 数量 |
policy.n_action_steps | 8 | 从采样 action chunk 中消费的 action 数量 |
policy.num_denoise_steps | 10 | 采样期间使用的 flow-matching 去噪步数 |
policy.max_state_dim | 32 | state 补零维度 |
policy.max_action_dim | 32 | action 补零维度 |
policy.force_fp32_autocast | true | 即使骨干网络使用混合精度,也让 flow 头保持在 fp32 |
policy.supervise_padding_action_dims | true | 控制是否监督补零的 action 维度 |
policy.supervise_padding_actions | true | 控制是否监督补零的未来 action 行 |
policy.recipe_path | None | 启用由方案驱动的文本和逐样本 action 监督 |
policy.text_loss_weight | 0.01 | 受监督的助手 token 交叉熵损失的权重 |
policy.flow_loss_weight | 1.0 | 连续 flow action 损失的权重 |
policy.tokenizer_max_length | 1000 | 联合视觉-语言-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_pixels 和 policy.image_max_pixels 设置控制图像在视觉 token 传入骨干网络之前的缩放边界。
policy 会在将 state 和 action 向量送入 EO-1 flow 头之前,将它们补零到 policy.max_state_dim 和 policy.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 上更新