If you've ever tried to take a VLA paper from arxiv to a real robot, you know the hidden cost: it's rarely the algorithm that blocks you. It's the engineering. Pi0 ships one data format, GR00T another, OpenVLA a third. Each has its own training stack, its own deployment quirks, its own evaluation harness. Want to compare two models on the same task? Congratulations — you're now maintaining parallel infrastructure that will diverge silently over time.
FluxVLA Engine, released this week by LimX Dynamics together with teams from Nankai University and the University of Hong Kong (arXiv:2609.17210), attacks this problem directly. It doesn't introduce a new policy architecture. Instead, it's a standardized engineering platform that unifies the entire workflow from raw demonstrations to real-robot execution under a single, auditable configuration.

This guide walks through the full practical pipeline: environment setup, data preparation, training, simulation evaluation, accelerated inference, and deployment on real hardware.
The Three Problems FluxVLA Solves
The VLA ecosystem in 2026 has a fragmentation problem. Three specific bottlenecks:
1. Incompatible data formats — RLDS, LeRobot v2.1, HDF5, custom pickle. Each dataset ships a different schema. Switching models means rewriting your data loader from scratch — not because the algorithm changed, but because the file format did.
2. Tightly-coupled codebases — Pi0's training code isn't GR00T's training code. An apples-to-apples comparison of three architectures requires maintaining three separate training stacks, three evaluation harnesses, and three deployment pipelines that drift apart silently over months.
3. The sim-to-real gap — A policy that scores 95% in LIBERO simulation may fail completely on a real Franka arm if the inference pipeline doesn't correctly handle latency, sensor noise, and hardware timing. That gap lives in the infrastructure, not the algorithm.
FluxVLA standardizes interfaces at each of these points using explicit "contracts" between components — ensuring that the same preprocessing that ran at training time runs at inference time, and that a checkpoint always carries its resolved configuration.
Five-Layer Architecture
FluxVLA organizes the VLA lifecycle into five explicit layers:
Data Layer — Maps episodes into canonical sample dictionaries through composable transforms. The standard is LeRobot v2.1/v3.x Parquet with metadata in meta/episodes.jsonl. Critically, transforms compose into pipelines (crop → normalize → temporal stack) that run identically at training and inference time, eliminating the classic preprocessing drift bug.
Model Layer — Registry-based construction lets you swap any component independently:
- Vision encoders: CLIP ViT-B/32, DINOv2 ViT-Large, SigLIP ViT-SO400M, PaliGemma
- Language models: Qwen 2.5 (3B/7B), Llama 2 (7B), Gemma-family
- Action heads: discrete token prediction (OpenVLA-style), continuous flow-matching (Pi0-style), DiT
- Projectors: MLP or Linear bridge from visual tokens to language space
Every model inherits from BaseVLA for consistent distributed training and action prediction interfaces.
Execution Layer — DDP and FSDP via scripts/train.py. Checkpoints are self-contained with their resolved configuration — you always know which config produced which weights, making experiments reproducible months later.
Serving Layer — ZMQ-based transport for observation/action I/O. Models can run on a dedicated GPU server and serve inference over the network, or run locally. This is critical for edge setups where the robot controller and the inference backend live on different hardware.
Operator Layer — Translates framework abstractions into simulator or robot SDK calls. Currently supports: Franka dual-arm and single-arm, ALOHA, UR3, TRON 2, and the Oli humanoid for whole-body manipulation.
Supported Models
| Model | Params | Architecture | Best for |
|---|---|---|---|
| OpenVLA | 7B | Token prediction (SigLIP + LLaMA) | Research, benchmarking |
| GR00T N1.5 | 3B | Cross-attention DiT head | Humanoid WBC |
| GR00T N1.7 | 3B | Improved N1.5 | Humanoid WBC |
| Pi0/Pi0.5 | 3B | Flow-matching, dual Gemma experts | ALOHA, UR3, LIBERO |
| FastWAM | 5B | World-action model | Multi-task generalization |
| SmolVLA | 450M | Lightweight | Jetson Orin, low-latency |
| DiT4DiT | varies | Diffusion-in-tokenizer | High-dexterity tasks |
| DreamZero | varies | World model integration | Sim-augmented training |
Also supported as VLM backbones: Qwen2.5-VL (3B), Qwen3-VL (30B), SmolVLM2 (500M).
Installation
FluxVLA provides an automated installer with three modes — pick the right one to avoid unnecessary dependencies:
conda create -n fluxvla python=3.10 -y
conda activate fluxvla
# Simulation only (LIBERO, RoboCasa, MuJoCo)
bash scripts/install_env.sh sim-only
# Real robot only (lighter, no sim dependencies)
bash scripts/install_env.sh real-only
# Full installation (sim + real + all features)
bash scripts/install_env.sh full
The script handles all the painful dependencies automatically: PyTorch + CUDA, FlashAttention wheel build, FFmpeg + av, and the full FluxVLA package.
Headless server note: For training on a GPU server without a display, configure EGL rendering for simulation:
export MUJOCO_GL=egl
export EGL_DEVICE_ID=0 # target GPU index
Data Preparation
FluxVLA uses LeRobot v2.1/v3.x Parquet format as its canonical representation. Pre-processed datasets are available on Hugging Face under the FluxVLA organization:
FluxVLA/libero-spatial-lerobot — LIBERO Spatial (10 tasks)
FluxVLA/libero-object-lerobot — LIBERO Object
FluxVLA/libero-goal-lerobot — LIBERO Goal
FluxVLA/libero-10-lerobot — LIBERO 10 (long-horizon)
FluxVLA/robocasa-gr1-lerobot — RoboCasa GR1 tabletop tasks
FluxVLA/franka-realrobot-lerobot — Real-robot Franka demonstrations
For custom datasets (HDF5 from ACT/ALOHA, RLDS from Open X-Embodiment), use the conversion scripts:
# Convert from RLDS
python scripts/convert_rlds_to_lerobot.py \
--data-dir /path/to/rlds \
--output-dir /path/to/lerobot_dataset
# Verify structure
python scripts/verify_dataset.py --data-dir /path/to/lerobot_dataset
Expected dataset structure:
dataset/
├── meta/
│ └── episodes.jsonl # per-episode metadata
├── data/
│ ├── chunk-000/
│ │ ├── episode_000000.parquet
│ │ └── episode_000001.parquet
│ └── chunk-001/
│ └── ...
└── videos/ # optional compressed observations
Training
FluxVLA uses Python config files (mmengine-style) where a single file manages the entire pipeline: model architecture, data loading, training hyperparameters, evaluation protocol, and deployment interfaces. This is the core of the configuration-as-code approach — one file, one experiment, reproducible forever.
Training Pi0.5 on LIBERO-10:
torchrun --standalone --nnodes 1 --nproc-per-node 2 \
scripts/train.py \
--config configs/pi05/pi05_paligemma_libero_10_full_finetune.py \
--work-dir ./work_dirs/pi05_libero_10_full_finetune \
--cfg-options train_dataloader.per_device_batch_size=2
--nproc-per-node 2 for 2 GPUs; change to 1 for single-GPU training.
Training GR00T N1.5 on RoboCasa GR1:
torchrun --standalone --nnodes 1 --nproc-per-node 4 \
scripts/train.py \
--config configs/groot/groot_n15_robocasa_gr1_full_finetune.py \
--work-dir ./work_dirs/groot_n15_robocasa_gr1 \
--cfg-options train_dataloader.per_device_batch_size=4 \
model.freeze_vision_encoder=True
Multi-node cluster training:
# Node 0 (master):
torchrun --nnodes 2 --nproc-per-node 8 \
--node-rank 0 --master-addr <NODE0_IP> --master-port 29500 \
scripts/train.py --config configs/fastwam/fastwam_5b_libero.py
# Node 1:
torchrun --nnodes 2 --nproc-per-node 8 \
--node-rank 1 --master-addr <NODE0_IP> --master-port 29500 \
scripts/train.py --config configs/fastwam/fastwam_5b_libero.py
LimX Dynamics claims "full training pipeline under 30 minutes" for smaller models on LIBERO — enabled by FSDP sharding and optimized checkpoint design.
Simulation Evaluation
torchrun --standalone --nnodes 1 --nproc-per-node 2 \
scripts/eval.py \
--config configs/pi05/pi05_paligemma_libero_10_full_finetune.py \
--ckpt-path checkpoints/step-028548-epoch-18-loss=0.0111.safetensors
LIBERO benchmark results (average across 4 task suites):
| Model | Avg Success Rate |
|---|---|
| FastWAM-Joint | 98.35% |
| Pi0.5 | ~92% |
| GR00T N1.5 | ~87% |
| OpenVLA | ~81% |
| SmolVLA | ~72% |
FastWAM-Joint (5B) leads with 98.35% — the strongest result in the group on this benchmark. (See the paper for the full breakdown per task suite.)
RoboCasa GR1 — significantly harder than LIBERO:
| Model | Success Rate |
|---|---|
| DiT4DiT | 57.25% |
| FastWAM | ~48% |
| Pi0.5 | ~41% |
| GR00T N1.5 | ~35% |
| SmolVLA | 8.75% |
The lower numbers on RoboCasa reflect task complexity, not model quality — this benchmark is closer to real-world manipulation difficulty.
Accelerated Inference — 5-10x Speedup
This is FluxVLA's standout technical contribution on the engineering side. The inference pipeline achieves 5-10x speedup over baseline through multiple optimization layers:

- CUDA Graph capture — Capture the computation graph once, replay to eliminate per-step CPU overhead
- Triton kernel fusion — Merge small CUDA kernels into larger ones to reduce memory bandwidth pressure
- Real-Time Chunking (RTC) — Training-time prefix conditioning combined with test-time guidance ensures smooth action chunk transitions without jerk artifacts at chunk boundaries
- Trajectory post-processing — Joint-space optimization with jerk-limited filtering for physically smooth robot motion
On NVIDIA Jetson Orin (edge deployment):
- GR00T-N1.5: 7.4 Hz — sufficient for real-time manipulation (5-10 Hz minimum required)
- SmolVLA (450M): higher throughput for latency-sensitive applications
Remote inference with ZMQ (when the robot lacks onboard compute):
# On the GPU server:
python scripts/serve_inference.py \
--config configs/groot/groot_n15_serving.py \
--port 5555
# On the robot controller (NUC or Jetson):
python scripts/run_robot.py \
--operator configs/operators/franka_operator.py \
--inference-server tcp://192.168.1.100:5555
This split architecture is essential for Franka and ALOHA setups where the arm controller runs on a small embedded computer that can't host a 3B+ parameter model.
Whole-Body Manipulation with the Oli Humanoid
FluxVLA supports the Oli humanoid platform for whole-body manipulation — distinguishing it from frameworks focused exclusively on tabletop robot arms. This support extends to the SARM (Segmented ARM) training workflow, which addresses a common real-world problem: uneven demonstration quality.
Arm Reward Modeling (ARM) with reweighting:
# Reward-Adjusted Behavioral Cloning (RA-BC)
torchrun --standalone --nnodes 1 --nproc-per-node 4 \
scripts/train.py \
--config configs/sarm/sarm_oli_wholebody.py \
--cfg-options model.reweighting_method=ra_bc
# Advantage-Weighted Behavioral Cloning (AW-BC)
torchrun --standalone --nnodes 1 --nproc-per-node 4 \
scripts/train.py \
--config configs/sarm/sarm_oli_wholebody.py \
--cfg-options model.reweighting_method=aw_bc
SARM segments demonstrations by quality and reweights gradient contributions — the model learns more from high-quality demos without discarding low-quality ones entirely. This is particularly valuable in real-robot collection where operator fatigue creates naturally uneven datasets.
For a deep-dive into Pi0.5 fine-tuning with teleop data collection, see the AXIS Browser teleop + Pi0.5 pipeline guide. To benchmark OpenVLA versus Pi0.5 on identical task sets with real numbers, the DexVerse comparison is the best reference. If your goal is deploying GR00T N1 on a G1 humanoid end-to-end, the GR00T N1 fine-tuning pipeline covers the complete workflow from data collection to deployment.
Summary
FluxVLA Engine solves the right problem: the VLA community doesn't lack good models — it lacks standardized infrastructure to run and compare them reproducibly.
Four things that make it worth the investment:
- Unified config — one Python file controls the entire lifecycle, from data to deployment
- Module decoupling — swap vision encoder, language model, or action head without rebuilding infrastructure
- 5-10x inference speedup — CUDA Graphs and Triton kernels that are practical for edge deployment, not just benchmarks
- Cross-embodiment support — from Franka single-arm to Oli humanoid whole-body manipulation
The codebase is on GitHub under Creative Commons BY 4.0. The paper, pre-processed datasets, and checkpoint downloads are all publicly available.



