训练集成
相关源文件
以下文件用于生成此 wiki 页面的上下文:
目的与范围
本文档介绍 IB-Robot 如何与外部 LeRobot 训练库 集成以训练具身 AI 策略。内容涵盖 lerobot 库的设置、数据集格式兼容性、训练工作流程,以及训练后的模型检查点如何存储和引用以用于部署。
有关通过遥操作收集演示数据的信息,请参阅 遥操作与数据收集。有关将 ROS2 bag 转换为训练所需的 LeRobot 数据集格式,请参阅 数据集转换 (bag_to_lerobot)。有关将训练后的模型部署回机器人,请参阅页面 策略节点。
训练架构概述
IB-Robot 遵循 关注点分离 理念,其中 数据收集和机器人控制 由 ROS2 工作空间处理,而 模型训练 则委托给外部 LeRobot 库。这种架构实现了:
使用完整的 LeRobot 生态系统和社区模型
将重型 ML 依赖与 ROS2 运行时隔离
灵活地在不同机器上训练(云 GPU 服务器、工作站)
与上游 LeRobot 更新兼容
训练生命周期图
graph LR
subgraph "IB-Robot ROS2 Workspace"
A["Robot<br/>Teleoperation"]
B["episode_recorder"]
C["ROS2 Bag<br/>(MCAP)"]
D["bag_to_lerobot<br/>Converter"]
E["LeRobot v3<br/>Dataset"]
end
subgraph "External Training Environment"
F["lerobot library<br/>libs/lerobot/"]
G["Training Script<br/>lerobot/scripts/train.py"]
H["Policy Checkpoint<br/>.pt file"]
end
subgraph "Deployment"
I["robot_config YAML<br/>models section"]
J["lerobot_policy_node"]
end
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
G --> H
H --> I
I --> J
style F fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style H fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
style I fill:#fff3e0,stroke:#ff9800,stroke-width:2px
来源:cluster-README.md-7406cf73, cluster-src/dataset_tools/README.md-03eaf360
LeRobot 库集成
库位置与设置
LeRobot 训练框架作为 Git 子模块 集成在 IB-Robot 工作空间中:
IB_Robot/
├── libs/
│ └── lerobot/ # [子模块] LeRobot 训练框架
│ ├── lerobot/
│ │ ├── scripts/
│ │ │ └── train.py # 主训练入口点
│ │ ├── common/
│ │ │ └── policies/ # 策略实现 (ACT, Diffusion 等)
│ │ └── configs/ # 训练配置
│ └── pyproject.toml
└── venv/ # Python 虚拟环境
安装过程:
setup.sh 脚本(参见 2.1)自动处理 lerobot 安装:
子模块初始化:
git submodule update --init --recursive可编辑安装:使用
-e标志将 lerobot 安装到 venv依赖解析:安装 PyTorch、numpy<2.0 和其他 ML 依赖
build.sh 脚本也会在每次构建前确保 lerobot 已安装:
来源:README.md-7406cf73, scripts/build.sh-5.04
数据集格式兼容性
LeRobot v3 数据集结构
IB-Robot 的 bag_to_lerobot 转换器(参见 9.3)生成 LeRobot v3 格式 的数据集,这是 lerobot 训练库期望的原生格式:
dataset_name/
├── videos/
│ ├── observation.images.top/
│ │ └── chunk-000/
│ │ └── file-000.mp4
│ ├── observation.images.wrist/
│ └── observation.images.front/
├── data/
│ └── chunk-000/
│ └── file-000.parquet # 包含动作/状态的回合数据
└── meta/
├── info.json # 数据集元数据
├── tasks.parquet # 回合任务描述
├── stats.json # 归一化统计信息
└── episodes/ # 每个回合的元数据
契约驱动的特征映射
IB-Robot 与 LeRobot 训练之间的关键连接是 robot_config YAML 中定义的 Contract(契约)。此契约嵌入在数据集元数据中,确保:
观测键 与策略期望的完全匹配
动作维度 与机器人自由度对齐
归一化统计信息 正确计算
graph TB
subgraph "robot_config YAML"
RC["contract:<br/>- observations<br/>- actions<br/>- rate_hz"]
end
subgraph "Dataset Conversion"
BAG["bag_to_lerobot"]
META["meta/info.json"]
STATS["meta/stats.json"]
end
subgraph "Training Configuration"
POLICY_CFG["Policy config.json"]
TRAIN_CFG["Training YAML"]
end
subgraph "Trained Model"
CKPT["checkpoint.pt"]
MODEL_META["config.json<br/>(input_features)"]
end
RC --> BAG
BAG --> META
BAG --> STATS
META --> POLICY_CFG
STATS --> TRAIN_CFG
POLICY_CFG --> CKPT
TRAIN_CFG --> CKPT
CKPT --> MODEL_META
style RC fill:#fff3e0,stroke:#ff9800,stroke-width:2px
style MODEL_META fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
来源: cluster-src/dataset_tools/dataset_tools/bag_to_lerobot.py-ef20288b, cluster-src/robot_config/config/robots/so101_single_arm.yaml-a9ae727a
训练工作流程
步骤 1:准备数据集
收集演示并将 bag 转换为 LeRobot 格式后(参见 9.2 和 9.3):
# 验证数据集结构
ls -R /path/to/dataset/
# 应显示:videos/, data/, meta/
# 检查数据集信息
cat /path/to/dataset/meta/info.json
步骤 2:配置训练
在 lerobot 库中创建训练配置 YAML:
ACT 策略示例
(libs/lerobot/lerobot/configs/policy/act_so101.yaml):
# 策略架构
policy:
name: act
input_shapes:
observation.images.top: [3, 480, 640]
observation.images.wrist: [3, 480, 640]
observation.state: [6]
output_shapes:
action: [6]
# ACT 特定参数
n_action_steps: 100
chunk_size: 100
hidden_dim: 512
dim_feedforward: 3200
n_encoder_layers: 4
n_decoder_layers: 1
# 训练参数
training:
offline_steps: 50000
batch_size: 8
lr: 1e-5
lr_scheduler: cosine
gradient_clip_norm: 10
# 数据集
dataset_repo_id: local
root: /path/to/dataset
关键配置参数:
参数 |
描述 |
|---|---|
|
必须与 Contract 观测匹配 |
|
必须与 Contract 动作匹配 |
|
每次推理预测的未来动作数量 |
|
总动作序列长度(用于分块模型) |
|
总训练迭代次数 |
步骤 3:执行训练
导航到 lerobot 库并运行训练:
# 激活虚拟环境
source venv/bin/activate
# 导航到 lerobot
cd libs/lerobot
# 运行训练
python lerobot/scripts/train.py \
policy=act_so101 \
dataset_repo_id=local \
root=/path/to/dataset \
output_dir=/path/to/checkpoints \
wandb.enable=true \
wandb.project=so101_training
训练脚本流程:
graph TB
START["python train.py"]
LOAD_CFG["Load policy config<br/>(act_so101.yaml)"]
LOAD_DS["Load LeRobotDataset<br/>(from root path)"]
INIT_POL["Initialize Policy<br/>(ACTPolicy class)"]
TRAIN_LOOP["Training Loop<br/>(offline_steps)"]
SAVE_CKPT["Save checkpoint.pt<br/>+ config.json"]
START --> LOAD_CFG
LOAD_CFG --> LOAD_DS
LOAD_DS --> INIT_POL
INIT_POL --> TRAIN_LOOP
TRAIN_LOOP --> SAVE_CKPT
subgraph "Per Iteration"
SAMPLE["Sample batch from dataset"]
FORWARD["Forward pass through policy"]
LOSS["Compute loss (MSE, BCE)"]
BACKWARD["Backward pass + optimizer step"]
SAMPLE --> FORWARD
FORWARD --> LOSS
LOSS --> BACKWARD
end
TRAIN_LOOP --> SAMPLE
BACKWARD -.->|repeat| SAMPLE
来源:cluster-README.md-7406cf73, cluster-src/action_dispatch/README.en.md-5.34
模型检查点与配置
检查点结构
训练完成后,输出目录包含:
checkpoints/
└── act_so101_20240315_123456/
├── checkpoints/
│ ├── 010000/
│ │ └── pretrained_model/
│ │ ├── model.safetensors # 模型权重
│ │ └── config.json # 模型元数据
│ ├── 020000/
│ └── 050000/ # 最终检查点
├── config.yaml # 完整训练配置
└── training.log
config.json 结构
嵌入在每个检查点中的 config.json 文件对部署至关重要:
{
"input_features": {
"observation.images.top": {
"shape": [3, 480, 640],
"dtype": "float32"
},
"observation.images.wrist": {
"shape": [3, 480, 640],
"dtype": "float32"
},
"observation.state": {
"shape": [6],
"dtype": "float32"
}
},
"output_features": {
"action": {
"shape": [6],
"dtype": "float32"
}
},
"policy_type": "act",
"n_action_steps": 100,
"chunk_size": 100
}
关键字段:
字段 |
用途 |
|---|---|
|
定义策略期望的观测(过滤 Contract) |
|
定义动作维度 |
|
推理服务用于实例化正确的策略类 |
|
action_dispatcher_node 用于分块管理 |
来源:cluster-src/inference_service/README.en.md-2537d748
与 robot_config 集成
引用训练模型
训练完成后,检查点路径注册到 robot_config YAML:
robot:
name: so101_single_arm
models:
- name: act_reach_and_grasp
path: /path/to/checkpoints/act_so101_20240315_123456/checkpoints/050000/pretrained_model
policy_type: act
- name: diffusion_pick_place
path: /path/to/checkpoints/diffusion_so101_20240320_091234/checkpoints/100000/pretrained_model
policy_type: diffusion_policy
部署时的模型加载
当推理服务启动时(参见 7.4),它会:
读取 robot_config 查找模型路径
从检查点加载 config.json
基于 ``input_features`` 过滤观测
使用 ``policy_type`` 实例化策略
从 ``model.safetensors`` 加载权重
模型加载流程:
graph TB
LAUNCH["robot.launch.py"]
LOAD_CFG["Load robot_config YAML"]
FIND_MODEL["Find model by name<br/>(from models section)"]
POLICY_NODE["lerobot_policy_node"]
LOAD_META["Load config.json"]
FILTER_OBS["Filter Contract observations<br/>by input_features"]
INIT_POLICY["Initialize policy class<br/>(ACTPolicy, DiffusionPolicy)"]
LOAD_WEIGHTS["Load model.safetensors"]
READY["Inference Ready"]
LAUNCH --> LOAD_CFG
LOAD_CFG --> FIND_MODEL
FIND_MODEL --> POLICY_NODE
POLICY_NODE --> LOAD_META
LOAD_META --> FILTER_OBS
FILTER_OBS --> INIT_POLICY
INIT_POLICY --> LOAD_WEIGHTS
LOAD_WEIGHTS --> READY
来源: cluster-src/robot_config/config/robots/so101_single_arm.yaml-a9ae727a, cluster-README.md-7406cf73
支持的策略类型
IB-Robot 与 lerobot 库中的以下策略类型集成:
策略类型 |
描述 |
关键参数 |
动作格式 |
|---|---|---|---|
ACT |
Action Chunking Transformer |
|
分块(100 步) |
Diffusion Policy |
基于扩散的 轨迹生成 |
|
分块(可变) |
VLA (Pi0, SmolVLA) |
视觉-语言- 动作模型 |
|
逐步 |
CNN Policy |
简单的 基于 CNN 的 策略 |
` encoder_layers` |
逐步 |
策略特定的训练注意事项
ACT (Action Chunking Transformer): - 需要 chunk_size = n_action_steps (通常为 100) - 最适合平滑、连续的操作任务 - 训练时间: 单 GPU 上 50k 步约 12-24 小时
Diffusion Policy: - 推理时需要多步去噪 - 计算成本较高, 但在多模态分布上表现更好 - 训练时间: 单 GPU 上 100k 步约 24-48 小时
VLA (Vision-Language-Action): - 数据集中需要任务语言提示 - 可以零样本泛化到新任务 - 训练时间: 不定 (通常预训练, 微调约 6-12 小时)
来源:cluster-src/action_dispatch/README.en.md-5.34, cluster-README.md-7406cf73
训练最佳实践
数据需求
策略类型 |
最少回合数 |
推荐回合数 |
每回合时长 |
|---|---|---|---|
ACT |
50 |
200+ |
30-60 秒 |
Diffusion Policy |
100 |
300+ |
30-60 秒 |
VLA (fine-tuning) |
20 |
50+ |
可变 |
硬件推荐
组件 |
最低配置 |
推荐配置 |
|---|---|---|
GPU |
NVIDIA RTX 3060 (12GB) |
NVIDIA A100 (40GB) |
CPU |
8 核 |
16+ 核 |
RAM |
32GB |
64GB+ |
存储 |
100GB SSD |
500GB+ NVMe SSD |
监控训练
lerobot 库支持 Weights & Biases (wandb) 进行训练监控:
# 在训练配置中
wandb:
enable: true
project: so101_training
entity: your_username
关键监控指标:- train/loss:应平滑下降 - train/action_mse:动作预测误差 - train/grad_norm:梯度幅度(不应爆炸)- eval/success_rate:如果运行评估回合
来源:cluster-README.md-7406cf73, cluster-docs/architecture.md-4.71
故障排除
常见训练问题
问题 |
原因 |
解决方案 |
|---|---|---|
`` KeyError: ‘observa tion.images.top’`` |
数据集与策略配置 不匹配 |
验证 |
|
批次大小过大 |
在训练配置中减小 |
|
学习率过高/过低 |
尝试 |
|
回合太少或步数 太多 |
收集更多数据或减少 |
数据集验证
训练前,验证转换后的数据集:
# 检查数据集完整性
python -c "
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
dataset = LeRobotDataset('local', root='/path/to/dataset')
print(f'Episodes: {dataset.num_episodes}')
print(f'Frames: {dataset.num_frames}')
print(f'Features: {dataset.features}')
"
来源:cluster-src/dataset_tools/README.md-03eaf360
总结
IB-Robot 中的训练集成遵循清晰的分离原则:
数据收集(ROS2 工作空间):遥操作 → episode_recorder → ROS2 bags
数据转换(ROS2 工作空间):bag_to_lerobot → LeRobot v3 数据集
训练(外部 lerobot 库):train.py → 模型检查点
部署(ROS2 工作空间):robot_config YAML → lerobot_policy_node
robot_config YAML 中定义的 Contract 作为唯一事实来源,确保数据收集、训练和部署之间的一致性。lerobot 库作为 Git 子模块集成并以可编辑模式安装,允许开发者利用完整的 LeRobot 生态系统同时保持可复现性。
有关流水线的下一步,请参阅 部署反馈循环,了解在线评估数据如何反馈到训练中以实现持续改进。
来源:cluster-README.md-7406cf73, cluster-src/dataset_tools/README.md-03eaf360, cluster-src/robot_config/config/robots/so101_single_arm.yaml-a9ae727a