3. LeRobot项目速览

在正式进入 VLA 策略微调之前,先把 LeRobot 这个仓库“摸清楚”非常关键。LeRobot 是 Hugging Face 主导的开源机器人学习框架,目标是把机器人数据、策略模型、训练脚本和真机部署统一到一套接口里。它既不是单纯的模型库,也不是单纯的数据集工具,而是一个“数据—策略—训练—部署”闭环工程。理解它的目录结构和模块职责,能让你在后续微调时快速定位配置、数据和权重。

一、仓库结构:从目录看职责边界

LeRobot 的仓库结构大致可以按“数据、策略、训练、部署、工具”五类来理解。下面是一个典型目录的简化视图:

lerobot/
├── lerobot/
│   ├── common/          # 通用工具:配置、日志、设备、随机种子
│   ├── datasets/        # 数据集加载、转换、统计、采样
│   ├── policies/        # 策略模型:ACT、Diffusion、VLA 等
│   ├── envs/            # 仿真与真机环境封装
│   ├── scripts/         # 训练、评估、部署入口脚本
│   └── utils/           # 可视化、回放、数据校验
├── examples/            # 示例配置与快速上手脚本
├── tests/               # 单元测试与集成测试
└── pyproject.toml       # 依赖与项目元信息

其中 datasets/ 和 policies/ 是微调时最常打交道的两个目录。datasets/ 负责把 LeRobotDataset 格式的数据读进来,policies/ 则定义策略网络、损失函数和推理接口。训练脚本通常放在 scripts/ 下,通过配置文件组合数据集与策略。

二、核心模块与数据流关系

LeRobot 的核心模块之间不是孤立的,而是围绕“数据流”组织起来的。数据集提供观测与动作序列,策略消费这些序列并输出动作,训练脚本负责把两者连接起来,环境则用于评估和部署。下图展示了这一关系:

LeRobot 核心模块与数据流 LeRobotDataset parquet + mp4 观测 / 动作 / 元数据 Policy 策略接口 select_action() forward() / loss 训练脚本 train.py + config 优化器 / 日志 / 保存 Env 环境封装 仿真 / 真机 reset() / step() 评估与部署 eval / rollout 权重加载 / 推理 观测 动作 权重

从图中可以看到,数据从 LeRobotDataset 流向策略接口,训练脚本负责调度,环境提供交互反馈,评估与部署则消费训练好的权重。这条链路就是后续微调工作的主干。

三、数据集格式:LeRobotDataset 的组成

LeRobot 使用统一的 LeRobotDataset 格式,核心是“元数据 + 分片数据”。一个数据集通常包含以下内容:

组成部分 文件/目录 作用
元信息 meta/info.json 记录 fps、特征维度、机器人类型、总帧数
任务描述 meta/tasks.jsonl 每条轨迹对应的语言指令或任务标签
统计量 meta/stats.json 观测与动作的均值、方差,用于归一化
帧数据 data/chunk-*/file.parquet 存储状态、动作、时间戳等结构化字段
视频数据 videos/chunk-*/ 存储多路相机视频,按 episode 分片

这种设计的好处是:结构化数据用 parquet 高效读取,视频用 mp4 分片存储,元数据集中管理。微调时,你通常只需要关注 meta/info.json 中的特征定义,以及 stats.json 中的归一化参数。

提示:如果自定义数据集,务必保证 info.json 中的 features 字段与策略输入输出维度一致,否则训练会在第一批数据就报维度错误。

四、策略接口:统一但不失灵活

LeRobot 的策略接口设计遵循“统一注册、按名加载”的思路。所有策略都继承自基类,并实现几个关键方法:

  • forward(batch):训练前向,返回损失或预测动作。
  • select_action(observation):推理时根据当前观测选择动作。
  • reset():重置策略内部状态,例如动作队列或历史缓存。
  • get_optimizer():返回优化器与学习率调度器。

以 ACT 和 Diffusion Policy 为例,它们都实现了上述接口,但内部结构差异很大。ACT 使用 Transformer 编码器-解码器加动作分块,Diffusion Policy 则用去噪扩散过程生成动作序列。VLA 策略通常在此基础上引入视觉-语言 backbone,因此接口保持一致,但配置项更多。

from lerobot.policies.act import ACTPolicy

policy = ACTPolicy.from_pretrained("lerobot/act_aloha")
action = policy.select_action(observation)

这种“接口统一、实现多样”的设计,使得切换策略时只需改配置,而不需要重写训练循环。

五、训练脚本与配置:微调的入口

LeRobot 的训练脚本通常以 train.py 为入口,通过 Hydra 或类似配置系统加载 YAML 文件。一个典型的训练命令如下:

python -m lerobot.scripts.train \
  --config_path examples/act_aloha.yaml \
  --dataset.root ./data/aloha \
  --policy.type act \
  --training.batch_size 8 \
  --training.steps 100000

配置文件中会分别定义数据集、策略、训练超参和日志选项。训练脚本负责构建 DataLoader、初始化策略、加载预训练权重、执行优化循环,并定期保存 checkpoint。评估脚本则加载 checkpoint,在仿真或真机上运行 rollout,统计成功率。

注意:微调时不要忽略 stats.json 的归一化参数。如果直接用自己的数据统计替换,可能导致动作尺度不一致,表现为策略输出抖动或收敛缓慢。

六、常见误区与复盘建议

初学者在速览 LeRobot 时容易陷入两个误区。第一,把 LeRobot 当成纯模型库,忽略数据集格式和元数据的重要性,结果在自定义数据上频繁报错。第二,直接修改策略网络结构,却没有同步更新配置中的特征维度,导致训练脚本无法正确构建输入输出。

建议的复盘路径是:先跑通官方示例数据集和预训练策略,确认环境与依赖无误;再替换为自己的数据集,检查 info.json 与 stats.json;最后才调整策略配置和训练超参。这样能把问题定位在数据、接口还是模型层面,避免混在一起排查。