25年2.4日,几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST,如之前所介绍的,他们对用超过 10,000 小时的机器人数据进行了预训练
该GitHub代码仓库「 π0及π0-FAST的GitHub地址:github.com/Physical-Intelligence/openpi」包括4个方面:简言之,就是π0本身的代码和权重、特定平台上特定任务的微调checkpoint、推理代码、微调代码
本文接上一篇文章《π0源码剖析——从π0模型架构的实现(如何基于PaLI-Gemma和扩散策略去噪生成动作),到基于C/S架构下的模型训练与部署》而来,但本文侧重对π0的微调
且他们还提供了专门为ALOHA和DROID平台上一些简单任务做了微调的checkpoint,相当于在ALOHA 和 DROID 收集的相对较小的数据集上进行了微调
即several checkpoints that are fine-tuned for a few simple tasks on a few widely available platforms such as ALOHA and DROID,当然,它们可能无法推广到您的特定设置
他们还开源了在多个显示世界和仿真机器人平台上推理运行的示例代码(example code to run inference on several real-world and simulated robot platforms)
以下是跑π0-FAST-DROID模型的预训练检查点
from openpi.training import config
from openpi.policies import policy_config
from openpi.shared import download
config = config.get_config("pi0_fast_droid")
checkpoint_dir = download.maybe_download("s3://openpi-assets/checkpoints/pi0_fast_droid")
# Create a trained policy.
policy = policy_config.create_trained_policy(config, checkpoint_dir)
# Run inference on a dummy example.
example = {
"observation/exterior_image_1_left": ...,
"observation/wrist_image_left": ...,
...
"prompt": "pick up the fork"
}
action_chunk = policy.infer(example)["actions"]
且也可以在示例笔记本中测试这一点,他们还提供了在DROID和ALOHA机器人上运行预先训练的检查点的推理的详细分步示例
此外
uv run scripts/serve_policy.py --env=[DROID | ALOHA | LIBERO]
其中,参数env指定哪个π0 checkpoint 应该被加载,比如是ALOHA还是LIBERO。在后台,这个脚本将执行如下命令,你可以使用它来启动策略服务器,例如用于你自己训练的检查点——这里是 DROID 环境的一个示例 uv run scripts/serve_policy.py policy:checkpoint --policy.config=pi0_fast_droid --policy.dir=s3://openpi-assets/checkpoints/pi0_fast_droid
其中,config这将启动一个策略服务器,该服务器将执行和参数指定的策略dir。该策略将在指定端口(默认值:8000)上执行此外,他们还提供了用于根据用户自身任务和平台微调π0的代码(code for fine-tuning the base π0 model for your own tasks and platforms),这个微调π0的代码 个人觉得很有价值,且huggingface上有相应的pytorch接口
Physical Intelligence (π)认为,1 到 20 小时的数据足以微调各种任务,具体而言,如果想利用自己的数据上微调π0基础模型,只需以下三个步骤即可:
uv run examples/libero/convert_libero_data_to_lerobot.py --data_dir /path/to/your/libero/data
且作为示例,已将 BiPlay 代码库中的 aloha_pen_uncap_diverse_raw 数据集转换,并将其上传至 HuggingFace Hub,地址为 physical-intelligence/aloha_pen_uncap_diverseuv run scripts/serve_policy.py policy:checkpoint --policy.config=pi0_fast_libero --policy.dir=checkpoints/pi0_fast_libero/my_experiment/20000
Libero数据集转换脚本convert_libero_data_to_lerobot.py的解析
接下来,我们使用Libero数据集(存储在RLDS格式中)作为示例——将RLDS格式转换为LeRobot格式,如何修改以适应其他自定义格式的数据
首先,咱们明确下Libero数据集的层级结构
Libero数据集
├── libero_10_no_noops/
├── libero_goal_no_noops/
├── libero_object_no_noops/
└── libero_spatial_no_noops/
└── train/
└── episode
└── steps
├── observation
│ ├── image (256x256x3)
│ ├── wrist_image (256x256x3)
│ └── state (8维向量)
├── action (7维向量)
└── language_instruction (文本)接下来,按如下步骤逐一执行
- 关键常量定义
# 输出数据集名称,也用于Hugging Face Hub REPO_NAME = "your_hf_username/libero" RAW_DATASET_NAMES = [ "libero_10_no_noops", "libero_goal_no_noops", "libero_object_no_noops", "libero_spatial_no_noops", ] # 将多个Libero数据集合并为一个训练数据集
- 定义主函数结构
主函数接受两个参数:def main(data_dir: str, *, push_to_hub: bool = False):
data_dir: 原始数据目录路径
push_to_hub: 是否推送到HuggingFace Hub的标志- 清理现有数据
确保输出目录干净,删除任何已存在的数据output_path = LEROBOT_HOME / REPO_NAME if output_path.exists(): shutil.rmtree(output_path)
- 创建LeRobot数据集:包含处理图像、状态和动作数据
定义数据集结构,包括:# 创建LeRobot数据集,定义要存储的特征 # OpenPi假设本体感知数据存储在`state`中,动作存储在`action`中 # LeRobot假设图像数据的dtype为`image` dataset = LeRobotDataset.create( repo_id=REPO_NAME, # 数据集的仓库ID robot_type="panda", # 机器人类型 fps=10, # 帧率 features={ # 特征定义 "image": { # image数据 "dtype": "image", # 数据类型 "shape": (256, 256, 3), # 数据形状 "names": ["height", "width", "channel"], # 维度名称 }, "wrist_image": { # 手腕image数据 "dtype": "image", "shape": (256, 256, 3), "names": ["height", "width", "channel"], }, "state": { # 状态数据 "dtype": "float32", "shape": (8,), "names": ["state"], }, "actions": { # 动作数据 "dtype": "float32", "shape": (7,), "names": ["actions"], }, }, image_writer_threads=10, # 图像写入线程数 image_writer_processes=5, # 图像写入进程数 )
- 机器人类型:panda
- 帧率:10fps
- 特征定义:
- 图像:256x256x3的RGB图像
- 手腕图像:同样的格式
- 状态:8维浮点数向量
- 动作:7维浮点数向量
- 多线程/进程配置用于图像处理- 数据转换循环
这部分实现了数据转换的核心逻辑:# 遍历原始Libero数据集并将episode写入LeRobot数据集 # 你可以根据自己的数据格式修改此部分 for raw_dataset_name in RAW_DATASET_NAMES: raw_dataset = tfds.load(raw_dataset_name, data_dir=data_dir, split="train") # 加载原始数据集 for episode in raw_dataset: # 遍历每个episode for step in episode["steps"].as_numpy_iterator(): # 遍历每个步骤 dataset.add_frame( { "image": step["observation"]["image"], # 添加图像数据 "wrist_image": step["observation"]["wrist_image"], # 添加手腕图像数据 "state": step["observation"]["state"], # 添加状态数据 "actions": step["action"], # 添加动作数据 } ) dataset.save_episode(task=step["language_instruction"].decode()) # 保存episode并解码语言指令
1. 遍历所有原始数据集
2. 对每个数据集中的每个episode
3. 处理episode中的每一步
4. 保存frame数据和语言指令- 数据集的整合与发布
最后的处理步骤:
1. 整合数据集(不计算统计信息)
2. 可选:推送到HuggingFace Hub,包括:
- 添加标签
- 设置为公开
- 包含视频
- 指定许可证脚本可以通过以下命令运行:
uv run examples/libero/convert_libero_data_to_lerobot.py --data_dir /path/to/your/data
如果要推送到HuggingFace Hub:
uv run examples/libero/convert_libero_data_to_lerobot.py --data_dir /path/to/your/data --push_to_hub
总之,这个脚本展示了如何构建标准化的机器人学习数据集,为训练像Pi0这样的模型提供数据支持
// 待更
要运行此存储库中的模型,需要至少具有以下规格的 NVIDIA GPU。这些估算假设单个 GPU,但您也可以通过fsdp_devices
在训练配置中进行配置来使用具有模型并行性的多个 GPU,以减少每个 GPU 的内存要求。另请注意,当前的训练脚本尚不支持多节点训练
模式 | 所需内存 | 示例 GPU |
---|---|---|
推理 | > 8 GB | RTX 4090 |
微调(LoRA) | > 22.5 GB | RTX 4090 |
微调(完整版) | > 70 GB | A100(80GB)/H100 |
PS,他们说该 repo 已在 Ubuntu 22.04 上测试过,其他操作系统可能不支持
以下是安装过程
git clone --recurse-submodules [email protected]:Physical-Intelligence/openpi.git
# Or if you already cloned the repo:
git submodule update --init --recursive
GIT_LFS_SKIP_SMUDGE=1 uv sync
注意:GIT_LFS_SKIP_SMUDGE=1需要将 LeRobot 作为依赖项此外,该开源库还提供ALOHA SIM
export SERVER_ARGS="--env ALOHA_SIM"
docker compose -f examples/aloha_sim/compose.yml up --build
# Create virtual environment
uv venv --python 3.10 examples/aloha_sim/.venv
source examples/aloha_sim/.venv/bin/activate
uv pip sync examples/aloha_sim/requirements.txt
uv pip install -e packages/openpi-client
# Run the simulation
MUJOCO_GL=egl python examples/aloha_sim/main.py
注意:如果您看到 EGL 错误,则可能需要安装以下依赖项 sudo apt-get install -y libegl1-mesa-dev libgles2-mesa-dev
# Run the server
uv run scripts/serve_policy.py --env ALOHA_SIM
// 待更
// 待更