LeRobot documentation

向后兼容性

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

向后兼容性

策略归一化迁移(PR #1452)

破坏性变更:LeRobot 策略不再在权重中嵌入内置的归一化层。归一化现在由外部的 PolicyProcessorPipeline 组件处理。

发生了什么变化?

在 PR #1452 之前在 PR #1452 之后
归一化位置嵌入在模型权重中(normalize_inputs.*)外部 PolicyProcessorPipeline 组件
模型状态字典包含归一化统计信息仅清理权重 - 不包含归一化参数
用法policy(batch) 处理所有操作preprocessor(batch) → policy(...) → postprocessor(...)

对现有模型的影响

  • 在 PR #1452 之前训练的模型,其权重中已嵌入归一化
  • 这些模型需要迁移才能与新的 PolicyProcessorPipeline 系统配合使用
  • 迁移过程会提取归一化统计信息,并创建独立的处理器流水线

迁移旧模型

使用迁移脚本转换带有嵌入归一化的模型:

python src/lerobot/processor/migrate_policy_normalization.py \
    --pretrained-path lerobot/act_aloha_sim_transfer_cube_human \
    --push-to-hub \
    --branch migrated

该脚本:

  1. 从模型权重中提取Extracts归一化统计量
  2. 创建外部预处理和后处理流水线
  3. 从模型权重中移除归一化层
  4. 保存干净的模型 + 处理器流水线
  5. 使用自动创建 PR 的方式向 Hub 执行Pushes

使用迁移后的模型

# New usage pattern (after migration)
from lerobot.policies import make_policy, make_pre_post_processors

# Load model and processors separately
policy = make_policy(config, ds_meta=dataset.meta)
preprocessor, postprocessor = make_pre_post_processors(
    policy_cfg=config,
    dataset_stats=dataset.meta.stats
)

# Process data through pipeline
processed_batch = preprocessor(raw_batch)
action = policy.select_action(processed_batch)
final_action = postprocessor(action)

硬件 API 重新设计

PR #777 改进了 LeRobot 的校准,但不向后兼容。以下是变更内容的概述,以及如何在处理此拉取请求之前创建的数据集时继续工作。

发生了什么变化?

在 PR #777 之前在 PR #777 之后
联合范围度数 -180...180°归一化范围 关节:–100...100 夹爪:0...100
零位(SO100 / SO101)手臂完全水平伸展每个关节范围的中点
边界处理用于检测 ±180 ° 环绕的软件防护由于中间范围为零,无需环绕逻辑

对现有数据集的影响

  • 在 PR #777 之前创建的录制轨迹如果直接加载,将会错误地重放:
    • 关节角度存在偏移,且归一化不正确。
  • 任何直接在旧数据上微调或训练的模型,都需要对其输入和输出进行转换。

使用旧校准系统创建的数据集

我们提供了一个迁移示例脚本,用于重放使用先前校准记录的剧集,位于此处:examples/backward_compatibility/replay.py。 下面我们将带您了解示例脚本中所做的修改,以使先前的校准数据集能够正常工作。

+   key = f"{name.removeprefix('main_')}.pos"
    action[key] = action_array[i].item()
+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90

让我们逐步分析。 新代码库使用 .pos 后缀表示位置观测值,并且我们已移除 main_ 前缀:

key = f"{name.removeprefix('main_')}.pos"

对于 "shoulder_lift"(id = 2),与旧校准/代码相比,0 位置改变了 -90 度,且方向相反。

action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)

对于 "elbow_flex"(id = 3),与旧的校准/代码相比,0 位置改变了 -90 度。

action["elbow_flex.pos"] -= 90

要使用角度归一化,我们将 --robot.use_degrees 选项设置为 true。

python examples/backward_compatibility/replay.py \
    --robot.type=so101_follower \
    --robot.port=/dev/tty.usbmodem5A460814411 \
    --robot.id=blue \
+   --robot.use_degrees=true \
    --dataset.repo_id=my_dataset_id \
    --dataset.episode=0

使用通过先前校准系统训练的策略

策略以与数据集相同的格式(torch.Tensors)输出动作。因此,应应用相同的转换。

要找到这些变换,我们建议首先使用上面的章节,重放策略训练所用数据集中的某一集。 然后,将这些相同的变换添加到你的推理脚本中(此处展示的是调用 predict_action 的脚本,类似于 examples/ 中的 evaluate.py 示例):

action_values = predict_action(
    observation_frame,
    policy,
    get_safe_torch_device(policy.config.device),
    preprocessor,
    postprocessor,
    policy.config.use_amp,
    task=single_task,
    robot_type=robot.robot_type,
    )
    action = {key: action_values[i].item() for i, key in enumerate(robot.action_features)}

+   action["shoulder_lift.pos"] = -(action["shoulder_lift.pos"] - 90)
+   action["elbow_flex.pos"] -= 90
    robot.send_action(action)

如果您有任何问题或在迁移过程中遇到问题,欢迎在 Discord 上提出。

Update on GitHub