[π Quick Start] [π Pre-train] [π€ Post-train (Robotwin)] [πΉ RoboTwin Eval] [π Troubleshooting]
2026/06: Initial release of PoseVLA: supports Omni3D / Omni6D / BOP / GraspClutter6D for 3D tasks and Agibot / InternData-A1 for robot actions.
| Method | Easy | Hard |
|---|---|---|
| Ο0 | 67.00 | 65.12 |
| Ο0.5 | 79.48 | 76.16 |
| PaliGemma_expert | 35.40 | 33.36 |
| Pose-VLA (In Paper) | 79.91 | 79.10 |
| PoseVLA (In Repo) | 89.40 | 88.60 |
PoseVLA is split into two training stages, each with its own document:
| Stage | Entry script | Config | Doc |
|---|---|---|---|
| Pre-train (joint VLM + Action on large-scale data) | train_pretrain.py | config/base.yaml | docs/PRETRAIN.md |
| Robotwin data conversion (raw β HDF5 + normalization) | utils/process_data_all.py | config/dataset/robotwin.yaml | docs/ROBOTWIN_DATA.md |
| Post-train / Fine-tune (Robotwin and other downstream robots) | train_posttrain.py | config/base_posttrain.yaml | docs/POSTTRAIN.md |
| RoboTwin simulation eval | robotwin/PoseVLA/eval_policy.py | robotwin/PoseVLA/deploy_policy.yml | robotwin/PoseVLA/README.md |
The project supports three orthogonal training modes that can be freely combined:
- VLM training β learn 3D object detection via Next-Token Prediction (NTP) on Omni3D, Omni6D, BOP, GraspClutter6D, β¦
- Action training β learn robot actions via Flow Matching on HDF5 / LeRobot-format data (Agibot, InternData-A1, Robotwin, β¦).
- Co-Training β VLM and Action data are interleaved within the same optimization step.
π Project Structure (click to expand)
PoseVLA/
βββ train_pretrain.py # Pre-train entry (hydra + accelerate + deepspeed)
βββ train_posttrain.py # Post-train / fine-tune entry (Robotwin etc.)
βββ eval_detection.py # Evaluation / mAP entry (Omni3D and other 3D tasks)
β
βββ posevla/ # PoseVLA model implementation (Ο0 / Ο0.5 based)
β βββ configuration_posevla.py # PoseVLAConfig
β βββ modeling_posevla.py # PoseVLAPolicy (PaliGemma + Action Expert + Flow Matching)
β βββ paligemma_with_expert.py # PaliGemma + Expert dual-stream architecture
β βββ patch_embed.py # Vision patch embedding (SigLIP + prior fusion)
β βββ convert_jax_model_to_pytorch.py # JAX β PyTorch weight converter
β βββ _lerobot_compat.py # LeRobot compatibility layer
β
βββ data/
β βββ factory.py # Unified VLM / Action DataLoader factory
β βββ collators.py # DataCollators (action / detection)
β βββ ds_raw/ # Raw dataset readers
β β βββ agibot.py / interndata_a1.py / robotwin.py
β β βββ droid.py / rdt.py / umi.py / xtrainer.py
β β βββ mix.py # Multi-source mixed dataset reader
β βββ ds_train/ # Training Datasets
β βββ detection/ # 3D detection datasets (VLM)
β β βββ dataset_bop.py / dataset_omni3d.py / dataset_omni6d.py
β β βββ dataset_clutter.py
β β βββ graspclutter6dAPI.py
β βββ robot/ # Robot action datasets (VLA)
β βββ dataset_hdf5_action.py # HDF5 action dataset
β βββ dataset_lerobot.py # LeRobot format dataset
β βββ dataset_agibot.py # Agibot dataset
β
βββ utils/ # Shared utilities
β βββ process_data_all.py # Robotwin raw β HDF5 conversion
β βββ mapping_token.py # Text β 3D scene encoding / decoding utilities
β βββ transform_utils.py # SE(3) / pose math helpers
β βββ image_corrupt.py # Image augmentation
β βββ vis.py # Visualization helpers
β βββ logger.py # WandB / training-state logging
β
βββ config/ # Hydra configs
β βββ base.yaml # Pre-train main config
β βββ base_posttrain.yaml # Post-train (Robotwin) main config
β βββ zero0.json / zero2.json / zero3_offload.json # DeepSpeed configs
β βββ dataset/ # Action training dataset configs (hdf5, lerobot, robotwin)
β βββ dataset_bop/ # BOP series
β βββ dataset_clutter/ # GraspClutter6D
β βββ dataset_omni6d/ # Omni6D
β βββ dataset_omni3d/ # Omni3D (train/val/test)
β βββ dataset_lerobot/ # LeRobot grouped configs
β βββ dataset_meta/ # Per-source sample lists (json)
β
βββ scripts/
β βββ launch/ # Training launch scripts
β β βββ pretrain.sh # Multi-GPU launch for pre-training (train_pretrain.py)
β β βββ posttrain.sh # Multi-GPU launch for post-training (train_posttrain.py)
β βββ download/ # Dataset download / extract / yaml-gen scripts
β β βββ agibot.sh
β β βββ interndata_a1.sh
β β βββ interndata_a1_unzip.sh
β β βββ interndata_a1_generate_yaml.py
β βββ stats/ # Dataset normalization stats
β βββ compute_dataset_stat_hdf5_abs_joint.py
β βββ compute_dataset_stat_hdf5_rel_ee.py
β βββ norm_robotwin.py # Robotwin EEP / qpos normalization stats
β βββ normalize.py
β
βββ bin_stats/ # Non-uniform tokenizer bin boundaries
β βββ nonuniform_bins.pkl # Pre-computed quantization bins for 3D tokenization
β
βββ docs/ # Stage-level documents
β βββ PRETRAIN.md # Pre-train guide
β βββ POSTTRAIN.md # Post-train / fine-tune guide (Robotwin)
β βββ ROBOTWIN_DATA.md # Robotwin raw β HDF5 conversion guide
β
βββ robotwin/PoseVLA/ # RoboTwin simulation deploy + eval
βββ google/paligemma-3b-pt-224/ # Local PaliGemma tokenizer / config
git clone git@github.com:hetolin/PoseVLA.git
cd PoseVLA- Python 3.10.12
- PyTorch 2.7.0 + CUDA 12.6 (TF32 / bf16 works best on Ampere / Hopper GPUs)
conda create -n vla python==3.10.12
conda activate vla
# Install PyTorch first β it is intentionally NOT pinned in requirements.txt,
# because the correct wheel depends on your local CUDA version.
# CUDA 12.6:
pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 \
--index-url https://download.pytorch.org/whl/cu126
# Install lerobot (pinned commit, compatible with PoseVLA)
# Fix: rename `pyav` -> `av` (package renamed on PyPI)
# Fix: remove `rerun-sdk` (requires numpy>=2, conflicts with imgaug)
git clone https://github.com/huggingface/lerobot.git third_party/lerobot \
&& cd third_party/lerobot \
&& git checkout 638d411cd3acf32c28d8c2120f3c41bda8bb15d4 \
&& sed -i 's/pyav/av/' pyproject.toml \
&& sed -i '/rerun-sdk/d' pyproject.toml \
&& pip install -e . \
&& cd ../..
# (Optional) Install bop_toolkit (used for BOP dataset, for 3D pretraining only)
git clone https://github.com/thodan/bop_toolkit.git third_party/bop_toolkit \
&& cd third_party/bop_toolkit \
&& pip install -e . \
&& cd ../..
# NOTE: keep the `lerobot` line commented out in requirements.txt β we install it manually.
pip install -r requirements.txt
Create a pretrain/ directory under the project root and place any of the following weights (pick what you need β multiple loading branches are available in train_pretrain.py):
pretrain/
βββ paligemma-3b-pt-224/ # Vanilla PaliGemma VLM
βββ lerobot_pi0/ # Ο0
βββ pi05_base/ # Ο0.5
The tokenizer is already bundled under google/paligemma-3b-pt-224/; the config points to it via model.tokenizer_model_path.
Set the project parent directory before launching Hydra-based training scripts. At minimum:
export ROOT="/your/home"
export DEV_PATH="${ROOT}/robot_code"
export PYTHONPATH="$PYTHONPATH:${DEV_PATH}"
export HF_HOME=${ROOT}/.cache/huggingface
export HF_LEROBOT_HOME=${HF_HOME}/lerobot
export HYDRA_FULL_ERROR=1W&B auto-login: the script writes /root/.netrc β replace API_KEY with your own.
- For pre-training the PoseVLA backbone on large-scale 3D + action data, follow docs/PRETRAIN.md.
- For post-training / fine-tuning on RoboTwin (or your own robot), follow docs/POSTTRAIN.md.
- For simulation evaluation on RoboTwin, follow robotwin/PoseVLA/README.md.
- Release the training / co-training code for PoseVLA.
- Release the 3D evaluation entry (
eval_detection.py) with mAP / PR-curve aggregation. - Release support for both Ο0 and Ο0.5 Action Experts in a single codebase (switchable via
training.pi05). - Release the Robotwin post-training entry (
train_posttrain.py) and RoboTwin deployment scripts. - Release pretrained PoseVLA checkpoints.
If you encounter any issues, feel free to open an issue on GitHub or reach out through discussions. Feedback and contributions are very welcome! π
PoseVLA is built with reference to the following projects: lerobot, Transformers, Google PaliGemma, Ο0 / OpenPI, Omni3D, BOP Toolkit, and GraspClutter6D. Thanks for their awesome work.