LingBot-VLA 2.0 là một release đáng chú ý vì nó không chỉ là một VLA cho dual-arm manipulation. Nhóm Robbyant đặt mục tiêu gần với triển khai thật hơn: một policy có thể học từ nhiều embodiment, hiểu instruction bằng vision-language backbone, rồi sinh action liên tục trong một không gian canonical 55 chiều. Với người đang làm robot learning, điểm hấp dẫn là repo đã mở code Apache-2.0, checkpoint 6B, cấu hình post-training trên RoboTwin 2.0, script open-loop evaluation, script chạy 50 task RoboTwin và entrypoint deploy real robot.
Bài này hướng dẫn theo hướng thực hành: paper đang giải quyết vấn đề gì, kiến trúc 55D hoạt động ra sao, cách cài môi trường, chuẩn bị dữ liệu RoboTwin 2.0 sang LeRobot, chạy training, open-loop evaluation và inference trong simulator. Nếu bạn mới bắt đầu với VLA, nên đọc trước bài VLA Models trong robotics. Nếu chưa quen data format LeRobot, bài LeRobot hands-on sẽ giúp bạn hiểu vì sao dataset cần episode, observation, action, camera stream và normalization stats.
Paper đang nói gì?
Paper From Foundation to Application: Improving VLA Models in Practice được công bố trên arXiv ngày 7/7/2026. Ý tưởng trung tâm khá thực dụng: nhiều VLA hiện nay thể hiện tốt trong môi trường lab, nhưng khi đưa sang robot thật hoặc task dài thì dễ gặp ba lỗi. Thứ nhất là dữ liệu quá hẹp, thường gắn với một platform hoặc một nhóm task. Thứ hai là action space chưa đủ rộng cho whole-body robot: policy chỉ điều khiển arm/gripper, trong khi robot thực tế còn có head, waist, mobile base hoặc dexterous hand. Thứ ba là mô hình thiếu khả năng dự đoán động học tương lai, nên lỗi nhỏ ở vài bước đầu có thể tích lũy thành failure ở cuối task.
LingBot-VLA 2.0 nâng cấp LingBot-VLA 1.0 theo đúng ba hướng đó. Dataset pretraining được mở rộng lên khoảng 60.000 giờ, gồm 50.000 giờ robot trajectory trên 20 robot configurations và 10.000 giờ egocentric human video. Action representation được mở rộng thành vector 55 chiều để chứa arm joints, end-effector pose, gripper, dexterous hand, waist, head và mobility signal. Phần perception được thêm proxy task dự đoán tương lai: DINO-Video cung cấp semantic temporal prior, còn LingBot-Depth cung cấp geometric cue.

Điểm nên hiểu đúng: đây không phải bài "cứ clone repo là train lại foundation model". Pretraining 60.000 giờ cần hạ tầng rất lớn. Workflow phù hợp cho engineer là dùng checkpoint robbyant/lingbot-vla-v2-6b, sau đó post-training hoặc fine-tune trên dataset downstream, ví dụ RoboTwin 2.0. Repo chính thức cung cấp đúng workflow này: tải model, chuẩn bị LeRobot dataset, map feature vào robot config, compute norm statistics, train bằng train.sh, rồi đánh giá hoặc deploy.
Kiến trúc 55D đa hình thái
Khác biệt lớn nhất của LingBot-VLA 2.0 là unified action representation. Thay vì viết policy riêng cho từng robot, nhóm tác giả map state/action của nhiều embodiment vào một vector canonical 55 chiều:
| Nhóm tín hiệu | Số chiều | Ý nghĩa |
|---|---|---|
| Arm joint position | 14 | hai arm, có padding để chứa robot khác nhau |
| End-effector pose | 14 | pose tay trái/phải hoặc biến thể tương đương |
| Gripper position | 2 | trạng thái mở/đóng gripper |
| Hand joint position | 12 | dexterous hand |
| Waist position | 4 | thân/eo cho humanoid hoặc half-humanoid |
| Head position | 2 | pan/tilt hoặc tương đương |
| Mobility signal | 3 | base motion |
| Reserved | 4 | dự phòng cho embodiment khác |

Với RoboTwin 2.0, bạn sẽ không dùng đủ 55 chiều. Robotwin bimanual setup thường dùng arm.position 14 chiều, end.position 14 chiều và effector.position 2 chiều trong training config, nhưng robot config thực tế map raw state/action của hai tay thành 12 chiều arm và 2 chiều gripper. Phần còn lại được giữ để khớp action/state head của model và để policy không phải đổi kiến trúc khi chuyển sang embodiment giàu DoF hơn. Đây là chi tiết rất quan trọng: beginner thường nhầm rằng action tensor trong dataset phải đủ đúng 55 giá trị. Thực tế bạn cần map đúng joint type, camera name và normalization, còn framework xử lý padding/head dimension theo config.
Phần action expert dùng sparse MoE. Trực giác là model cần vừa có prior chung, vừa có chuyên môn cho từng embodiment/task. Nếu dùng một dense head duy nhất, các distribution rất khác nhau có thể cạnh tranh nhau. MoE cho phép một số expert được active theo token/action context, trong khi shared expert giữ kiến thức phổ quát. Repo cũng nhắc đến sequence-wise auxiliary loss và router z-loss trong cấu hình post-training để ổn định routing.
Phần dual-query distillation giải quyết câu hỏi: policy nhìn ảnh hiện tại thì làm sao biết hành động sắp tới sẽ đưa scene về đâu? LingBot-VLA 2.0 append current và future perceptual queries vào visual/text tokens, rồi distill từ LingBot-Depth và DINO-Video. Depth giúp policy có cue hình học như khoảng cách, mặt phẳng, vật thể và vùng tiếp xúc. DINO-Video giúp có cue chuyển động/ngữ nghĩa theo thời gian. Với manipulation dài, tín hiệu này hữu ích vì success không chỉ phụ thuộc vào grasp frame đầu tiên mà còn vào khả năng đi tới trạng thái trung gian đúng.

Chuẩn bị máy
Repo chính thức yêu cầu Miniconda hoặc Anaconda, Python 3.12 và PyTorch 2.8.0. Nếu bạn chỉ đọc code hoặc chuẩn bị dataset, laptop vẫn ổn. Nếu chạy inference 6B, nên có GPU NVIDIA nhiều VRAM. Nếu post-training 50 task RoboTwin, hãy xem đây là workload multi-GPU thực sự: repo dùng FSDP2, gradient checkpointing, flash-attn==2.8.3, torch.compile() và micro batch nhỏ. Một RTX 4090 có thể dùng để thử inference hoặc debug dữ liệu; training nghiêm túc nên dùng server nhiều GPU.
Các nguồn cần tải:
| Thành phần | Dùng để làm gì |
|---|---|
Robbyant/lingbot-vla-v2 |
code training/eval/deploy |
robbyant/lingbot-vla-v2-6b |
checkpoint LingBot-VLA 2.0 |
Qwen/Qwen3-VL-4B-Instruct |
tokenizer/backbone path cho training và inference |
Ruicheng/moge-2-vitb-normal |
depth model dependency |
LingBot-Depth trong model repo |
teacher/checkpoint depth |
DINO-VIDEO trong model repo |
teacher video representation |
| RoboTwin 2.0 dataset | downstream simulation data |
Cài repo:
git clone https://github.com/Robbyant/lingbot-vla-v2.git
cd lingbot-vla-v2
bash tools/create_train_env.sh
Nếu môi trường của bạn không build được flash-attn từ pip, tải wheel tương ứng CUDA/PyTorch rồi truyền vào script:
bash tools/create_train_env.sh \
--flash-attn-wheel /path/to/flash_attn-2.8.3+cu12torch2.8cxx11abiTRUE-cp312-cp312-linux_x86_64.whl
Tải checkpoint 6B:
python3 scripts/download_hf_model.py \
--repo_id robbyant/lingbot-vla-v2-6b \
--local_dir lingbot-vla
Trong các command bên dưới, giả sử bạn đặt:
export LINGBOT_CKPT=/path/to/lingbot-vla
export QWEN3VL_PATH=/path/to/Qwen3-VL-4B-Instruct
export ROBOTWIN_ROOT=/path/to/RoboTwin
Chuẩn bị RoboTwin 2.0 data
RoboTwin 2.0 là benchmark và data generator cho bimanual manipulation, có pre-collected large-scale dataset trên Hugging Face. Official repo hướng dẫn chạy task bằng:
bash collect_data.sh ${task_name} ${task_config} ${gpu_id}
Nhưng với LingBot-VLA 2.0, đường đi đơn giản hơn là dùng dataset RoboTwin đã có, chuyển qua HDF5 theo script policy/pi0, rồi generate LeRobotDataset v2.1. Theo hướng dẫn trong experiment/robotwin/README.md, bạn clone RoboTwin, tạo folder trong policy/pi0, download dataset về /path/to/RoboTwin/data, sau đó process từng task:
cd /path/to/RoboTwin/policy/pi0
mkdir -p processed_data training_data
bash process_data_pi0.sh adjust_bottle aloha-agilex_clean_50 50
bash process_data_pi0.sh adjust_bottle aloha-agilex_randomized_500 50
Kết quả sẽ nằm ở:
processed_data/adjust_bottle-aloha-agilex_clean_50-50/
processed_data/adjust_bottle-aloha-agilex_randomized_500-50/
Sau đó copy những folder bạn muốn train vào training_data/<model_name>/ và generate LeRobot dataset:
cp -r processed_data/adjust_bottle-aloha-agilex_clean_50-50 \
training_data/demo_lingbot/
bash generate.sh ./training_data/demo_lingbot/ demo_lingbot_repo
Output mặc định nằm dưới:
${XDG_CACHE_HOME}/huggingface/lerobot/demo_lingbot_repo
Nếu disk ở ~/.cache nhỏ, đặt cache sang ổ khác trước khi generate:
export XDG_CACHE_HOME=/data/cache
Robot config và normalization
LingBot-VLA 2.0 đọc downstream data qua LeRobotDataset. Với một dataset, data.data_name là tên robot config, ví dụ robotwin, và data.train_path trỏ tới local LeRobot directory. Với nhiều dataset, dùng data.data_name: multi và tạo text file trong đó mỗi dòng gồm:
<robot_config_name> <lerobot_repo_or_local_path>
Ví dụ assets/training_data/robotwin.txt:
robotwin /data/cache/huggingface/lerobot/demo_lingbot_repo
robotwin /data/cache/huggingface/lerobot/another_robotwin_task
Robot config configs/robot_configs/robotwin.yaml map raw RoboTwin tensor sang unified feature. Với state, hai arm được lấy từ observation.state[0:6] và observation.state[7:13]; hai gripper lấy từ [6:7] và [13:14]. Với action cũng tương tự. Camera mapping thường là:
images:
- observation.images.camera_top:
origin_keys: observation.images.cam_high
- observation.images.camera_wrist_left:
origin_keys: observation.images.cam_left_wrist
- observation.images.camera_wrist_right:
origin_keys: observation.images.cam_right_wrist
Sau khi có dataset, compute normalization stats:
CUDA_VISIBLE_DEVICES=0 bash train.sh scripts/compute_norm_stats.py \
./configs/vla/robotwin/robotwin.yaml \
--data.data_name robotwin \
--data.train_path /path/to/lerobot_dataset \
--data.robot_config_root ./configs/robot_configs \
--data.norm_path assets/norm_stats/robotwin.json \
--data.data_ratio_for_norm_compute 1
Đây là bước không nên bỏ qua. VLA action head học trên distribution đã normalize; nếu stats sai, model có thể sinh action nhìn hợp lý về shape nhưng lệch scale, gripper đóng/mở sai hoặc arm joint dao động quá mạnh. Khi debug, hãy in vài sample đầu tiên của observation/action trước và sau normalization để chắc rằng joint order không bị đảo.
Training trên RoboTwin 2.0
Repo có sẵn ví dụ post-training trên 50 task RoboTwin 2.0 với clean và randomized data:
bash train.sh tasks/vla/train_lingbotvla.py \
./configs/vla/robotwin/robotwin.yaml \
--data.train_path assets/training_data/robotwin.txt \
--data.data_name multi \
--train.output_dir output/
Một số tham số đáng chú ý trong config:
| Tham số | Gợi ý đọc |
|---|---|
action_dim: 55 |
giữ cùng canonical action/state head |
max_action_dim: 55, max_state_dim: 55 |
padding/compatibility across embodiments |
use_moe: true |
bật MoE action expert |
token_num_experts: 32, token_top_k: 4 |
số expert và số expert active |
enable_gradient_checkpointing: true |
giảm VRAM, đổi lại train chậm hơn |
data_parallel_mode: fsdp2 |
training phân tán |
use_future_image: true |
dùng future image cho distillation |
depth_loss_weight: 0.004 |
loss cho depth query |
future_video_loss_weight: 0.004 |
loss cho future video query |
loss_type: L1_fm |
loss cho action prediction trong RoboTwin config |
Nếu chỉ thử pipeline, hãy bắt đầu bằng một hoặc hai task thay vì 50 task. Mục tiêu đầu tiên không phải đạt SOTA, mà là đảm bảo dataloader chạy, camera key đúng, normalization đúng, model forward/backward không NaN, checkpoint được save và inference đọc được checkpoint. Sau đó mới tăng số task, tăng data ratio, bật logging và chạy nhiều GPU.
Một lỗi beginner hay gặp là dùng data.data_name: robotwin nhưng data.train_path lại trỏ tới file list nhiều dataset. Quy tắc đơn giản: một dataset thì robotwin; nhiều dòng trong text file thì multi. Lỗi khác là camera name trong robot config không khớp data.cameras của VLA config. Khi đó loader sẽ báo undefined camera hoặc tạo batch thiếu image token.
Open-loop evaluation và RoboTwin inference
Sau khi có checkpoint post-training, chạy open-loop evaluation để kiểm tra action prediction trên validation data:
export QWEN3_PATH=Qwen/Qwen3-VL-4B-Instruct
python scripts/open_loop_eval.py \
--model_path path_to_posttraining_ckpt \
--robo_name robotwin \
--data_path path_to_validation_data \
--use_length 50
--robo_name robotwin bắt buộc vì script cần đọc configs/robot_configs/robotwin.yaml. Open-loop eval không thay thế simulation rollout, nhưng rất hữu ích để bắt lỗi format: checkpoint load sai, tokenizer path thiếu, action dimension mismatch, normalization file sai hoặc image key không tồn tại.
Để chạy đánh giá trong RoboTwin simulator cho 50 task:
QWEN3VL_PATH=/path/to/Qwen3-VL-4B-Instruct/ \
EVAL_WORKDIR=/path/to/RoboTwin/ \
bash experiment/robotwin/start_robotwin_infer_and_eval.sh \
--model_path /path/to/your/post_training_checkpoint \
--output_base /path/to/your/eval_output \
--num_per_gpu 2
--num_per_gpu quyết định số task chạy song song trên mỗi GPU. Nếu bị OOM hoặc simulator giao tiếp không ổn định, giảm về 1. Nếu GPU còn dư và CPU/simulator đủ khỏe, tăng dần. Với experiment nghiêm túc, hãy lưu đủ seed, task config, checkpoint hash, norm stats và version của RoboTwin vì domain randomization có thể làm kết quả dao động.
Real-robot deployment
Repo cũng cung cấp entrypoint real robot:
export QWEN3VL_PATH=/path/to/Qwen3-VL-4B-Instruct
python -m deploy.lingbot_vla_v2_policy \
--model_path path_to_posttraining_ckpt \
--use_compile \
--use_length 25 \
--port 8000
Theo README, một inference call trên NVIDIA GeForce RTX 4090D mất khoảng 130 ms với 10 denoising steps. Con số này chỉ nên xem là tham chiếu vì latency thật phụ thuộc GPU, compile cache, image resolution, batch, transport giữa policy server và robot controller, cũng như việc bạn có chạy depth/video heads trong path inference hay không.
Khi triển khai thật, đừng nối thẳng output VLA vào actuator nếu chưa có safety layer. Tối thiểu cần action clipping, joint limit, velocity/acceleration limit, emergency stop, watchdog timeout, collision zone và logging. Với whole-body robot, base/waist/head signal càng cần kiểm tra vì action sai có thể làm perception viewpoint thay đổi và khiến policy mất grounding ở bước sau. Nếu đang đi theo hướng humanoid whole-body, bạn có thể đọc thêm GROOT synthetic data cho WholeBody VLA và LeRobot humanoid dataset 2500 giờ để so sánh cách các pipeline khác xử lý dữ liệu đa hình thái.
Kết quả paper
LingBot-VLA 2.0 được báo cáo trên GM-100 bimanual manipulation và long-horizon mobile manipulation. Trên GM-100 generalist setting, kết quả trung bình là:
| Platform | GR00T N1.7 | π0.5 | LingBot-VLA 1.0 | LingBot-VLA 2.0 |
|---|---|---|---|---|
| AgileX Cobot Magic | 36.3 / 17.8 | 59.1 / 32.2 | 58.2 / 30.0 | 66.2 / 34.4 |
| Galaxea R1Pro | 16.4 / 5.6 | 27.4 / 8.9 | 32.7 / 15.6 | 34.6 / 15.6 |
Hai số là progress score / success rate. Progress score quan trọng vì task dài có thể fail ở bước cuối nhưng vẫn hoàn thành nhiều sub-step. Success rate vẫn là thước đo cứng hơn: robot có hoàn tất toàn bộ task hay không.

Với long-horizon mobile manipulation, paper đánh giá Astribot S1 trên refrigerator sorting và Cobot Magic-ARX X5 trên stove cleaning. LingBot-VLA 2.0 đạt 77.1 / 60.0 ở refrigerator sorting in-domain, 37.0 / 13.3 ở out-of-domain, 84.3 / 66.7 ở stove cleaning in-domain và 67.5 / 40.0 ở out-of-domain. OOD refrigerator khó hơn vì vừa đổi initial pose vừa đổi object category; stove cleaning chủ yếu kiểm tra robustness với pose perturbation.
Điều đáng rút ra không phải là model đã "giải xong" whole-body manipulation. Success rate OOD vẫn còn thấp ở task refrigerator. Nhưng kết quả cho thấy mở rộng data, action space và future-aware perception giúp policy generalize tốt hơn baseline trong setting dài hơn, gần robot thật hơn.
Checklist debug cho beginner
Nếu bạn mới chạy LingBot-VLA 2.0 lần đầu, hãy đi theo thứ tự này:
- Clone repo và tạo env thành công, kiểm tra
python -c "import torch; print(torch.__version__)". - Tải checkpoint 6B và Qwen3-VL tokenizer/backbone path, không để path chứa symlink lỗi.
- Generate một LeRobot dataset nhỏ từ RoboTwin, mở metadata để xem camera keys.
- Chạy compute norm stats và kiểm tra JSON có đủ
arm.position,effector.position. - Chạy training một task với vài step để bắt lỗi shape.
- Chạy open-loop eval với
--robo_name robotwin. - Chạy RoboTwin rollout với
--num_per_gpu 1. - Chỉ khi mọi thứ ổn mới mở rộng sang nhiều task hoặc real-robot deploy.
Nguồn chính nên đọc là repo Robbyant/lingbot-vla-v2, paper arXiv 2607.06403, RoboTwin 2.0 repo và hướng dẫn LeRobot dataset trong chính repo LingBot-VLA 2.0. Nếu bạn đã quen bimanual manipulation nhưng chưa quen whole-body VLA, bài Bimanual manipulation là nền tảng tốt để hiểu vì sao progress score, task decomposition và camera viewpoint quan trọng.



