200字
LeHome 尝试 pi0.5:依赖地狱、LoRA 微调与截止前的放弃
2026-04-26
2026-05-10

摘要

我试图用 pi0.5 冲一波分。结果一头扎进了依赖地狱:LeRobot pi0.5 需要特定版本的 transformers(4.53.2,不是 4.57.6)、需要 OpenPI 的 transformers_replace 补丁、需要 Hugging Face token 授权 paligemma 模型。本文记录完整的排障过程、LoRA 微调训练(sanity check → 30k → 150k → 270k)、以及最终"初具人形但依旧悬空"的评测效果。在截止前未能得到可用结果,pi0.5 最终未作为主力方案。


正文

1. 为什么要试 pi0.5

跑通somlVLA的30k后,我个人因为机时有限(L40一小时2块3),还是想押注一下更强大的基础模型的。

pi0.5(Physical Intelligence 的 Pytorch 移植版)是当时 LeRobot 生态里比较新的大模型路线,3.6B 参数量,支持 LoRA 微调。如果能跑通,理论上比 SmolVLA 强不少。

抱着"截止前冲一把"的心态,我开始试 pi0.5。

2. 环境准备

2.1 代码同步策略

之前做 SmolVLA 的时候,代码全靠手动在GPU 服务器上改。这次改用 GitHub 私有仓库同步:

# 本地 WSL:写好配置和代码 → commit → push
cd ~/lehome-personal
git status
git add configs/train_pi05_lora.yaml
git commit -m "add pi05 lora training config"
git push origin main

# 远程 GPU 机器:pull
cd ~/gpufree-data/lehome-challenge
git fetch myrepo
git pull --ff-only myrepo main

--ff-only 做快进更新,避免意外生成 merge commit。

2.2 补依赖

cd ~/gpufree-data/lehome-challenge
conda activate lehome311
source .venv/bin/activate

uv pip install "peft>=0.18.0,<1.0.0" "scipy>=1.10.1,<1.15"

3. 第一次训练:transformers 版本报错

3.1 Smoke Test 启动

cd ~/gpufree-data/lehome-challenge
tmux new -s pi05_smoke

conda activate lehome311
source .venv/bin/activate

mkdir -p outputs/train
RUN_NAME=pi05_lora_smoke_$(date +%Y%m%d_%H%M%S)

lerobot-train \
  --config_path=configs/train_pi05_lora.yaml \
  --num_workers=0 \
  --output_dir=outputs/train/${RUN_NAME} \
  2>&1 | tee outputs/train/${RUN_NAME}.log

3.2 报错

ValueError: An incorrect transformer version is used, please create an issue on
https://github.com/huggingface/lerobot/issues

pi0.5 对 transformers 版本非常敏感。当前环境是 transformers==4.57.6(太新),LeRobot 0.4.3 的 pi/pi05 线需要 custom 4.53 系。这个版本冲突在 LeRobot issue 里也有人提过。

3.3 第一轮修复(失败)

uv pip install "lerobot[pi]==0.4.3" --reinstall-package transformers

不行。pi05 需要的不只是特定版本的 transformers,还需要 OpenPI 的 transformers_replace 补丁。

3.4 第二轮修复:安装 transformers_replace 补丁

OpenPI 的官方 issue 里写了提示:安装 transformers==4.53.2,然后把 src/openpi/models_pytorch/transformers_replace/* 复制进当前环境的 transformers/ 目录。

步骤:

cd ~/gpufree-data/lehome-challenge

# 降级 transformers
export UV_LINK_MODE=copy
uv pip install "transformers==4.53.2" --reinstall-package transformers

# clone OpenPI 拿补丁文件
cd /tmp
rm -rf openpi
git clone --depth 1 https://github.com/Physical-Intelligence/openpi.git

# 找到当前环境的 transformers 路径并复制补丁
cd ~/gpufree-data/lehome-challenge

TRANSFORMERS_DIR=$(python - <<'PY'
import transformers
from pathlib import Path
print(Path(transformers.__file__).parent)
PY
)

echo "TRANSFORMERS_DIR=$TRANSFORMERS_DIR"

cp -r /tmp/openpi/src/openpi/models_pytorch/transformers_replace/* "$TRANSFORMERS_DIR"/

验证补丁是否成功:

python - <<'PY'
import transformers
from transformers.models.siglip import check

print("transformers:", transformers.__version__)
print("check file:", check.__file__)
print("replace ok:", check.check_whether_transformers_replace_is_installed_correctly())
PY

看到 replace ok: True 就算成功。

4. 第二次训练:paligemma 授权门槛

重新跑 smoke,报新错误——pi0.5 内部用了 Google 的 paligemma 模型,需要先在 Hugging Face 上同意 Google 的模型使用条款,拿到 token 授权。

具体操作:

  • 去 Hugging Face 网页上申请 paligemma 的访问权限
  • 创建 HF token
  • 在远程环境里 huggingface-cli login 或用环境变量传 token

处理完之后,smoke 终于跑通:

Using PEFT! Wrapping model.
Start offline training
step:1 ...
step:10 ...
End of training
exit code 0

5. LoRA 微调:Sanity Check

smoke 10 step 不报错,下一步做 1k step 的 sanity check。

cd ~/gpufree-data/lehome-challenge
tmux new -s pi05_1k
conda activate lehome311
source .venv/bin/activate

export HF_HOME=/root/gpufree-data/hf-cache
export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_ENABLE_HF_TRANSFER=0

RUN_NAME=pi05_lora_1k_$(date +%Y%m%d_%H%M%S)

lerobot-train \
  --config_path=configs/train_pi05_lora.yaml \
  --steps=1000 \
  --batch_size=1 \
  --num_workers=0 \
  --save_freq=1000 \
  --log_freq=20 \
  --output_dir=outputs/train/${RUN_NAME} \
  2>&1 | tee outputs/train/${RUN_NAME}.log

1k step 顺利跑完。loss 下降正常:

step:880 loss:0.654
step:900 loss:0.596
step:920 loss:0.573
step:940 loss:0.507
step:960 loss:0.670
step:980 loss:0.663
step:1K  loss:0.579

LoRA 实际可训练参数只有 1.28M / 3.6B——只训很小的 adapter,冻结了大部分模型。所以训练速度比预想的快(每 step 约 0.28 秒)。

6. 正式训练:30k → 150k → 270k

6.1 30k LoRA

tmux new -s pi05_30k
cd ~/gpufree-data/lehome-challenge
conda activate lehome311
source .venv/bin/activate

export HF_HOME=/root/gpufree-data/hf-cache
export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_ENABLE_HF_TRANSFER=0

RUN_NAME=pi05_lora_30k_$(date +%Y%m%d_%H%M%S)

lerobot-train \
  --config_path=configs/train_pi05_lora.yaml \
  --steps=30000 \
  --batch_size=1 \
  --num_workers=0 \
  --save_freq=5000 \
  --log_freq=50 \
  --output_dir=outputs/train/${RUN_NAME} \
  2>&1 | tee outputs/train/${RUN_NAME}.log

30k 完成后评测。建议先评估 10k/20k/30k 几个 checkpoint(LoRA 小数据后面容易过拟合)。

6.2 评测:感觉"初具人形,但还是悬空"

检查了多个 checkpoint 的 rollout 视频。总体感觉:

  • 双臂确实在朝衣服移动,方向大致正确
  • 但手爪经常悬在衣服上方,没有真正抓下去
  • 偶尔抓到也很快松开
  • fabric 没有形成稳定的折叠动作

用一句话描述就是——"初具人形,但还是悬空"

6.3 继续 Scale:150k

感觉可能是 scale 不够,1.28M 的 LoRA adapter 需要更多步数来收敛。直接上 150k:

cd ~/gpufree-data/lehome-challenge
tmux new -s pi05_r16_150k
conda activate lehome311
source .venv/bin/activate

RUN_NAME=pi05_lora_r16_150k_$(date +%Y%m%d_%H%M%S)

LEHOME_DATASET_ROOT=Datasets/example/four_types_merged \
HF_HOME=/root/gpufree-data/hf-cache \
HF_HUB_OFFLINE=1 \
TRANSFORMERS_OFFLINE=1 \
HF_HUB_ENABLE_HF_TRANSFER=0 \
lerobot-train \
  --config_path=configs/train_pi05_lora.yaml \
  --policy.pretrained_path=/root/gpufree-data/models/lerobot_pi05_base \
  --steps=150000 \
  --batch_size=1 \
  --num_workers=0 \
  --save_freq=25000 \
  --log_freq=100 \
  --output_dir=outputs/train/${RUN_NAME} \
  2>&1 | tee outputs/train/${RUN_NAME}.log

训练完成:

step:150K loss:0.301
step:150K loss:0.310
step:150K loss:0.332
step:150K loss:0.274
Checkpoint policy after step 150000
End of training

评测:有进步,但还是悬空。双臂的动作模式更加明确了,但抓取-提起-折叠这个关键序列始终不稳定。

6.4 继续 Scale:270k(约 1 epoch)

既然 150k 在改善,继续到约 1 epoch(270k step):

cd ~/gpufree-data/lehome-challenge
tmux new -s pi05_r16_270k
conda activate lehome311
source .venv/bin/activate

RUN=outputs/train/pi05_lora_r16_150k_20260428_111715

LEHOME_DATASET_ROOT=Datasets/example/four_types_merged \
HF_HOME=/root/gpufree-data/hf-cache \
HF_HUB_OFFLINE=1 \
TRANSFORMERS_OFFLINE=1 \
HF_HUB_ENABLE_HF_TRANSFER=0 \
lerobot-train \
  --config_path="$RUN/checkpoints/last/pretrained_model/train_config.json" \
  --resume=true \
  --steps=270000 \
  --save_freq=25000 \
  --log_freq=100 \
  --num_workers=0 \
  2>&1 | tee -a "${RUN}/resume_270k_$(date +%Y%m%d_%H%M%S).log"

7. 最终评测:放弃

270k 评测视频出来之后,我必须面对现实。

有了一些肉眼可见的改善——在个别 episode 里,pi0.5 确实能够在正确的时机抓住衣服并做出折叠动作。但这些成功是脆弱的、不可靠的。大部分 rollout 仍然是"悬空 + 试探性移动",始终没有形成像 SmolVLA 70k 那样的稳定折叠行为。

我需要做决定:是继续调 pi0.5(换 LoRA rank、调学习率、加数据增强、试不同的 backbone),还是回到 SmolVLA 整理最终提交。

我决定放弃 pi0.5。不因为它没有潜力,而是剩的时间不够把"潜力"变现。

8. 反思

pi0.5 在这个任务上到底能不能 work?

我认为有可能。3.6B 的参数量、预训练基础、支持多模态——这些理论上都适合 LeHome 这个任务。但我遇到的障碍是工程性的而不是算法性的:

  • 依赖版本冲突消耗了大量时间(transformers + OpenPI 补丁)
  • 模型授权问题(paligemma)也是额外的摩擦
  • batch_size 只能开 1(L40 48G 的显存限制),导致 270k 步的训练时间非常长
  • LoRA 的 rank 和 target modules 可能需要更细致的调试

如果重来会怎么试?

  • 用更大的 GPU(80G 级)把 batch_size 开到 4 或 8
  • 更激进地调 LoRA rank(素材里 r16,可能 r32 或 r64 在双臂任务上更合适)
  • 更早做数据增强对比
  • 参考其他 pi0.5 在 manipulation 任务上的微调经验

但是——以上这些都需要时间。Solo 参赛的约束下,"能跑通"的优先级远高于"可能更强"。我选择回到 SmolVLA 做最终提交,这个决策我没有后悔。

LeHome 尝试 pi0.5:依赖地狱、LoRA 微调与截止前的放弃
作者
若离
发表于
2026-04-26
License
CC BY-NC-SA 4.0

评论