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.json、data/ 等) |
--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。

浙公网安备 33010602011771号