π₀ 是 Physical Intelligence 推出的视觉-语言-动作(VLA)基础模型,它能对视觉、语言和动作进行联合推理以控制机器人,是后续实现 π₀.₅ 开放世界泛化能力的基础架构。
原始论文: π0: A Vision-Language-Action Flow Model for General Robot Controlion
参考实现: https://github.com/Physical-Intelligence/openpi
LeRobot 实现: 为确保兼容性,遵循原始参考代码。
pip install "lerobot[pi]@git+https://github.com/huggingface/lerobot.git"有关完整的安装详情(包括可选的视频依赖项,如用于 torchcodec 的 ffmpeg),请参阅官方文档:https://huggingface.co/docs/lerobot/installation
select_actionimport torch
from lerobot.datasets.lerobot_dataset import LeRobotDataset
from lerobot.policies.factory import make_pre_post_processors
# Swap this import per-policy
from lerobot.policies.pi0 import PI0Policy
# load a policy
model_id = "lerobot/pi0_base" # <- swap checkpoint
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
policy = PI0Policy.from_pretrained(model_id).to(device).eval()
preprocess, postprocess = make_pre_post_processors(
policy.config,
model_id,
preprocessor_overrides={"device_processor": {"device": str(device)}},
)
# load a lerobotdataset
dataset = LeRobotDataset("lerobot/libero")
# pick an episode
episode_index = 0
# each episode corresponds to a contiguous range of frame indices
from_idx = dataset.meta.episodes["dataset_from_index"][episode_index]
to_idx = dataset.meta.episodes["dataset_to_index"][episode_index]
# get a single frame from that episode (e.g. the first frame)
frame_index = from_idx
frame = dict(dataset[frame_index])
batch = preprocess(sample)
with torch.inference_mode():
pred_action = policy.select_action(frame)
# use your policy postprocess, this post process the action
# for instance unnormalize the actions, detokenize it etc..
pred_action = postprocess(pred_action)如果您正在进行训练/微调,通常会调用 forward(...) 来获取损失,然后:
policy.train()
batch = dict(dataset[0])
batch = preprocess(batch)
loss, outputs = policy.forward(batch)
loss.backward()
注意:
- 部分策略会公开
policy(**batch)或返回字典;请确保本代码片段与策略 API 保持一致。- 请使用训练器脚本(
lerobot-train)执行完整的训练循环。
lerobot-train \
--dataset.repo_id=${HF_USER}/<dataset> \
--output_dir=./outputs/[RUN_NAME] \
--job_name=[RUN_NAME] \
--policy.repo_id=${HF_USER}/<desired_policy_repo_id> \
--policy.path=lerobot/[BASE_CHECKPOINT] \
--policy.dtype=bfloat16 \
--policy.device=cuda \
--steps=100000 \
--batch_size=4在下方添加特定于策略的标志:
-policy.chunk_size=...-policy.n_action_steps=...-policy.max_action_tokens=...-policy.gradient_checkpointing=true您可以使用来自 lerobot-record 的 record 脚本,并将策略检查点作为输入,来运行推理并评估您的策略。
例如,运行以下命令或 API 示例以运行推理并记录 10 个评估 episode:
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/ttyACM1 \
--robot.cameras="{ up: {type: opencv, index_or_path: /dev/video10, width: 640, height: 480, fps: 30}, side: {type: intelrealsense, serial_number_or_name: 233522074606, width: 640, height: 480, fps: 30}}" \
--robot.id=my_awesome_follower_arm \
--display_data=false \
--dataset.repo_id=${HF_USER}/eval_so100 \
--dataset.single_task="Put lego brick into the transparent box" \
# <- Teleop optional if you want to teleoperate in between episodes \
# --teleop.type=so100_leader \
# --teleop.port=/dev/ttyACM0 \
# --teleop.id=my_awesome_leader_arm \
--policy.path=${HF_USER}/my_policy