LeRobot documentation
LingBot-VLA 2.0
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
| Checkpoint | Nguồn | Sử dụng |
|---|---|---|
lerobot/lingbot_vla_v2_base | robbyant/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_robotwin | robbyant/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:
| Slot | Kích thước | Nội dung |
|---|---|---|
arm.position | 14 | vị trí các khớp cánh tay |
end.position | 14 | tư thế của đầu cuối |
effector.position | 2 | vị trí kẹp |
hand.position | 12 | các khớp của bàn tay khéo léo |
waist.position | 4 | khớp eo |
head.position | 2 | khớp đầu |
base.velocity | 3 | tốc độ cơ sở di động |
reserved.slots | 4 | dự 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ặcaction.. 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ặcaction(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=truesẽ 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_omxGiữ 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 định | Mô tả |
|---|---|---|
state_slots / action_slots | null | Các span thô sang các slot chuẩn (xem ở trên). |
use_relative_actions | false | Huấ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_type | L1_fm | Mất khớp dòng trên vận tốc. |
normalization_mapping | trạng thái và hành động MEAN_STD | Checkpoint RoboTwin sử dụng QUANTILES. |
train_expert_only | false | Đóng băng backbone của Qwen3-VL và chỉ huấn luyện action expert. |
freeze_vision_encoder | false | Đóng băng tháp thị giác. |
gradient_checkpointing | false | Tí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_lr | true | Cá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_lr | 1e-5 / 1e-5 | Tố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_pixels | 65536 / 65536 | Ngân sách pixel của Qwen3-VL: 64 token cho mỗi camera, như bản gốc. |
chunk_size / n_action_steps | 50 / 50 | Ngưỡng dự đoán và số lượng hành động được thực hiện cho mỗi khối. |
num_steps | 10 | Các bước khử nhiễu khi suy luận. |
tokenizer_path | Qwen/Qwen3-VL-4B-Instruct | Tokenizer 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.5 | LingBot-VLA 1.0 | LingBot-VLA 2.0 |
|---|---|---|---|
| Sạch | 82.74% | 88.56% | 93.52% |
| Ngẫu nhiên | 76.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.compilecho 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ờ | bf16 | fp32 |
|---|---|---|
| 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=cudaReal-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ên | Trọng số | Giấy phép |
|---|---|---|
| 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/) | 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