# Long-WAM

[Makalah](https://arxiv.org/abs/2610.10528) · [Proyek dan demo](https://nvlabs.github.io/LongLive/Long-WAM/) · [Kode](https://github.com/NVlabs/LongLive/tree/main/Long-WAM)

Long-WAM adalah model dunia-aksi berkonteks panjang: model ini menggunakan instruksi bahasa, status robot, dan riwayat visual untuk memprediksi dinamika masa depan dan menghasilkan aksi.

## Ringkasan model

- **Belajar menggunakan riwayat.** Pra-pelatihan video autoregressive LongLive2.0-Robot mempelajari ketergantungan dari riwayat ke masa depan sebelum adaptasi ke aksi robot.
- **Prediksi, lalu bertindak.** IDM mengondisikan generasi aksi pada riwayat yang diamati dan latens masa depan yang diprediksi, tanpa mendekode gambar RGB masa depan.
- **Skalakan konteks temporal.** Jendela observasi yang lebih panjang menangkap gerakan dan kemajuan tugas; panjang riwayat dipisahkan dari cakupan aksi.

LeRobot mendukung baik IDM maupun co-denoising video/aksi bersama (COD), dengan pemuatan checkpoint native, fine-tuning, dan inferensi chunk aksi sinkron. Backbone Wan berasal dari Diffusers dan encoder teks UMT5 berasal dari Transformers.

## Hasil

Hasil `lerobot-eval` yang dilaporkan untuk checkpoint [IDM](https://huggingface.co/Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot/tree/92f09103e0393b09b06a439895c800a0a198ba57) dan [COD](https://huggingface.co/Efficient-Large-Model/Long-WAM-LIBERO-COD-LeRobot/tree/8d5ff0fc4aabf926179ddecf1c57469867047272) LeRobot-native yang dipublikasikan:

| Suite          | Tingkat keberhasilan IDM | Tingkat keberhasilan COD | Episode per model |
| -------------- | ---------------: | ---------------: | -----------------: |
| libero_spatial |            99.4% |            98.6% |                500 |
| libero_object  |            99.8% |            99.6% |                500 |
| libero_goal    |            97.8% |            98.2% |                500 |
| libero_10      |            99.0% |            97.4% |                500 |
| **Rata-rata**    |       **99.00%** |       **98.45%** |           **2000** |

Lihat [Evaluation](#evaluation) untuk contoh perintah dan batas episode. Perintah diuji pada NVIDIA GB200 dengan BF16 dan inferensi sinkron.

## Instal

Dari checkout sumber LeRobot:

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

## Checkpoint

Checkpoint asli LeRobot mencakup bobot model lengkap dan pre/post-processor yang disimpan. Tokenizer dimuat dari `google/umt5-xxl`.

| Mode | Inferensi                                  | Checkpoint                                                                             |
| ---- | ------------------------------------------ | -------------------------------------------------------------------------------------- |
| IDM  | Bayangkan video masa depan, lalu hilangkan derau pada aksi | [LIBERO IDM](https://huggingface.co/Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot) |
| COD  | Denoise video dan aksi secara bersama-sama          | [LIBERO COD](https://huggingface.co/Efficient-Large-Model/Long-WAM-LIBERO-COD-LeRobot) |

Keduanya menggunakan riwayat P48 (2,4 s pada 20 Hz), dua tampilan kamera 224×224, aksi 7-D, dan status robot 8-D. Gunakan checkpoint yang sesuai dengan mode denoising yang diinginkan; bundle `model.pt` asli Long-WAM tidak dapat dimuat secara langsung.

## Kebutuhan data

Gunakan dataset LeRobot dengan kamera RGB, `observation.state`, `action`, dan instruksi tugas. Kunci kamera LIBERO yang dirilis adalah `observation.images.image` dan `observation.images.image2`, dalam urutan tersebut. Sediakan tensor RGB dalam `[0, 1]`; prosesor akan mengubah ukuran dan memotong tengah setiap tampilan, dan kebijakan akan menggabungkan tampilan secara horizontal. Pastikan urutan kamera dan konvensi aksi/keadaan selaras dengan checkpoint.

## Inferensi

```python
from lerobot.policies import make_pre_post_processors
from lerobot.policies.longwam.modeling_longwam import LongWAMPolicy

checkpoint = "Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot"
policy = LongWAMPolicy.from_pretrained(checkpoint).to("cuda").eval()
preprocess, postprocess = make_pre_post_processors(
    policy.config,
    pretrained_path=checkpoint,
    preprocessor_overrides={"device_processor": {"device": "cuda"}},
)
policy.reset()
# observation contains both current camera images, observation.state, and task.
# Repeat on every control tick, including ticks that consume queued actions.
action = postprocess(policy.select_action(preprocess(observation)))
```

Panggil `select_action` pada **setiap control tick**, termasuk saat action chunk sedang dieksekusi, agar riwayat tetap mutakhir. `predict_action_chunk` mengembalikan `[batch, prediction_steps, action_dim]`; setiap panggilan mencatat frame saat ini yang diberikan. `reset()` dan `drop_queued_actions()` membersihkan kedua riwayat dan action yang antre. Generic async/RTC belum divalidasi dalam integrasi ini.

Secara default, `inference_seed=1` memulai ulang generator noise video/aksi yang terpisah dengan seed yang sama untuk setiap chunk, sehingga mempertahankan perilaku inferensi yang dirilis. Atur `inference_seed=None` di Python (`--policy.inference_seed=null` di CLI) untuk menggunakan RNG global yang maju; `reset()` tidak mengatur ulang seed untuk stream tersebut. Pelatihan selalu mengambil sampel noise baru.

## Evaluasi

Instal tambahan benchmark dan evaluasi checkpoint native:

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

lerobot-eval --policy.path=Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot \
  --policy.device=cuda --policy.dtype=bfloat16 \
  --env.type=libero --env.task=libero_spatial \
  --env.observation_height=256 --env.observation_width=256 \
  --env.episode_length=300 \
  --eval.batch_size=1 --eval.n_episodes=50 --seed=1
```

Gunakan `libero_object` atau `libero_goal` untuk suite pendek lainnya. Untuk LIBERO-Long, atur `--env.task=libero_10 --env.episode_length=600`. Ganti `IDM` dengan `COD` di path checkpoint untuk mengevaluasi co-denoising.

### Riwayat dan pengelompokan aksi

| Parameter                  | Arti                                    | Nilai LIBERO yang dirilis |
| -------------------------- | ------------------------------------------ | --------------------- |
| `past_obs_steps`           | Tick kontrol masa lalu yang dipertahankan                | 48                    |
| `video_stride`             | Kontrol tick di antara bingkai video yang disampel | 4                     |
| `future_video_steps`       | Horizon pengawasan video masa depan           | 32                    |
| `action_horizon`           | Panjang chunk aksi pelatihan               | 32                    |
| `inference_action_horizon` | Panjang chunk aksi yang diprediksi              | 80                    |
| `n_action_steps`           | Aksi yang dieksekusi sebelum prediksi baru   | 10                    |

Durasi riwayat adalah `past_obs_steps / control_frequency`. Riwayat awal diisi dengan observasi pertama. Gunakan checkpoint yang dilatih untuk riwayat yang dimaksud; mengubah jendela pada saat inferensi bukanlah pelatihan penskalaan konteks.

## Fine-tuning

```bash
lerobot-train --policy.path=Efficient-Large-Model/Long-WAM-LIBERO-IDM-LeRobot \
  --policy.device=cuda --policy.dtype=bfloat16 \
  --accelerator.mixed_precision=bf16 \
  --dataset.repo_id=YOUR_ORG/YOUR_DATASET \
  --output_dir=outputs/longwam --batch_size=1 --steps=30000 \
  --policy.push_to_hub=false
```

`--policy.dtype` memilih penyimpanan parameter **sebelum dimuat**; gradien dan momen AdamW native menggunakan dtype tersebut. `--accelerator.mixed_precision` mengontrol autocast, bukan bobot master FP32. Contoh ini menggunakan BF16 untuk keduanya, sesuai dengan [dtype parameter asli](https://github.com/NVlabs/LongLive/blob/1b9e348897cafa206fc6dd6feb80b59e2a8b1aa9/Long-WAM/src/longwam/runtime/factory.py#L616-L619). Untuk parameter/gradien/momen FP32 dengan autocast BF16, gunakan `--policy.dtype=float32 --accelerator.mixed_precision=bf16`; VAE dan text encoder yang dibekukan juga menggunakan FP32, sehingga meningkatkan memori. Pilih ini sebelum memuat: meng-cast bobot yang dimuat sebagai BF16 ke FP32 tidak dapat memulihkan presisi yang hilang.

Postprocessor gripper yang dirilis mengubah dimensi aksi terakhir dari `[0, 1]` menjadi perintah bertanda. Gunakan `--policy.toggle_action_dimensions=[]` jika data fine-tuning Anda sudah menggunakan konvensi buka/tutup bertanda dari lingkungan. Pengaturan aktif juga berlaku untuk prosesor yang disimpan; `postprocessor_overrides` yang eksplisit memiliki prioritas lebih tinggi. Statistik normalisasi yang disimpan dipertahankan kecuali di-override, sehingga selaraskan dengan data fine-tuning Anda.

Pelatihan mengawasi chunk video dan aksi masa depan; inferensi hanya menerima observasi masa lalu/saat ini. Sesuaikan `--batch_size` sesuai memori GPU dan pertahankan urutan kamera checkpoint, definisi aksi/keadaan, serta mode denoising.

## Sitasi

```bibtex
@misc{huang2026longwamscalingcontextworldaction,
  title={Long-WAM: Scaling the Context of World-Action Models},
  author={Wei Huang and Bohan Zhang and Chenzhi Liu and Isabella Liu and
          Shuai Yang and Weian Mao and Luozhou Wang and Yicheng Xiao and
          Weifeng Lin and Qixin Hu and Bryan Chu and Sifei Liu and
          Linxi Fan and Xiaojuan Qi and Song Han and Yukang Chen},
  year={2026},
  eprint={2610.10528},
  archivePrefix={arXiv},
  primaryClass={cs.RO},
  url={https://arxiv.org/abs/2610.10528},
}
```

