Tháng 5/2026, Allen Institute for AI (Ai2) phát hành MolmoAct2 — một Vision-Language-Action model open-source mới cho robot manipulation. Kết quả đáng chú ý: trên thử nghiệm real-world với Franka Emika trong điều kiện out-of-distribution, MolmoAct2 đạt 87.1% thành công, trong khi π0.5 của Physical Intelligence chỉ đạt 45.2% — chênh nhau gần gấp đôi. Điều đó không có nghĩa MolmoAct2 thay thế mọi thứ, nhưng nó trả lời một câu hỏi cụ thể: liệu một VLA open-source có thể reach parity với frontier proprietary model trên manipulation thực tế?
Câu trả lời, theo benchmark của Ai2, là có.
Bài viết này là hướng dẫn thực hành fine-tune MolmoAct2 trên cánh tay SO-101 bằng LoRA với LeRobot v0.6 — pipeline chạy được trên một GPU 24GB (RTX 3090 / 4090 / A10G) mà không cần cluster. Chúng ta sẽ đi từ ý tưởng paper, kiến trúc, cách cài đặt, thu thập dữ liệu, training cho đến inference và đánh giá.
Nếu bạn chưa quen LeRobot, hãy đọc trước LeRobot framework: VLA cơ bản từ đầu rồi quay lại đây.
MolmoAct2 là gì và tại sao quan trọng?
MolmoAct2 là bản kế nhiệm của MolmoAct (Ai2, 2024). Paper đầy đủ: MolmoAct2: Action Reasoning Models for Real-world Deployment, arXiv tháng 5/2026, 29 tác giả từ Ai2 và Đại học Washington.
Điểm khác biệt cốt lõi so với các VLA trước: MolmoAct2 không chỉ tối ưu trên benchmark simulation như LIBERO, mà tập trung rõ ràng vào real-world robustness — khả năng tổng quát khi môi trường và vật thể thay đổi so với dữ liệu train.
Benchmark so sánh
| Benchmark | MolmoAct2 | π0.5 | GR00T N1.7 |
|---|---|---|---|
| LIBERO average | 97.2% | 96.9% | 97.0% |
| LIBERO (với -Think) | 98.1% | — | — |
| MolmoSpaces DROID zero-shot | 37.7% | 34.5% | — |
| MolmoBot sim (7 tasks) | 20.6% | 10.0% | — |
| Real-world Franka OOD | 87.1% | 45.2% | — |
| RoboEval | 44.3% | 40.5% | — |
LIBERO thì gần bằng nhau cả ba. Nhưng real-world OOD mới là thử thách thật sự — môi trường thay đổi ánh sáng, góc camera, vị trí vật thể, vật thể chưa thấy trong train. MolmoAct2 đạt 87.1% trong điều kiện đó; π0.5 chỉ 45.2%. Đây là lý do Ai2 claim model này "vượt π0.5" một cách có cơ sở.
Một điểm cũng quan trọng: Ai2 public toàn bộ — checkpoint, training code, dataset, và còn mở checkpoint đã được fine-tune sẵn trên SO-100/101. Không có black box, không có API-only.
Kiến trúc: bốn mảnh ghép quan trọng

MolmoAct2 được xây từ bốn thành phần, mỗi thành phần giải quyết một vấn đề riêng.
1. Molmo2-ER — Backbone "Embodied Reasoning"
Backbone không phải Molmo 7B như phiên bản gốc — thay vào đó là Molmo2-ER, xây trên Qwen3-4B. Số tham số nhỏ hơn nhưng được train theo công thức hai giai đoạn đặc biệt:
- Stage 1 (20K steps): Chuyên biệt hóa embodied reasoning — spatial reasoning, pointing, object grounding
- Stage 2 (1.5K steps): Interleave dữ liệu embodied + general để tránh catastrophic forgetting
Kết quả: 63.8/100 trên 13 embodied-reasoning benchmarks — vượt GPT-5, Gemini Robotics ER-1.5, và Qwen3-VL-8B. Backbone hiểu không gian tốt hơn, dẫn đến manipulation chính xác hơn.
2. OpenFAST — Action Tokenizer
OpenFAST là action tokenizer mở — map 1 giây trajectory liên tục thành 2048-token vocabulary. Được train trên 1 triệu sequence từ 5 embodiment khác nhau (SO-100/101, YAM bimanual, DROID Franka, BC-Z, BridgeData V2).
Cơ chế: dùng frequency-domain transform + byte-pair encoding để compress action trajectory thành token sequence. Điều này cho phép dùng autoregressive prediction như language model — đơn giản, scale tốt, không cần action head phức tạp.
3. Two-Phase Training: Discrete → Continuous
MolmoAct2 train theo hai pha:
Phase 1: Pre-training (200K steps)
→ Autoregressive VLA predict OpenFAST tokens (discrete)
→ Học "ngôn ngữ" của action
Phase 2: Post-training (100K steps)
→ Gắn DiT-style flow-matching action expert
→ Bridge bằng KV-cache conditioning (no-copy)
→ Output: continuous action trajectory
Điểm mấu chốt: KV-cache conditioning bridge — thay vì thay thế backbone bằng action head, DiT expert đọc KV-cache của VLM trực tiếp, không cần copy tensor, overhead gần như bằng không.
4. MolmoAct2-Think — Reasoning Nhanh hơn 37 lần
Biến thể -Think tái dự đoán depth token chỉ cho vùng scene đã thay đổi (grid 10×10, 128 depth codes, ngưỡng cosine similarity 0.996). Khi robot đang thực thi action đơn giản, -Think bỏ qua reasoning — chỉ reasoning lại khi cần thiết. Kết quả: nhanh hơn 37x so với predecessor, đạt 98.1% trên LIBERO với -Think.
Dataset MolmoAct2-SO100_101 — Không Cần Thu Thập Từ Đầu
Ai2 public ba bộ dataset lớn:
| Dataset | Thời lượng | Số episodes | Nguồn |
|---|---|---|---|
| MolmoAct2-BimanualYAM | 720h | 34,500 | Bộ bimanual lớn nhất open-source |
| MolmoAct2-SO100_101 | 184h | 38,059 | 377 contributor từ cộng đồng |
| MolmoAct2-DROID | — | 74,604 | Franka episodes tái chú thích |
Dataset SO100_101 qua 4-stage quality filtering: loại bỏ episode thiếu ngôn ngữ, kiểm tra action range, lọc episode quá ngắn/dài, và dedup. Đây là điểm xuất phát tốt nếu bạn muốn fine-tune cho task mới trên SO-101 mà chưa có đủ dữ liệu riêng.
Checkpoint đã train sẵn: allenai/MolmoAct2-SO100_101 — dùng zero-shot ngay trên SO-101 mà không cần train thêm.
Hardware: SO-101 và Yêu Cầu GPU
SO-101 Robot Arm

SO-101 là thế hệ thứ hai của SO-100, do TheRobotStudio phát triển cùng HuggingFace. Repo: TheRobotStudio/SO-ARM100.
| Thông số | Chi tiết |
|---|---|
| Bậc tự do | 6 DOF |
| Servo | Feetech STS3215 (bus servo) |
| Torque tối đa | 30 kg.cm @ 12V |
| Encoder | 12-bit magnetic |
| Tầm với | ~500mm |
| Payload | ~500g |
| Giao tiếp | USB serial |
Setup cơ bản: một cánh tay follower (robot thực thi) + một cánh tay leader (bạn điều khiển tay). Follower ghi lại trajectory của leader trong quá trình teleop.
Chi phí: Tự lắp ráp (3D print + mua phụ kiện) khoảng $100–130 mỗi cánh tay; bộ hai cánh tay leader+follower khoảng $230. Nếu mua kit từ bên thứ ba thì $199–500 tùy nguồn.
Cải thiện so với SO-100:
- Dây dẫn được route gọn hơn, không còn nguy cơ đứt ở joint 3
- Dễ lắp hơn — không cần tháo gear trong quá trình build
- Gear ratio tối ưu hơn cho leader arm
GPU yêu cầu
| Chế độ | VRAM cần | Thời gian/step |
|---|---|---|
| Inference only (bf16) | ~12 GB | — |
| LoRA fine-tune (bf16 + gradient checkpointing) | ~20–22 GB | ~0.8s/step |
| Full fine-tune (FFT) | 80+ GB | cần multi-GPU |
RTX 3090 (24GB) hoặc RTX 4090 (24GB) đủ cho LoRA. Với A10G (24GB) trên cloud cũng tốt.
Cài Đặt Môi Trường
Yêu cầu
- Python 3.10 hoặc 3.11
- CUDA 12.1+ (
nvidia-smikiểm tra) uv(package manager — nhanh hơn pip đáng kể)
LeRobot v0.6 với extra molmoact2
# Clone và cài đặt LeRobot
git clone https://github.com/huggingface/lerobot.git
cd lerobot
# Cài đặt với extra molmoact2 (bao gồm flash-attention, accelerate, peft)
uv sync --locked --extra molmoact2
# Kích hoạt venv
source .venv/bin/activate
# Kiểm tra
python -c "from lerobot.policies.molmoact2 import MolmoAct2Policy; print('OK')"
--extra molmoact2 kéo thêm flash-attn, peft, và accelerate — ba thứ cần thiết cho LoRA fine-tuning.
Kiểm tra SO-101 kết nối
Cắm SO-101 follower vào USB, chạy:
python -m lerobot.scripts.find_motors_bus_port
Output trả về port (thường /dev/ttyACM0 trên Linux). Lưu lại dùng cho bước calibration.
Calibrate SO-101
python -m lerobot.scripts.control_robot \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--control.type=calibrate
Script sẽ hướng dẫn move từng joint đến vị trí extreme để record offset. Calibration lưu vào ~/.cache/lerobot/calibration/so101_follower.json.
Thu Thập Dữ Liệu với Teleop
Teleop là bước thu thập demo bằng cách bạn điều khiển leader arm, follower arm ghi lại trajectory:
python -m lerobot.scripts.control_robot \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 \
--control.type=record \
--dataset.repo_id=${HF_USER}/my_so101_task \
--dataset.task="pick up the red cube and place it in the blue box" \
--dataset.num_episodes=50 \
--dataset.fps=30
Mỗi episode gồm: observations (camera RGB + proprioception state) + actions (joint positions). Dataset tự động upload lên HuggingFace Hub khi xong.
Mẹo thu thập dữ liệu tốt:
- 50–100 episodes đủ cho task đơn giản (pick-and-place)
- Thay đổi vị trí vật thể, ánh sáng nhẹ, góc camera giữa các episode
- Thực hiện chậm và mượt — tránh jerk đột ngột
- Xóa episode thất bại ngay (không để trong dataset)
Nếu bạn muốn dùng dataset có sẵn: MolmoAct2-SO100_101 đã có 38k episodes trên HuggingFace.
Bài SO-101 sim-to-real với Isaac Lab có hướng dẫn thu thập dữ liệu synthetic để tăng thêm diversity.
Fine-tune với LoRA
LoRA là gì và tại sao dùng thay vì Full Fine-tune?
LoRA (Low-Rank Adaptation) không train toàn bộ weight của model — nó thêm một cặp ma trận nhỏ (rank thấp) vào các layer attention và MLP. Ưu điểm:
- Chỉ train ~1–5% tổng tham số → VRAM giảm đáng kể
- Tránh catastrophic forgetting (backbone vẫn nhớ general representation)
- Kết quả thường tốt hơn FFT trên dataset nhỏ (<200 episodes)
MolmoAct2 có ba chế độ train (--policy.train_mode_vlm):
lora— train LoRA adapter trên VLM, action expert train đầy đủ (khuyến nghị cho dataset nhỏ)fft— full fine-tuning VLM (cần 80GB+ VRAM hoặc multi-GPU)freeze— đóng băng VLM, chỉ train action expert
Với dataset <200 episodes và một GPU 24GB, dùng lora.
Lệnh Fine-tune LoRA (Single GPU)
accelerate launch \
--num_processes=1 \
--mixed_precision=bf16 \
-m lerobot.scripts.lerobot_train \
--policy.type=molmoact2 \
--policy.checkpoint_path=allenai/MolmoAct2 \
--policy.train_mode_vlm=lora \
--policy.dtype=bfloat16 \
--policy.gradient_checkpointing=true \
--policy.action_mode=continuous \
--policy.num_flow_timesteps=8 \
--dataset.repo_id=${HF_USER}/my_so101_task \
--batch_size=4 \
--steps=10000 \
--output_dir=outputs/molmoact2_so101_lora \
--save_steps=1000
Giải thích các flag quan trọng:
| Flag | Giá trị | Lý do |
|---|---|---|
train_mode_vlm=lora |
lora | LoRA trên VLM, action expert train full |
dtype=bfloat16 |
bf16 | Tiết kiệm VRAM, giảm từ 24GB → ~12GB VLM |
gradient_checkpointing=true |
true | Giảm activation memory, cần cho 24GB |
action_mode=continuous |
continuous | Dùng flow-matching DiT output (tốt hơn discrete) |
num_flow_timesteps=8 |
8 | Số denoising step — balance quality/speed |
batch_size=4 |
4 | Tối đa cho 24GB với gradient checkpointing |
Learning rates mặc định:
- VLM LoRA LR:
5e-5 - Action expert LR:
5e-5(override bằng--policy.optimizer_action_expert_lr)
Theo dõi Training
# Loss curve
tensorboard --logdir=outputs/molmoact2_so101_lora
# VRAM usage
watch -n2 nvidia-smi --query-gpu=memory.used,memory.free --format=csv
Loss giảm ổn định trong 3,000–5,000 steps đầu. Sau đó thường plateau. Nếu loss dao động mạnh, thử giảm LR xuống 2e-5.
Upload Checkpoint
python -m lerobot.scripts.push_policy \
--policy.path=outputs/molmoact2_so101_lora \
--hub.repo_id=${HF_USER}/molmoact2-so101-task
Zero-shot với Checkpoint Có Sẵn
Nếu task của bạn gần với các task có trong dataset SO100_101 (pick-and-place đơn giản), thử zero-shot trước khi fine-tune:
lerobot-rollout \
--policy.path=lerobot/MolmoAct2-SO100_101-LeRobot \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM0 \
--task="pick up the red cube" \
--duration=30
Zero-shot hoạt động tốt khi: camera setup gần với training data, task language rõ ràng, vật thể quen thuộc. Nếu thành công rate <60%, thu thập demo và fine-tune với LoRA.
Inference và Đánh Giá

Rollout với Policy đã Fine-tune
lerobot-rollout \
--policy.path=${HF_USER}/molmoact2-so101-task \
--robot.type=so101_follower \
--robot.port=/dev/ttyACM0 \
--task="pick up the red cube and place it in the blue box" \
--num_episodes=20 \
--output_dir=eval_results/
--num_episodes=20 đánh giá 20 lần rồi báo success rate. Đủ để có số liệu sơ bộ.
Đánh giá tự động với lerobot-eval
LeRobot v0.6 thêm lerobot-eval CLI với 6 simulation benchmark — LIBERO-plus là phù hợp nhất cho manipulation:
lerobot-eval \
--policy.path=${HF_USER}/molmoact2-so101-task \
--env.type=libero \
--eval.num_episodes=20 \
--eval.task_suite=libero_spatial
Điều chỉnh số denoising steps
num_flow_timesteps=8 là mặc định, balance tốt giữa quality và speed. Thử:
4 steps— nhanh hơn 2x, chấp nhận được cho task đơn giản16 steps— chậm hơn 2x, đôi khi cải thiện task phức tạp
Troubleshooting Phổ Biến
CUDA OOM khi training:
# Giảm batch size
--batch_size=2
# Hoặc bật gradient accumulation
--gradient_accumulation_steps=4
Loss không giảm sau 2000 steps:
- Kiểm tra dataset format — đảm bảo action dimension khớp với SO-101 (6 joints + gripper = 7)
- Thử tăng LR lên
1e-4 - Kiểm tra normalization — dữ liệu phải được normalize theo range của SO-101
Robot move không mượt trong inference:
- Giảm
num_flow_timestepstừ 8 xuống 4 (giảm latency) - Kiểm tra camera framerate — LeRobot mặc định 30fps, SO-101 cần đúng FPS trong training
- Bật
--policy.use_cache=trueđể tái dùng KV-cache giữa các timestep
Serial port not found:
ls /dev/ttyACM* /dev/ttyUSB*
# Thêm user vào group dialout
sudo usermod -a -G dialout $USER
Để hiểu thêm về PEFT deployment sau khi fine-tune xong, đọc PEFT cho VLA: LoRA deploy trên robot thật.
So Sánh MolmoAct2 với DM0.5/OpenDM
Cả hai đều hỗ trợ SO-101 + LoRA + LeRobot. Khác biệt chính:
| Tiêu chí | MolmoAct2 | DM0.5/OpenDM |
|---|---|---|
| Backbone | Molmo2-ER (Qwen3-4B) | Proprietary |
| Action tokenizer | OpenFAST (2048 tokens, mở) | Đóng |
| Dataset SO-101 có sẵn | 38k episodes | Ít hơn |
| Real-world OOD benchmark | 87.1% Franka | Chưa công bố |
| -Think variant | Có (37x speedup) | Không |
MolmoAct2 mạnh về real-world robustness và openness; DM0.5 mạnh về out-of-the-box setup. Bài Fine-tune DM0.5/OpenDM trên SO-101 có pipeline tương tự nếu bạn muốn so sánh.
Tổng Kết
MolmoAct2 đáng thử vì ba lý do cụ thể: (1) nó open-source hoàn toàn kể cả training code và dataset, (2) kết quả real-world OOD vượt π0.5 đáng kể, và (3) LeRobot v0.6 làm cho LoRA fine-tune trên 24GB GPU trở nên đơn giản với một lệnh duy nhất. Nếu bạn có SO-101 và một GPU đủ mạnh, toàn bộ pipeline từ thu thập dữ liệu đến inference có thể chạy trong một ngày.
Bước tiếp theo: thêm reward model để đánh giá trajectory tự động, xem LeRobot v0.6: Reward Models và lerobot-eval CLI.
Bài Viết Liên Quan
- LeRobot framework: VLA cơ bản từ đầu — nền tảng trước khi fine-tune
- Fine-tune DM0.5/OpenDM trên SO-101 — VLA khác trên cùng hardware
- PEFT cho VLA: LoRA deploy trên robot thật — sau khi train xong thì deploy thế nào



