Skip to main content

模型训练

  • 特别说明

    从这里开始,涉及到kuavo-il-opensource框架的使用,用处如下:

    • kuavo-il-opensource作为模型训练框架被部署到训练机

一、前置说明

通过数据采集,在机器人上位机上获得到的原始RosBag数据集是/home/leju_kuavo/Data/rosbag/rosbag_out/water-bottle-sorting,目录结构如下:

/home/leju_kuavo/Data/rosbag/rosbag_out/water-bottle-sorting/
├── water-bottle-sorting_20250428_105822_1.bag
├── water-bottle-sorting_20250428_110122_2.bag
├── water-bottle-sorting_20250428_112413_3.bag
├── water-bottle-sorting_20250428_115822_4.bag
└── task_info.json

[注]:以下案例使用的RosBag包是使用可视化界面进行数据采集的,数据采集的操作步骤请参考数据采集。数据采集后的存储配置见数据采集-参数配置

二、环境配置

在您用来训练采集数据的主机或服务器上执行

git clone https://gitee.com/leju-robot/kuavo-il-opensource.git
cd kuavo-il-opensource
conda create -y -n kuavo_il python=3.10
conda activate kuavo_il
pip install -e lerobot

三、原始数据集转移

需要将采集好的数据从AGX转移到训练用的主机或服务器

1. 明确目标路径

训练机上的数据存放的目标路径为:/home/lejurobot/mydisk/data,希望RosBag数据集转移后构建的目录结构如下:

/home/lejurobot/mydisk/data/water-bottle-sorting/
├── rosbag/ ← 未转换的ROSBag包(原始数据)
├── water-bottle-sorting_20250428_105822_1.bag
├── water-bottle-sorting_20250428_110122_2.bag
├── water-bottle-sorting_20250428_112413_3.bag
├── ...
└── task_info.json

2. 进行转移

在机器人上位机执行以下命令:

rsync -av --info=PROGRESS /home/leju_kuavo/Data/rosbag/rosbag_out/water-bottle-sorting/ lejurobot@192.168.20.4:~/mydisk/data/water-bottle-sorting/rosbag/

四、数据转换

数据采集时会生成RosBag包,在进行模型训练时需要将RosBag包转换为lerobot格式或者zarr格式。目前文档介绍的是基于lerobot格式进行模型训练。转化为zarr格式仅做演示,后序的训练不使用。

1. 脚本转换

bag转换lerobot

1.克隆仓库

[注]:如果机器人预先配置好此仓库,则无需执行此步,直接执行下面的步骤即可。

git clone https://gitee.com/leju-robot/kuavo-il-opensource.git

2.进入仓库

cd ~/kuavo-il-opensource #将这个文件夹视作项目根目录

3.参数配置 数据转化的相关配置文件为/home/leju_kuavo/kuavo-il-opensource/kuavo/kuavo_1convert/common/lerobot_dataset.yaml,具体配置属性详细说明如下:

only_arm: true  # 默认true, 是否只使用手臂数据, 目前的模仿学习只用于手臂数据
eef_type: dex_hand # or leju_claw
which_arm: right # 可选: left, right, both

train_hz: 30 # 训练采样频率
main_timeline_fps: 30 # 主相机的帧率,必须稳定, 主相机来自head_cam_h, wrist_cam_l, wrist_cam_r
sample_drop: 10 # 丢弃回合前后的10帧

# dex_dof_needed是强脑手需要的自由度数目。强脑灵巧手有6个自由度。标准握拳状态[100] * 6, 张开状态[0] * 6。
# 1: 不需要精细操作或者多指协同操作时,通常为设置为1,表示只需要第一个关节作为开合依据,此时需要用[0, 100, 0, 0, 0, 0]表示张开状态, [100] * 6表示握拳状态。
# 2(暂未测试): 或者设置为2,目前的手柄遥操作只有两个自由度。0,2,3,4,5自由度绑定为1个自由度。
# 6(暂未测试): 如果脱离手柄使用手指灵巧操作,可以设置为6,表示需要所有6个自由度。
dex_dof_needed: 1 # default=1

is_binary: false # 是否将开合二值化, default=false
delta_action: false # 是否使用增量动作,default=false
relative_start: false # 是否使用相对起始位置, default=false

resize:
width: 640
height: 480

4.进行格式转换

python ./kuavo/kuavo_1convert/cvt_rosbag2lerobot.py  --raw_dir /home/lejurobot/mydisk/data/water-bottle-sorting/rosbag -v v0

[注]: 转换代码格式

Python [转换脚本]  --raw_dir [装载RosBag数据集的文件夹的路径]  -n [指定转换几个] -v [转换后数据集的名称]

5.转换过程中没有报错如下图

image-20250417171955671

[注]:转换后的lerobot数据在指定存放在装载RosBag数据集的文件夹的同级目录,本案例的转换后目录结构如下

/home/lejurobot/mydisk/data/water-bottle-sorting/
├── v0/
│ └── lerobot/ ← 转化好的训练数据集(用于训练)
│ ├── data/
│ ├── meta/
│ └── videos/

└── rosbag/ ← 未转换的ROS bag包(原始数据)
├── water-bottle-sorting_20250428_105822_1.bag
├── water-bottle-sorting_20250428_110122_2.bag
├── water-bottle-sorting_20250428_112413_3.bag
├── ...
└── task_info.json

bag转换zarr(此案例主线未使用zarr格式,仅做演示)

1.Git clone 仓库

git clone https://gitee.com/leju-robot/kuavo-il-opensource.git

2.进入仓库

cd kuavo-il-opensource

3.进行格式转换

python /home/lejurobot/tjy/kuavo-il-opensource/kuavo/kuavo_1convert/cvt_rosbag2zarr.py -b /home/lejurobot/mydisk/data/Task17_cup/rosbag -c /home/lejurobot/tjy/kuavo-il-opensource/kuavo/kuavo_1convert/config/Task14_cup.yaml -n 3 -a

[注]: 转换代码格式如下

Python [转换脚本]  
-b [bag数据集文件]
-c [配置文件路径(根据bag话题修改对应的yaml文件,内包含不同话题的处理方法以及抽帧值)]
-n [需要处理的bag包数量]
-a [如果需要合并多个任务的数据,这里可以加上-a]
-l [图像的压缩质量,越小质量越低(0-100)]

2. 可视化转换(可跳过此步骤 废弃)

数据采集-数据处理-操作说明

  • 若此时配置的参数如下,且设置的转化后目标数据集名称为water-bottle-sorting-10fps
    "dataset_save_dir": "/home/leju_kuavo/Data/convert_dataset/water-bottle-sorting-10fps"
  • 则可视化转化后的数据存储位置为
/home/leju_kuavo/Data/convert_dataset/water-bottle-sorting/
/home/leju_kuavo/Data/convert_dataset/
└── water-bottle-sorting(转化后任务数据集文件夹)
├── water-bottle-sorting-10fps(10fps的转化)
├── data
├── meta
└── videos

[注]: 可视化数据转换是针对一个任务数据集进行转换,换句话说,一次采集任务会有多个RosBag包,这些包组成一个任务,可视化数据转化时没有类似于脚本转化时的-n参数,默认会将该任务下的所有RosBag包进行转换。

五、模型训练

在上面的数据转化案例中,可视化数据转换后和脚本转化后得到的对象的文件夹包名都是water-bottle-sorting,最终用于模型训练的文件夹包名是有存放datametavideos的文件夹。因此可视化数据转化用于模型训练的是/home/leju_kuavo/Data/convert_dataset/water-bottle-sorting/water-bottle-sorting-10fps,脚本数据转化用于模型训练的是/home/leju_kuavo/Data/rosbag/rosbag_out/water-bottle-sorting_10fps/lerobot

1. LeRobot单卡训练

1.进入仓库中lerobot的上级文件夹

2.执行命令

python lerobot/lerobot/scripts/train.py \
--policy.type act \
--dataset.repo_id Task23_Orbber_conveyor_black/lerobot \
--dataset.local_files_only true \
--dataset.root ~/mydisk/data/Task23_Orbber_conveyor_black/v0/lerobot/ \
--save_checkpoint true \
--batch_size 32 \
--num_workers 8 \
--output_dir ~/mydisk/data/Task23_Orbber_conveyor_black/v0 \
--steps 200000 \
--save_freq 20000 \
--log_freq 200
# 如果需要记录训练过程,可以加上以下参数
--wandb.enable true \
--wandb.project Task23_Orbber_conveyor_black \

3.参数信息如下:

参数描述示例值
policy.typepolicy类型(act, diffusion)act
dataset.repo_id从hf上拉数据需要,如果使用本地数据可以填<TaskName/lerobot>Task23_Orbber_conveyor_black/lerobot
dataset.local_files_only默认使用本地数据训练true
dataset.root本地lerobot数据集路径~/mydisk/data/Task23_Orbber_conveyor_black/v0/lerobot/
save_checkpoint是否需要存储ckpttrue
batch_size模型训练batch大小32
num_workers数据加载使用cpu数量8
output_dir模型输出目录~/mydisk/data/Task23_Orbber_conveyor_black/v0
wandb.enable是否需要使用wandb记录训练过程,默认falsetrue
wandb.project为本次训练过程命名Task23_Orbber_conveyor_black
steps总训练采样batch次数,一般100000~200000200000
save_freq每20000采样存储一次训练结果,可以取中间训练结果验证20000
log_freq每200次采样log一次loss等数据显示到终端200
  1. 训练如下图所示

image-20250417171955671

2. LeRobot 多卡分布式训练

1.进入仓库中lerobot的上级文件夹

2.执行命令

export CUDA_VISIBLE_DEVICES=0,1,2,3 GPUS=4;
accelerate launch --num_processes=$GPUS --main_process_port 29399 --mixed_precision fp16\
lerobot/lerobot/scripts/train_distributed.py \
--policy.type act \
--dataset.repo_id Task23_Orbber_conveyor_black/lerobot\
--dataset.local_files_only true \
--dataset.root ~/mydisk/data/Task23_Orbber_conveyor_black/v0/lerobot/ \
--save_checkpoint true \
--batch_size 32 \
--num_workers 8 \
--output_dir ~/mydisk/data/Task23_Orbber_conveyor_black/v0/ \
--epochs 500 \
--save_epoch 50
# 如果需要记录训练过程,可以加上以下参数
--wandb.enable true \
--wandb.project Task23_Orbber_conveyor_black \

3.参数信息如下:

参数描述示例值
num_processes训练时使用的GPU数量3
main_process_port执行训练进程的端口号29599
mixed_precision是否使用混合精度训练fp16
policy.typepolicy类型(act, diffusion)act
dataset.repo_id从hf上拉数据需要,如果使用本地数据可以填<TaskName/lerobot>Task23_Orbber_conveyor_black/lerobot
dataset.local_files_only默认使用本地数据训练true
dataset.root本地lerobot数据集路径~/mydisk/data/Task23_Orbber_conveyor_black/v0/lerobot/
save_checkpoint是否需要存储ckpttrue
batch_size模型训练batch大小32
num_workers数据加载使用cpu数量8
output_dir模型输出目录~/mydisk/data/Task23_Orbber_conveyor_black/v0
wandb.enable是否需要使用wandb记录训练过程,默认falsetrue
wandb.project为本次训练过程命名Task23_Orbber_conveyor_black
epochs训练轮数(数据集遍历一轮)600
save_epoch每50轮存储一次训练结果50

4.成功启动训练则显示下图

image-20250417171955671

5.训练完成后,目录层级结构如下

/home/lejurobot/mydisk/data/water-bottle-sorting/
├── v0/
│ ├── lerobot/ ← 转化好的训练数据集(用于训练)
│ │ ├── data/
│ │ ├── meta/
│ │ └── videos/
│ │
│ └── train_leact/ ← 训练输出目录(保存模型、日志等)
│ └── 2025-04-29/10-28-17_act/checkpoints/
│ ├── 020000/ ← 训练了20000轮的模型
│ │ ├── pretrained_model ← 模型文件
│ │ └── training_state
│ ├── 040000/ ← 训练了40000轮的模型
│ │ ├── pretrained_model ← 模型文件
│ │ └── training_state
│ └── last/ ← 正在训练的模型

└── rosbag/ ← 未转换的ROS bag包(原始数据)
├── water-bottle-sorting_20250428_105822_1.bag
├── water-bottle-sorting_20250428_110122_2.bag
├── water-bottle-sorting_20250428_112413_3.bag
├── ...
└── task_info.json