Fine-tuning the π0 and π0.5 Models
π0 and π0.5 are Vision-Language-Action (VLA) policies from Physical Intelligence, and their training pipeline comes from OpenPI. They are the openpi-0 and openpi-0.5 models of the OpenPI repository, written officially as π₀ and π₀.₅, registered under the model identifiers pi0 and pi05 with base checkpoints pi0_base and pi05_base. The platform registers the two models under those identifiers. Both support the jax and lerobot training frameworks and take LeRobot v2 and v3 datasets.
Roles and Prerequisites
Roles
| Role | Can create a training task | Description |
|---|
| Administrator | Yes | Not restricted by Module Permissions |
| Project Manager | Requires authorization | An administrator grants Create Training Job in Module Permissions |
| Annotator | Requires authorization | Same as above |
| Auditor | Requires authorization | Same as above |
| Collector | Requires authorization | Same as above |
Viewing training tasks and metrics requires only View Training.
Prerequisites
| Item | Requirement |
|---|
| Dataset version | LeRobot v2 or v3. The training service reads codebase_version in the dataset's meta/info.json to identify the version and choose the training image |
| Framework | jax (OpenPI pipeline) or lerobot |
| GPU memory | About 22.5 GB or more with LoRA enabled on a single GPU; about 70 GB or more for full fine-tuning |
| Dependency | The platform's model training service is enabled with at least one training location configured; the jax framework uses the OpenPI training image, and the lerobot framework selects a LeRobot training image based on the dataset version |
| Dataset structure | The directory contains meta/info.json, data/, and videos/ |
| Permission | Creating requires Create Training Job; viewing requires View Training |
Training Task Creation and Parameters
Procedure
- Go to Model → Training and select Create Training Job.
- Choose a training location: a local GPU or a cloud training location enabled by an administrator.
- Under Selected Model, select
pi0 or pi05.
- Under Training framework, select
jax or lerobot. The framework determines which parameters appear in Training Parameters.
- Under Training Dataset, choose the data source: Export Records, an uploaded LeRobot dataset, Download Link, or Hugging Face.
- Set parameters in Training Parameters; the table below lists their meaning and default values.
- Enter Notes (optional).
- Select Create Training Job.
Training Parameters
The jax and lerobot frameworks use two separate parameter sets. The jax framework targets the OpenPI training entry point:
| Parameter | Description | Default | Valid range |
|---|
| batch_size | Global batch size | 1 | Integer, ≥ 1 |
| steps | Training steps | 10000 | Integer, ≥ 1 |
| save_interval | Checkpoint save interval | 5000 | Integer, ≥ 1 and not greater than steps |
| learning_rate | Peak learning rate of the cosine decay schedule | 2.5e-5 | Float, > 0 |
| fsdp_devices | Number of FSDP devices | auto | auto or a positive integer; not greater than the visible GPU count and a divisor of it |
| ema_decay | EMA decay factor | Not enabled | 0 < x ≤ 1; ignored when LoRA is enabled |
| action_horizon | Length of the action sequence predicted per step | 50 | Integer, ≥ 1 |
| prompt | Default instruction when the dataset has no task text | Empty | String |
The lerobot framework first applies general training parameters:
| Parameter | Description | Default | Valid range |
|---|
| batch_size | Batch size | 1 | Integer, ≥ 1 |
| steps | Training steps | 10000 | Integer, ≥ 1 |
| seed | Random seed | 1000 | Integer |
| num_workers | DataLoader processes | 4 | Integer, ≥ 1 |
| eval_freq | Evaluation interval | 1000 | Integer, ≥ 1 and not greater than steps |
| log_freq | Logging interval | 100 | Integer, ≥ 1 and not greater than steps |
| save_freq | Checkpoint save interval | 5000 | Integer, ≥ 1 and not greater than steps |
| save_checkpoint | Whether to save checkpoints | true | true / false |
It then appends model parameters with the policy. prefix:
| Parameter | Description | Default | Valid range |
|---|
| policy.n_obs_steps | Input observation steps | 1 | Integer |
| policy.chunk_size | Action prediction length | 50 | Integer |
| policy.n_action_steps | Action steps executed per call | 50 | Integer |
| policy.max_state_dim | State vector padding dimension | 32 | Integer |
| policy.max_action_dim | Action vector padding dimension | 32 | Integer |
| policy.num_inference_steps | Denoising steps at inference | 10 | Integer |
| policy.dtype | Model data type | bfloat16 | bfloat16, float32 |
| policy.tokenizer_max_length | Maximum tokenizer length | 48 for pi0, 200 for pi05 | Integer |
| policy.optimizer_lr | Optimizer learning rate | 2.5e-5 | Float |
| policy.optimizer_weight_decay | Weight decay | 0.0 | Float |
| policy.optimizer_grad_clip_norm | Gradient clipping threshold | 1.0 | Float |
| policy.scheduler_warmup_steps | Learning rate warmup steps | 1000 | Integer |
| policy.scheduler_decay_steps | Learning rate decay steps | 10000 | Integer |
| policy.scheduler_decay_lr | Final learning rate after decay | 0.0 | Float |
Verification
Training Monitoring
The training details page parses logs per framework and plots the metric curves. Metrics for the jax framework:
| Metric | Meaning | Criteria |
|---|
| step | Number of completed training steps | Increases step by step up to the configured steps |
| loss | Training loss | Decreases overall; if it stops decreasing for a long time, check the learning rate and data |
| gradient_norm | Gradient norm | Does not keep growing |
| param_norm | Parameter norm | Changes slowly over training |
Metrics for the lerobot framework:
| Metric | Meaning | Criteria |
|---|
| step | Number of completed training steps | Increases step by step up to the configured steps |
| sample | Number of processed samples | Increases with step |
| episode | Number of processed episodes | Increases with step |
| epoch | Number of trained epochs | Increases with step |
| loss | Training loss | Decreases overall |
| gradient_norm | Gradient norm | Does not keep growing |
| learning_rate | Current learning rate | Changes according to the schedule |
| update_time_s | Time per update step | Stable, does not keep growing |
| data_time_s | Data loading time | Stable |
Verification Checklist
The training service determines the final task state from the container exit code: exit code 0 is recorded as Success, and a nonzero code as Failed.
| Check | Pass criteria |
|---|
| Task status | The training details page shows Success and the container exit code is 0 |
| Output directory | The jax framework writes to docker_train/train/ under the output directory; the lerobot framework writes to checkpoints/ |
| Checkpoints | Checkpoints lists the checkpoints; jax contents include params/, and lerobot contents include pretrained_model/; the entry that last points to has type Final, and the rest have type Step |
| Metric curves | Training Metrics plots step, loss, and gradient_norm for jax; for lerobot it also includes sample, episode, epoch, and learning_rate |
| Logs | Real-time Logs can be read without repeated errors |
Checkpoints listed in Checkpoints can be downloaded, synced to object storage, or used to create an inference service; see Model Inference for the inference side.
Error Handling
| Symptom | Possible cause | Action | Owner |
|---|
| Training fails immediately with a dataset-not-found error | The dataset lacks meta/info.json, or the selected source path is wrong | Select the correct Export Records entry or uploaded dataset again | Project Manager |
| Out of GPU memory | batch_size is too large, or full fine-tuning runs on a single GPU | Lower batch_size; keep LoRA enabled on a single GPU | Algorithm Engineer |
| Invalid FSDP device count error | fsdp_devices exceeds the visible GPU count or is not a divisor of it | Set fsdp_devices to auto, or to a divisor of the visible GPU count | Algorithm Engineer |
| Save interval greater than training steps error | save_interval or save_freq exceeds steps | Reduce the save interval to no more than steps | Algorithm Engineer |
| Single-GPU and multi-GPU results differ greatly | A single GPU defaults to LoRA and multiple GPUs default to FSDP, so the number of trained parameters differs | Fix the framework, fsdp_devices, batch_size, and random seed, then compare again | Algorithm Engineer |
| Loss stops decreasing for a long time | Unsuitable learning rate, missing task text, or insufficient data coverage | Check prompt and the dataset; adjust learning_rate | Algorithm Engineer |
| Training location unavailable | The platform has not enabled that training location, or its GPU is unavailable | Switch to another training location; ask an administrator to check the Training Service | Administrator |
Related Pages