Why is extra_delta_action=True in 'pi0_libero' config?
Author: PuzhenYuanCreated Oct 27, 2025Updated Sep 15, 2026
In class LeRobotLiberoDataConfig from src/openpi/training/config.py:
# One additional data transform: pi0 models are trained on delta actions (relative to the first
# state in each action chunk). IF your data has ``absolute`` actions (e.g. target joint angles)
# you can uncomment the following line to convert the actions to delta actions. The only exception
# is for the gripper actions which are always absolute.
# In the example below, we would apply the delta conversion to the first 6 actions (joints) and
# leave the 7th action (gripper) unchanged, i.e. absolute.
# In Libero, the raw actions in the dataset are already delta actions, so we *do not* need to
# apply a separate delta conversion (that's why it's commented out). Choose whether to apply this
# transform based on whether your dataset uses ``absolute`` or ``delta`` actions out of the box.
# LIBERO already represents actions as deltas, but we have some old Pi0 checkpoints that are trained with this
# extra delta transform.
if self.extra_delta_transform:
delta_action_mask = _transforms.make_bool_mask(6, -1)
data_transforms = data_transforms.push(
inputs=[_transforms.DeltaActions(delta_action_mask)],
outputs=[_transforms.AbsoluteActions(delta_action_mask)],
)which says that Libero dataset is already in the form of delta action.
And in pi0_libero train config,extra_delta_action=True:
TrainConfig(
# Change the name to reflect your model and dataset.
name="pi0_libero",
# Here you define the model config -- In this example we use pi0 as the model
# architecture and perform *full* finetuning. in the examples below we show how to modify
# this to perform *low-memory* (LORA) finetuning and use pi0-FAST as an alternative architecture.
model=pi0_config.Pi0Config(),
# Here you define the dataset you are training on. In this example we use the Libero
# dataset. For your own dataset, you can change the repo_id to point to your dataset.
# Also modify the DataConfig to use the new config you made for your dataset above.
data=LeRobotLiberoDataConfig(
repo_id="physical-intelligence/libero",
base_config=DataConfig(
# This flag determines whether we load the prompt (i.e. the task instruction) from the
# ``task`` field in the LeRobot dataset. If set to True, the prompt will show up in
# a field called ``prompt`` in the input dict. The recommended setting is True.
prompt_from_task=True,
),
extra_delta_transform=True,
),
# Here you define which pre-trained checkpoint you want to load to initialize the model.
# This should match the model config you chose above -- i.e. in this case we use the pi0 base model.
weight_loader=weight_loaders.CheckpointWeightLoader("gs://openpi-assets/checkpoints/pi0_base/params"),
# Below you can define other hyperparameters like the learning rate, number of training steps, etc.
# Check the base TrainConfig class for a full list of available hyperparameters.
num_train_steps=30_000,
),The question is, although the libero dataset already has delta action, it is converted again during pi0 training, which is equivalent to delta delta action. Is this reasonable? Can we set extra_delta_action=False in pi0 libero training?
Source: Physical-Intelligence/openpi