StarAI——Lerobot机械臂算法复现之smolVLA篇

StarAI——Lerobot机械臂算法复现之smolVLA篇

理论部分*

实践部分

0.系统要求

操作系统:Linux(推荐 Ubuntu 20.04+)或 macOS
Python 版本:建议 3.10+(与 LeRobot 常用依赖更匹配)
GPU:NVIDIA GPU(推荐 RTX 3080 或更高),**至少 8GB 显存**
内存:至少 16GB RAM
存储空间:至少 50GB 可用空间

环境准备

安装依赖(SmolVLA 相关依赖通常在 extras 中)
pip install -e ".[smolvla]"

1.录制数据集

数据质量要求

最少 25 个高质量 episode 才能获得良好性能
推荐 100+ episode 以获得最佳效果
每个 episode 应包含完整的任务执行过程
图像分辨率推荐 224x224 或 256x256

2.一点疑惑

我在复现的过程中发现了一些小bug,查看训练好的模型config.json文件的时候发现一些奇怪的小bug——
图片

我的输入特征不对吧?!怎么图像分辨率变成256*256了,输入状态维度怎么才6个维度?!!
别担心,这并不会影响你的模型正常性能。这是因为在训练的时候使用了一个预训练权重/路径(--policy.path 指向已有 snapshot)。该 checkpoint 带有自己的 config(通常记录模型训练时的 input_features)。如果你去查看下载的预训练权重就可以发现:

图片

这里的维度确实是6和255,这是因为smolvla_base这个模型原先是在soarm101机械臂(5自由度+1末端执行器)上训练的。不必理会便可,并不会影响模型的正常性能

3.训练

首先下载smolVLA的权重lerobot/smolvla_base

HF_ENDPOINT=https://hf-mirror.com huggingface-cli download --resume-download lerobot/smolvla_base --local-dir /您的/目标/文件夹路径

然后下载smolVLA的模型HuggingFaceTB/SmolVLM2-500M-Video-Instruct

HF_ENDPOINT=https://hf-mirror.com huggingface-cli download --resume-download HuggingFaceTB/SmolVLM2-500M-Video-Instruct --local-dir /您的/目标/文件夹路径

接着开始训练

默认参数是冻结呢视觉编码器的参数,只训练动作专家。如果希望模型拥有更好的表现效果,可以设置

--policy.freeze_vision_encoder=false 
--policy.train_expert_only=false 

如果你的数据集只使用了2个摄像头,模型输入是3个摄像头,那需要设置

--policy.empty_cameras=1

具体逻辑可以在configuration_smolvla.py中查看:

图片

虚拟特征本身不包含任何图像数据,但是在模型推理的时候是占用内存的算力的。也就是说如果可以的话尽量使用3个摄像头捕捉视觉信息

训练代码如下:

HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
accelerate launch --num_processes=2 $(which lerobot-train) \
  --policy.path=权重路径  \
  --policy.repo_id=my_smolvla_training \
  --policy.empty_cameras=1 \
  --policy.vlm_model_name=模型路径 \
  --job_name=my_smolvla_training \
  --policy.device=cuda \
  --policy.use_amp=true \
  --policy.chunk_size=100 \
  --policy.freeze_vision_encoder=false \
  --policy.train_expert_only=false \
  --dataset.repo_id=/mnt/sdb/dataset/zzh/DataSet/pick_and_place_ppro \
  --batch_size=8 \
  --steps=50000 \
  --save_checkpoint=true \
  --save_freq=10000 \
  --rename_map='{"observation.images.front": "observation.images.camera1", "observation.images.up": "observation.images.camera2"}' \
  --output_dir=outputs/train/my_smolvla_ppro \
  --wandb.enable=false 2>&1 | tee training_smolVLA_log_ppro1.txt

3.1参数讲解

3.1.1核心参数
参数 含义 推荐值 说明
--policy.type 策略类型 smolvla SmolVLA 模型类型
--policy.pretrained_path 预训练模型路径 lerobot/smolvla_base HuggingFace 上的官方预训练模型
--dataset.repo_id 数据集标识 local/mylerobot3 推荐本地训练用 local/xxx;也可以填 your-name/your-repo(Hub)
--dataset.root 数据集本地路径 ~/Downloads/mylerobot3 仅当你使用本地数据集时需要(目录包含 meta/info.jsondata/ 等)
--batch_size 批处理大小 64 根据显存调整,RTX 3080 推荐 32-64
--steps 训练步数 20000 小数据集可减少到 10000
--output_dir 输出目录 outputs/train/smolvla_finetuned 模型保存路径
--job_name 任务名称 smolvla_finetuning 用于日志和实验跟踪(可选)
3.1.2训练参数
参数 含义 推荐值 说明
--policy.optimizer_lr 学习率 1e-4 微调时可适当降低
--policy.scheduler_warmup_steps 预热步数 1000 学习率预热,稳定训练
--policy.use_amp 混合精度 true 节省显存,加速训练
--policy.optimizer_grad_clip_norm 梯度裁剪 1.0 防止梯度爆炸
--num_workers 数据加载线程数 4 根据CPU核心数调整
--policy.push_to_hub 推送到Hub false 是否上传模型到HuggingFace(需要repo_id)
--save_checkpoint 保存检查点 true 是否保存训练检查点
--save_freq 保存频率 5000 检查点保存间隔步数
3.1.3网络架构参数
参数 含义 推荐值 说明
--policy.vlm_model_name VLM骨干模型 HuggingFaceTB/SmolVLM2-500M-Video-Instruct SmolVLA 使用的视觉语言模型
--policy.chunk_size 动作块大小 50 预测的动作序列长度
--policy.n_action_steps 执行动作步数 50 每次实际执行的动作数
--policy.n_obs_steps 观测历史步数 1 使用的历史观测帧数

4.评估

HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1 \
lerobot-record  \
  --robot.type=lerobot_robot_viola \
  --robot.port=/dev/ttyUSB1 \
  --robot.cameras="{ camera1: {type: opencv, index_or_path: /dev/video6, width: 640, height: 480, fps: 30, fourcc: "MJPG"},camera2: {type: opencv, index_or_path: /dev/video8, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \
  --robot.id=my_awesome_staraiviola_arm \
  --display_data=true \
  --dataset.repo_id=starai/eval_smol \
  --dataset.single_task="Put the yellow square into the drawer." \
  --dataset.push_to_hub=False \
  --policy.path=/home/zzh/lerobot/outputs/train/smolVLA/pretrained_model_ppro

常见问题(FAQ)

Q:推理时报字段 key 不匹配?

这是因为录制数据集的时候使用的是:

--robot.cameras="{ up: {type: opencv, index_or_path: /dev/video6, width: 640, height: 480, fps: 30, fourcc: "MJPG"},front: {type: opencv, index_or_path: /dev/video8, width: 640, height: 480, fps: 30, fourcc: "MJPG"}}" \

而smolVLA需要的信息是camera1,2,3。只需要在训练的时候使用remap给摄像头视觉信息名称重映射即可:

--rename_map='{"observation.images.front": "observation.images.camera1", "observation.images.up": "observation.images.camera2"}' \

Q:一上来就 OOM?

先把 --batch_size 降到 16/8,并开启 --policy.use_amp true,--num_workers 降到 2 或 1。

Q:Loss 几乎不降?

先确认数据是否对齐(state/action 维度、时间对齐、动作平滑),再考虑调学习率和步数。

Q:效果表现不佳?

首先确保自己的数据集是大于100episodes并且都是正确高质量的,可以全部replay一遍。如果都没问题的话,可以尝试解冻视觉编码器的参数,使得模型在数据集上更好的过拟合。如果还是不行,可以试一试增大模型的动作快action_chunk和执行的动作action_step。

posted @ 2026-03-26 12:57  zzzking778  阅读(50)  评论(0)    收藏  举报