LeRobot documentation
LingBot-VLA 2.0
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ı | Kaynak | Kullan |
|---|---|---|
lerobot/lingbot_vla_v2_base | robbyant/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_robotwin | robbyant/lingbot-vla-v2-6b-robotwin, adım 50000 | RoboTwin 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:
| Slot | Boyutlar | İçerik |
|---|---|---|
arm.position | 14 | kol eklem konumları |
end.position | 14 | uç-efektör pozları |
effector.position | 2 | gripper konumları |
hand.position | 12 | çevik el eklemleri |
waist.position | 4 | bel eklemleri |
head.position | 2 | baş eklem noktaları |
base.velocity | 3 | mobil taban hızı |
reserved.slots | 4 | rezerve |
--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.veyaaction.önekiyle kullanılabilirler. Bilinmeyen adlar bir hata oluşturur. - Her slot,
observation.state(durum slotları) veyaaction(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_omxAğı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
| Parametre | Varsayılan | Açıklama |
|---|---|---|
state_slots / action_slots | null | Ham aralıklardan kanonik yuvalara (bkz. yukarıdaki). |
use_relative_actions | false | Mevcut duruma göre göreli eylemler üzerinde eğitim yapın. |
loss_type | L1_fm | Hız üzerindeki akış-eşleştirme kaybı. |
normalization_mapping | MEAN_STD durumu ve eylemi | RoboTwin kontrol noktası QUANTILES kullanır. |
train_expert_only | false | Qwen3-VL omurgasını dondurun ve yalnızca eylem uzmanını eğitin. |
freeze_vision_encoder | false | Görme kulesini dondurun. |
gradient_checkpointing | false | Adım süresinin maliyetiyle bellek tasarrufu sağlamak için geri yayılım sırasında aktivasyonları yeniden hesaplayın. |
use_moe_expert_lr | true | Routed uzmanlar, upstream'deki gibi lr * sqrt(num_experts / top_k) öğrenme oranıyla eğitilir. |
optimizer_lr / scheduler_decay_lr | 1e-5 / 1e-5 | AdamW 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_pixels | 65536 / 65536 | Qwen3-VL piksel bütçesi: kamera başına 64 token, upstream ile aynı. |
chunk_size / n_action_steps | 50 / 50 | Öngörülen ufuk ve parça başına yürütülen eylem sayısı. |
num_steps | 10 | Çıkarım sırasında gürültü azaltma adımları. |
tokenizer_path | Qwen/Qwen3-VL-4B-Instruct | Qwen3-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.5 | LingBot-VLA 1.0 | LingBot-VLA 2.0 |
|---|---|---|---|
| Temiz | 82.74% | 88.56% | 93.52% |
| Rastgele | 76.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 tahmininitorch.compileile 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:
| Bayraklar | bf16 | fp32 |
|---|---|---|
| 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=cudaReal-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):
| Öğretmen | Ağırlıklar | Lisans |
|---|---|---|
| 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/) | 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