Tháng 9/2025, THU-ML (Tsinghua University Machine Learning Lab) công bố RDT2 — phiên bản kế thừa của RDT-1B, và là một trong những foundation model đầu tiên đạt được zero-shot deployment trên embodiment chưa từng thấy trong training. Nói cách khác, bạn lấy model đã train ra, cắm vào cánh tay UR5e bimanual của bạn, gõ một câu lệnh tiếng Anh ("pick up the apple"), và robot làm được — không cần thu thập dữ liệu trên chính cặp tay đó, không cần fine-tune lại.
Đây là bước nhảy lớn so với RDT-1B (10/2024), vốn chỉ generalize tốt trong cùng embodiment. RDT2 mở khóa khả năng cross-embodiment thực sự nhờ một thiết kế dữ liệu khéo léo: dùng UMI (Universal Manipulation Interface) — một thiết bị gripper cầm tay người — để thu thập 10,000+ giờ demo manipulation trên 100+ scene khác nhau, embodiment-agnostic ngay từ đầu.
Bài này sẽ đi qua: ý tưởng paper, kiến trúc 3-stage training, cách cài đặt repo thu-ml/RDT2, pipeline data, training, inference, và kết quả thực tế.
Tại sao cross-embodiment quan trọng?
Trong robotics, "embodiment" là cấu hình vật lý cụ thể: số DOF, gripper, camera, base. Mỗi lab thường có một embodiment riêng (UR5e đơn, ALOHA, Franka đôi…). Vấn đề: dữ liệu thu trên ALOHA không dùng được trực tiếp cho UR5e, vì action space, reachable workspace, dynamics đều khác.
Hậu quả là cộng đồng phải replicate dữ liệu cho từng embodiment — cực kỳ tốn kém. Open X-Embodiment (2023) cố gắng pool dữ liệu nhưng generalization vẫn yếu vì format không đồng nhất.
RDT2 giải bài này bằng cách không thu data trên robot, mà thu data trên một thiết bị embodiment-agnostic: UMI gripper. UMI có wrist-view fisheye camera + tracker, người vận hành cầm tay làm task → record action chunk + image. Khi deploy, mọi robot có wrist-camera bimanual setup tương tự đều có thể "đọc" được model.
Ý tưởng cốt lõi của RDT2
Paper RDT2: Exploring the Scaling Limit of UMI Data Towards Zero-Shot Cross-Embodiment Generalization (arXiv:2602.03310) đề xuất ba điểm then chốt:
- Scale UMI data lên 10,000+ giờ — lớn nhất trong các open-source robotic dataset hiện tại.
- Three-stage training recipe — kết nối kiến thức ngôn ngữ rời rạc (từ Qwen2.5-VL) với continuous control thông qua RVQ → flow matching → distillation.
- Action chunk relative + 24 frames — output 24 frames (0.8 giây ở 30 FPS), 20 DOF cho bimanual (mỗi tay: 3D position + 6D rotation + 1D gripper). Relative action giúp transfer qua các robot có workspace khác nhau.
Kết quả: RDT2 zero-shot generalize sang object/scene/instruction/embodiment chưa thấy, và còn vượt baseline state-of-the-art ở các task khó như chơi bóng bàn, bắn cung 100ms reaction time, dập tắt nhang đang cháy.
Kiến trúc: VQ + FM trên Qwen2.5-VL-7B
RDT2 release 2 model song hành:
RDT2-VQ — Vision-Language-Action discrete
- Backbone: Qwen2.5-VL-7B-Instruct (vision-language model 7B params, công khai trên Hugging Face).
- Action tokenizer:
MultiVQVAE(Residual Vector Quantization) — discretize action chunk 24-frame thành 27 tokens. Đây là điểm hay: ngắn hơn FAST 3 lần, ngắn hơn binning 8 lần. Token ngắn → autoregressive decode nhanh hơn nhiều. - Input: 2 ảnh wrist-view fisheye + instruction tiếng Anh.
- Output: discrete action tokens, decode ngược thành continuous action chunk qua VQ-VAE decoder.
RDT2-FM — Flow-matching action expert
- Backbone: vẫn là Qwen2.5-VL-7B nhưng frozen, key-value cache được attended bởi một action expert riêng.
- Action expert: 400M params, kiến trúc RDT cải tiến, train với flow-matching loss (5 step denoising).
- Stage 3: distill RDT2-FM thành one-step generator — chỉ 1 forward pass duy nhất từ noise sang action, latency cực thấp (đủ để chơi bóng bàn 1 m/s, bắn cung 100ms).
Bạn pick model nào tùy use case: VQ cho task tốc độ vừa phải cần explainability (action token có thể inspect), FM cho task dynamic cần latency cực thấp.
Three-stage training recipe
Đây là phần mình thấy thiết kế đẹp nhất của paper:
Stage 1 — RVQ pretraining: train Qwen2.5-VL-7B trên UMI data với task: input 2 ảnh + instruction → output discrete action tokens. Loss là cross-entropy chuẩn của LLM. Stage này dạy model hiểu mapping từ ngôn ngữ + thị giác sang hành động — nhưng dưới dạng rời rạc.
Stage 2 — Flow matching: thay RVQ head bằng action expert 400M. Frozen Qwen backbone, chỉ train action expert với flow-matching loss. Stage này đưa output về continuous, loại bỏ artifact của quantization, đặc biệt quan trọng cho task dexterous (bóng bàn, bắn cung).
Stage 3 — Distillation: distill 5-step flow matching thành 1-step direct mapping. Từ noise → action chỉ 1 forward pass. Idea giống adversarial generation (kiểu consistency model). Đây là chìa khóa để latency đủ thấp cho task real-time.
Triết lý: ngôn ngữ rời rạc + control liên tục, kết nối qua VQ rồi tinh chỉnh qua flow matching. Mình nghĩ đây là một template sẽ xuất hiện ở rất nhiều VLA model trong 1-2 năm tới.
Cài đặt repo thu-ml/RDT2
Yêu cầu phần cứng:
- Inference: NVIDIA RTX 4090 (~16GB VRAM) đủ cho RDT2-FM hoặc RDT2-VQ với LoRA.
- Full fine-tuning: A100/H100 80GB.
- OS: Ubuntu 24.04, Python 3.10, PyTorch 2.7.1.
- Khác: Flash Attention, DeepSpeed, packages riêng cho UR5e hoặc Franka Research 3.
git clone https://github.com/thu-ml/RDT2.git
cd RDT2
# Tạo conda env
conda create -n rdt2 python=3.10 -y
conda activate rdt2
# Install PyTorch 2.7.1 với CUDA 12.4
pip install torch==2.7.1 torchvision --index-url https://download.pytorch.org/whl/cu124
# Install requirements
pip install -r requirements.txt
# Flash Attention (mất ~10 phút compile)
pip install flash-attn==2.7.4 --no-build-isolation
Cấu trúc repo theo doc:
RDT2/
├── configs/ # dataset, robot, training config
├── deploy/ # script calibration UR5e/FR3
├── examples/ # deployment guide từng robot
├── models/ # RDT inference, normalizer
├── rdt/ # core modules
├── scripts/ # finetune_full_param.sh, finetune_lora.sh
├── vqvae/ # action tokenizer
├── main.py # entry training
└── train.py
Hardware setup: UR5e bimanual và Franka Research 3
RDT2 hỗ trợ chính thức 2 nền tảng:
Bimanual UR5e:
- Payload mỗi tay 0.82 kg.
- Tác giả khuyến nghị chạy ở 30% speed lúc đầu để an toàn.
- Cần HikRobot fisheye camera gắn cổ tay, Vive Tracker để calibrate TCP-to-tracker space.
Bimanual Franka Research 3:
- Gripper mass 1.9 kg.
- Setup tương tự, tracker calibration qua script trong
deploy/.
Calibration là bước dễ sai nhất. Bạn cần:
- Đặt Vive Tracker lên gripper, chạy
python deploy/calibrate_tcp.py. - Đo offset từ TCP đến tracker frame (rotation + translation).
- Lưu vào
configs/robots/ur5e.yamlhoặcfranka.yaml.
Sai 5mm offset có thể khiến model "bay trượt" mục tiêu khi pick. Nên test với calibration object cố định trước khi run task thật.
Inference: chạy thử RDT2-VQ
Đây là code minimal để chạy inference với pretrained RDT2-VQ:
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor
from vqvae.multi_vqvae import MultiVQVAE
from rdt.inference import batch_predict_action
# Load model + tokenizer + VAE từ Hugging Face
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
"robotics-diffusion-transformer/RDT2-VQ",
torch_dtype="bfloat16",
device_map="auto",
)
processor = AutoProcessor.from_pretrained("robotics-diffusion-transformer/RDT2-VQ")
vae = MultiVQVAE.from_pretrained("robotics-diffusion-transformer/RVQActionTokenizer")
# Camera input (2 wrist-view fisheye, 224x224 RGB)
import cv2
left_rgb = cv2.imread("left_wrist.jpg")
right_rgb = cv2.imread("right_wrist.jpg")
# Predict 24-frame action chunk
result = batch_predict_action(
model, processor, vae,
examples=[{
"obs": {
"camera0_rgb": left_rgb,
"camera1_rgb": right_rgb,
}
}],
instruction="Pick up the red apple and place it in the bowl."
)
action_chunk = result[0]["action"] # shape (24, 20)
# 24 frame, 20 DOF: [left_xyz(3), left_rot6d(6), left_gripper(1),
# right_xyz(3), right_rot6d(6), right_gripper(1)]
Chunk này được "execute" bằng cách stream xuống controller robot ở 30 Hz. Mỗi 0.8 giây chạy lại model để predict chunk mới — đủ overlap để tránh giật.
Fine-tune trên data của bạn
Nếu task bạn quá đặc thù (ví dụ thao tác trong tủ chật), bạn cần fine-tune. Repo cung cấp 2 script:
scripts/finetune_full_param.sh— full-parameter, cần A100 80GB.scripts/finetune_lora.sh— LoRA, RTX 4090 chạy được.
Pipeline chuẩn bị data 3 bước:
- Convert sang WebDataset shards: mỗi sample là
image.jpg + action.npy + action_token.npy. Có script trongdata/để convert từ ROS bag hoặc UMI recording. - Define dataset config: YAML chỉ path data + normalizer (tính mean/std action chunk).
- Chạy training: DeepSpeed ZeRO-2 hoặc ZeRO-3 tùy GPU. Lưu ý paper khuyến cáo train < 5 epoch để tránh overfit — model đã rất mạnh sau pretrain, fine-tune ít epoch là đủ.
bash scripts/finetune_lora.sh \
--config configs/datasets/my_task.yaml \
--output_dir checkpoints/my_task \
--num_epochs 3
Kết quả benchmark
Theo paper, RDT2 đạt một số kết quả ấn tượng:
- Zero-shot generalize sang object, scene, instruction, và embodiment chưa thấy trong training.
- Vượt SOTA baseline (π0, OpenVLA) ở task long-horizon như set bàn ăn.
- Task dexterous: bóng bàn với arm speed 1 m/s, bắn cung với reaction time 100ms.
- Deformable object: generalize sang fabric với texture/size mới (vải lạ).
Inference latency:
- RDT2-VQ: ~150-200 ms/chunk.
- RDT2-FM (5-step): ~80-100 ms/chunk.
- RDT2-FM (1-step distilled): ~20-30 ms/chunk — đủ cho real-time control.
So với chạy mỗi câu một policy riêng, đây là step change về generalization.
Pitfall và lời khuyên
- Camera setup phải khớp: wrist-view fisheye, cần đúng FOV và mounting angle. Sai góc 15° có thể làm action lệch hoàn toàn.
- Tracker calibration: test calibration trước khi chạy task. Mình dùng calibration cube để verify.
- Đừng skip Stage 2: nếu fine-tune full pipeline cho task riêng, đừng bỏ flow matching stage. Action quantization-only sẽ giật.
- Speed limit: chạy 30% speed lúc đầu, tăng dần khi confident. Bimanual mà va vào nhau ở full speed thì broken gripper.
- Bắt đầu với LoRA fine-tune trước khi đi full-param — rẻ và nhanh hơn nhiều.
- Không phải mọi task đều zero-shot được: task quá khác distribution training (ví dụ phẫu thuật, vi tế) vẫn cần data thu thêm.
Tổng kết
RDT2 là một bước tiến quan trọng cho cross-embodiment manipulation. Bằng cách scale UMI data lên 10,000+ giờ và thiết kế 3-stage training kết nối ngôn ngữ-rời rạc với control-liên tục, THU-ML đã xây được foundation model thật sự "deployable" trên các robot khác nhau.
Với engineer Việt Nam: nếu bạn có UR5e hoặc Franka, hãy thử zero-shot demo trước khi nghĩ tới việc thu data riêng. Có thể bạn sẽ ngạc nhiên: pick-place đơn giản hoạt động ngay không cần training. Khi cần task đặc thù, LoRA fine-tune trên RTX 4090 đủ rồi.
Repo: thu-ml/RDT2 trên GitHub. Models: robotics-diffusion-transformer/RDT2-VQ và RDT2-FM trên Hugging Face. Project page: rdt-robotics.github.io/rdt2.