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 là mô hình vision-language-action của Robbyant, phiên bản kế nhiệm của LingBot-VLA 1.0. Nó kết hợp backbone Qwen3-VL-4B với chuyên gia hành động Qwen2 dạng sparse Mixture-of-Experts (32 chuyên gia, top-4 routing) và tạo ra các khối hành động (action chunks) bằng flow matching trên không gian trạng thái/hành động chuẩn hóa 55-D được chia sẻ giữa các cấu hình (embodiments).

Phiên bản port của LeRobot là chính sách lingbot_vla_v2. Nó sử dụng các bộ dữ liệu LeRobot chuẩn, các bộ xử lý, lerobot-train, lerobot-eval và lerobot-rollout, bao gồm cả quá trình chưng cất độ sâu và video dual-query từ upstream.

Để biết chi tiết về mô hình, hãy xem kho lưu trữ gốc và báo cáo kỹ thuật.

Cài đặt

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

Tokenizer và image processor của Qwen3-VL được nạp từ Qwen/Qwen3-VL-4B-Instruct (--policy.tokenizer_path) khi processor được xây dựng. flash-attn không cần thiết; attention sử dụng PyTorch SDPA.

Điểm kiểm tra

CheckpointNguồnSử dụng
lerobot/lingbot_vla_v2_baserobbyant/lingbot-vla-v2-6b, chỉ chuyển đổi định dạngĐiểm khởi đầu để tinh chỉnh. Các đặc trưng là bố cục chính tắc 55-D đầy đủ; hãy truyền các ánh xạ slot cho robot của bạn.
lerobot/lingbot_vla_v2_robotwinrobbyant/lingbot-vla-v2-6b-robotwin, bước 50000Đánh giá RoboTwin 2.0. Trạng thái/hành động 14 chiều, camera cam_high, cam_left_wrist, cam_right_wrist, chuẩn hóa QUANTILES (q01/q99).

Tải một trong hai bằng --policy.path; loại policy được đọc từ config.json của checkpoint.

Ánh xạ robot lên bố cục chuẩn

Mô hình nhìn thấy trạng thái 55-D và dự đoán các hành động 55-D. Bố cục được thiết lập bởi canonical_joints trong cấu hình:

SlotKích thướcNội dung
arm.position14vị trí các khớp cánh tay
end.position14tư thế của đầu cuối
effector.position2vị trí kẹp
hand.position12các khớp của bàn tay khéo léo
waist.position4khớp eo
head.position2khớp đầu
base.velocity3tốc độ cơ sở di động
reserved.slots4dự phòng

--policy.state_slots và --policy.action_slots ánh xạ các khoảng của observation.state và action trong bộ dữ liệu của bạn lên các slot này, dưới dạng JSON:

{
  "observation.state.arm.position": {
    "origin_keys": [{ "observation.state": { "start": 0, "end": 5 } }]
  }
}
  • Tên slot là các tên chính thức ở trên, có thể được thêm tiền tố observation.state. hoặc action.. Các tên không xác định sẽ gây ra lỗi.
  • Mỗi slot đọc một hoặc nhiều khoảng {start, end} từ observation.state (slot trạng thái) hoặc action (slot hành động). Các khoảng được nối lại và đóng gói từ đầu slot; phần còn lại của slot được đệm bằng số 0 và bị loại khỏi loss.
  • Khi không có ánh xạ slot, các đặc trưng thô được coi là bố cục chính tắc 55-D, giống như trong checkpoint cơ sở.
  • Các hành động tương đối bị tắt theo mặc định. --policy.use_relative_actions=true sẽ trừ trạng thái hiện tại khỏi hành động, ngoại trừ các chiều có tên chứa một mục của --policy.relative_exclude_joints (mặc định là ["gripper"]).

Postprocessor đảo ngược ánh xạ, do đó select_action trả về các hành động trong không gian hành động thô của robot. Các checkpoint đã fine-tune lưu trữ các ánh xạ slot và thống kê tập dữ liệu cùng với các processor của chúng.

Camera

Bước hình ảnh đọc các camera được liệt kê trong input_features của checkpoint, theo đúng thứ tự đó. Đối với checkpoint cơ sở, chúng là camera_top, camera_wrist_left và camera_wrist_right. Hãy ánh xạ các camera trong bộ dữ liệu của bạn lên chúng bằng --rename_map; các góc nhìn mà robot của bạn không có sẽ bị che đi.

Tinh chỉnh

Ví dụ trên maximellerbach/omx_multicubes, một cánh tay đơn với 5 khớp và một kẹp cùng hai camera (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

Giữ trọng số ở fp32 và tính toán ở bf16 (--policy.dtype=float32 --accelerator.mixed_precision=bf16), giống như cách upstream thực hiện. Với --policy.dtype=bfloat16, bộ tối ưu sẽ cập nhật trực tiếp các trọng số bf16, và hầu hết các bản cập nhật đều quá nhỏ để thay đổi chúng: trên bộ dữ liệu này, 66% trọng số giữ nguyên bit so với checkpoint gốc, và chính sách được tinh chỉnh trở nên giật cục hơn nhiều. Chạy suy luận ở fp32 (mặc định của checkpoint được huấn luyện theo cách này); suy luận bf16 làm cho các khối hành động kém mượt mà hơn rõ rệt.

Thống số chuẩn hóa được lấy từ tập dữ liệu. Huấn luyện đa GPU sử dụng trình khởi chạy torchrun tiêu chuẩn với các cờ --parallelism.* và --accelerator.*. Trọng số, gradient và trạng thái optimizer ở fp32 chiếm khoảng 96 GB, vì vậy hãy chia nhỏ chúng bằng --parallelism.dp_shard=<num_gpus> khi một GPU không đủ dung lượng.

Chưng cất truy vấn kép

Ứng dụng LingBot-VLA 2.0 thêm các token query đã học (độ sâu và video hiện tại/tương lai) sau các token ngôn ngữ, và chuyên gia hành động sẽ chú ý đến chúng. Cả hai checkpoint đều chứa công thức của upstream trong align_params, do đó các token query luôn được sử dụng khi suy luận. Trong quá trình huấn luyện, các đầu nhỏ đọc các token đó và được chưng cất từ các giáo viên đóng băng (LingBot-Depth với MoGe-2 và DINO-Video) với trọng số loss của upstream; các loss bổ sung được ghi log dưới dạng depth_loss, future_depth_loss, current_video_loss và future_video_loss.

Các mô hình teacher được tải xuống ở bước huấn luyện đầu tiên (khoảng 3 GB từ robbyant/lingbot-vla-v2-6b và Ruicheng/moge-2-vitb-normal), chiếm khoảng 2 GB bộ nhớ GPU và thêm vào mỗi bước khoảng 130 ms cho mỗi mẫu. Mỗi mẫu cũng tải trước khung hình chunk_size - 1 bước, điều mà các mục tiêu tương lai cần. Không có gì thêm được chạy ở giai đoạn suy luận.

Các tham số huấn luyện chính

Tham sốMặc địnhMô tả
state_slots / action_slotsnullCác span thô sang các slot chuẩn (xem ở trên).
use_relative_actionsfalseHuấn luyện trên các hành động tương đối so với trạng thái hiện tại.
loss_typeL1_fmMất khớp dòng trên vận tốc.
normalization_mappingtrạng thái và hành động MEAN_STDCheckpoint RoboTwin sử dụng QUANTILES.
train_expert_onlyfalseĐóng băng backbone của Qwen3-VL và chỉ huấn luyện action expert.
freeze_vision_encoderfalseĐóng băng tháp thị giác.
gradient_checkpointingfalseTính lại các kích hoạt trong bước truyền ngược để tiết kiệm bộ nhớ, với chi phí là thời gian mỗi bước.
use_moe_expert_lrtrueCác chuyên gia được định tuyến được huấn luyện với lr * sqrt(num_experts / top_k), giống như ở upstream.
optimizer_lr / scheduler_decay_lr1e-5 / 1e-5Tốc độ học đỉnh và cuối cùng của AdamW.
resize_imgs_with_padding[256, 256]Kích thước khung trước bộ xử lý hình ảnh Qwen3-VL, như ở đầu vào.
image_max_pixels / image_min_pixels65536 / 65536Ngân sách pixel của Qwen3-VL: 64 token cho mỗi camera, như bản gốc.
chunk_size / n_action_steps50 / 50Ngưỡng dự đoán và số lượng hành động được thực hiện cho mỗi khối.
num_steps10Các bước khử nhiễu khi suy luận.
tokenizer_pathQwen/Qwen3-VL-4B-InstructTokenizer và bộ xử lý ảnh của Qwen3-VL. Sử dụng đường dẫn cục bộ ngoại tuyến.

Để chạy trên GPU nhỏ hơn, hãy kết hợp --policy.train_expert_only=true và --policy.gradient_checkpointing=true với --batch_size nhỏ.

Đánh giá

Đánh giá checkpoint RoboTwin trong môi trường RoboTwin của LeRobot (xem RoboTwin để cài đặt). Bản đồ đổi tên khớp tên camera của môi trường với 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"}'

Tỷ lệ thành công trung bình trên 50 tác vụ RoboTwin 2.0 (mỗi tác vụ 100 tập), như được báo cáo trong README gốc cho checkpoint RoboTwin đã phát hành (Muon post-training trên dữ liệu sạch và dữ liệu ngẫu nhiên, suy luận FP32 với trình khởi chạy RoboTwin gốc). Đây là các con số từ nguồn gốc, không được đo lường thông qua bản port này.

Cài đặtπ0.5LingBot-VLA 1.0LingBot-VLA 2.0
Sạch82.74%88.56%93.52%
Ngẫu nhiên76.76%86.68%92.80%

Tăng tốc suy luận

Bốn cờ, tất cả đều tắt mặc định, giúp tăng tốc select_action. Chúng yêu cầu CUDA và hình dạng đầu vào cố định, và không có phụ thuộc bổ sung:

  • --policy.use_cudagraph_denoise=true: thu thập vòng lặp khử nhiễu thành một đồ thị CUDA duy nhất.
  • --policy.use_cudagraph_prefix=true: bắt giữ việc điền KV cho phần tiền tố thị giác-ngôn ngữ.
  • --policy.use_cudagraph_prefix_full=true: cũng bắt (capture) vision tower trong prefix graph.
  • --policy.compile_predict_velocity=true: torch.compile cho việc dự đoán vận tốc từng bước. Lệnh gọi đầu tiên sẽ biên dịch trong khoảng một phút.

Thời gian cho một khối hành động 50 bước với 10 bước khử nhiễu, checkpoint RoboTwin, một RTX PRO 6000:

Cờbf16fp32
none~756 ms~614 ms
cả ba cờ CUDA graph~180 ms~203 ms
cả ba cờ CUDA graph + compile~120 ms~156 ms

Trong bf16, các CUDA graphs cho ra kết quả giống hệt so với chế độ eager; torch.compile làm thay đổi nhẹ các giá trị số.

Triển khai

Chạy checkpoint đã fine-tune trên robot bằng lerobot-rollout, truyền cùng --rename_map như trong quá trình huấn luyệ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 có sẵn với --inference.type=rtc, tương tự như các chính sách flow-matching khác.

Trích dẫn

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

Giấy phép

Mã nguồn và các checkpoint đã chuyển đổi được cấp phép theo Apache-2.0, giống như các bản phát hành LingBot-VLA 2.0 và Qwen3-VL ở thượng nguồn.

Huấn luyện chưng cất tải về ba giáo viên đóng băng dưới giấy phép riêng của chúng (suy luận không bao giờ nạp chúng):

Giáo viênTrọng sốGiấy phép
MoGe-2Ruicheng/moge-2-vitb-normalMIT
LingBot-Depthrobbyant/lingbot-vla-v2-6b (depth/)Apache-2.0
DINO-Videorobbyant/lingbot-vla-v2-6b (dino_video/)Giấy phép DINOv3

Trọng số DINO-Video được suy ra từ DINOv3 của Meta, do đó việc huấn luyện bằng phương pháp chưng cất có nghĩa là sử dụng chúng dưới Giấy phép DINOv3, trong đó, cùng với các điều khoản khác, yêu cầu bạn ghi nhận DINOv3 trong các ấn phẩm và hạn chế một số mục đích sử dụng cuối cùng.

Update on GitHub