# EVO1

EVO1, InternVL3 omurgası ve sürekli akış eşleştirme (flow-matching) eylem başlığı etrafında inşa edilmiş, robot kontrolü için bir Görüntü-Dil-Eylem (Vision-Language-Action) politikasıdır. Bu LeRobot entegrasyonu, EVO1'i standart bir politika türü olarak sunar; böylece standart LeRobot veri seti, checkpoint ve işlemci (processor) API'leriyle eğitilebilir ve değerlendirilebilir.

## Model Genel Bakış

Politika, bir veya daha fazla kamera görüntüsünü ve dil görevi istemini InternVL3 ile gömme (embedding) yapar, robot durum/aksiyon vektörlerini sabit maksimum boyutlara doldurur (padding) ve bir akış eşleştirme (flow-matching) aksiyon başlığı ile gelecekteki aksiyon parçacıklarını tahmin eder. Çıkarım sırasında politika, bir aksiyon parçacığı örnekler ve yeniden örneklemeye geçmeden önce bu parçacıktan `n_action_steps` aksiyon döndürür.

### LeRobot Entegrasyonunun Kapsamı

- LeRobot üzerinden standart `policy.type=evo1` yapılandırması
- Opsiyonel FlashAttention yedeği ile InternVL3 görsel/metin gömme
- Eylem başlığına özgü ve VLM ince ayar çalışmaları için aşama tabanlı ince ayar denetimleri
- Sürekli akış-eşleştirme eylem tahmini
- LeRobot politika API'leri üzerinden checkpoint kaydetme/yükleme
- `lerobot-train` ile eğitim ve standart politika çıkarım API'leri ile değerlendirme

Daha geniş kapsamlı EVO1 projesi ek eğitim betikleri ve veri seti araçlarını içerebilir. Bu sayfa, LeRobot robot kontrolü politikası yoluna odaklanmaktadır.

## Kurulum Gereksinimleri

1. LeRobot'u [Yükleme Kılavuzu](./installation)'nu izleyerek yükleyin.
2. EVO1 bağımlılıklarını yükleyin:

   ```bash
   pip install -e ".[training,evo1]"
   ```

   LIBERO eğitimi ve değerlendirmesi için LIBERO ek paketini de yükleyin:

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

3. `flash-attn` tekerleğini yalnızca Python, PyTorch, CUDA ve GPU yığınıyla uyumluysa yükleyin. `flash_attn` kullanılamıyorsa EVO1 standart dikkate geri düşer.

EVO1, yerel Hugging Face `transformers` InternVL uygulamasını kullandığından `policy.vlm_model_name`, `OpenGVLab/InternVL3-1B-hf` gibi yerel olarak dönüştürülmüş bir kontrol noktasına işaret etmelidir (dikkat edin `-hf` son eki). İlk çalıştırma, yapılandırılan VLM kontrol noktasını indirir ve sonraki çalıştırmalar bunu Hugging Face önbelleğinden yeniden kullanır.

## Veri Gereksinimleri

EVO1, aşağıdaki özelliklere sahip bir LeRobot veri seti bekler:

- Örneğin `observation.images.image` gibi, `policy.max_views`'a kadar görsel gözlemler
- `observation.state`
- `action`
- Veri setindeki `task` alanındaki dil görevi talimatı veya `policy.task_field` ile yapılandırılmış başka bir alan

Durum ve eylem vektörleri `policy.max_state_dim` ve `policy.max_action_dim` boyutlarına kadar doldurulur. Tahminler, döndürülmeden önce veri seti eylem boyutuna kırpılır.

## Kullanım

LeRobot yapılandırmasında EVO1'i kullanmak için şunları belirtin:

```python
policy.type=evo1
```

Varsayılan olarak, yeni bir EVO1 politikası VLM'ini şundan başlatır:

```python
policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf
```

LeRobot formatında bir EVO1 kontrol noktası kullanılabilir olduğunda, onu şu şekilde yükleyin:

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

## Eğitim

### Aşama 1

Aşama 1, VLM'yi dondurur ve eylem başını eğitir:

```bash
lerobot-train \
  --dataset.repo_id=your_org/your_dataset \
  --policy.type=evo1 \
  --policy.training_stage=stage1 \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.optimizer_lr=1e-5 \
  --batch_size=4 \
  --steps=5000 \
  --output_dir=./outputs/evo1_stage1
```

### Aşama 2

Stage 2, Stage 1 politikasını yükler ancak yeni bir optimizör ve zamanlayıcı başlatır:

```bash
lerobot-train \
  --dataset.repo_id=your_org/your_dataset \
  --policy.path=./outputs/evo1_stage1/checkpoints/005000/pretrained_model \
  --policy.training_stage=stage2 \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.optimizer_lr=1e-5 \
  --batch_size=4 \
  --steps=80000 \
  --output_dir=./outputs/evo1_stage2
```

Varsayılan olarak, `policy.training_stage` ilgili aşama için ince ayar varsayılanlarını yeniden uygular. Stage 1 kontrol noktasından Stage 2'ye başlanırken bu önemlidir, çünkü Stage 1 kontrol noktası yapılandırması VLM ince ayar bayraklarını devre dışı olarak saklar. `policy.apply_training_stage_defaults=false` olmadıkça, bu aşama varsayılanları, kaydedilen veya manuel olarak sağlanan `policy.finetune_*` bayraklarından önceliklidir; bu nedenle bu bayrağı yalnızca tüm ince ayar bayraklarını manuel olarak kontrol ettiğinizde ayarlayın.

### Temel Eğitim Parametreleri

| Parametre                                     | Varsayılan                     | Açıklama                                                       |
| --------------------------------------------- | --------------------------- | ----------------------------------------------------------------- |
| `policy.vlm_model_name`                       | `OpenGVLab/InternVL3-1B-hf` | Yerel olarak dönüştürülmüş InternVL3 checkpoint'i veya yerel model dizini  |
| `policy.training_stage`                       | `stage1`                    | `stage1` eylem başlığını eğitir; `stage2` VLM dallarını ince ayarlar  |
| `policy.apply_training_stage_defaults`        | `true`                      | Kontrol noktası yüklendikten sonra aşama ince ayar varsayılanlarını yeniden uygular    |
| `policy.vlm_num_layers`                       | `14`                        | Politika için korunan InternVL3 dil katmanı sayısı           |
| `policy.dtype`                                | `bfloat16`                  | İstenen VLM dtype                                               |
| `policy.use_flash_attn`                       | `true`                      | Yüklüyse FlashAttention ister; değilse geriye düşer      |
| `policy.enable_gradient_checkpointing`        | `true`                      | Desteklenen InternVL3 modüllerinde checkpointing'i etkinleştirir              |
| `policy.gradient_checkpointing_use_reentrant` | `false`                     | Desteklendiğinde gradient checkpointing'e iletilen reentrant ayarı |
| `policy.chunk_size`                           | `50`                        | Her parça için tahmin edilen gelecek eylem sayısı                      |
| `policy.n_action_steps`                       | `50`                        | Örnekleme biriminden tüketilen eylem sayısı                   |
| `policy.max_state_dim`                        | `24`                        | Dolgu boyutunu belirt                                           |
| `policy.max_action_dim`                       | `24`                        | Eylem dolgu boyutu                                          |
| `policy.postprocess_action_dim`               | `null`                      | EVO1 son işlemeden sonra döndürülen isteğe bağlı eylem boyutu      |
| `policy.binarize_gripper`                     | `false`                     | LIBERO tarzı değerlendirme için işlenmiş gripper kanalını ikileştirir |
| `policy.task_field`                           | `task`                      | Dil istemi olarak kullanılan batch alanı                           |

## Çıkarım

Eğitilmiş bir EVO1 kontrol noktasıyla deneyin:

```bash
# --inference.type=rtc is optional
lerobot-rollout \
  --policy.path=your-org/your-evo1-checkpoint \
  --inference.type=rtc \
  ...
```

## Sonuçlar

### LIBERO Değerlendirmesi

#### Referans sonucu

> [!NOTE]
> Yayınlanan Stage-2 checkpoint, temiz indirme ve rollout doğrulamasından başarıyla geçti: [`zuoxingdong/evo1_libero`](https://huggingface.co/zuoxingdong/evo1_libero), revizyon [`515921f4a2c1d3f3ad523721eafa26fdf2af315b`](https://huggingface.co/zuoxingdong/evo1_libero/commit/515921f4a2c1d3f3ad523721eafa26fdf2af315b). Temiz indirme değerlendirmesi, LeRobot revizyonu [`e40b58a8dfa9e7b86918c374791599d070518d11`](https://github.com/huggingface/lerobot/commit/e40b58a8dfa9e7b86918c374791599d070518d11) kullanılarak gerçekleştirildi.

70.000. adımdaki tek çalışımlı Stage-2 kontrol noktası şunu üretti:

| Suite          | Başarılı bölümler |  Bölümler | Başarı oranı |
| -------------- | ------------------: | --------: | -----------: |
| LIBERO Uzamsal |                 485 |       500 |        97.0% |
| LIBERO Nesne  |                 496 |       500 |        99.2% |
| LIBERO Hedef    |                 483 |       500 |        96.6% |
| LIBERO-10      |                 469 |       500 |        93.8% |
| **Genel**    |           **1,933** | **2,000** |   **96.65%** |

Bu sonuçlar, tek bir eğitilmiş checkpoint ve `1000` değerlendirme tohumu kullanılarak elde edilmiştir; bunlar çoklu tohum ortalaması veya güven tahmini değildir.

#### Referans eğitim tarifi

Yayınlanan checkpoint, tam olarak çözümlenmiş Stage-2 yapılandırmasını [`train_config.json`](https://huggingface.co/zuoxingdong/evo1_libero/blob/515921f4a2c1d3f3ad523721eafa26fdf2af315b/train_config.json) dosyasında kaydeder. Ölçülen çalıştırma, iki DDP süreci ve süreç başına 64 batch ile iki H100 GPU kullandı; bu da 128 küresel batch değerine karşılık gelir. Her iki aşama da aynı topolojiyi kullandı. Temel VLM, `OpenGVLab/InternVL3-1B-hf` deposunun `014c0583a0d4bedf29fbe2dbff4f865eb998e171` revizyonundan geldi. Yayınlanan artefakt, tam LeRobot eğitim commit'ini veya orijinal bağımlılık kilidini kaydetmediğinden, aşağıdaki komutlar yazılım ortamını bit bit yeniden oluşturmak yerine, mevcut bir checkout üzerinden kaydedilen yapılandırmayı ve topolojiyi yeniden üretir.

LeRobot kaynak kodundan, kilitlenmiş bağımlılıkları yükleyin ve tam olarak o VLM revizyonunu indirin:

```bash
uv sync --locked --extra training --extra evo1 --extra libero
VLM_DIR=$(uv run hf download OpenGVLab/InternVL3-1B-hf \
  --revision=014c0583a0d4bedf29fbe2dbff4f865eb998e171)
```

Aşama 1, VLM'yi dondurur ve 5.000 adım boyunca eylem başını eğitir:

```bash
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=lerobot/libero \
  --dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
  --dataset.video_backend=torchcodec \
  --dataset.return_uint8=true \
  --dataset.image_transforms.enable=true \
  --dataset.use_imagenet_stats=true \
  --dataset.eval_split=0.0 \
  --policy.type=evo1 \
  --policy.training_stage=stage1 \
  --policy.apply_training_stage_defaults=true \
  --policy.vlm_model_name="${VLM_DIR}" \
  --policy.vlm_num_layers=14 \
  --policy.dtype=bfloat16 \
  --policy.device=cuda \
  --policy.use_amp=true \
  --policy.use_flash_attn=true \
  --policy.enable_gradient_checkpointing=true \
  --policy.gradient_checkpointing_use_reentrant=false \
  --policy.image_resolution='[448,448]' \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.dropout=0.2 \
  --policy.optimizer_lr=1e-5 \
  --policy.optimizer_weight_decay=1e-3 \
  --policy.optimizer_grad_clip_norm=1.0 \
  --policy.scheduler_warmup_steps=1000 \
  --policy.push_to_hub=false \
  --use_policy_training_preset=true \
  --batch_size=64 \
  --steps=5000 \
  --save_checkpoint=true \
  --save_checkpoint_to_hub=false \
  --save_freq=2500 \
  --log_freq=10 \
  --env_eval_freq=0 \
  --num_workers=4 \
  --prefetch_factor=2 \
  --persistent_workers=true \
  --seed=1000 \
  --trackio.enable=false \
  --output_dir=./outputs/evo1-libero-stage1-g128-5k
```

Stage 2, Stage-1 politikasını yükler ancak yeni bir optimizör ve zamanlayıcı başlatır. 80.000 adım boyunca eğitim yapılır; raporlanan kontrol noktası, 70.000. adımda kaydedilen kontrol noktasıdır:

```bash
uv run accelerate launch --num_processes=2 -m lerobot.scripts.lerobot_train \
  --dataset.repo_id=lerobot/libero \
  --dataset.revision=a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4 \
  --dataset.video_backend=torchcodec \
  --dataset.return_uint8=true \
  --dataset.image_transforms.enable=true \
  --dataset.use_imagenet_stats=true \
  --dataset.eval_split=0.0 \
  --policy.path=./outputs/evo1-libero-stage1-g128-5k/checkpoints/005000/pretrained_model \
  --policy.training_stage=stage2 \
  --policy.apply_training_stage_defaults=true \
  --policy.vlm_model_name="${VLM_DIR}" \
  --policy.vlm_num_layers=14 \
  --policy.dtype=float32 \
  --policy.device=cuda \
  --policy.use_amp=true \
  --policy.use_flash_attn=true \
  --policy.enable_gradient_checkpointing=true \
  --policy.gradient_checkpointing_use_reentrant=false \
  --policy.image_resolution='[448,448]' \
  --policy.chunk_size=50 \
  --policy.n_action_steps=50 \
  --policy.max_state_dim=24 \
  --policy.max_action_dim=24 \
  --policy.dropout=0.2 \
  --policy.optimizer_lr=1e-5 \
  --policy.optimizer_weight_decay=1e-3 \
  --policy.optimizer_grad_clip_norm=1.0 \
  --policy.scheduler_warmup_steps=1000 \
  --policy.push_to_hub=false \
  --use_policy_training_preset=true \
  --batch_size=64 \
  --steps=80000 \
  --resume=false \
  --save_checkpoint=true \
  --save_checkpoint_to_hub=false \
  --save_freq=10000 \
  --log_freq=10 \
  --env_eval_freq=0 \
  --num_workers=4 \
  --prefetch_factor=2 \
  --persistent_workers=true \
  --seed=1000 \
  --trackio.enable=false \
  --output_dir=./outputs/evo1-libero-stage2-g128-80k
```

#### Yazar biçimi değerlendirme profili

Yazar formatındaki EVO1 LIBERO profili, ham LIBERO kamera özellik adlarını (`observation.images.agentview_image` ve `observation.images.robot0_eye_in_hand_image`) kullanır, her 14 eylemde yeniden planlama yapar ve simülatörü ilerletmeden önce gripper komutunu ikileştirir. EVO1 politikası son işlemcisi, dolgulu 24B eylemi 7B LIBERO eylem uzayına geri kırpabilir ve bu gripper ikileştirmesini uygulayabilir. Bir yazar formatı kontrol noktasını aynı görev başına bir bölüm ayarında değerlendirmek için, varsayılan `image`/`image2` eşlemesi yerine ham kamera adlarını koruyun ve LIBERO eylem son işleme bayraklarını ayarlayın:

```bash
lerobot-eval \
  --policy.path=your-org/your-evo1-libero-checkpoint \
  --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
  --policy.device=cuda \
  --policy.use_flash_attn=true \
  --policy.n_action_steps=14 \
  --policy.postprocess_action_dim=7 \
  --policy.binarize_gripper=true \
  --env.type=libero \
  --env.task=libero_object \
  --env.camera_name_mapping="{agentview_image: agentview_image, robot0_eye_in_hand_image: robot0_eye_in_hand_image}" \
  --env.observation_height=448 \
  --env.observation_width=448 \
  --eval.batch_size=1 \
  --eval.n_episodes=1
```

#### Yerel `lerobot/libero` v3 profili

Revizyon `a1aaacb7f6cd6ee5fb43120f673cebb0cfea7dd4`, kamera özelliklerini `image` ve `image2` olarak saklar. Bu örnek, her görevi taze bir süreçte başlatarak on LIBERO Object görevinin tamamını değerlendirir:

```bash
export MUJOCO_GL=egl
export PYOPENGL_PLATFORM=egl

suite=libero_object
horizon=280
for task_id in {0..9}; do
  lerobot-eval \
    --policy.path=zuoxingdong/evo1_libero \
    --policy.pretrained_revision=515921f4a2c1d3f3ad523721eafa26fdf2af315b \
    --policy.vlm_model_name=OpenGVLab/InternVL3-1B-hf \
    --policy.device=cuda \
    --policy.use_amp=true \
    --policy.dtype=bfloat16 \
    --policy.use_flash_attn=false \
    --policy.enable_gradient_checkpointing=false \
    --policy.vlm_num_layers=14 \
    --policy.image_resolution='[448,448]' \
    --policy.max_text_length=1024 \
    --policy.chunk_size=50 \
    --policy.n_action_steps=14 \
    --policy.max_state_dim=24 \
    --policy.max_action_dim=24 \
    --policy.num_inference_timesteps=32 \
    --policy.postprocess_action_dim=7 \
    --policy.binarize_gripper=true \
    --policy.gripper_threshold=0.0 \
    --policy.gripper_below_threshold_value=-1.0 \
    --policy.gripper_above_threshold_value=1.0 \
    --env.type=libero \
    --env.task="${suite}" \
    --env.task_ids="[${task_id}]" \
    --env.camera_name=agentview_image,robot0_eye_in_hand_image \
    --env.camera_name_mapping="{agentview_image: image, robot0_eye_in_hand_image: image2}" \
    --env.control_mode=relative \
    --env.obs_type=pixels_agent_pos \
    --env.observation_width=448 \
    --env.observation_height=448 \
    --env.init_states=true \
    --env.episode_length="${horizon}" \
    --env.render_mode=rgb_array \
    --env.max_parallel_tasks=1 \
    --eval.n_episodes=50 \
    --eval.batch_size=1 \
    --eval.use_async_envs=false \
    --eval.recording=false \
    --seed=1000 \
    --output_dir="./outputs/evo1-libero-stage2-70k-eval/${suite}/task-${task_id}" \
    --job_name="evo1-libero-stage2-70k-${suite}-task-${task_id}"
done
```

Her suite için bu ufuklarla on görev kimliğinin tamamını çalıştırın:

| `env.task`       | `env.episode_length` |
| ---------------- | -------------------: |
| `libero_spatial` |                `280` |
| `libero_object`  |                `280` |
| `libero_goal`    |                `300` |
| `libero_10`      |                `520` |

Her satır için `suite` ve `horizon` değerlerini ayarlayın. Bu, her suite için 500 ve toplamda 2.000 episode sağlar; ayrıca döngünün görev başına yeni süreç oluşturması, ölçülen RNG sıfırlama topolojisiyle eşleşir.

## Referanslar

- [EVO1 deposu](https://github.com/MINT-SJTU/Evo-1)
- [InternVL3-1B-hf](https://huggingface.co/OpenGVLab/InternVL3-1B-hf)

## Lisans

Bu LeRobot entegrasyonu, LeRobot tarafından kullanılan Apache 2.0 Lisansını takip eder. Yayınlanan checkpoint ve verilerin lisansları için upstream EVO1 ve InternVL3 model sayfalarını kontrol edin.

