# EO-1

EO-1은 **로봇 제어를 위한 Vision-Language-Action 정책**입니다. LeRobot 구현은 EO-1을 표준 LeRobot 학습, 평가, 프로세서 인터페이스와 통합합니다.

## 모델 개요

EO-1은 비전-언어 이해를 위해 Qwen2.5-VL 백본을 사용하며, 로봇 제어를 위한 연속형 flow-matching 액션 헤드를 추가합니다. 이 정책은 각 로봇 제어 샘플을 멀티모달 대화로 포맷합니다: 카메라 이미지는 Qwen2.5-VL로 전달되고, 로봇 상태는 EO-1 상태 토큰으로, 미래 액션 청크는 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%"
/>

학습 중 EO-1은 액션 토큰 위치에서 연속 액션 청크의 노이즈를 제거하는 것을 학습합니다. 추론 중에는 액션 청크를 샘플링하여 연속 액션을 반환하고, 청크에서 `n_action_steps`만큼 실행한 후 다시 샘플링합니다.

### LeRobot 통합의 범위

- LeRobot를 통한 표준 `policy.type=eo1` 구성
- Qwen2.5-VL의 이미지 및 텍스트 전처리: 정책 프로세서
- 연속 플로우 매칭 액션 예측
- LeRobot 정책 API를 통한 Checkpoint 저장/로드
- `lerobot-train`로 학습하고 `lerobot-eval`로 평가하기

더 넓은 범위의 EO-1 프로젝트에는 인터리브드 비전-텍스트-액션 사전 학습 및 멀티모달 추론 워크플로도 포함됩니다. 이 페이지는 LeRobot 로봇 제어 정책 경로에 초점을 맞춥니다.

## 설치 요구 사항

1. [설치 가이드](./installation)를 따라 LeRobot을 설치하세요.
2. 다음 명령을 실행하여 EO-1의 종속성을 설치합니다:

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

3. LIBERO에서 학습하거나 평가하려면 LIBERO의 종속성도 설치해야 합니다:

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

EO-1은 `policy.attn_implementation=sdpa`를 통해 표준 PyTorch scaled-dot-product attention 백엔드를 사용할 수 있습니다. 환경에 호환되는 `flash_attn` 설치 파일이 있는 경우 `policy.attn_implementation=flash_attention_2`를 요청할 수 있습니다.

## 데이터 요구 사항

EO-1은 다음을 포함하는 LeRobot 데이터셋을 기대합니다:

- `observation.images.image`와 같은 시각적 관찰이 최소 하나
- `observation.state`
- `action`
- 데이터셋의 `task` 필드를 통한 언어 작업 지침

데이터셋에 다른 관찰(observation) 이름이 사용되는 경우, `rename_map`을 사용하여 학습 또는 평가 설정에서 기대하는 이름과 일치시키세요.

## 사용

LeRobot 구성에서 EO-1을 사용하려면 정책 유형을 다음과 같이 지정하세요:

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

변환된 릴리스 체크포인트를 사용하여 EO-1의 인터리브드 비전-텍스트-액션 사전 학습을 시작합니다:

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

`lerobot/eo1-base`는 [`IPEC-COMMUNITY/EO-1-3B`](https://huggingface.co/IPEC-COMMUNITY/EO-1-3B)의 네이티브 LeRobot 변환 버전입니다. 공개된 Qwen 비전-언어 가중치와 학습된 flow-matching 액션 헤드를 그대로 유지합니다. 액션 청크 크기는 16으로, 업스트림 체크포인트와 일치합니다. 원래 Qwen 백본에서만 초기화하려면 `policy.path`를 생략하고 `policy.vlm_base=Qwen/Qwen2.5-VL-3B-Instruct`를 설정하세요.

다음으로 다른 fine-tuned LeRobot 형식의 EO-1 체크포인트를 로드합니다:

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

### 텍스트 생성 및 인터랙티브 제어

EO-1은 공유된 정책 텍스트 계약을 통해 Qwen 백본을 노출합니다. 런타임은 `query_kind`와 `query_text`를 추가한 후, 표준 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`는 호출자의 질문을 유지합니다. `next_subtask`는 EO-1 정책 설정에 저장된 레시피를 적용합니다. EO-1은 `generate_text(processed_batch)`를 상속하고 `supports_text_generation` 및 `generate_text`를 오버라이드하며, 별도의 VLM은 로드되지 않습니다.

인터랙티브 언어 런타임 덕분에 EO-1은 하위 작업을 생성하고 해당 현재 하위 작업에서 액션 프롬프트를 다시 구성할 수 있습니다:

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

`/start` 이후에는 `/vqa <question>`, `/autosteer <goal>`, 또는 `/subtask <text>`를 사용하세요.

## 학습

### 학습 명령어 예시

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

### 언어 주석으로 학습

`EO1Config`에는 LeRobot의 선택적 언어 열을 기반으로 학습하는 레시피가 포함되어 있습니다. 내장된 결합 레시피는 동일한 시퀀스에서 선택된 어시스턴트 응답과 해당 연속 동작 청크를 감독합니다:

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

Targeted assistant turns은 next-token cross-entropy를, `low_level` recipe streams은 flow-action supervision을 받습니다. 한 행(row)은 두 목적 함수 중 하나 또는 둘 다를 받을 수 있습니다. User prompts, images, state tokens, action tokens, padding은 text loss에서 제외됩니다. `policy.recipe=null`을 설정하면 recipe 렌더링을 비활성화하고 원래의 action-only 학습 경로를 사용합니다.

[Language columns and recipes](./language_and_recipes)에서 어노테이션 스키마와 레시피 구조를 확인하세요. `recipe_path`는 명시적인 외부 YAML 오버라이드를 가리킬 수 있으며, LeRobot은 공유된 기본 레시피 파일을 제공하지 않습니다. 기본 시스템 프롬프트는 EO1의 레시피 일부이며, 사용자 정의 시스템 턴으로 대체할 수 있습니다. 시스템 턴이 없는 렌더링된 입력, VQA 프롬프트를 포함하여, 시스템 턴 없이 유지됩니다. 렌더링된 메시지가 없는 액션 전용 경로는 기본 시스템 프롬프트를 유지합니다. `EO1PrepareModelMessagesStep`는 Qwen 포맷팅과 토큰화 전에 렌더링된 메시지에 이미지와 상태/액션 토큰을 추가합니다.

### 주요 학습 매개변수

| 매개변수                              | 기본값                       | 설명                                                             |
| -------------------------------------- | ----------------------------- | ----------------------------------------------------------------------- |
| `policy.path`                          | `lerobot/eo1-base`            | EO-1 가중치를 네이티브 LeRobot 형식으로 변환하여 출시                |
| `policy.vlm_base`                      | `Qwen/Qwen2.5-VL-3B-Instruct` | `policy.path` 없이 학습할 때만 사용되는 Qwen 프로세서/백본   |
| `policy.dtype`                         | `bfloat16`                    | Backbone dtype 요청: torch dtype 이름, 예: `bfloat16`, `float32`  |
| `policy.attn_implementation`           | `None`                        | `sdpa`와 같은 선택적 Qwen 어텐션 백엔드                         |
| `policy.gradient_checkpointing`        | `false`                       | 학습 중 메모리 사용량 감소                                    |
| `policy.chunk_size`                    | `16`                          | Number of future actions predicted per chunk                            |
| `policy.n_action_steps`                | `16`                          | 샘플링된 청크에서 소비된 액션의 수                         |
| `policy.num_denoise_steps`             | `10`                          | 샘플링 중에 사용되는 flow-matching 디노이징 단계 수            |
| `policy.max_state_dim`                 | `32`                          | 패딩 차원 상태                                                 |
| `policy.max_action_dim`                | `32`                          | 액션 패딩 차원                                                |
| `policy.force_fp32_autocast`           | `true`                        | backbone가 혼합 정밀도를 사용하더라도 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 형식의 체크포인트가 준비되면 `lerobot-eval`을 통해 EO-1을 평가할 수 있습니다:

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

체크포인트 구성과 카메라 이름이 다른 데이터셋 또는 환경의 경우, `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"}'
```

## 구성 참고 사항

### 이미지 처리

EO-1은 Qwen2.5-VL 프로세서를 사용합니다. `policy.image_min_pixels` 및 `policy.image_max_pixels` 설정은 시각 토큰이 백본으로 전달되기 전에 이미지가 리사이즈되는 범위를 제어합니다.

### 상태 및 행동 차원

정책은 EO-1 flow head에 전달하기 전에 상태 및 동작 벡터를 `policy.max_state_dim`과 `policy.max_action_dim`으로 패딩합니다. 예측 값은 정책이 반환하기 전에 원래의 동작 차원으로 다시 잘립니다.

### Attention 백엔드

이식 가능한 설정을 위해 `policy.attn_implementation=sdpa`를 사용하세요. `flash_attention_2`는 `flash_attn`가 설치되어 있고 현재 환경과 호환되는 경우에만 사용하세요.

## 참고

- [EO-1 프로젝트](https://github.com/EO-Robotics/EO1)
- [EO-1 논문](https://arxiv.org/abs/2508.21112)
- [Qwen2.5-VL-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct)

## 인용

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

## 라이선스

이 LeRobot 통합은 LeRobot에서 사용하는 **Apache 2.0 License**를 따릅니다. 공개된 EO-1 체크포인트와 데이터의 라이선스는 업스트림 EO-1 모델 및 데이터 페이지에서 확인하세요.

