跳到主要内容

Pi0 模型的微调:使用自定义数据集适应机器人任务

Pi0 是一个先进的视觉-语言-动作(Vision-Language-Action, VLA)模型,通过少样本微调(Few-Shot Fine-Tuning),能够快速适应特定机器人任务。

本文档基于 LeRobot 框架,使用预训练的 Pi0 模型(lerobot/pi0)在自定义机器人数据集上进行微调。

先决条件

  • 拥有符合 LeRobot 数据格式的数据集(参考上一节的 LeRobot 数据集导出指南)
  • 需要将 Pi0 模型适应特定机器人硬件、任务或控制策略
  • 熟悉 PyTorch 和 Hugging Face 生态系统的训练流程
  • 具备深度学习模型训练的基本经验

微调概述

微调(Fine-Tuning)是在预训练模型基础上,使用特定领域数据进行进一步训练的过程,通常涉及较少的迭代周期。

Pi0 模型已在多样化的机器人任务上进行预训练,具备通用的视觉感知、语言理解和动作生成能力。

通过微调,Pi0 可以实现:

  • 环境适应:调整到特定摄像头视角、光照条件和机械结构
  • 任务特化:优化针对特定任务(如物体抓取、分类或放置)的性能
  • 精度提升:显著提高在目标任务中的控制精度和成功率

简单来说:预训练模型懂很多,但不一定懂您;微调之后,它就懂您了。

环境准备

系统要求

请确保您的环境满足以下要求:

  • Python ≥ 3.8(推荐 3.10 以上)
  • GPU:至少 32GB 显存(Pi0 为大规模模型,推荐 NVIDIA V100 或更高性能 GPU)
  • 内存:至少 64GB 系统 RAM
  • 存储:充足磁盘空间用于数据集和模型检查点

安装依赖

# 克隆 LeRobot 仓库(主仓)
git clone https://github.com/lerobot-ai/lerobot.git
cd lerobot/

# 安装 LeRobot 框架(包含 Pi0 支持)
pip install -e ".[pi0]"

# 验证安装
python -c "from lerobot.policies import Pi0Policy; print('Pi0 安装成功!')"

镜像仓库(如需):https://github.com/huggingface/lerobot

准备您的数据集

导出 LeRobot 格式数据

可以通过艾欧数据平台的导出页面,将标注后的数据导出为 LeRobot 格式数据集,参见 导出LeRobot数据集

重要提示:不需要将您的数据上传到 HuggingFace 也能训练,通过参数 --dataset.root= 来指定使用本地目录的数据进行微调训练。

数据集结构示例

假设您的导出数据存储在 ~/DualPiper_Pickup_Pen

$ ls ~/DualPiper_Pickup_Pen
data meta videos

$ ls ~/DualPiper_Pickup_Pen/data
episode_000 episode_001 episode_002 ...

$ ls ~/DualPiper_Pickup_Pen/data/episode_000
observations actions.npy language_instruction.txt metadata.json

开始微调(Fine-tune)

基本训练命令

使用 train.py 脚本进行训练:

# 设置 CUDA 内存分配策略(推荐)
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

# 启动训练
python3 -m lerobot.scripts.train \
--dataset.root=~/DualPiper_Pickup_Pen \
--dataset.repo_id=io-ai-data/DualPiper_Pickup_Pen \
--policy.path=lerobot/pi0 \
--policy.repo_id=lerobot/pi0 \
--policy.device=cuda \
--output_dir=./checkpoints/pi0_finetuned \
--batch_size=1 \
--policy.attention_implementation=flash_attention_2 \
--training.learning_rate=1e-5 \
--training.num_epochs=10
提示

Pi0 模型参数量较大,单 GPU 训练可能需数十小时。例如,对 2 小时数据集的微调,在单张 NVIDIA V100 上约需 50 小时,而使用 8 张 V100 可将时间缩短至约 10 小时。

参数详细说明

参数含义推荐值说明
--dataset.root本地数据集路径~/your_dataset指向 LeRobot 格式数据集目录
--dataset.repo_idHugging Face 数据集标识your-username/dataset用于元数据标识
--policy.path预训练模型路径lerobot/pi0指定官方预训练模型
--policy.repo_id模型仓库 IDlerobot/pi0Hugging Face 模型仓库
--policy.device训练设备cuda启用 GPU 加速
--output_dir输出目录./checkpoints/pi0_finetuned微调模型保存路径
--batch_size批处理大小1根据显存调整
--policy.attention_implementation注意力机制flash_attention_2使用高效实现加速训练
--training.learning_rate学习率1e-5微调时采用较低值以避免灾难性遗忘
--training.num_epochs训练周期数10根据数据集规模调整

多卡加速训练

如果您有多张显卡,可以并行训练来大幅加快速度。

# 使用 8张 GPU 训练
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
torchrun --nproc_per_node=8 --master_port=29500 \
-m lerobot.scripts.train \
--dataset.root=/data/nfs2/export/lerobot/DualPiper_Pickup_Pen/ \
--dataset.repo_id=io-ai-data/DualPiper_Pickup_Pen \
--policy.path=lerobot/pi0 \
--policy.repo_id=lerobot/pi0 \
--policy.device=cuda \
--output_dir=/home/puxk/DualPiper_Pickup_Pen_pi0_model \
--batch_size=1 \
--num_workers=4 \
--policy.attention_implementation=flash_attention_2

总 batch size 是 nproc_per_node × batch_size ,设置了 --batch_size=1,8 卡等于总 batch size 为 8,如果内存足够可以调大。

调试时建议先用 --nproc_per_node=2 测试是否能跑通,再放开全部 8 卡。

特殊注意事项

  1. 网络访问:下载 Hugging Face 模型可能需代理工具,如 hf-mirror
  2. 显存监控:训练中实时监控 GPU 利用率
  3. 检查点恢复:若训练中断,可从 --output_dir 中的最新检查点恢复

Pi0 模型集成 Google PaliGemma 用于语言处理。作为近期 Hugging Face 模型:

版本兼容性

  • Transformers:要求 ≥ 4.37.0
  • 兼容检查:若遇 embed_tokens 错误,请升级 transformers

解决方案

# 升级到最新版 transformers
pip install -U transformers

# 或者指定版本
pip install transformers>=4.37.0

策略选择建议(Pi0 vs smolVLA)

  • 若任务是单任务、短时序、高控制频率,且对语言生成要求不高:Pi0/ACT 类策略往往训练成本更低、响应更快。
  • 若希望在多任务/跨场景上获得更好泛化,或资源对齐到单卡/消费级:更推荐 smolVLA,在官方 smolvla_base 上做少量微调即可获得稳定收益。
  • 资源受限时优先:混合精度、梯度累积、合理降低分辨率与 batch size。

训练结果检查

模型保存

训练完成后,模型文件位于:

./checkpoints/pi0_finetuned/
├── config.json
├── pytorch_model.bin
├── tokenizer.json
└── training_args.bin

加载微调模型

from lerobot import Pi0Policy  # 注意:导入路径可能为 lerobot.policies

# 加载模型
policy = Pi0Policy.from_pretrained("./checkpoints/pi0_finetuned")

# 推理示例
action = policy.select_action(observation_batch)

日志分析

训练日志包括:

  • 损失曲线:训练/验证损失趋势
  • 学习率:调度器变化
  • 梯度统计:范数和裁剪信息
  • 资源利用:GPU/CPU 内存占用

性能评估

艾欧数据平台评估

艾欧平台提供模型推理质量评估,支持使用真实数据与模型输出进行可视化比较,包括每个关节的指令对比。

其他评估方法

定量指标

  • 动作误差:预测动作与 ground truth 的均值绝对误差 (MAE) 或均方误差 (MSE)
  • 轨迹相似度:使用动态时间规整 (DTW) 或弗雷歇距离比较轨迹
  • 验证损失:监控验证集上的损失函数值

定性评估

  • 实机测试:部署到物理机器人,测量任务成功率
  • 行为分析:可视化生成的动作序列是否合理
  • 人类评估:收集专家对模型输出的主观评分

评估脚本示例

import numpy as np
from lerobot import Pi0Policy
from torch.utils.data import DataLoader # 假设 test_dataset 是 DataLoader

# 加载模型
policy = Pi0Policy.from_pretrained("./checkpoints/pi0_finetuned")

# 评估函数
def evaluate_model(policy, test_loader):
total_mae = 0.0
num_batches = 0

for batch in test_loader:
with torch.no_grad():
predicted_action = policy.select_action(batch)
true_action = batch['actions']

# 计算 MAE
mae = np.mean(np.abs(predicted_action.cpu().numpy() - true_action.cpu().numpy()))
total_mae += mae
num_batches += 1

return total_mae / num_batches

# 执行评估(假设 test_loader 已准备)
avg_mae = evaluate_model(policy, test_loader)
print(f"平均绝对误差 (MAE): {avg_mae:.4f}")

相关资源

常见问题解答

Q: 训练时报错 embed_tokens 不存在?

A: 此为 transformers 版本过低引起,升级解决:

pip install -U transformers

Q: 未上传数据集到 Hugging Face,能使用本地数据吗?

A: 是的,通过 --dataset.root=本地路径 指定即可。

Q: 显存不足如何处理?

A: 尝试:

  • 减小批处理大小:--batch_size=1
  • 使用梯度累积:添加 --training.gradient_accumulation_steps=4(示例值,根据需求调整)
  • 启用混合精度:添加 --training.fp16=true

Q: 训练时长估计?

A: 取决于数据集规模、硬件和周期数。通常为 10+ 小时;使用多 GPU 可显著加速。

Q: 如何判断收敛?

A: 监控:

  • 损失曲线趋于平稳
  • 验证指标停止改善
  • 出现过拟合迹象时早停

Q: 微调模型部署?

A: 艾欧平台支持 Pi0 和 SmolVLA 等模型的自动部署,详情咨询技术支持。

手动部署示例:

# 加载
policy = Pi0Policy.from_pretrained("./checkpoints/pi0_finetuned")

# 输入准备
observation = {
'images': camera_images, # 张量或数组
'language_instruction': "拿起红色的笔"
}

# 生成动作
action = policy.select_action(observation)

祝微调成功!