← reports index
训练 · 2026-09-06 夜

今晚训左臂:为什么是 sep3-clean,命令,以及跑测前必须对上的四件事

目标是抓桌面正中那个米色纸杯。数据盘完之后结论很清楚:现役的 0826 右臂模型一集都没覆盖过中位,而 0903 左臂那批覆盖最好、开头干净、视角和现在的标准预置位一致。今晚不需要做任何数据处理,直接开训。

证据等级:跑测过 本机实测 · 数据里读的 从数据集算出来 · 没核过。本页所有数字都是 2026-09-06 在这台机器上算的。

一、为什么是 sep3-clean(0903 左臂,54 集)

y=0 是两肩正中(左肩 y=+0.133、右肩 y=−0.133 m),杯子放桌面正中就是 y≈0。下面的 y 是每集闭爪那一刻指尖的横向位置,也就是杯子当时站在哪。

数据集臂集闭爪 y 范围(cm)离中位 <5cm头 tilt开头跳变
0826(现役模型用的)右40−31.2 ~ −8.6049.8°5.5°,6 帧稳
sep2-trim(0902)右51−28.4 ~ +2.1837.5°已裁
sep3-clean(0903)左54−6.2 ~ +16.92350.1°2.9°,3 帧稳

三条理由,全部指向同一批:

所以今晚不需要任何数据处理。0902 右臂那 51 集我今天裁过跳变并推了 Hub(xlerobot-right-pick-cup-sep2-trim-20260906),但那是右臂、而且是 37.5° 视角,今晚用不上。

数据体检(我已经跑过)

项结果
语言指令Pick up the cup with the left arm. —— 试跑必须一字不差下发这句
verify_dataset.pyUSABLE 54 集 / 13693 帧,行数 = 视频 = 索引,全对得上
相机3 路;head 240×424,和试跑一致;fps 30
Hub已在 xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905

二、训练命令

和现役模型完全同一套超参(b16 / 20k 步 / freeze_vision_encoder / train_expert_only / lr 1e-4 / chunk 50),只换数据集 —— 这样跑出来能和 0826 那版直接比。

tmux new -s train        # 家里网断不影响它;Pod 不停也不停计费

lerobot-train \
  --policy.path=lerobot/smolvla_base \
  --policy.input_features=null --policy.output_features=null \
  --dataset.repo_id=xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905 \
  --batch_size=16 \
  --num_workers=8 \
  --steps=20000 \
  --dataset.eval_split=0.0 \
  --policy.scheduler_decay_steps=20000 \
  --dataset.video_backend=torchcodec \
  --policy.device=cuda --policy.push_to_hub=false \
  --save_freq=2000 --log_freq=100 \
  --job_name=left_sep3_b16_u20k \
  --output_dir=/workspace/outputs/train/left_sep3_b16_u20k
先跑 40 步基准:把 --steps=20000 临时改成 --steps=40 --save_checkpoint=false 跑一遍。健康的样子是 step/s 约 4–5、mem_gb 约 4.6、loss 在降。确认了再开正式的。
checkpoint 存 /workspace(持久卷),别存容器盘。
--eval_split=0.0 是故意的:0.2 是按集号顺序切最后 20%,而集号和杯位相关,会把整片区域切进验证集 —— 08-23 踩过。

三、拿回 checkpoint 之后,跑测前必须对上的四件事

1
语言指令:必须是 Pick up the cup with the left arm.
脚本会自动从训练数据集读这句,日志里会打 == task string (read from the training dataset ...)。看到那行就是对的。
2
头部姿态:tilt ≈ 50°(标准预置位 cup-grasp-v0 / trial)
和 sep3-clean 的 50.1° 对得上,不用改。
3
归位:脚本会自动把左臂放到示范起点
按训练数据集自动算:左臂 肩抬 −29.5° / 肘 91.5° / 腕 −64.5°。日志里 [home] left span … 然后 [home] 到位,最大偏差 x.x°。左臂归位真机没跑过没核过,第一次盯一下。
4
光照:白天跑,或至少把房间白灯打开
G/R 是画面「绿色比红色多多少」,1.0 是中性。今晚实时 1.58,比任何一批训练数据都绿。sep3-clean 是夜里录的(1.21),三批里最接近但仍差一截;0826 白天 0.92。这条不影响训练,只影响你哪天去跑测。

四、这一版能回答什么、不能回答什么

能「中位的杯子,位置覆盖补上之后抓不抓得到」—— 这是 0826 从来回答不了的,因为它一集都没见过中位
能和 0826 那版直接比:同超参、同流程、只换数据,差异就是数据的差异
不能光照。sep3-clean 是夜里录的偏绿数据,白天跑测又是另一个分布
不能控制频率。回路 2.4 Hz vs 训练 30 Hz,这是我们和「复现成功」的人最大的工程差别,换数据集解决不了
不能纠错行为。全部数据都是 success-only,没有一集录过「抓偏了再抓一次」

后两条要怎么办,见 「SmolVLA 复现不出来 vs 微调效果好」那一页的五个实验。

五、想要更大的一批(第二个变体,不是今晚)

左臂另有 sep2 的 51 集(1819 三十四集 + 1928 十七集),但头 tilt 是 37.5°,和 sep3 的 50.1° 混在一起就是两个视角。按复现清单「一次只改一个变量」,先训 sep3-clean 单独这一版(54 集,正好是复现帖推荐的 ~50 集量级)。要加的话,流程是:裁掉开头跳变(trim_episode_starts.py,约 50 分钟)→ 合并 → 推 Hub → 当第二个变体去比。

数据集:sep3-clean(左臂 54 集) · sep2-trim(右臂 51 集,今天裁的)。相关页:09-06 改动验收单 · SmolVLA 复现。脚本:03-software/scripts/{arm_home.py, trim_episode_starts.py, demo_coverage.py}。