LeRobot documentation

LingBot-VLA 2.0

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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

CheckpointSumberGunakan
lerobot/lingbot_vla_v2_baserobbyant/lingbot-vla-v2-6b, konversi format-onlyTitik awal untuk fine-tuning. Fitur adalah tata letak kanonik 55-D penuh; berikan pemetaan slot untuk robot Anda.
lerobot/lingbot_vla_v2_robotwinrobbyant/lingbot-vla-v2-6b-robotwin, langkah 50000Evaluasi 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:

SlotDimensiKonten
arm.position14posisi sendi lengan
end.position14pose end-effector
effector.position2posisi gripper
hand.position12sendi tangan yang lincah
waist.position4sendi pinggang
head.position2sendi kepala
base.velocity3kecepatan dasar mobile
reserved.slots4dicadangkan

--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. atau action.. Nama yang tidak dikenal akan memicu error.
  • Setiap slot membaca satu atau lebih rentang {start, end} dari observation.state (slot state) atau action (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=true mengurangkan 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_omx

Jaga 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

ParameterDefaultDeskripsi
state_slots / action_slotsnullSpan mentah ke slot kanonik (lihat di atas).
use_relative_actionsfalseLatih pada aksi yang relatif terhadap keadaan saat ini.
loss_typeL1_fmLoss flow-matching pada kecepatan.
normalization_mappingstate dan action MEAN_STDCheckpoint RoboTwin menggunakan QUANTILES.
train_expert_onlyfalseBekukan backbone Qwen3-VL dan latih hanya action expert.
freeze_vision_encoderfalseBekukan menara visual.
gradient_checkpointingfalseHitung ulang aktivasi pada langkah mundur untuk menghemat memori dengan mengorbankan waktu langkah.
use_moe_expert_lrtrueEkspert yang di-rutekan dilatih pada lr * sqrt(num_experts / top_k), sesuai dengan upstream.
optimizer_lr / scheduler_decay_lr1e-5 / 1e-5Laju 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_pixels65536 / 65536Anggaran piksel Qwen3-VL: 64 token per kamera, sesuai dengan upstream.
chunk_size / n_action_steps50 / 50Horizon prediksi dan jumlah aksi yang dieksekusi per chunk.
num_steps10Langkah denoising saat inferensi.
tokenizer_pathQwen/Qwen3-VL-4B-InstructTokenizer 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.5LingBot-VLA 1.0LingBot-VLA 2.0
Bersih82.74%88.56%93.52%
Acak76.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.compile untuk 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:

Benderabf16fp32
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=cuda

Real-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):

GuruBobotLisensi
MoGe-2Ruicheng/moge-2-vitb-normalMIT
LingBot-Depthrobbyant/lingbot-vla-v2-6b (depth/)Apache-2.0
DINO-Videorobbyant/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