Nếu bạn đã từng tự hỏi tại sao robot cần hai não (một não lập kế hoạch, một não thực thi), câu trả lời của Galaxea cho G0.5 là: không cần. GalaxeaVLA G0.5 dồn tất cả vào một dòng token thống nhất — lý luận, lên kế hoạch, và ra lệnh cho từng khớp robot, tất cả trong cùng một transformer decoder.
Bài viết này sẽ dẫn bạn qua kiến trúc, cách cài đặt, fine-tune, và deploy G0.5 từ HuggingFace xuống robot thực — kể cả Galaxea R1 Lite/Pro, SO-100/101, và Franka DROID.
Repo: github.com/OpenGalaxea/GalaxeaVLA | Checkpoint: huggingface.co/OpenGalaxea/G05 | Technical Report: opengalaxea.github.io/G05/Galaxea_G0_5.pdf
Từ G0 Dual-System đến G0.5 Unified — Tại Sao Lại Thay Đổi?
GalaxeaVLA G0 Plus dùng kiến trúc dual-system kinh điển: System 2 (VLM planner, chạy ~1 Hz) phân tách nhiệm vụ dài thành subtask; System 1 (VLA executor, chạy 10–50 Hz) thực thi từng bước. Hai hệ thống giao tiếp qua chuỗi subtask ngôn ngữ — đơn giản nhưng tồn tại độ trễ phối hợp.
G0.5 gộp hai hệ thống lại. Một decoder duy nhất sinh ra chuỗi token: ảnh → ngôn ngữ → lý luận (chain-of-thought) → action token. Không có handshake, không có latency phối hợp. Ý tưởng này giống với cách não người xử lý: không có luồng riêng "tôi sẽ làm gì" và "tôi đang làm gì" — chúng xảy ra trong cùng một dòng nhận thức.
Kiến Trúc Thống Nhất: Một Decoder Cho Tất Cả
Backbone: Qwen3.5 2B
G0.5 được khởi tạo từ Qwen3.5 2B — một VLM mạnh của Alibaba với khả năng lý luận tốt (không phải PaliGemma-3B như G0 Plus). Qwen3.5 được chọn vì khả năng multilingual mạnh (tiếng Việt, tiếng Trung, tiếng Anh đều tốt) và chain-of-thought reasoning native.
ActionCodec: Học Cách Nói Ngôn Ngữ Robot
Vấn đề lớn nhất khi gộp action vào token stream là: action liên tục (góc khớp, vận tốc) không thể trộn với token rời rạc của LLM. G0.5 giải quyết bằng ActionCodec — một VQ (Vector Quantization) tokenizer học được, không phải hand-crafted.
ActionCodec ánh xạ các robot khác nhau (R1 Lite, SO-100, Franka, v.v.) vào không gian action 27 chiều thống nhất:
left_control(9) | left_gripper(1) | right_control(9) | right_gripper(1) | lower_body(7)
Robot nào không có tay trái hoặc chân sẽ điền zero vào các chiều tương ứng. Nhờ vậy, G0.5 pre-train cùng lúc trên 14 embodiment khác nhau — một codebook token action dùng chung cho tất cả.
Điều này khác căn bản với FAST tokenizer (DCT-based) của π0-FAST: FAST dùng phép biến đổi DCT cố định và áp riêng cho từng robot, không học được cross-embodiment. ActionCodec của G0.5 được học end-to-end và cross-embodiment by design.
Token Sequence: Lý Luận Trước Khi Hành Động
Đây là điểm hay nhất của G0.5. Mỗi bước suy luận của mô hình có cấu trúc rõ ràng:

[Image tokens] [Language instruction]
→ <Subtask>: "reach for the red cup"
→ <BBox>: [0.3, 0.4, 0.5, 0.6]
→ <Trace>: waypoint trajectory hint
→ <ActionHint>: movement direction prediction
→ <Action>: [discrete VQ action tokens × 16 steps]
Mô hình không "nhảy thẳng" từ ảnh sang action như OpenVLA hay chuỗi action chunk của π0. Nó lý luận công khai — đặt tên subtask, khoanh vùng object bằng bounding box, phác waypoint trace, rồi mới ra action. Đây là lý do G0.5 xử lý được task dài hạn và ít bị confused khi gặp scene phức tạp.
Visual Memory: 6 Khung Hình, 5 Giây Lịch Sử
Để giải quyết task dài (pick-and-place nhiều bước, lồng vật vào nhau), G0.5 không chỉ nhìn khung hiện tại. Nó nhìn 6 frame trải dài 5 giây trước đó, xử lý qua vision encoder với factorized spatial-temporal attention — spatial attention tập trung vào vị trí trong từng frame, temporal attention theo dõi chuyển động theo thời gian.

Checkpoints & Kết Quả Benchmark
Các Checkpoint Có Sẵn Trên HuggingFace
| Checkpoint | Kích thước | Dùng cho |
|---|---|---|
g05-base |
~11 GB | Fine-tune custom task; zero-shot R1 Lite/Pro |
g05-so101 |
~11 GB | SO-100/101 robot deployment |
g05-droid |
~11 GB | DROID/Franka deployment |
g05-libero |
~11 GB | LIBERO simulation |
g05-robotwin20 |
~11 GB | RoboTwin 2.0 evaluation |
action_tokenizer.pt |
~484 MB | VQ tokenizer (bắt buộc download) |
qwen3_5_2b_base_processor |
~22 MB | Vision processor |
Download tất cả hoặc chọn checkpoint phù hợp:
# Download base + tokenizer (bắt buộc)
huggingface-cli download OpenGalaxea/G05 \
--local-dir ./checkpoints/g05-base \
--include "g05-base/*" "action_tokenizer.pt" "qwen3_5_2b_base_processor/*"
Kết Quả Benchmark
| Benchmark | Điều kiện | Thành công |
|---|---|---|
| LIBERO | Fine-tune, 50 trial/task | 98.9% |
| RoboTwin 2.0 | Fine-tune | 93.3% |
| Bridge-SimplerEnv | Zero-shot | 87.3% |
| DROID | Zero-shot | 82.5% |
| BEHAVIOR-1K | Zero-shot | 0.3136 TSS |
| Real robot (R1 Lite/Pro) | Fine-tune | 76.7% trung bình |
Kết quả LIBERO 98.9% là mức rất cao — hầu hết các VLA hiện tại như OpenVLA đạt 60–70% trên bộ test này. DROID zero-shot 82.5% thậm chí ấn tượng hơn vì G0.5 không cần fine-tune để đạt mức này.
Cài Đặt
Yêu Cầu Hệ Thống
- Linux (Ubuntu 22.04+)
- Python 3.10.x (chú ý:
>=3.10.16, <3.11) - CUDA 12.8, PyTorch 2.7.1
- GPU: ≥8 GB VRAM cho inference; ≥70 GB cho full fine-tune
- FFmpeg (xử lý video trong dataset)
Cài Đặt Với uv
G0.5 dùng uv thay vì pip để quản lý dependency — nhanh hơn ~10-100x, tránh conflict version:
# Cài uv nếu chưa có
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.local/bin/env
# Clone repo
git clone https://github.com/OpenGalaxea/GalaxeaVLA
cd GalaxeaVLA
# Tạo virtualenv + install tất cả dependencies
uv sync --index-strategy unsafe-best-match
source .venv/bin/activate
# Cài ffmpeg
sudo apt update && sudo apt install -y ffmpeg
# Verify
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
Fine-Tune G0.5 Trên Task Của Bạn
Đây là luồng chính mà hầu hết người dùng sẽ làm: thu thập ~50–200 demo bằng VR teleop, convert sang định dạng LeRobot, rồi fine-tune G0.5 base.
Xem thêm hướng dẫn thu thập data và format LeRobot trong bài LeRobot hands-on.
Bước 1: Chuẩn Bị Dataset Theo Định Dạng LeRobot
G0.5 dùng định dạng LeRobot (video + Parquet):
my_task_dataset/
meta/
info.json # camera names, fps, action dim
tasks.jsonl # ["Pick up the red block and place on tray"]
episodes.jsonl # episode metadata
data/
chunk-000/
episode_000000.parquet
episode_000001.parquet
...
videos/
chunk-000/
observation.images.head_rgb/
episode_000000.mp4
observation.images.wrist_rgb/
episode_000000.mp4
Bước 2: Tạo Task Config
# Copy template config
cp configs/task/r1lite.yaml configs/task/my_pick_task.yaml
Sửa configs/task/my_pick_task.yaml:
# @package _global_
defaults:
- override /data: r1lite/eef_torso # hoặc custom robot config
- override /model: vla/g05
model:
pretrained_ckpt: ./checkpoints/g05-base/checkpoints/model_state_dict.pt
action_tokenizer_path: ./checkpoints/g05-base/action_tokenizer.pt
data:
dataset:
dataset_dirs:
- /path/to/my_task_dataset
# Chuẩn hóa action (lấy từ dataset stats)
action_norm:
type: "gaussian"
training:
num_epochs: 50
batch_size: 8
learning_rate: 1.0e-5
grad_accumulation_steps: 4
precision: "bf16"
Bước 3: Chạy Fine-Tuning
# Thiết lập biến môi trường
export G05_OUTPUT_DIR=./outputs/my_pick_task
export HF_HOME=./hf_cache
export HF_HUB_CACHE=./hf_cache
# Fine-tune với 1 GPU (+ gradient accumulation)
bash scripts/run/finetune.sh 1 configs/task/my_pick_task.yaml \
model.batch_size=4 \
model.grad_accumulation_steps=8
# Fine-tune với 8 GPU
bash scripts/run/finetune.sh 8 configs/task/my_pick_task.yaml
Thời gian thực tế: Với 100 demo, 1 GPU RTX 4090, fine-tune ~50 epoch mất khoảng 4–6 giờ.
Theo dõi training:
tensorboard --logdir ./outputs/my_pick_task/tensorboard
Debug Thường Gặp Khi Fine-Tune
| Triệu chứng | Nguyên nhân | Giải pháp |
|---|---|---|
| NaN loss từ epoch đầu | bf16 overflow | Giảm learning_rate xuống 5e-6 |
| CUDA OOM | Batch size quá lớn | Giảm batch_size, tăng grad_accumulation_steps |
| Robot không hiểu lệnh | tasks.jsonl format sai |
Dùng câu ngắn gọn: "Pick up the cup" |
| Action sai chiều | Wrong coordinate frame | Check action_space: absolute vs relative trong config |
Deploy Lên Robot Thực
Xem thêm pipeline deploy đầy đủ trong bài G0Tiny fine-tune và deploy trên R1 Pro.
Galaxea R1 Lite (Phổ Biến Nhất)
# Khởi động policy server (trên GPU machine)
python scripts/serve_policy.py \
--ckpt_path ./outputs/my_pick_task/checkpoints/model_state_dict.pt \
--host 0.0.0.0 \
--port 8080 \
--device cuda \
eval_embodiment=galaxea_r1lite
# Robot-side: nhận lệnh từ server qua ROS2/HTTP
Galaxea R1 Pro (Có Visual Memory)
R1 Pro cần serve_policy_mem.py vì nó gửi multi-frame:
python scripts/serve_policy_mem.py \
--ckpt_path ./outputs/my_pick_task/checkpoints/model_state_dict.pt \
--host 0.0.0.0 \
--port 8080 \
--device cuda \
eval_embodiment=galaxea_r1pro \
num_history_frames=6
SO-100/SO-101 (LeRobot Native)
SO-101 dùng client LeRobot tích hợp sẵn:
cd experiments/so100/
# Cấu hình trong so100_config.yaml
python run_so100_client.py \
--server_host 192.168.1.100 \
--server_port 8080 \
--task "Pick up the block and place it in the box"
DROID / Franka (Repo Riêng)
# Clone Franka client (repo riêng)
git clone https://github.com/OpenGalaxea/droid-franka-client
cd droid-franka-client
pip install -e .
python run_droid_client.py \
--policy_host 192.168.1.100 \
--policy_port 8080 \
--task "place the mug on the plate"
So Sánh G0.5 Với Các VLA Khác
| G0.5 | G0 Plus | OpenVLA-OFT | π0-FAST | |
|---|---|---|---|---|
| Kiến trúc | Unified AR | Dual-system | Transformer + flow | Flow-matching |
| Backbone | Qwen3.5 2B | PaliGemma 3B | Llama 2 7B | PaliGemma 3B |
| Embodiment | 14 (cross) | 1 (single) | Cross (OXE) | Benchmark only |
| LIBERO | 98.9% | N/A | ~82% | ~95% |
| DROID zero-shot | 82.5% | N/A | ~45% | ~60% |
| Chain-of-Thought | ✅ Native | ❌ | ❌ | ❌ |
| Open-source | ✅ | ✅ | ✅ | ❌ |
| Edge deploy | G0Tiny (250M) | G0Tiny | Không | Không |
Điểm khác biệt lớn nhất: G0.5 có chain-of-thought native — nó không chỉ ra lệnh, nó giải thích tại sao. Khi robot thất bại, bạn đọc được lý luận trong log để debug. Các VLA khác không làm được điều này.
Để hiểu bức tranh toàn cảnh các VLA hiện tại, đọc thêm AI Series #5: Tổng Quan Các Mô Hình VLA.
Giấy Phép & Khi Nào Dùng Được Thương Mại
G0.5 dùng G0.5 Community License (áp dụng cho code commit từ 16/6/2026 trở đi):
- ✅ Được phép: Nghiên cứu, phi thương mại, demo nội bộ
- ❌ Cần xin phép: Deploy thương mại, tích hợp sản phẩm bán ra
- ✅ Qwen3.5 components: Apache 2.0
Nếu bạn dùng cho nghiên cứu hoặc prototyping: hoàn toàn miễn phí. Nếu muốn thương mại hóa: liên hệ Galaxea để xin commercial license.
Kết Luận
GalaxeaVLA G0.5 đánh dấu một bước chuyển quan trọng: từ dual-system (hai não) sang unified autoregressive (một não, một dòng suy nghĩ). Kết quả 98.9% LIBERO và 82.5% zero-shot DROID chứng minh rằng cách tiếp cận này không chỉ đẹp về lý thuyết mà thực sự hiệu quả.
Ba điều bạn nên nhớ từ bài này:
- ActionCodec là chìa khóa: Học cách tokenize action cross-embodiment cho phép G0.5 pre-train trên 14 robot cùng lúc — và benefitcủa cross-embodiment transfer thực sự mang lại
- Chain-of-Thought native = debuggable: Khi robot thất bại, bạn đọc được reasoning trong log. Đây là ưu điểm thực tiễn cực kỳ lớn khi deploy production
uv+ config YAML: Pipeline fine-tune của G0.5 sạch và reproducible hơn nhiều so với các VLA framework trước đây



