LeRobot documentation
EO-1
EO-1
EO-1 是一种用于机器人控制的视觉-语言-动作策略。LeRobot 的实现将 EO-1 与标准的 LeRobot 训练、评估和处理器接口集成在一起。
模型概览
EO-1 采用 Qwen2.5-VL 骨干网络进行视觉-语言理解,并添加了一个用于机器人控制的连续流匹配动作头。该策略将每个机器人控制样本格式化为多模态对话:相机图像被传递给 Qwen2.5-VL,机器人状态用 EO-1 状态 token 表示,未来的动作块用 EO-1 动作 token 表示。
在训练过程中,EO-1 学习在动作标记位置对连续动作块进行去噪。在推理过程中,它会采样一个动作块,返回连续动作,并执行该块中的 n_action_steps 步,然后再进行下一次采样。
LeRobot 集成涵盖的内容
- 通过 LeRobot 进行标准的
policy.type=eo1配置 - 通过策略处理器对 Qwen2.5-VL 的图像和文本进行预处理
- 连续流匹配动作预测
- 通过 LeRobot 策略 API 保存/加载检查点
- 使用
lerobot-train进行训练,使用lerobot-eval进行评估
更广泛的 EO-1 项目还包括交错式视觉-文本-动作预训练和多模态推理工作流。本页聚焦于 LeRobot 机器人控制策略路径。
安装要求
按照安装指南安装 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 数据集,其中包含:
- 至少一个视觉观察,例如
observation.images.image observation.stateaction- 通过数据集的
task字段指定的语言任务指令
如果您的数据集使用了不同的观测名称,请使用 rename_map 将其与训练或评估配置所期望的名称对齐。
用法
要在 LeRobot 配置中使用 EO-1,请将策略类型指定为:
policy.type=eo1使用转换后的发布检查点,从 EO-1 的交错视觉-文本-动作预训练开始:
--policy.path=lerobot/eo1-base
lerobot/eo1-base 是 IPEC-COMMUNITY/EO-1-3B 的原生 LeRobot 转换版本。
它保留了已发布的 Qwen 视觉语言权重以及训练好的 flow-matching 动作头。其动作块大小为 16,与上游检查点保持一致。如果希望仅从原始的 Qwen 骨干网络进行初始化,请省略 policy.path 并设置 policy.vlm_base=Qwen/Qwen2.5-VL-3B-Instruct。
使用以下内容加载另一个微调后的 LeRobot 格式 EO-1 检查点:
policy.path=your-org/your-eo1-checkpoint
文本生成与交互式控制
EO-1 通过共享的策略文本契约暴露 Qwen 骨干网络。运行时添加 query_kind 和 query_text,然后运行常规的 EO-1 输入处理器:
request = {
**observation,
"query_kind": "vqa",
"query_text": "Which object is closest to the gripper?",
}
processed_batch = preprocessor(request)
answer = policy.generate_text(processed_batch)vqa 保留调用方的问题。next_subtask 应用存储在 EO-1 策略配置中的配方。EO-1 继承 generate_text(processed_batch) 并重写 supports_text_generation 和 generate_text;不会加载单独的 VLM。
借助交互式语言运行时,EO-1 可以生成一个子任务,并根据该当前子任务重建其操作提示:
# Use the robot, port and cameras your checkpoint was trained with
lerobot-rollout \
--policy.path=your-org/your-eo1-checkpoint \
--policy.device=cuda \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--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 可选语言列进行训练的配方。内置的联合配方在同一序列中监督所选的助手回复及其连续动作块:
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
定向的助手轮次接收下一词元交叉熵,而 low_level 配方流接收流式动作监督。一行数据可以接收其中一种目标或同时接收两种。用户提示、图像、状态词元、动作词元以及填充均不计入文本损失。将 policy.recipe=null 设置为 null 可禁用配方渲染,并使用原始的动作专用训练路径。
请参阅 语言列和配方 以了解注释模式和配方结构。recipe_path 可以指向显式的外部 YAML 覆盖文件;LeRobot 不提供共享的默认配方文件。默认系统提示词是 EO1 配方的一部分,可以被自定义系统轮次替换。未包含系统轮次的渲染输入(包括 VQA 提示词)将保持无系统轮次的状态。不包含渲染消息的纯动作路径会保留默认系统提示词。EO1PrepareModelMessagesStep 在 Qwen 格式化和分词之前,将图像和状态/动作标记添加到渲染的消息中。
关键训练参数
| 参数 | 默认 | 描述 |
|---|---|---|
policy.path | lerobot/eo1-base | 已发布转换为原生 LeRobot 格式的 EO-1 权重 |
policy.vlm_base | Qwen/Qwen2.5-VL-3B-Instruct | 仅在未使用 policy.path 进行训练时使用的 Qwen 处理器/主干网络 |
policy.dtype | bfloat16 | Backbone 数据类型请求:一个 torch 数据类型名称,例如 bfloat16、float32 |
policy.attn_implementation | None | 可选的 Qwen 注意力后端,例如 sdpa |
policy.gradient_checkpointing | false | 减少训练过程中的内存使用 |
policy.chunk_size | 16 | 每个块预测的未来动作数量 |
policy.n_action_steps | 16 | 从采样块中消耗的动作数量 |
policy.num_denoise_steps | 10 | 采样期间使用的流匹配去噪步数 |
policy.max_state_dim | 32 | 状态填充维度 |
policy.max_action_dim | 32 | 动作填充维度 |
policy.force_fp32_autocast | true | 即使主干网络使用混合精度,也保持 flow head 为 fp32 |
policy.supervise_padding_action_dims | true | 控制是否对填充的动作维度进行监督 |
policy.supervise_padding_actions | true | 控制是否对填充的未来动作行进行监督 |
policy.recipe_path | None | 启用基于配方的文本和逐样本操作监督 |
policy.text_loss_weight | 0.01 | 用于监督助手标记交叉熵的权重 |
policy.flow_loss_weight | 1.0 | 连续流-动作损失的权重 |
policy.tokenizer_max_length | 1000 | 最大联合视觉-语言-动作序列长度 |
评估
在拥有 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
对于相机名称与检查点配置不同的数据集或环境,请传入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 设置用于控制视觉标记传入主干网络之前的图像缩放范围。
状态和动作维度
策略在 EO-1 流程头之前,将状态向量和动作向量填充至 policy.max_state_dim 和 policy.max_action_dim。在策略返回预测结果之前,会将其裁剪回原始的动作维度。
注意力后端
使用 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 模型和数据集页面,以了解已发布的 EO-1 检查点和数据的许可证。
Update on GitHub