Skip to content

vllm_omni.diffusion.models.pi05.pipeline_pi05

π0.5 VLA pipeline for vllm-omni.

Entry point for DiffusionEngine.step() → pipeline.forward(req). Mirrors the DreamZero contract and the π0 pipeline: the pipeline owns ALL preprocessing. It reads the raw robot observation from req.sampling_params.extra_args["robot_obs"] (delivered by the OpenPI realtime serving layer), builds model inputs, runs flow-matching denoising, and returns DiffusionOutput(output={"actions": ndarray}).

π0.5 is stateless across calls (no KV reuse, first-order Markov), so session_id / reset from the OpenPI protocol are accepted but ignored.

The post-processing order is load-bearing and matches LeRobot::

unnormalize → absolute actions → to_cpu

AbsoluteActionsProcessorStep must run after unnormalization, because a relative-action checkpoint's norm_stats are computed in relative space.

DEFAULT_PI05_TOKENIZER module-attribute

DEFAULT_PI05_TOKENIZER = 'google/paligemma-3b-pt-224'

SUPPORTED_DTYPES module-attribute

SUPPORTED_DTYPES = (torch.float32, torch.bfloat16)

logger module-attribute

logger = init_logger(__name__)

Pi05Pipeline

Bases: Module

π0.5 VLA pipeline: raw robot obs → continuous action chunk.

Registered as "Pi05Pipeline" in the diffusion registry.

config instance-attribute

config = self._build_config(od_config)

model instance-attribute

model = self._initialize_model()

model_dir instance-attribute

model_dir = self._resolve_model_dir(od_config.model)

od_config instance-attribute

od_config = od_config

prefix instance-attribute

prefix = prefix

processor instance-attribute

processor = Pi05Processor(
    self.config, self.tokenizer, self._device
)

tokenizer instance-attribute

tokenizer = self._load_tokenizer()

tokenizer_source instance-attribute

tokenizer_source = str(
    custom_args.get(
        "tokenizer", self._resolve_tokenizer_source()
    )
)

forward

forward(
    req: OmniDiffusionRequest, **kwargs
) -> DiffusionOutput

has_real_checkpoint

has_real_checkpoint() -> bool

load_weights

load_weights(weights=())

No-op for the diffusion loader: π0.5 self-loads its checkpoint.

get_pi05_post_process_func

get_pi05_post_process_func(od_config: OmniDiffusionConfig)

π0.5 returns actions directly; post-processing is identity.