← reports index
复用右臂配方 · 2026-09-08

左臂重训手册

右臂那套 state dropout 流程(见 右臂完整手册)从代码到验收照抄,这页只列跟右臂不一样的地方,以及右臂那一轮真实踩过的坑。机制部分不重复。

先纠正三处 —— 早先的草稿里写错了,照着走会踩空
①「唯一变量是数据集」不成立。实际有三个变量:数据集、图像增强(左臂上一轮是关着的,右臂是开着的)、以及 state 处理。
②「斜率 ≥ 0.3 硬门禁」撤销。那个门槛建立在一个只取动作块第一步、且只在起手位测的指标上 —— 手臂停在 home 位时第一步本来就只挪一点点,任何模型测出来都接近 0。
③ 由此,「会看图 +0.21 / 不看图 +0.004、差 50 倍」这组基准也不可用。用修正后的测法(整条 50 步计划 + 分阶段)复测,那个"+0.006 不看图"的左臂模型实际是 +0.95~0.99。

一、填好的两项

项值
数据集 REPO_IDxlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905(54 集 / 13,693 帧)
任务文本Pick up the cup with the left arm.
实读自 meta/tasks.parquet。脚本自己会读,不用手传 —— 手传反而有传错的风险。

二、跟右臂的差异(三个变量,不是一个)

项右臂(已跑完)左臂(这次)
数据集right-pick-cup-20260826-0042left-pick-cup-sep3-clean-20260905
TAGright-sdleft-sd
模型仓库(自动拼)…-right-sd-p0.2-b16-u20000…-left-sd-p0.2-b16-u20000
图像增强 AUG开(train_config 实读 enable=True)上一轮是关的 —— 这次必须显式 AUG=1
state dropout相同。左臂的 state 捷径实测同样强:照抄当前关节角对下一帧 action 的误差中位 0.53°(右臂 0.66°),逐维相关 0.946–0.997。
配方B_eff 16 / lr 1e-4 / 20000 更新 / warmup 1000 / p_end 0.2 —— 不要改
REPO_ID=xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905 \
TAG=left-sd AUG=1 ./train_smolvla_state_dropout.sh
为什么 AUG=1 这次是必须的。这份数据的 54 集实测是两批不同光照(见 抓取位点图那一页),而上一轮训练一点颜色扰动都没做。
更重要的是角度问题:光照本来就是要泛化的东西,不是要消除的杂质 —— 机器人会被搬到会场,现场光照和这两批都不同。 按"清洗成单一光照"的思路做,反而会把仅有的多样性删掉。

三、左臂特有:9 个恒定维

right_arm 六维 + x.vel / y.vel / theta.vel   ——  训练集里 std 恰好为 0

录左臂时右臂不动、底盘不动,于是这九维在 13,693 帧里是常数。而 lerobot 的归一化是 (x−mean)/(std+1e-8),对 std==0 没有任何保护 —— 真机上右臂是连着的、报真实角度,那六维会被放大约 1e8 倍。

推理端已修(run_policy_trials.py 的 install_state_guard(),从 checkpoint 自己的统计量推,左右通用)。上机前确认日志里有这一行:

== state 恒定维保护【已启用】: 9 维在训练集里恒定(std==0),喂给策略前钉回训练均值

看不到就是没生效,那一批数据不作数。

四、六步操作

1
确认数据集在 Hub 上
python3 -c "
from huggingface_hub import HfApi
print(HfApi().dataset_info('xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905').lastModified)"
打印出时间就跳过;没有就 hf upload-large-folder --repo-type=dataset … 先传。录制完不会自动补传,右臂那次踩过。
2
租卡、装依赖、开 tmux
pip install -U "lerobot[dataset,training,smolvla]" huggingface_hub
hf auth login && hf auth whoami
tmux new -s train-left        # 独立会话名,别和右臂那个混用
装完立刻验版本:python -c "import torch,torchcodec;print(torch.__version__,torchcodec.__version__)"
要看到 2.8.0+cu128 / 0.7.0。默认会装出 torchcodec 0.11.1,和 torch 2.8 不兼容,导入报 undefined symbol: torch_dtype_float4_e2m1fn_x2,而 lerobot 会静默退回 pyav、慢好几倍还不报错。修法见第五节。
3
把代码拉到 Pod 上
cd /workspace
git clone -b claude/right-arm-batch-16-training-hgq1l4 \
  https://<用户名>:<PAT>@github.com/ginagina19992023/Robotic_challenge.git
cd Robotic_challenge/05-training
-b 这个分支参数不能省,漏了会拉 main、看不到那三个文件。PAT 要用 classic token(ghp_ 开头、勾 repo),不是网页密码;只显示一次,忘了只能 Regenerate。粘贴时别把示例里的尖括号一起抄进去。
4
自检 + 40 步烟测
python state_dropout.py       # 不需要 GPU,退火分段点全 ok 才算过

SD_DEBUG_EVERY=5 BENCH=1 SD_DEBUG=1 AUG=1 \
REPO_ID=xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905 TAG=left-sd \
  ./train_smolvla_state_dropout.sh
要看到好几行 [state-dropout] step N/40 p=… 置零 x/16,p 从 1.000 一路降到 0.200 才算通过。
SD_DEBUG_EVERY=5 不能漏:默认每 200 次前向才打一行,40 步烟测天然到不了,漏传只会看到开头横幅,容易误判成"补丁没生效"。
5
正式训练
AUG=1 REPO_ID=xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905 \
TAG=left-sd ./train_smolvla_state_dropout.sh
4090 上一小时出头,每 2000 步存一档。Ctrl-B 再 D 脱离,断线不杀训练。想提前测中间档(如 012000)可以边训边拉,不影响已存的档。
6
拉回本机测斜率 —— 用修正后的测法
python 03-software/scripts/chunk_sweep.py \
  <新checkpoint>/checkpoints/020000/pretrained_model \
  ~/.cache/huggingface/lerobot/xlerobot-team/xlerobot-left-pick-cup-sep3-clean-20260905 \
  "Pick up the cup with the left arm." left 12 50 0.70
用 chunk_sweep.py,不要用 vision_sweep*.py —— 后者只取动作块第一步、只在起手位测,在那里任何模型都接近 0,没有分辨力。
最后那个 0.70 是 phase:从够取过程的 70% 处起手。对照基准(同一测法、同一 phase):现役 sep3-left/020000 是 +0.949,右臂最好的是 +1.02。

五、已知坑(右臂那轮真实撞过的)

级别坑修法
阻断torchcodec 装成 0.11.1,和 torch 2.8.0+cu128 不兼容,import 报 undefined symbol;不修则静默退回 pyav,训练慢几倍但不报错pip uninstall -y torchcodec && pip install "torchcodec==0.7.0"
阻断脚本里 --accelerator.gradient_accumulation.steps 现装的 lerobot CLI 不认,报 unrecognized arguments分支上已删。本机 05-training/ 里这一行还在(第 116 行)—— 用本机版本要先删。配方里 ACCUM 本来就是 1,删掉不改变任何数值。
易错命令敲错机器:git clone 在 Pod 上跑,scp 在 Jetson 上跑并指向 Pod—
易错hf 在 Jetson 上 command not foundpip install -U huggingface_hub
易错漏传 SD_DEBUG_EVERY=5,40 步烟测看不到 p 在动见第四步。本机版 state_dropout.py 还不支持这个变量,只有分支上支持。
本机和分支不是同一份。本机 05-training/ 里:train_smolvla_state_dropout.sh 仍带那行会报错的 --accelerator 参数,state_dropout.py 不支持 SD_DEBUG_EVERY。 按本页第三步从分支 clone 就没问题;但两边迟早要合成一份,否则以后必然有人用本机版本踩空。

六、跑之前值得想一想的一件事

今天用修正后的测法复测发现:现役左臂模型接近段的斜率已经是 +0.949(r=0.995),两批光照下都一样。它不是"学不会看图"。右臂最好的那个是 +1.02,也是同一档。

换句话说,左臂和右臂现在是同一个病:起手位不瞄(斜率 ≈ 0),而真机每次都从 home 起步,走不到会瞄的那一段就先闭了爪。所以这一轮重训要回答的问题应该是 「state dropout 能不能把起手段的斜率带起来」,而不是「左臂能不能学会看图」——后者它已经会了。

建议在第 6 步同时测 phase 0.00 / 0.35 / 0.70 三个点,看的是低 phase 那一端有没有改善。只看 0.70 会看到一个本来就很好的数字,误以为有进步。
右臂完整手册与机制:train-state-dropout-2026-09-08 · 补丁实现:smolvla-state-dropout-patch · 数据体检:grasp-sight-left-2026-09-07
代码分支 claude/right-arm-batch-16-training-hgq1l4 · 本页数字实测于 2026-09-08 本机 Jetson