A1 VLA: Deploy Vision-Language-Action SOTA trên Franka/AgiBot với Latency Giảm 72%
Hãy tưởng tượng bạn có một robot cánh tay đang cố gắng nhặt một vật thể. Bộ não của robot — mô hình AI — cần nghĩ nhanh để ra lệnh cho tay. Nếu suy nghĩ quá chậm, tay robot đã qua vị trí cần thiết rồi. Đây là bài toán latency trong VLA (Vision-Language-Action) models mà các nhà nghiên cứu đã loay hoay hàng năm.
Tháng 4/2026, nhóm nghiên cứu từ ATeam Research công bố A1 trên arXiv (2604.05672) — một VLA model hoàn toàn open-source với đổi mới kỹ thuật cốt lõi: Inter-Layer Truncated Flow Matching. Kết quả? Latency giảm tới 72%, tính toán backbone giảm tới 76.6%, trong khi hiệu suất vẫn đạt SOTA trên nhiều benchmark chuẩn.
Bài này sẽ giải thích từ A đến Z: tại sao A1 quan trọng, kiến trúc hoạt động ra sao, cách cài đặt và chạy thực tế trên robot Franka Panda và AgiBot.
Bối cảnh: Tại sao VLA vẫn chậm?
Trước khi đi vào A1, cần hiểu tại sao các VLA model hiện tại lại chậm đến vậy.
Một VLA hiện đại thường dùng kiến trúc hai giai đoạn:
- VLM backbone (7B params, ví dụ PaliGemma hoặc Qwen): xử lý ảnh từ camera và câu lệnh ngôn ngữ → tạo ra embedding hiểu ngữ cảnh
- Action head (thường là Diffusion Policy hoặc Flow Matching): nhận embedding → sinh ra sequence tọa độ điều khiển robot
Vấn đề nằm ở action head dùng Flow Matching. Để sinh ra 1 action sequence, model phải lặp đi lặp lại quá trình denoising (khử nhiễu) nhiều bước — mỗi bước lại cần chạy qua backbone VLM một lần. Nếu bạn cần 10 denoising steps, backbone chạy 10 lần. Với model 7B trên GPU, mỗi lần chạy backbone mất khoảng 35ms → tổng cộng 350ms chỉ để nghĩ ra 1 action. Quá chậm cho robot thực tế.
Các giải pháp cũ đều có hạn chế:
- Giảm denoising steps: từ 100 xuống 10. Nhanh hơn nhưng chất lượng action giảm đáng kể.
- Consistency models: skip bước, nhưng cần train lại từ đầu với objective mới.
- Distillation: model nhỏ học từ model lớn, phức tạp và mất thông tin.
A1 đề xuất một hướng khác hoàn toàn, khai thác cấu trúc bên trong của VLM mà các phương pháp trước chưa ai khai thác.
A1 VLA: Ý tưởng cốt lõi
Hình 1: A1 khai thác representations từ các layer trung gian của VLM thay vì luôn chạy full backbone
Insight chính: Các layer trung gian đã đủ tốt
Khi một VLM 7B xử lý ảnh và câu lệnh, nó có 32–40 transformer layers. Layer cuối cùng (layer 32) cho embedding tốt nhất — nhưng embedding ở layer 16, 20, hay 24 thực ra đã chứa đủ thông tin về affordance (khả năng tương tác với vật thể) để guide action head sinh ra action đúng.
Đây là điểm then chốt mà A1 khai thác: không cần chạy hết backbone mỗi lần denoising. Thay vào đó:
- Denoising step đầu tiên: chạy backbone đến layer cuối → embedding chất lượng cao → khởi động denoising
- Các bước sau: chỉ chạy backbone đến layer trung gian → embedding "đủ tốt" → tiếp tục denoising từ điểm đã dừng (warm-start)
Đây là "Inter-Layer" trong tên: sử dụng representations từ nhiều layer khác nhau, không phải chỉ layer cuối. Và "Truncated": cắt bớt việc chạy backbone — thay vì 32 layers, chỉ chạy 16–20 layers cho các bước sau, tiết kiệm ~50–70% tính toán backbone.
Để hiểu trực giác: đây giống như khi bạn đã hiểu tổng quan một bài toán (đọc full đề), thì để làm tiếp chỉ cần nhìn lại một phần đề chứ không cần đọc lại toàn bộ từ đầu.
Kiến trúc chi tiết: 3 thành phần chính
1. Inter-Layer Truncated Flow Matching
Flow Matching (khác với DDPM Diffusion) học một đường thẳng từ điểm nhiễu đến action đích, thay vì lộ trình cong phức tạp. Nó nhanh hơn và cần ít bước hơn. Nếu bạn muốn tìm hiểu thêm về Diffusion Policy, xem bài Diffusion Policy: Chính sách khuếch tán cho Robot Manipulation.
A1 mở rộng Flow Matching bằng cách warm-start: thay vì bắt đầu denoising từ pure noise mỗi bước, A1 khởi động từ intermediate output của step trước — kết hợp với embedding từ layer trung gian của VLM.
Về mặt toán học, nếu gọi:
h_L= embedding từ layer L cuối cùng của VLMh_k= embedding từ layer k trung gian (k < L)a_t= action tại denoising step t
Thì A1 thực hiện:
step 1: a_0 = FlowMatch(noise, h_L) # full backbone
step 2: a_1 = FlowMatch(a_0, h_k) # layer trung gian, warm-start từ a_0
step 3: a_2 = FlowMatch(a_1, h_k') # tiếp tục, k' có thể khác k
Backbone computation giảm tới 76.6% so với chạy full backbone mỗi bước.
2. Action Consistency Monitoring
Làm sao biết khi nào nên dừng denoising sớm?
A1 theo dõi độ nhất quán của action qua các bước liên tiếp. Nếu a_t và a_{t-1} gần nhau (cosine similarity cao), nghĩa là action đã hội tụ — không cần denoising thêm nữa.
consistency = cosine_similarity(a_t, a_t_prev)
if consistency > threshold:
break # Action đã ổn định, dừng sớm
Trong thực tế, nhiều task đơn giản (nhặt vật không bị che khuất, đặt vào vị trí xác định) hội tụ sau 3–5 steps thay vì 10 steps tiêu chuẩn. Dừng sớm = ít computation = robot phản ứng nhanh hơn.
3. Budget-aware Adaptive Inference
Người dùng hoặc hệ thống có thể đặt latency budget — ví dụ: "action phải xong trong 100ms". A1 tự điều chỉnh ba tham số:
- Backbone depth: bao nhiêu layers VLM sẽ chạy
- Denoising steps: bao nhiêu bước denoising tối đa
- Consistency threshold: ngưỡng dừng sớm
Đây là điểm linh hoạt mà các VLA khác không có: bạn đánh đổi performance lấy speed tùy use case và hardware.
Cài đặt và Setup
Yêu cầu hệ thống
# Hardware tối thiểu
# GPU: NVIDIA với ≥16GB VRAM (A100, 4090, 3090 Ti)
# RAM: ≥32GB system RAM
# Storage: ≥100GB (dataset + checkpoints)
# Software
# Python 3.10+, CUDA 11.8+ hoặc 12.1+, PyTorch 2.1+
Clone và cài đặt
git clone https://github.com/ATeam-Research/A1.git
cd A1
conda create -n a1-vla python=3.10 -y
conda activate a1-vla
pip install -e .
pip install flash-attn --no-build-isolation
python -c "import a1_vla; print('A1 VLA ready!')"
Download pretrained checkpoint
from huggingface_hub import snapshot_download
snapshot_download(
repo_id="ATeam-Research/A1-7B",
local_dir="./checkpoints/a1-7b"
)
A1 release nhiều model size: 1B (chạy được trên GPU 16GB), 7B (chuẩn, cần 24GB+), và 34B (research, cần multi-GPU). Với hầu hết use case thực tế, model 7B là lựa chọn tốt nhất.
Training và Fine-tuning
Chuẩn bị dữ liệu
A1 dùng định dạng RLDS (Robot Learning Dataset), tương thích với Open X-Embodiment (OpenX). Nếu bạn có dữ liệu teleop từ hệ thống LeRobot, cần convert sang RLDS trước. Xem thêm về cách thu thập dữ liệu teleop tại Hướng dẫn thu thập dữ liệu với LeRobot.
python scripts/convert_lerobot_to_rlds.py \
--input_dir ./data/lerobot_episodes/ \
--output_dir ./data/rlds_episodes/ \
--robot franka
Training với PyTorch FSDP
A1 dùng PyTorch FSDP (Fully Sharded Data Parallel) để train model 7B trên nhiều GPU. Training trên single A100 80GB:
torchrun --nproc_per_node=1 vla-scripts/train.py \
--base_model "ATeam-Research/A1-7B" \
--dataset_dir ./data/rlds_episodes/ \
--output_dir ./checkpoints/a1-franka-custom \
--batch_size 8 \
--learning_rate 2e-5 \
--num_epochs 10 \
--gradient_checkpointing true
Training trên multi-GPU (4x A100):
torchrun --nproc_per_node=4 vla-scripts/train.py \
--base_model "ATeam-Research/A1-7B" \
--dataset_dir ./data/rlds_episodes/ \
--output_dir ./checkpoints/a1-franka-custom \
--batch_size 32 \
--learning_rate 5e-5 \
--fsdp true \
--fsdp_sharding_strategy FULL_SHARD
Lưu ý quan trọng: A1 release cả intermediate checkpoints sau mỗi 1000 steps, cho phép bạn resume training nếu bị ngắt và evaluate model tại nhiều thời điểm khác nhau để chọn checkpoint tốt nhất. Đây là tính năng tiếc là nhiều paper SOTA không có.
Cấu hình fine-tune
# configs/finetune_franka.yaml
base_model: "ATeam-Research/A1-7B"
robot: "franka"
task: "pick_place"
# Truncated flow matching config
flow_matching:
num_steps: 10
min_steps: 3 # Sẽ dừng sớm nếu consistency đủ cao
consistency_threshold: 0.95
# Backbone truncation
backbone:
full_layers: 32 # Layer cuối cùng cho step đầu tiên
truncated_layers: 18 # Layer dùng cho warm-start steps
# Training
training:
batch_size: 8
lr: 2e-5
epochs: 20
warmup_steps: 100
Inference trên Robot thực tế
Hình 2: Với adaptive inference budget 100ms, A1 phản ứng nhanh hơn 3.5x so với chạy full backbone
Franka Panda
from a1_vla import A1Policy
from a1_vla.robots import FrankaRobot
import cv2
policy = A1Policy.from_pretrained(
"./checkpoints/a1-7b",
device="cuda",
adaptive_inference=True,
latency_budget_ms=100
)
robot = FrankaRobot(
ip="192.168.1.100",
use_gripper=True
)
cap = cv2.VideoCapture(0)
instruction = "Pick up the red cup and place it on the tray"
while True:
ret, frame = cap.read()
if not ret:
break
joint_pos = robot.get_joint_positions()
action = policy.predict(
image=frame,
instruction=instruction,
robot_state=joint_pos
)
robot.execute(action, blocking=False)
AgiBot
from a1_vla.robots import AgiBotRobot
robot = AgiBotRobot(
config_path="./configs/agibot_world.yaml"
)
# Interface tương tự Franka — A1 thiết kế robot-agnostic
action = policy.predict(
image=frame,
instruction=instruction,
robot_state=robot.get_state()
)
robot.execute(action)
Điều chỉnh latency budget theo use case
# Low latency mode — ưu tiên tốc độ
policy.set_budget(latency_ms=80)
# High quality mode — ưu tiên chính xác
policy.set_budget(latency_ms=300)
# Xem thống kê inference
stats = policy.get_inference_stats()
print(f"Avg latency: {stats['avg_latency_ms']:.1f}ms")
print(f"Backbone layers used: {stats['avg_backbone_layers']}")
print(f"Denoising steps: {stats['avg_denoising_steps']:.1f}")
Kết quả benchmark
So sánh các VLA models
| Model | LIBERO | VLABench | RoboChallenge | Latency (est.) |
|---|---|---|---|---|
| A1 (Full) | 96.6% | 53.5% | 29.0% | ~350ms |
| A1 (Adaptive 100ms) | 94.1% | 51.2% | 27.8% | ~100ms |
| π₀ (Pi-Zero) | ~93% | ~48% | 28.3% | ~400ms |
| X-VLA | ~89% | ~44% | 21.3% | ~500ms |
| RDT-1B | ~85% | ~40% | 15.0% | ~600ms |
Điểm đáng chú ý: A1 Adaptive 100ms vẫn vượt qua π₀ full ở LIBERO và VLABench, trong khi nhanh hơn 4x. Đây là trade-off rất tốt cho ứng dụng thực tế.
Về bản chất, A1 cho thấy rằng phần lớn "sức mạnh" của VLA không nằm ở việc chạy full backbone mỗi bước, mà nằm ở chất lượng của denoising trajectory — và trajectory đó có thể được guided tốt bởi các intermediate representations.
Bạn có thể so sánh thêm với các VLA model khác tại bài Tổng quan VLA Models: Từ RT-2 đến OpenVLA và phân tích chi tiết SimpleVLA tại SimpleVLA và RL Scaling.
Tại sao A1 quan trọng cho cộng đồng?
Đây là điểm thực sự đặc biệt ở A1, khác với nhiều paper SOTA khác:
1. Không có closed-source dependencies: Nhiều VLA SOTA dùng dataset hoặc model pretrained mà không publish công khai. A1 release toàn bộ: training code, data processing pipeline, intermediate checkpoints, evaluation scripts. Không có gì bị giấu lại.
2. Reproducibility đầy đủ: Bạn có thể reproduce kết quả paper từ A đến Z. Đây là tiêu chuẩn cao mà robotics research hay bỏ qua vì "robot experiments khó reproduce".
3. Scalability từ 1B đến 34B: Training code support nhiều model size — bạn không nhất thiết cần A100 80GB. Model 1B có thể train trên 4090 24GB với batch size nhỏ.
4. Format data chuẩn RLDS: Tương thích với Open X-Embodiment và hệ sinh thái LeRobot → dễ integrate với pipeline hiện có mà không cần viết lại data loader từ đầu.
Khi nào nên dùng A1?
Nên dùng A1 nếu:
- Cần VLA nhanh cho real-time robot control (dưới 150ms latency)
- Muốn fine-tune trên robot và task của mình với full control
- Cần reproducibility và transparency cho nghiên cứu hoặc demo
- Hardware hạn chế và cần điều chỉnh linh hoạt giữa speed/accuracy
Cân nhắc lại nếu:
- Task cần dexterity cao (manipulation phức tạp với nhiều ngón tay) — các model chuyên dụng có thể tốt hơn
- Đã có pipeline ổn định với Diffusion Policy thông thường — chuyển sang A1 cần train lại
- Không có GPU ≥16GB — inference sẽ rất chậm và mất ưu thế latency
Tóm lại
A1 VLA giải quyết một trong những pain points lớn nhất của VLA trong thực tế: latency quá cao cho robot real-time. Bằng cách khai thác rằng các layer trung gian của VLM đã đủ tốt để guide denoising, A1 tiết kiệm tới 76.6% backbone computation mà không đánh đổi nhiều về hiệu suất.
Điều thực sự ấn tượng là tính fully open-source và transparent của project — không có closed-source dependency, full training stack được release, intermediate checkpoints có sẵn. Đây là tấm gương tốt cho robotics research nên làm theo.
Nếu bạn đang build robot manipulation và đang vật lộn với latency của VLA, A1 là lựa chọn đáng thử đầu tiên.
Tài nguyên: