Diffusion Policy 模型微调
概述
Diffusion Policy 是一种基于扩散模型的视觉运动策略学习方法,将扩散模型的生成能力应用于机器人控制领域。该方法通过学习动作分布的扩散过程,能够生成多样化且高质量的机器人动作序列,在复杂的机器人操作任务中表现出色。
核心特点
- 扩散生成:使用扩散模型生成连续的动作序列
- 多模态动作:能够处理具有多种解决方案的任务
- 高质量输出:生成平滑、自然的机器人动作
- 鲁棒性强:对噪声和扰动具有良好的鲁棒性
- 表达能力强:能够学习复杂的动作分布
先决条件
系统要求
- 操作系统:Linux(推荐 Ubuntu 20.04+)或 macOS
- Python 版本:3.8+
- GPU:NVIDIA GPU(推荐 RTX 3080 或更高),至少 10GB 显存
- 内存:至少 32GB RAM
- 存储空间:至少 50GB 可用空间
环境准备
1. 安装 LeRobot
# 克隆 LeRobot 仓库
git clone https://github.com/huggingface/lerobot.git
cd lerobot
# 创建虚拟环境(推荐 venv;如你偏好 conda 也可以)
python -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
# 安装依赖
pip install -e .
版本匹配提示:
meta/info.json中codebase_version=v2.1时建议使用git checkout v0.3.3;codebase_version=v3.0时建议使用git checkout v0.4.3,并重新执行pip install -e ".[all]"。
Diffusion Policy 架构
核心组件
- 视觉编码器:提取图像特征
- 状态编码器:处理机器人状态信息
- 条件编码器:融合视觉和状态信息
- 扩散网络:学习动作分布的扩散过程
- 噪声调度器:控制扩散过程的噪声水平
扩散过程
- 前向过程:逐步向动作序列添加噪声
- 反向过程:从噪声中逐步恢复动作序列
- 条件生成:基于观察条件生成动作
- 采样策略:使用 DDPM 或 DDIM 采样
数据准备
LeRobot 格式数据
Diffusion Policy 需要使用 LeRobot 格式的数据集:
your_dataset/
├── data/
│ ├── chunk-001/
│ │ ├── observation.images.cam_high.png
│ │ ├── observation.images.cam_low.png
│ │ ├── observation.state.npy
│ │ ├── action.npy
│ │ └── ...
│ └── chunk-002/
│ └── ...
├── meta.json
├── stats.safetensors
└── videos/
├── episode_000000.mp4
└── ...
数据质量要求
- 最少 100 个 episode 用于基本训练
- 推荐 500+ episode 以获得最佳效果
- 动作序列应该平滑连续
- 包含多样化的任务场景
- 高质量的视觉观察数据
微调训练
基本训练命令
# 设置环境变量
export HF_USER="your-huggingface-username"
export CUDA_VISIBLE_DEVICES=0
# 启动 Diffusion Policy 训练
lerobot-train \
--policy.type diffusion \
--policy.pretrained_path lerobot/diffusion_policy \
--dataset.repo_id ${HF_USER}/your_dataset \
--batch_size 64 \
--steps 100000 \
--output_dir outputs/train/diffusion_policy_finetuned \
--job_name diffusion_policy_finetuning \
--policy.device cuda \
--policy.horizon 16 \
--policy.n_action_steps 8 \
--policy.n_obs_steps 2 \
--policy.optimizer_lr 1e-4 \
--policy.optimizer_weight_decay 1e-6 \
--policy.push_to_hub false \
--save_checkpoint true \
--save_freq 10000 \
--wandb.enable true
高级训练配置
多步预测配置
# 针对长序列预测的配置
lerobot-train \
--policy.type diffusion \
--policy.pretrained_path lerobot/diffusion_policy \
--dataset.repo_id ${HF_USER}/your_dataset \
--batch_size 32 \
--steps 150000 \
--output_dir outputs/train/diffusion_policy_long_horizon \
--job_name diffusion_policy_long_horizon \
--policy.device cuda \
--policy.horizon 32 \
--policy.n_action_steps 16 \
--policy.n_obs_steps 4 \
--policy.beta_schedule squaredcos_cap_v2 \
--policy.clip_sample true \
--policy.prediction_type epsilon \
--policy.optimizer_lr 1e-4 \
--policy.scheduler_name cosine \
--policy.scheduler_warmup_steps 5000 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true
内存优化配置
# 针对显存较小的 GPU
lerobot-train \
--policy.type diffusion \
--policy.pretrained_path lerobot/diffusion_policy \
--dataset.repo_id ${HF_USER}/your_dataset \
--batch_size 16 \
--steps 200000 \
--output_dir outputs/train/diffusion_policy_memory_opt \
--job_name diffusion_policy_memory_optimized \
--policy.device cuda \
--policy.horizon 16 \
--policy.n_action_steps 8 \
--policy.num_inference_steps 50 \
--policy.optimizer_lr 5e-5 \
--policy.use_amp true \
--num_workers 2 \
--policy.push_to_hub false \
--save_checkpoint true \
--wandb.enable true
参数详细说明
核心参数
| 参数 | 含义 | 推荐值 | 说明 |
|---|---|---|---|
--policy.type | 策略类型 | diffusion | Diffusion Policy 模型类型 |
--policy.pretrained_path | 预训练模型路径 | lerobot/diffusion_policy | LeRobot 官方模型(可选) |
--dataset.repo_id | 数据集仓库 ID | ${HF_USER}/your_dataset | 你的 HuggingFace 数据集 |
--batch_size | 批处理大小 | 64 | 根据显存调整,RTX 3080 推荐 32-64 |
--steps | 训练步数 | 100000 | 扩散模型通常需要更多训练步数 |
--output_dir | 输出目录 | outputs/train/diffusion_policy_finetuned | 模型保存路径 |
--job_name | 任务名称 | diffusion_policy_finetuning | 用于日志和实验跟踪(可选) |
Diffusion Policy 特定参数
| 参数 | 含义 | 推荐值 | 说明 |
|---|---|---|---|
--policy.horizon | 预测时间范围 | 16 | 预测的动作序列长度 |
--policy.n_action_steps | 执行动作步数 | 8 | 每次执行的动作数量 |
--policy.n_obs_steps | 观察步数 | 2 | 历史观察的数量 |
--policy.num_inference_steps | 推理步数 | 100 | 扩散采样的步数(训练时不生效) |
--policy.beta_schedule | 噪声调度 | squaredcos_cap_v2 | 噪声添加的调度策略 |
--policy.clip_sample | 样本裁剪 | true | 是否裁剪生成的样本 |
--policy.clip_sample_range | 裁剪范围 | 1.0 | 样本裁剪的范围 |
--policy.prediction_type | 预测类型 | epsilon | 预测噪声或样本 |
--policy.num_train_timesteps | 训练时间步 | 100 | 前向扩散的步数 |
网络架构参数
| 参数 | 含义 | 推荐值 | 说明 |
|---|---|---|---|
--policy.vision_backbone | 视觉骨干网络 | resnet18 | 图像特征提取网络 |
--policy.crop_shape | 图像裁剪尺寸 | 84 84 | 输入图像的裁剪尺寸 |
--policy.crop_is_random | 随机裁剪 | true | 训练时是否随机裁剪 |
--policy.use_group_norm | 使用组归一化 | true | 替换批归一化 |
--policy.spatial_softmax_num_keypoints | 空间软最大关键点数 | 32 | 空间软最大层的关键点数 |
--policy.down_dims | 下采样维度 | 512 1024 2048 | U-Net 下采样路径的维度 |
--policy.kernel_size | 卷积核大小 | 5 | 1D 卷积的核大小 |
--policy.n_groups | 组归一化组数 | 8 | GroupNorm 的组数 |
--policy.diffusion_step_embed_dim | 步骤嵌入维度 | 128 | 扩散步骤的嵌入维度 |