# EO-1

EO-1 es una **política Vision-Language-Action para el control de robots**. La implementación de LeRobot integra EO-1 con la interfaz estándar de entrenamiento, evaluación y procesador de LeRobot.

## Resumen del modelo

EO-1 utiliza un backbone Qwen2.5-VL para la comprensión de visión-lenguaje y añade una cabeza de flujo continuo para el control de robots. La política formatea cada muestra de control de robot como una conversación multimodal: las imágenes de la cámara se pasan a Qwen2.5-VL, el estado del robot se representa con tokens de estado de EO-1 y el trozo de acción futuro se representa con tokens de acción de EO-1.

<img
  src="https://huggingface.co/datasets/HaomingSong/lerobot-documentation-images/resolve/main/lerobot/eo_pipeline.png"
  alt="An overview of EO-1"
  width="85%"
/>

Durante el entrenamiento, EO-1 aprende a desruidar trozos de acciones continuas en las posiciones de tokens de acción. Durante la inferencia, muestrea un trozo de acciones, devuelve acciones continuas y ejecuta `n_action_steps` del trozo antes de volver a muestrear.

### Lo que abarca la integración de LeRobot

- Configuración estándar `policy.type=eo1` a través de LeRobot
- Preprocesamiento de imágenes y texto de Qwen2.5-VL a través de procesadores de política
- Predicción de acciones mediante flujo continuo
- Guardado y carga de puntos de control a través de las APIs de políticas de LeRobot
- Entrenamiento con `lerobot-train` y evaluación con `lerobot-eval`

El proyecto EO-1 más amplio también incluye el preentrenamiento intercalado de visión-texto-acción y flujos de trabajo de razonamiento multimodal. Esta página se centra en la ruta de la política de control de robots de LeRobot.

## Requisitos de instalación

1. Instala LeRobot siguiendo la [Guía de instalación](./installation).
2. Instale las dependencias de EO-1 ejecutando:

   ```bash
   pip install -e ".[eo1]"
   ```

3. Si desea entrenar o evaluar en LIBERO, instale también las dependencias de LIBERO:

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

EO-1 puede utilizar el backend estándar de atención de producto escalar de PyTorch a través de `policy.attn_implementation=sdpa`. Si su entorno tiene una instalación compatible de `flash_attn`, puede solicitar `policy.attn_implementation=flash_attention_2`.

## Requisitos de datos

EO-1 espera un conjunto de datos de LeRobot con:

- Al menos una observación visual, por ejemplo `observation.images.image`
- `observation.state`
- `action`
- Una instrucción de tarea de lenguaje a través del campo `task` del conjunto de datos

Si tu conjunto de datos usa nombres de observación diferentes, usa `rename_map` para alinearlos con los nombres esperados por tu configuración de entrenamiento o evaluación.

## Uso

Para usar EO-1 en una configuración de LeRobot, especifique el tipo de política como:

```python
policy.type=eo1
```

Use el punto de control de la versión convertida para comenzar desde el preentrenamiento de visión, texto y acción intercalados de EO-1:

```bash
--policy.path=lerobot/eo1-base
```

`lerobot/eo1-base` es una conversión nativa de LeRobot de [`IPEC-COMMUNITY/EO-1-3B`](https://huggingface.co/IPEC-COMMUNITY/EO-1-3B). Conserva los pesos de visión-lenguaje de Qwen publicados y la cabeza de acciones de flow-matching entrenada. Su tamaño de chunk de acciones es 16, coincidiendo con el checkpoint upstream. Para inicializar solo desde el backbone original de Qwen, omita `policy.path` y establezca `policy.vlm_base=Qwen/Qwen2.5-VL-3B-Instruct`.

Cargue otro punto de control de EO-1 en formato LeRobot afinado con:

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

### Generación de texto y control interactivo

EO-1 expone el backbone de Qwen a través del contrato de texto de política compartido. Runtime añade `query_kind` y `query_text` y luego ejecuta el procesador de entrada normal de EO-1:

```python
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` conserva la pregunta del llamador. `next_subtask` aplica la receta almacenada en la configuración de la política EO-1. EO-1 hereda `generate_text(processed_batch)` y sobrescribe `supports_text_generation` y `generate_text`; no se carga un VLM separado.

Con el tiempo de ejecución de lenguaje interactivo, EO-1 puede generar una subtarea y reconstruir su prompt de acción a partir de esa subtarea actual:

```bash
# 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
```

Después de `/start`, usa `/vqa <question>`, `/autosteer <goal>` o `/subtask <text>`.

## Entrenamiento

### Ejemplo de comando de entrenamiento

```bash
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
```

### Entrenar con anotaciones de lenguaje

`EO1Config` incluye una receta para entrenar a partir de las columnas de lenguaje opcionales de LeRobot. La receta conjunta integrada supervisa una respuesta de asistente seleccionada y su trozo de acción continuo en la misma secuencia:

```bash
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
```

Las respuestas dirigidas del asistente reciben la entropía cruzada del siguiente token, mientras que los flujos de la receta `low_level` reciben supervisión de acciones de flujo. Una fila puede recibir cualquiera de estos objetivos o ambos. Los prompts del usuario, las imágenes, los tokens de estado, los tokens de acción y el relleno se excluyen de la pérdida de texto. Establezca `policy.recipe=null` para deshabilitar el renderizado de la receta y usar la ruta de entrenamiento original solo con acciones.

Consulte [Columnas de idioma y recetas](./language_and_recipes) para el esquema de anotación y la estructura de la receta. `recipe_path` puede apuntar a una superposición externa YAML explícita; LeRobot no proporciona archivos de receta predeterminados compartidos. El prompt de sistema predeterminado forma parte de la receta de EO1 y puede reemplazarse por un turno de sistema personalizado. Las entradas renderizadas sin un turno de sistema, incluidos los prompts de VQA, permanecen sin uno. La ruta solo de acción sin mensajes renderizados mantiene el prompt de sistema predeterminado. `EO1PrepareModelMessagesStep` añade imágenes y tokens de estado/acción a los mensajes renderizados antes del formato y la tokenización de Qwen.

### Parámetros clave de entrenamiento

| Parámetro                              | Predeterminado                       | Descripción                                                             |
| -------------------------------------- | ----------------------------- | ----------------------------------------------------------------------- |
| `policy.path`                          | `lerobot/eo1-base`            | Se han publicado los pesos de EO-1 convertidos al formato nativo de LeRobot                |
| `policy.vlm_base`                      | `Qwen/Qwen2.5-VL-3B-Instruct` | Procesador/backbone de Qwen utilizado solo cuando se entrena sin `policy.path`   |
| `policy.dtype`                         | `bfloat16`                    | Solicitud de dtype del backbone: un nombre de dtype de torch, p. ej. `bfloat16`, `float32`  |
| `policy.attn_implementation`           | `None`                        | Backend de atención de Qwen opcional, como `sdpa`                         |
| `policy.gradient_checkpointing`        | `false`                       | Reduce el uso de memoria durante el entrenamiento                                    |
| `policy.chunk_size`                    | `16`                          | Número de acciones futuras predichas por bloque                            |
| `policy.n_action_steps`                | `16`                          | Número de acciones consumidas de un fragmento muestreado                         |
| `policy.num_denoise_steps`             | `10`                          | Número de pasos de desruido de flow-matching utilizados durante la muestreo            |
| `policy.max_state_dim`                 | `32`                          | Dimensión de relleno del estado                                                 |
| `policy.max_action_dim`                | `32`                          | Dimensión de relleno de la acción                                                |
| `policy.force_fp32_autocast`           | `true`                        | Mantiene la cabeza de flujo en fp32 incluso cuando el backbone utiliza precisión mixta |
| `policy.supervise_padding_action_dims` | `true`                        | Controla si las dimensiones de acción rellenas se supervisan                |
| `policy.supervise_padding_actions`     | `true`                        | Controla si las filas de acciones futuras rellenas se supervisan               |
| `policy.recipe_path`                   | `None`                        | Permite la supervisión de texto basada en recetas y la supervisión de acciones por muestra            |
| `policy.text_loss_weight`              | `0.01`                        | Peso para la entropía cruzada de tokens de asistente supervisados                     |
| `policy.flow_loss_weight`              | `1.0`                         | Peso para la pérdida de flujo-acción continua                                  |
| `policy.tokenizer_max_length`          | `1000`                        | Longitud máxima de la secuencia conjunta de visión-lenguaje-acción                    |

## Evaluación

EO-1 se puede evaluar mediante `lerobot-eval` una vez que se dispone de un punto de control en formato LeRobot:

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

Para conjuntos de datos o entornos cuyos nombres de cámara difieren de la configuración del punto de control, pase un `rename_map`:

```bash
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"}'
```

## Notas de configuración

### Procesamiento de imágenes

EO-1 utiliza el procesador Qwen2.5-VL. Las configuraciones `policy.image_min_pixels` y `policy.image_max_pixels` controlan los límites de redimensionamiento de la imagen antes de que los tokens visuales se pasen al backbone.

### Dimensiones del estado y de la acción

La política rellena los vectores de estado y acción hasta `policy.max_state_dim` y `policy.max_action_dim` antes de la cabeza de flujo EO-1. Las predicciones se recortan de nuevo a la dimensión de acción original antes de ser devueltas por la política.

### Backend de atención

Use `policy.attn_implementation=sdpa` para una configuración portable. Use `flash_attention_2` solo cuando `flash_attn` esté instalado y sea compatible con su entorno.

## Referencias

- [Proyecto EO-1](https://github.com/EO-Robotics/EO1)
- [artículo de EO-1](https://arxiv.org/abs/2508.21112)
- [Qwen2.5-VL-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct)

## Cita

```bibtex
@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}
}
```

## Licencia

Esta integración de LeRobot sigue la **Apache 2.0 License** utilizada por LeRobot. Consulte las páginas del modelo y el conjunto de datos EO-1 de origen para conocer las licencias de los puntos de control y los datos de EO-1 publicados.

