在日新月异的机器人智能领域,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 GB | RTX 4090 |
微调 (LoRA) | > 22.5 GB | RTX 4090 |
微调 (Full) | > 70 GB | A100 (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 的示例配置,其中包含详细注释,你可以根据自己的数据集进行修改:
LiberoInputs
和LiberoOutputs
:定义了从 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(指数移动平均)权重
设置
- 确保你已安装所有依赖项的最新版本:
uv sync
- 再次检查你是否安装了 transformers 4.53.2:
uv pip show transformers
- 应用 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 微调模型:
- 将 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
在配置中使用
pytorch_weight_path
指定转换后的 PyTorch 模型路径。使用以下任一模式启动训练:
- 单 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>
- 单 GPU 训练:
精度设置
JAX 和 PyTorch 实现在精度处理上有所不同:
JAX:
- 推理:大部分权重和计算使用 bfloat16,少数计算为了稳定性使用 float32。
- 训练:默认为混合精度:权重和梯度使用 float32,大部分激活和计算使用 bfloat16。你可以在配置中将
dtype
设置为 float32 来切换到完全 float32 训练。
PyTorch:
- 推理:与 JAX 匹配——大部分权重和计算使用 bfloat16,少数权重为了稳定性转换为 float32。
- 训练:支持完全 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 文件中你的 q01 、q99 和 std 值。某些很少使用的维度可能会导致 q01 、q99 或 std 值非常小,从而在归一化后产生巨大的状态和动作。你可以手动调整归一化统计量作为解决方法。 |