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, Robbyant’ın LingBot-VLA 1.0’ın devamı niteliğindeki görme-dil-aksiyon modelidir. Qwen3-VL-4B omurgasını, seyrek Uzmanlar Karışımı (Mixture-of-Experts) Qwen2 aksiyon uzmanıyla (32 uzman, top-4 yönlendirme) eşleştirir ve tüm vücut yapıları arasında paylaşılan 55 boyutlu kanonik durum/aksiyon uzayında akış eşleştirmesi (flow matching) üzerinden aksiyon parçacıkları üretir.

LeRobot portu, lingbot_vla_v2 politikasıdır. Standart LeRobot veri setlerini, işlemcilerini, lerobot-train, lerobot-eval ve lerobot-rollout bileşenlerini, ayrıca upstream'in çift sorgulu derinlik ve video damıtmasını kullanır.

Model detayları için upstream repository ve teknik rapor başlıklarına bakın.

Kurulum

pip install -e ".[training,lingbot_vla_v2]"

İşleyici oluşturulurken Qwen3-VL belirteçleyicisi ve görüntü işleyicisi Qwen/Qwen3-VL-4B-Instruct (--policy.tokenizer_path) adresinden yüklenir. flash-attn gerekmez; dikkat mekanizması PyTorch SDPA kullanır.

Kontrol Noktaları

Kontrol NoktasıKaynakKullan
lerobot/lingbot_vla_v2_baserobbyant/lingbot-vla-v2-6b, yalnızca biçim dönüşümüİnce ayar için başlangıç noktası. Özellikler, tam 55 boyutlu kanonik yerleşimdir; robotunuz için yuva eşlemelerini iletin.
lerobot/lingbot_vla_v2_robotwinrobbyant/lingbot-vla-v2-6b-robotwin, adım 50000RoboTwin 2.0 değerlendirmesi. 14 boyutlu durum/aksiyon, kameralar cam_high, cam_left_wrist, cam_right_wrist, QUANTILES (q01/q99) normalizasyonu.

Bunlardan birini --policy.path ile yükleyin; politika türü, kontrol noktasının config.json dosyasından okunur.

Bir robotun kanonik yerleşime eşlenmesi

Model 55 boyutlu bir durum görür ve 55 boyutlu eylemler tahmin eder. Yerleşim, yapılandırmadaki canonical_joints tarafından belirlenir:

SlotBoyutlarİçerik
arm.position14kol eklem konumları
end.position14uç-efektör pozları
effector.position2gripper konumları
hand.position12çevik el eklemleri
waist.position4bel eklemleri
head.position2baş eklem noktaları
base.velocity3mobil taban hızı
reserved.slots4rezerve

--policy.state_slots ve --policy.action_slots, veri setinizin observation.state ve action aralıklarını bu yuvalara JSON olarak eşler:

{
  "observation.state.arm.position": {
    "origin_keys": [{ "observation.state": { "start": 0, "end": 5 } }]
  }
}
  • Slot adları, yukarıdaki kanonik adlardır; isteğe bağlı olarak observation.state. veya action. önekiyle kullanılabilirler. Bilinmeyen adlar bir hata oluşturur.
  • Her slot, observation.state (durum slotları) veya action (eylem slotları) içinden bir veya daha fazla {start, end} aralığını okur. Aralar, slotun başından itibaren birleştirilir ve paketlenir; slotun geri kalanı sıfır ile doldurulur ve kayıptan (loss) hariç tutulur.
  • Slot eşlemesi olmadan, ham özellikler, temel kontrol noktasında olduğu gibi 55 boyutlu kanonik yerleşim olarak alınır.
  • Göreceli eylemler varsayılan olarak kapalıdır. --policy.use_relative_actions=true, adı --policy.relative_exclude_joints (varsayılan ["gripper"]) girdilerinden birini içeren boyutlar hariç olmak üzere, eylemden mevcut durumu çıkarır.

Postprocessor eşlemeyi tersine çevirir, bu nedenle select_action eylemleri robotunuzun ham eylem uzayında döndürür. İnce ayarlanmış checkpoint'ler, slot eşlemelerini ve veri seti istatistiklerini işlemcileriyle birlikte kaydeder.

Kameralar

Görsel adımı, kontrol noktasındaki input_features içinde listelenen kameraları bu sırayla okur. Temel kontrol noktası için bunlar camera_top, camera_wrist_left ve camera_wrist_right'tir. Veri setinizdeki kameraları bunlara --rename_map ile eşleyin; robotunuzda olmayan görünümler maskeleme ile dışlanır.

İnce ayar

maximellerbach/omx_multicubes örneği, 5 eklemli ve bir kavrayıcı ile iki kameraya (top, wrist) sahip tek kollu bir sistemdir:

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

Ağırlıkları fp32'de tutun ve bf16'da hesaplama yapın (--policy.dtype=float32 --accelerator.mixed_precision=bf16), tıpkı upstream'in yaptığı gibi. --policy.dtype=bfloat16 kullanıldığında optimizator bf16 ağırlıklarını doğrudan günceller ve güncellemelerin çoğu onları değiştirmek için çok küçüktür: bu veri setinde ağırlıkların %66'sı temel checkpoint ile bit-bitt aynı kaldı ve ince ayarlanmış politika çok daha titrek oldu. Çıkarımı da fp32'de çalıştırın (bu şekilde eğitilen bir checkpoint'in varsayılanı); bf16 çıkarımı, eylem parçalarının belirgin şekilde daha az pürüzsüz olmasına neden olur.

Normalizasyon istatistikleri veri setinden gelir. Çoklu GPU eğitimi, --parallelism.* ve --accelerator.* bayraklarıyla standart torchrun başlatıcısını kullanır. fp32 ağırlıklar, gradyanlar ve optimizör durumu yaklaşık 96 GB yer kaplar, bu nedenle tek bir GPU çok küçükse bunları --parallelism.dp_shard=<num_gpus> ile bölün.

Çift sorgu damıtma

LingBot-VLA 2.0, dil token'larının ardından öğrenilmiş sorgu token'larını (mevcut ve gelecekteki derinlik/video) ekler ve eylem uzmanı bunlara dikkat eder. Her iki checkpoint de align_params içinde upstream'in tarifesini taşır, bu nedenle sorgu token'ları çıkarım sırasında her zaman kullanılır. Eğitim sırasında küçük başlıklar bu token'ları okur ve dondurulmuş öğretmenlerden (MoGe-2 ile LingBot-Depth ve DINO-Video) upstream'in kayıp ağırlıklarıyla damıtılır; ek kayıplar depth_loss, future_depth_loss, current_video_loss ve future_video_loss olarak kaydedilir.

Öğretmenler, ilk eğitim adımında indirilir (robbyant/lingbot-vla-v2-6b ve Ruicheng/moge-2-vitb-normal modellerinden yaklaşık 3 GB), yaklaşık 2 GB GPU belleği kullanır ve her adıma örnek başına yaklaşık 130 ms ekler. Her örnek, gelecekteki hedeflerin gerektirdiği chunk_size - 1 adım öncesindeki kareyi de yükler. Çıkarım sırasında ek bir işlem çalışmaz.

Temel eğitim parametreleri

ParametreVarsayılanAçıklama
state_slots / action_slotsnullHam aralıklardan kanonik yuvalara (bkz. yukarıdaki).
use_relative_actionsfalseMevcut duruma göre göreli eylemler üzerinde eğitim yapın.
loss_typeL1_fmHız üzerindeki akış-eşleştirme kaybı.
normalization_mappingMEAN_STD durumu ve eylemiRoboTwin kontrol noktası QUANTILES kullanır.
train_expert_onlyfalseQwen3-VL omurgasını dondurun ve yalnızca eylem uzmanını eğitin.
freeze_vision_encoderfalseGörme kulesini dondurun.
gradient_checkpointingfalseAdım süresinin maliyetiyle bellek tasarrufu sağlamak için geri yayılım sırasında aktivasyonları yeniden hesaplayın.
use_moe_expert_lrtrueRouted uzmanlar, upstream'deki gibi lr * sqrt(num_experts / top_k) öğrenme oranıyla eğitilir.
optimizer_lr / scheduler_decay_lr1e-5 / 1e-5AdamW zirve ve son öğrenme oranı.
resize_imgs_with_padding[256, 256]Qwen3-VL görüntü işleyicisi öncesindeki çerçeve boyutu, upstream olarak.
image_max_pixels / image_min_pixels65536 / 65536Qwen3-VL piksel bütçesi: kamera başına 64 token, upstream ile aynı.
chunk_size / n_action_steps50 / 50Öngörülen ufuk ve parça başına yürütülen eylem sayısı.
num_steps10Çıkarım sırasında gürültü azaltma adımları.
tokenizer_pathQwen/Qwen3-VL-4B-InstructQwen3-VL tokenizer ve görüntü işleyicisi. Çevrimdışı kullanımda yerel bir yol kullanın.

Daha küçük bir GPU'ya sığdırmak için --policy.train_expert_only=true ve --policy.gradient_checkpointing=true parametrelerini küçük bir --batch_size değeriyle birleştirin.

Değerlendirme

RoboTwin kontrol noktasını LeRobot'un RoboTwin ortamında değerlendirin (kurulum için bkz. RoboTwin). Yeniden adlandırma haritası, ortam kamera adlarını kontrol noktasınınkilerle hizalar:

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"}'

50 RoboTwin 2.0 görevi üzerindeki ortalama başarı (her biri 100 epizot), yayınlanan RoboTwin checkpoint'i için upstream README'de raporlandığı gibidir (temiz ve rastgele veri üzerinde Muon post-training, upstream RoboTwin launcher ile FP32 çıkarım). Bunlar upstream sayılarıdır, bu port üzerinden ölçülmemiştir.

Ayarπ0.5LingBot-VLA 1.0LingBot-VLA 2.0
Temiz82.74%88.56%93.52%
Rastgele76.76%86.68%92.80%

Çıkarım hızlandırmaları

Dört bayrak, varsayılan olarak hepsi kapalı, select_action işlemini hızlandırır. Bunlar CUDA ve sabit giriş biçimleri gerektirir ve ek bağımlılık içermez:

  • --policy.use_cudagraph_denoise=true: gürültü azaltma döngüsünü tek bir CUDA grafiği olarak yakalar.
  • --policy.use_cudagraph_prefix=true: görsel-dil öneki KV doldurmasını yakalar.
  • --policy.use_cudagraph_prefix_full=true: prefix grafiğinde vision tower'ı da yakala.
  • --policy.compile_predict_velocity=true: Adım başına hız tahminini torch.compile ile derler. İlk çağrı yaklaşık bir dakika sürer.

10 gürültü azaltma adımı içeren 50 adımlık bir eylem parçası için, RoboTwin kontrol noktası, tek RTX PRO 6000 ile süre:

Bayraklarbf16fp32
none~756 ms~614 ms
üç CUDA grafik bayrağının tamamı~180 ms~203 ms
üç CUDA grafik bayrağının tamamı + derleme~120 ms~156 ms

bf16'da CUDA grafikleri, eager ile aynı çıktıları verir; torch.compile sayısal değerleri hafifçe değiştirir.

Dağıtım

Bir robot üzerinde ince ayarlanmış bir kontrol noktasını, eğitimde kullanılan aynı --rename_map parametresini geçirerek lerobot-rollout ile çalıştırın:

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, diğer flow-matching politikaları gibi, --inference.type=rtc ile kullanılabilir.

Atıf

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

Lisans

Kod ve dönüştürülen checkpoint'ler, upstream LingBot-VLA 2.0 ve Qwen3-VL sürümleri gibi Apache-2.0 lisanslıdır.

Distillation eğitimi, kendi lisansları altında üç donmuş öğretmen indirir (çalıştırma sırasında bunlar asla yüklenmez):

ÖğretmenAğırlıklarLisans
MoGe-2Ruicheng/moge-2-vitb-normalMIT
LingBot-Depthrobbyant/lingbot-vla-v2-6b (depth/)Apache-2.0
DINO-Videorobbyant/lingbot-vla-v2-6b (dino_video/)DINOv3 Lisansı

DINO-Video ağırlıkları Meta’nın DINOv3’ünden türetilmiştir, bu nedenle damıtma ile eğitim, DINOv3 Lisansı kapsamında kullanımı gerektirir; bu lisans, diğer hükümlerin yanı sıra, yayınlarında DINOv3’ü belirtmenizi ve bazı nihai kullanım senaryolarını kısıtlamanızı ister.

Update on GitHub