LeRobot documentation
LingBot-VLA 2.0
LingBot-VLA 2.0
LingBot-VLA 2.0 adalah model vision-language-action dari Robbyant, penerus dari LingBot-VLA 1.0. Model ini menggabungkan backbone Qwen3-VL-4B dengan action expert Qwen2 berbasis sparse Mixture-of-Experts (32 expert, top-4 routing) dan menghasilkan action chunks menggunakan flow matching pada ruang state/action kanonik 55-D yang dibagikan di antara berbagai embodiments.
Port LeRobot adalah kebijakan lingbot_vla_v2. Ia menggunakan dataset LeRobot standar, prosesor, lerobot-train, lerobot-eval dan lerobot-rollout, termasuk distilasi kedalaman dan video dual-query dari upstream.
Untuk detail model, lihat repo upstream dan laporan teknis.
Instalasi
pip install -e ".[training,lingbot_vla_v2]"Tokenizer dan image processor Qwen3-VL dimuat dari Qwen/Qwen3-VL-4B-Instruct (--policy.tokenizer_path) saat processor dibangun. flash-attn tidak diperlukan; attention menggunakan PyTorch SDPA.
Checkpoint
| Checkpoint | Sumber | Gunakan |
|---|---|---|
lerobot/lingbot_vla_v2_base | robbyant/lingbot-vla-v2-6b, konversi format-only | Titik awal untuk fine-tuning. Fitur adalah tata letak kanonik 55-D penuh; berikan pemetaan slot untuk robot Anda. |
lerobot/lingbot_vla_v2_robotwin | robbyant/lingbot-vla-v2-6b-robotwin, langkah 50000 | Evaluasi RoboTwin 2.0. State/action 14-D, kamera cam_high, cam_left_wrist, cam_right_wrist, normalisasi QUANTILES (q01/q99). |
Muat salah satunya dengan --policy.path; tipe kebijakan dibaca dari config.json checkpoint.
Memetakan robot ke tata letak kanonik
Model melihat keadaan 55-D dan memprediksi aksi 55-D. Tata letak diatur oleh canonical_joints dalam konfigurasi:
| Slot | Dimensi | Konten |
|---|---|---|
arm.position | 14 | posisi sendi lengan |
end.position | 14 | pose end-effector |
effector.position | 2 | posisi gripper |
hand.position | 12 | sendi tangan yang lincah |
waist.position | 4 | sendi pinggang |
head.position | 2 | sendi kepala |
base.velocity | 3 | kecepatan dasar mobile |
reserved.slots | 4 | dicadangkan |
--policy.state_slots dan --policy.action_slots memetakan rentang observation.state dan action dari dataset Anda ke slot-slot ini, dalam format JSON:
{
"observation.state.arm.position": {
"origin_keys": [{ "observation.state": { "start": 0, "end": 5 } }]
}
}- Nama slot adalah nama kanonik di atas, secara opsional dengan awalan
observation.state.atauaction.. Nama yang tidak dikenal akan memicu error. - Setiap slot membaca satu atau lebih rentang
{start, end}dariobservation.state(slot state) atauaction(slot action). Rentang tersebut digabungkan dan dikemas dari awal slot; sisa slot diisi nol dan dikecualikan dari loss. - Tanpa pemetaan slot, fitur mentah diambil sebagai tata letak kanonik 55-D, seperti pada checkpoint dasar.
- Aksi relatif dimatikan secara default.
--policy.use_relative_actions=truemengurangkan keadaan saat ini dari aksi, kecuali untuk dimensi yang namanya mengandung entri dari--policy.relative_exclude_joints(default["gripper"]).
Postprocessor membalikkan pemetaan, sehingga select_action mengembalikan aksi dalam ruang aksi mentah robot Anda.
Checkpoint hasil fine-tuning menyimpan pemetaan slot dan statistik dataset bersama prosesor mereka.
Kamera
Langkah gambar membaca kamera yang terdaftar dalam input_features checkpoint, sesuai urutannya. Untuk checkpoint dasar, kameranya adalah camera_top, camera_wrist_left, dan camera_wrist_right. Petakan kamera dataset Anda ke kamera tersebut menggunakan --rename_map; tampilan yang tidak dimiliki robot Anda akan dimasker.
Fine-tuning
Contoh pada maximellerbach/omx_multicubes,
lengan tunggal dengan 5 sendi dan gripper serta dua kamera (top, wrist):
lerobot-train \
--dataset.repo_id=maximellerbach/omx_multicubes \
--policy.path=lerobot/lingbot_vla_v2_base \
--policy.state_slots='{"observation.state.arm.position": {"origin_keys": [{"observation.state": {"start": 0, "end": 5}}]}, "observation.state.effector.position": {"origin_keys": [{"observation.state": {"start": 5, "end": 6}}]}}' \
--policy.action_slots='{"action.arm.position": {"origin_keys": [{"action": {"start": 0, "end": 5}}]}, "action.effector.position": {"origin_keys": [{"action": {"start": 5, "end": 6}}]}}' \
--rename_map='{"observation.images.top": "observation.images.camera_top", "observation.images.wrist": "observation.images.camera_wrist_left"}' \
--policy.dtype=float32 \
--accelerator.mixed_precision=bf16 \
--policy.repo_id=your_repo_id \
--batch_size=1 \
--steps=30000 \
--save_freq=5000 \
--output_dir=outputs/train/lingbot_vla_v2_omxJaga bobot dalam fp32 dan hitung dalam bf16 (--policy.dtype=float32 --accelerator.mixed_precision=bf16), seperti yang dilakukan upstream. Dengan --policy.dtype=bfloat16, optimizer memperbarui bobot bf16 secara langsung, dan sebagian besar pembaruan terlalu kecil untuk mengubahnya: pada dataset ini 66% bobot tetap identik bit-untuk-bit dengan checkpoint dasar, dan kebijakan yang dihaluskan jauh lebih tidak mulus. Jalankan inferensi dalam fp32 juga (nilai default dari checkpoint yang dilatih dengan cara ini); inferensi bf16 membuat chunk aksi terasa jauh kurang mulus.
Statistik normalisasi berasal dari dataset. Pelatihan multi-GPU menggunakan launcher standar torchrun dengan flag --parallelism.* dan --accelerator.*. Bobot fp32, gradien, dan state optimizer membutuhkan sekitar 96 GB, jadi shard-kan dengan --parallelism.dp_shard=<num_gpus> jika satu GPU terlalu kecil.
Distilasi kueri ganda
LingBot-VLA 2.0 menambahkan token query yang dipelajari (kedalaman/video saat ini dan masa depan) setelah token bahasa, dan pakar aksi memperhatikan token tersebut. Kedua checkpoint membawa resep upstream di align_params, sehingga token query selalu digunakan saat inferensi. Selama pelatihan, kepala kecil membaca token tersebut dan didistilasi dari guru yang dibekukan (LingBot-Depth dengan MoGe-2, dan DINO-Video) dengan bobot kerugian upstream; kerugian tambahan dicatat sebagai depth_loss, future_depth_loss, current_video_loss dan future_video_loss.
Guru diunduh pada langkah pelatihan pertama (sekitar 3 GB dari robbyant/lingbot-vla-v2-6b dan Ruicheng/moge-2-vitb-normal), menggunakan sekitar 2 GB memori GPU, dan menambah sekitar 130 ms per sampel pada setiap langkah.
Setiap sampel juga memuat frame chunk_size - 1 langkah ke depan, yang dibutuhkan oleh target masa depan. Tidak ada proses tambahan
yang berjalan saat inferensi.
Parameter pelatihan utama
| Parameter | Default | Deskripsi |
|---|---|---|
state_slots / action_slots | null | Span mentah ke slot kanonik (lihat di atas). |
use_relative_actions | false | Latih pada aksi yang relatif terhadap keadaan saat ini. |
loss_type | L1_fm | Loss flow-matching pada kecepatan. |
normalization_mapping | state dan action MEAN_STD | Checkpoint RoboTwin menggunakan QUANTILES. |
train_expert_only | false | Bekukan backbone Qwen3-VL dan latih hanya action expert. |
freeze_vision_encoder | false | Bekukan menara visual. |
gradient_checkpointing | false | Hitung ulang aktivasi pada langkah mundur untuk menghemat memori dengan mengorbankan waktu langkah. |
use_moe_expert_lr | true | Ekspert yang di-rutekan dilatih pada lr * sqrt(num_experts / top_k), sesuai dengan upstream. |
optimizer_lr / scheduler_decay_lr | 1e-5 / 1e-5 | Laju pembelajaran puncak dan akhir AdamW. |
resize_imgs_with_padding | [256, 256] | Ukuran frame sebelum pemroses gambar Qwen3-VL, sesuai dengan hulu. |
image_max_pixels / image_min_pixels | 65536 / 65536 | Anggaran piksel Qwen3-VL: 64 token per kamera, sesuai dengan upstream. |
chunk_size / n_action_steps | 50 / 50 | Horizon prediksi dan jumlah aksi yang dieksekusi per chunk. |
num_steps | 10 | Langkah denoising saat inferensi. |
tokenizer_path | Qwen/Qwen3-VL-4B-Instruct | Tokenizer dan pemroses gambar Qwen3-VL. Gunakan jalur lokal secara offline. |
Untuk menyesuaikan dengan GPU yang lebih kecil, gabungkan --policy.train_expert_only=true dan --policy.gradient_checkpointing=true dengan --batch_size yang kecil.
Evaluasi
Evaluasi checkpoint RoboTwin di lingkungan RoboTwin LeRobot (lihat RoboTwin untuk pengaturan). Peta penamaan ulang menyelaraskan nama kamera env dengan checkpoint:
lerobot-eval \
--policy.path=lerobot/lingbot_vla_v2_robotwin \
--env.type=robotwin \
--env.task=beat_block_hammer \
--eval.batch_size=1 \
--eval.n_episodes=100 \
--rename_map='{"observation.images.head_camera": "observation.images.cam_high", "observation.images.left_camera": "observation.images.cam_left_wrist", "observation.images.right_camera": "observation.images.cam_right_wrist"}'Rata-rata keberhasilan pada 50 tugas RoboTwin 2.0 (masing-masing 100 episode), sebagaimana dilaporkan dalam README hulu untuk checkpoint RoboTwin yang dirilis (post-training Muon pada data bersih dan acak, inferensi FP32 dengan peluncur RoboTwin hulu). Angka-angka ini berasal dari hulu, bukan diukur melalui port ini.
| Pengaturan | π0.5 | LingBot-VLA 1.0 | LingBot-VLA 2.0 |
|---|---|---|---|
| Bersih | 82.74% | 88.56% | 93.52% |
| Acak | 76.76% | 86.68% | 92.80% |
Peningkatan kecepatan inferensi
Empat flag, semuanya nonaktif secara default, mempercepat select_action. Mereka membutuhkan CUDA dan bentuk input yang tetap, serta tidak memerlukan dependensi tambahan:
--policy.use_cudagraph_denoise=true: menangkap loop denoising sebagai satu grafik CUDA.--policy.use_cudagraph_prefix=true: menangkap pengisian KV prefix vision-language.--policy.use_cudagraph_prefix_full=true: juga menangkap menara visual dalam grafik prefiks.--policy.compile_predict_velocity=true:torch.compileuntuk prediksi kecepatan per langkah. Panggilan pertama akan melakukan kompilasi selama sekitar satu menit.
Waktunya untuk satu chunk aksi 50 langkah dengan 10 langkah denoising, checkpoint RoboTwin, satu RTX PRO 6000:
| Bendera | bf16 | fp32 |
|---|---|---|
| none | ~756 ms | ~614 ms |
| ketiga flag CUDA graph | ~180 ms | ~203 ms |
| ketiga flag CUDA graph + compile | ~120 ms | ~156 ms |
Pada bf16, CUDA graphs memberikan output yang sama dengan eager; torch.compile mengubah numerik sedikit.
Deployment
Jalankan checkpoint yang telah dihaluskan pada robot dengan lerobot-rollout, dengan meneruskan --rename_map yang sama seperti saat pelatihan:
lerobot-rollout \
--strategy.type=base \
--policy.path=outputs/train/lingbot_vla_v2_omx/checkpoints/last/pretrained_model \
--robot.type=<your_robot_type> \
--robot.port=<port> \
--task="pick up the cube" \
--fps=30 \
--device=cudaReal-Time Chunking tersedia dengan --inference.type=rtc, sama seperti kebijakan flow-matching lainnya.
Sitasi
@article{lingbotvla2,
title={From Foundation to Application: Improving VLA Models in Practice},
author={Wei Wu and Fangjing Wang and Fan Lu and He Sun and Shi Liu and Yunnan Wang and Yibin Yan and Yong Wang and Shuailei Ma and Xinyang Wang and Yibin Liu and Shuai Yang and Tianxiang Zhou and Kejia Zhang and Lei Zhou and Cheng Su and Nan Xue and Bin Tan and Han Zhang and Youchao Zhang and Fei Liao and Xing Zhu and Yujun Shen and Kecheng Zheng},
journal={arXiv preprint arXiv:2607.06403},
year={2026}
}Lisensi
Kode dan checkpoint yang dikonversi berlisensi Apache-2.0, sama seperti rilis upstream LingBot-VLA 2.0 dan Qwen3-VL.
Pelatihan distilasi mengunduh tiga guru beku di bawah lisensi mereka masing-masing (inferensi tidak pernah memuatnya):
| Guru | Bobot | Lisensi |
|---|---|---|
| MoGe-2 | Ruicheng/moge-2-vitb-normal | MIT |
| LingBot-Depth | robbyant/lingbot-vla-v2-6b (depth/) | Apache-2.0 |
| DINO-Video | robbyant/lingbot-vla-v2-6b (dino_video/) | Lisensi DINOv3 |
Bobot DINO-Video diturunkan dari DINOv3 milik Meta, sehingga pelatihan dengan distilasi berarti menggunakannya di bawah Lisensi DINOv3, yang di antara ketentuan lainnya meminta Anda untuk mengakui DINOv3 dalam publikasi dan membatasi beberapa penggunaan akhir.
Update on GitHub