在日新月异的机器人智能领域,Physical Intelligence 团队始终走在前沿,致力于将最前沿的研究成果转化为可触及、可操作的工具。OpenPI 正是这一愿景的结晶,它是一个充满活力的开源项目,汇集了我们为机器人打造的视觉-语言-动作(VLA)模型和软件包。它的诞生,旨在为全球的研究者和开发者提供一个强大的平台,共同探索机器人智能的无限可能。

OpenPI 的核心:探索多模态模型的演进

在 OpenPI 的核心,我们精心打造了三款独特的 VLA 模型,它们代表了我们在机器人感知和控制领域的持续探索与创新:

  • π₀ 模型:这是我们的先驱之作,一个基于流(flow-based)的 VLA 模型。它能够理解视觉信息、语言指令,并将其转化为具体的机器人动作,为多模态智能交互奠定了基础。
  • π₀-FAST 模型:为了追求更快的响应和更流畅的交互,我们推出了 π₀-FAST 模型。它是一个自回归 VLA 模型,借鉴了 FAST 动作分词器的优势,使得机器人能够更高效地规划和执行任务。
  • π₀.₅ 模型:作为 π₀ 的升级版,π₀.₅ 模型在开放世界泛化能力上实现了显著提升。我们引入了“知识隔离”技术,使得模型在面对未知环境和新任务时,依然能表现出卓越的适应性。值得注意的是,目前在 OpenPI 仓库中,π₀.₅ 模型在训练和推理时均主要支持流匹配(flow matching)头部。

所有这些模型,我们都提供了在超过 10,000 小时真实机器人数据上预训练的“基础模型”检查点。这意味着你可以直接使用它们进行开箱即用的实验,或者根据你自己的数据集进行微调,以适应特定的应用场景。

一场充满潜力的实验:欢迎你的尝试

OpenPI 中的 π 模型最初是为我们内部的机器人平台而开发的,这些平台与市面上广泛使用的 ALOHA 和 DROID 等机器人系统存在差异。我们怀着乐观的态度,相信研究人员和实践者能够通过富有创造性的实验,将 π 模型适配到他们自己的平台上。然而,我们也要坦诚地说明,并非每一次尝试都能获得预期的成功。这正是实验的魅力所在:π 模型可能适合你,也可能不适合,但我们热情地邀请你来尝试,亲自验证它的潜力!

OpenPI 的发展足迹:持续的进步与更新

OpenPI 的旅程充满了持续的改进和创新。以下是我们近期的一些重要更新,它们共同描绘了项目不断进化的面貌:

  • 2025年9月:我们为 OpenPI 带来了期待已久的 PyTorch 支持,为更广泛的开发者社区提供了便利。
  • 2025年9月:π₀.₅ 模型正式发布,以其在开放世界泛化方面的显著提升,标志着我们在机器人智能领域迈出了重要一步。
  • 2025年9月:为了优化 DROID 训练效果,我们新增了一个改进的空闲过滤器,有助于更高效地处理数据。
  • 2025年6月:我们发布了详细指南,指导用户如何使用 OpenPI 在完整的 DROID 数据集上训练 VLA 模型。这为复现 π₀-FAST-DROID 的训练流程提供了开源实现。

开启你的 OpenPI 之旅:软硬件要求与安装指南

踏上 OpenPI 的智能机器人之旅前,你需要准备一些基本的软硬件环境。

硬件要求: 为了运行本仓库中的模型,你需要一块 NVIDIA GPU。以下是单 GPU 的大致配置估算,但请注意,你也可以通过配置训练中的 fsdp_devices 来利用多 GPU 并行,从而降低单 GPU 的内存需求。目前,我们的训练脚本尚不支持多节点训练。

模式内存需求推荐 GPU
推理(Inference)> 8 GBRTX 4090
微调 (LoRA)> 22.5 GBRTX 4090
微调 (Full)> 70 GBA100 (80GB) / H100

操作系统: 我们已在 Ubuntu 22.04 系统上对 OpenPI 进行了全面测试,目前暂不支持其他操作系统。

安装步骤: 克隆仓库时,请务必更新子模块,以确保所有依赖项都已就位:

git clone --recurse-submodules [email protected]:Physical-Intelligence/openpi.git
git submodule update --init --recursive

我们推荐使用 uv 来管理 Python 依赖。请参考 uv 的官方安装指南进行设置。安装 uv 后,运行以下命令来配置环境:

GIT_LFS_SKIP_SMUDGE=1 uv sync
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .

注意GIT_LFS_SKIP_SMUDGE=1 是为了在拉取 LeRobot 作为依赖时避免 LFS 对象污染。

Docker 支持:如果你在系统配置上遇到困难,我们还提供了 Docker 安装指南。通过 Docker,你可以简化安装过程,快速启动 OpenPI。详情请参阅 Docker 设置文档。

深度解析模型检查点:基础与专家模型

OpenPI 提供了丰富多样的模型检查点,它们是开启机器人智能实验的关键。

基础模型: 这些 VLA 基础模型检查点在超过 10,000 小时真实机器人数据上进行了预训练,是进行进一步微调的理想起点。

模型用途描述检查点路径
π₀微调用于微调的基础 π₀ 模型gs://openpi-assets/checkpoints/pi0_base
π₀-FAST微调用于微调的基础自回归 π₀-FAST 模型gs://openpi-assets/checkpoints/pi0_fast_base
π₀.₅微调用于微调的基础 π₀.₅ 模型gs://openpi-assets/checkpoints/pi05_base

微调模型(专家模型): 我们还提供了一系列针对特定机器人平台和任务的“专家”检查点。这些模型在上述基础模型的基础上进行了微调,旨在直接在目标机器人上运行。它们可能适用于你的特定机器人,也可能不适用。尽管这些检查点是在 ALOHA 和 DROID Franka 等更常见的机器人平台上收集的相对较小数据集上进行微调的,但我们发现其中一些,尤其是 DROID 检查点,在实际应用中具有相当广泛的泛化能力。

模型用途描述检查点路径
π₀-FAST-DROID推理在 DROID 数据集上微调的 π₀-FAST 模型:在 DROID 机器人平台上,可以在新场景中零样本执行各种简单的桌面操作任务。gs://openpi-assets/checkpoints/pi0_fast_droid
π₀-DROID微调在 DROID 数据集上微调的 π₀ 模型:推理速度比 π₀-FAST-DROID 更快,但在遵循语言指令方面可能略逊一筹。gs://openpi-assets/checkpoints/pi0_droid
π₀-ALOHA-towel推理在内部 ALOHA 数据上微调的 π₀ 模型:可以在 ALOHA 机器人平台上零样本折叠各种毛巾。gs://openpi-assets/checkpoints/pi0_aloha_towel
π₀-ALOHA-tupperware推理在内部 ALOHA 数据上微调的 π₀ 模型:可以从特百惠容器中取出食物。gs://openpi-assets/checkpoints/pi0_aloha_tupperware
π₀-ALOHA-pen-uncap推理在公共 ALOHA 数据上微调的 π₀ 模型:可以打开笔盖。gs://openpi-assets/checkpoints/pi0_aloha_pen_uncap
π₀.₅-LIBERO推理针对 LIBERO 基准测试微调的 π₀.₅ 模型:取得了最先进的性能表现,详情可参阅 LIBERO README 文档。gs://openpi-assets/checkpoints/pi05_libero
π₀.₅-DROID推理 / 微调在 DROID 数据集上,并结合知识隔离技术微调的 π₀.₅ 模型:具有快速推理和良好的语言遵循能力。gs://openpi-assets/checkpoints/pi05_droid

默认情况下,这些检查点会从 gs://openpi-assets 自动下载,并缓存到 ~/.cache/openpi 目录。如果你希望修改下载路径,可以设置 OPENPI_DATA_HOME 环境变量。

运行推理:让预训练模型动起来

我们的预训练模型检查点只需几行代码即可运行。以 π₀.₅-DROID 模型为例,你可以轻松地将其集成到你的应用中:

from openpi.training import config as _config
from openpi.policies import policy_config
from openpi.shared import download

config = _config.get_config("pi05_droid")
checkpoint_dir = download.maybe_download("gs://openpi-assets/checkpoints/pi05_droid")
policy = policy_config.create_trained_policy(config, checkpoint_dir)
example = {
    "observation/exterior_image_1_left": ...,
    "observation/wrist_image_left": ...,
    ...
    "prompt": "pick up the fork"
}
action_chunk = policy.infer(example)["actions"]

你也可以在我们的示例 notebook 中进行测试。

为了帮助你更好地将模型应用于实际,我们提供了在 DROID 和 ALOHA 机器人上运行预训练检查点的详细分步示例。

远程推理:我们还提供了远程运行模型推理的示例和代码。这意味着模型可以在不同的服务器上运行,并通过 WebSocket 连接将动作流式传输到机器人。这使得使用更强大的 GPU 进行离线计算变得容易,同时保持机器人和策略环境的独立性。

无需机器人测试推理:如果你想在没有实体机器人的情况下测试推理功能,我们也提供了一个脚本。该脚本将生成随机观测数据并运行模型推理。

微调基础模型:定制你的机器人数据

将基础模型微调到你自己的数据集上,是 OpenPI 提供强大定制能力的关键。我们将以 LIBERO 数据集上的 π₀.₅ 模型微调为例,为你详细解读整个过程。这可以分为三个主要步骤:

1. 将数据转换为 LeRobot 数据集

我们使用 LeRobot 数据集进行训练。我们提供了一个将 LIBERO 数据转换为 LeRobot 数据集的最小示例脚本 examples/libero/convert_libero_data_to_lerobot.py。你可以轻松修改它,以适配你自己的数据!你可以从指定位置下载原始 LIBERO 数据集,然后运行脚本:

uv run examples/libero/convert_libero_data_to_lerobot.py --data_dir /path/to/your/libero/data

注意:如果你只是想在 LIBERO 上进行微调,可以跳过此步骤,因为我们的 LIBERO 微调配置已经指向了一个预转换的 LIBERO 数据集。此步骤仅作为一个示例,供你将其应用于自己的数据。

2. 定义训练配置并运行训练

为了在你自己的数据上微调基础模型,你需要定义数据处理和训练的配置。我们提供了 LIBERO 的示例配置,其中包含详细注释,你可以根据自己的数据集进行修改:

  • LiberoInputsLiberoOutputs:定义了从 LIBERO 环境到模型以及模型到环境的数据映射,用于训练和推理。
  • LeRobotLiberoDataConfig:定义了如何处理来自 LeRobot 数据集的原始 LIBERO 数据以进行训练。
  • TrainConfig:定义了微调的超参数、数据配置和权重加载器。

我们为 π₀、π₀-FAST 和 π₀.₅ 模型在 LIBERO 数据上的微调提供了示例配置。

在开始训练之前,我们需要计算训练数据的归一化统计量。使用你的训练配置名称运行以下脚本:

uv run scripts/compute_norm_stats.py --config-name pi05_libero

现在,我们可以通过以下命令启动训练(--overwrite 标志用于在你使用相同配置重新运行微调时覆盖现有检查点):

XLA_PYTHON_CLIENT_MEM_FRACTION=0.9 uv run scripts/train.py pi05_libero --exp-name=my_experiment --overwrite

该命令将把训练进度记录到控制台,并将检查点保存到 checkpoints 目录。你还可以在 Weights & Biases 仪表板上监控训练进度。为了最大化利用 GPU 内存,请在运行训练前设置 XLA_PYTHON_CLIENT_MEM_FRACTION=0.9——这使得 JAX 可以使用高达 90% 的 GPU 内存(而默认值为 75%)。

注意:我们提供了从预训练中重新加载状态/动作归一化统计量的功能。如果你正在对预训练混合物中的机器人执行新任务进行微调,这可能会很有益。有关如何重新加载归一化统计量的更多详细信息,请参阅 norm_stats.md 文件。

3. 启动策略服务器并运行推理

训练完成后,我们可以通过启动策略服务器,然后从 LIBERO 评估脚本中查询它来运行推理。启动模型服务器非常简单(本例中我们使用第 20,000 次迭代的检查点,可根据需要修改):

uv run scripts/serve_policy.py policy:checkpoint --policy.config=pi05_libero --policy.dir=checkpoints/pi05_libero/my_experiment/20000

这将启动一个服务器,它在端口 8000 监听,并等待接收观测数据。然后,我们可以运行一个评估脚本(或机器人运行时)来查询服务器。

对于运行 LIBERO 评估,我们特别提供并推荐使用 Dockerized 工作流,它能同时处理策略服务器和评估脚本。更多详情请参阅 LIBERO README。

如果你想将策略服务器调用嵌入到你自己的机器人运行时中,我们在远程推理文档中提供了一个最小示例。

更多示例: 我们还在以下 README 文档中提供了更多关于如何在 ALOHA 平台上微调和运行模型推理的示例:

  • ALOHA 模拟器
  • ALOHA 真实机器人
  • UR5

PyTorch 支持:拓宽 OpenPI 的生态边界

OpenPI 现在为 π₀ 和 π₀.₅ 模型提供了 PyTorch 实现,与最初的 JAX 版本并驾齐驱!PyTorch 实现已在 LIBERO 基准测试(包括推理和微调)上进行了验证。目前,一些功能尚未支持(未来可能会有所改变):

  • π₀-FAST 模型
  • 混合精度训练
  • FSDP(完全分片数据并行)训练
  • LoRA(低秩适应)训练
  • 训练期间的 EMA(指数移动平均)权重

设置

  1. 确保你已安装所有依赖项的最新版本:uv sync
  2. 再次检查你是否安装了 transformers 4.53.2:uv pip show transformers
  3. 应用 transformers 库补丁:
cp -r ./src/openpi/models_pytorch/transformers_replace/* .venv/lib/python3.11/site-packages/transformers/

这将使用必要的模型更改覆盖 transformers 库中的几个文件:1) 支持 AdaRMS,2) 正确控制激活的精度,以及 3) 允许使用 KV 缓存而不更新。

警告:使用默认的 uv link 模式(硬链接),这将永久影响 uv 缓存中的 transformers 库,这意味着这些更改将在重新安装 transformers 后仍然存在,甚至可能传播到使用 transformers 的其他项目。要完全撤销此操作,你必须运行 uv cache clean transformers

将 JAX 模型转换为 PyTorch

要将 JAX 模型检查点转换为 PyTorch 格式:

uv run examples/convert_jax_model_to_pytorch.py \
    --checkpoint_dir /path/to/jax/checkpoint \
    --config_name <config name> \
    --output_path /path/to/converted/pytorch/checkpoint

使用 PyTorch 运行推理

PyTorch 实现使用与 JAX 版本相同的 API——你只需更改检查点路径,使其指向转换后的 PyTorch 模型:

from openpi.training import config as _config
from openpi.policies import policy_config
from openpi.shared import download

config = _config.get_config("pi05_droid")
checkpoint_dir = "/path/to/converted/pytorch/checkpoint"
policy = policy_config.create_trained_policy(config, checkpoint_dir)
action_chunk = policy.infer(example)["actions"]

PyTorch 策略服务器

策略服务器与 PyTorch 模型的工作方式相同——只需指向转换后的检查点目录:

uv run scripts/serve_policy.py policy:checkpoint \
    --policy.config=pi05_droid \
    --policy.dir=/path/to/converted/pytorch/checkpoint

使用 PyTorch 进行微调

要使用 PyTorch 微调模型:

  1. 将 JAX 基础模型转换为 PyTorch 格式:
uv run examples/convert_jax_model_to_pytorch.py \
    --config_name <config name> \
    --checkpoint_dir /path/to/jax/base/model \
    --output_path /path/to/pytorch/base/model
  1. 在配置中使用 pytorch_weight_path 指定转换后的 PyTorch 模型路径。

  2. 使用以下任一模式启动训练:

    • 单 GPU 训练
      uv run scripts/train_pytorch.py <config_name> --exp_name <run_name> --save_interval <interval>
      uv run scripts/train_pytorch.py debug --exp_name pytorch_test
      uv run scripts/train_pytorch.py debug --exp_name pytorch_test --resume  # 从最新检查点恢复
      
    • 多 GPU 训练(单节点)
      uv run torchrun --standalone --nnodes=1 --nproc_per_node=<num_gpus> scripts/train_pytorch.py <config_name> --exp_name <run_name>
      uv run torchrun --standalone --nnodes=1 --nproc_per_node=2 scripts/train_pytorch.py pi0_aloha_sim --exp_name pytorch_ddp_test
      uv run torchrun --standalone --nnodes=1 --nproc_per_node=2 scripts/train_pytorch.py pi0_aloha_sim --exp_name pytorch_ddp_test --resume
      
    • 多节点训练
      uv run torchrun \
          --nnodes=<num_nodes> \
          --nproc_per_node=<gpus_per_node> \
          --node_rank=<rank_of_node> \
          --master_addr=<master_ip> \
          --master_port=<port> \
          scripts/train_pytorch.py <config_name> --exp_name=<run_name> --save_interval <interval>
      

精度设置

JAX 和 PyTorch 实现在精度处理上有所不同:

JAX

  1. 推理:大部分权重和计算使用 bfloat16,少数计算为了稳定性使用 float32。
  2. 训练:默认为混合精度:权重和梯度使用 float32,大部分激活和计算使用 bfloat16。你可以在配置中将 dtype 设置为 float32 来切换到完全 float32 训练。

PyTorch

  1. 推理:与 JAX 匹配——大部分权重和计算使用 bfloat16,少数权重为了稳定性转换为 float32。
  2. 训练:支持完全 bfloat16(默认)或完全 float32。你可以通过在配置中设置 pytorch_training_precision 来更改。bfloat16 使用更少的内存,但相比 float32 会显示出更高的损失。混合精度目前尚不支持。

通过 torch.compile 优化,PyTorch 和 JAX 在推理速度上具有可比性。

疑难解答:解决常见问题

我们在此收集了 OpenPI 使用过程中可能遇到的常见问题及其解决方案。如果你遇到问题,请首先查阅此处。如果仍无法找到解决方案,请在仓库中提交 Issue。

问题解决方案
uv sync 因依赖冲突而失败尝试删除虚拟环境目录 (rm -rf .venv) 并重新运行 uv sync。如果问题仍然存在,请检查你是否安装了最新版本的 uv (uv self update)。
训练时 GPU 内存不足确保在运行训练之前设置 XLA_PYTHON_CLIENT_MEM_FRACTION=0.9(或更高),以允许 JAX 使用更多 GPU 内存。你还可以使用 --fsdp-devices <n>,其中 <n> 是你的 GPU 数量,以启用完全分片数据并行(fully-sharded data parallelism),这会降低内存使用,但会以较慢的训练速度为代价(速度下降程度取决于你的具体设置)。如果内存仍然不足,你可能需要考虑禁用 EMA。
策略服务器连接错误检查服务器是否正在运行并监听预期端口。验证客户端和服务器之间的网络连接和防火墙设置。
训练时出现“缺少归一化统计量”错误在开始训练之前,使用你的配置名称运行 scripts/compute_norm_stats.py
数据集下载失败检查你的互联网连接。对于 HuggingFace 数据集,请确保你已登录 (huggingface-cli login)。
CUDA/GPU 错误验证 NVIDIA 驱动程序是否正确安装。对于 Docker,请确保已安装 nvidia-container-toolkit。检查 GPU 兼容性。你不需要在系统级别安装 CUDA 库——它们将通过 uv 安装。如果你遇到 CUDA 问题,甚至可能需要尝试卸载系统 CUDA 库,因为系统库有时会引起冲突。
运行示例时出现导入错误确保你已使用 uv sync 安装所有依赖项。某些示例可能在其 README 中列出了额外的要求。
动作维度不匹配验证你的数据处理转换与机器人预期的输入/输出维度是否匹配。检查策略类中的动作空间定义。
训练损失发散检查数据集中 norm_stats.json 文件中你的 q01q99std 值。某些很少使用的维度可能会导致 q01q99std 值非常小,从而在归一化后产生巨大的状态和动作。你可以手动调整归一化统计量作为解决方法。

查看更多详情