wsagi/X-VLA-PickOrange
X-VLA-PickOrange
针对 LeIsaac SO-101 PickOrange 任务从 X-VLA-base 微调的 X-VLA (Florence2 + Soft-Prompted Transformer + Rectified-Flow action head, 0.9B params) 策略。 An [X-VLA](https://arxiv.org/abs/2510.10274) (Florence2 + Soft-Prompted Transformer + Rectified-Flow action head, 0.9 B params) policy fine-tuned from [X-VLA-base](https://huggingface.co/lerobot/xvla-base) on the [LeIsaac SO-101 PickOrange](https://github.com/LightwheelAI/leisaac) task.
🔗 项目仓库 / Project repos:
- vitorcen/isaaclab-experience — Isaac Lab + LeIsaac 多策略横评(parent project)
- vitorcen/LeIsaac-Training — LeIsaac fork(训练脚本 + 设计文档 / training scripts + design docs)
TL;DR
- 任务 / Task:
Pick up the orange and put it in the plate— SO-101 单臂依次夹起 3 颗橙子并放盘子。 Single-arm SO-101 picks 3 oranges sequentially and places each in a plate. - 数据集 / Dataset:`LightwheelAI/leisaac-pick-orange` — 60 episode 遥操示范(50 train / 10 val split)。
- 架构 / Architecture:X-VLA — Florence2 vision-language encoder + Soft-Prompted Transformer + Rectified-Flow action head(10 denoising steps)。chunksize=32,nobs_steps=2。
- 训练 / Training:batch=8 / lr=1e-4 / 10k step / weak image-aug (brightness ±5% only) / GRIPPER_SCALE=5 / ~18 min on RTX 4090。
- 评测 / Eval(benchmark-aligned 3 round × 120s sim × 180s wall_cap,与 leaderboard 其他 baseline 同条件):4/9 oranges (44%),ep2 = [T, T, T] 3/3 ⭐。
- ⚠️ 关键 inference 配置 / Critical inference setting:
n_action_steps=32(chunksize 整 reuse)。 默认 `naction_steps=8` 在此 ckpt 上 6-round = 0/18 灾难性失败(每步重 plan 互相冲突)。详见下方 Inference caveat。
模型亮点
Highlights
- Benchmark setting (3 round × 120s sim × 180s wall_cap) 下 ep2 = 3/3 perfect 全部完成。其他 baseline (ACT, DP, X-VLA-15k) 在同条件下均无单 ep 3/3。 Under standardized benchmark conditions (matching leaderboard protocol), ep2 placed all 3 oranges — a feat not achieved by ACT, DP, or X-VLA-15k under the same evaluation.
- 暴露了 `n_action_steps` 的关键作用:从 default 8 改 32 是 session 中唯一可靠的 3.5× baseline 提升。 Exposes `nactionsteps` as the single most reliable improvement — switching from default 8 to chunksize=32 (full chunk reuse) gave ~3.5× over baseline._
- Weak image-aug 是唯一 aggregate 正向 retrain:lerobot 默认 ColorJitter+Sharp+Affine 在 50-demo 数据集是 over-regularize(13% per-ep);只保留 brightness ±5%(maxnumtransforms=1)反而 +5.6% 真胜 baseline,10k 达到 44% per-ep。 Out of 6 retrain experiments (velocity-reweight, L1 loss, default image-aug, weak image-aug, body-desc, L1+aug compound), **only weak image-aug was net positive**. Default aug strength was harmful (-11.1% vs baseline); minimal brightness-only aug at 10k step gave 44% per-ep on benchmark.
训练配方
Training recipe
# 一段式 10k step from lerobot/xvla-base
WEAK_IMAGE_AUG=1 \
BATCH_SIZE=8 \
MAX_STEPS=10000 \
SAVE_FREQ=500 \
OUTPUT_DIR=$LEISAAC/outputs/xvla-leisaac-pick-orange.weakaug \
bash LeIsaac/scripts/finetune/xvla/train.shWEAK_IMAGE_AUG=1 在 `train.sh` 内展开为:
--dataset.image_transforms.enable=true
--dataset.image_transforms.max_num_transforms=1
--dataset.image_transforms.tfs={"brightness":{"weight":1.0,"type":"ColorJitter","kwargs":{"brightness":[0.95,1.05]}}}即:每 batch 至多采样 1 个 transform,且只允许 brightness ±5%(关闭 contrast / saturation / hue / SharpnessJitter / RandomAffine)。
详细对比见 完整 retrain 聚合表。
推理 / Inference
端到端 server(Isaac Sim ZMQ 客户端兼容)
# 启动 X-VLA 推理服务(ZMQ REQ/REP + msgpack)
N_ACTION_STEPS=32 \
PROMPT="Pick up the orange and put it in the plate" \
CKPT=<this_repo_dir> \
PORT=5558 \
bash server/serve_xvla.sh --detach
# 在 Isaac Sim 客户端跑 PickOrange eval
POLICY_PORT=5558 \
POLICY_TIMEOUT_MS=3000 \
ACTION_HORIZON=1 \
EVAL_ROUNDS=3 \
EPISODE_LENGTH=120 \
PROMPT="Pick up the orange and put it in the plate" \
MAX_ROUND_WALL_S=180 \
bash server/eval_pi05.shServer 实现。eval 脚本与 π0.5/SmolVLA/ACT/GR00T 共用。
🔴 推理关键配置 / Critical inference caveat
X-VLA 的 RF action head 一次性生成 32-step chunk,必须让 chunk 在 env 里全部展开才能体现其规划价值。每步 re-plan 反而让 chunk 序列错位。
评测结果
Evaluation
Benchmark-aligned (3 round × 120s sim × 180s wall_cap) — leaderboard 同条件
6-round 扩展 eval (60s sim × 90s wall_cap)
完整 retrain 实验聚合表
详见父项目 HTML 设计文档 `vla_improvement_methods_checklist.html`(含 90+ 个 hyperparam sweep CSV)。
已证伪 / 不要再试的方法
Negative findings — DO NOT repeat
90+ 实验中已严格证伪(≥36 ep cumulative):
- ❌ TAE (Temporal Action Ensembling, [ALOHA 2304.13705](https://arxiv.org/abs/2304.13705)):K∈{2,4,8} × m∈{0.1,0.3} 全部 ≤1/9。X-VLA 的 RF + 10-step denoising 本身就有平滑性。
- ❌ EMA action smoothing α∈[0.2, 0.7]:3-round 上 α=0.3=5/9 是单 ep outlier;12-round retest = 2/18,实际有害。
- ❌ "Grasp" verb in prompt:0/18 完全死掉。可能 OXE 数据集里 "grasp" 关联到 hand-pose 而非 robot reach trajectory。
- ❌ "all <plural>" prompts:3/18,触发多目标歧义。
- ❌ 短 prompt 缺 "Pick up" preamble:1/18,无法 ground。
- ❌ "on/onto the plate" 介词:≤2/18,远不如 "in the plate"(容器语义)。
- ❌ Body-desc retrain (Path 2):Florence2 freeze 下长 prompt 只是 token 微扰,不改 action conditioning。
- ❌ Offline action-MSE eval:不预测 closed-loop(多次证伪)。只能 Isaac Sim 实测。
- ❌ 3-round closed-loop eval:方差 ±15-30%。所有决策必须 ≥6-round (≥18 ep),对比必须 ≥12-round (≥36 ep)。
限制 / Limitations
- 样本数小:44% per-ep 是 benchmark 3-round (9 ep) 估计,置信区间宽 ±20%。6-round 扩展 = 33% (18 ep, CI ±15%)。
- 数据集只有 50 demo:retrain 改 loss / aug 普遍过激;扩到 80-100 demo 应能突破当前 ~44% per-ep 上限。
- place 子任务多模态:模型偶尔抓起后悬空抖动。可能需要 DAgger 或 synthetic relabel 修 covariate shift。
- chunk_size=32 与 wall_clock:1 chunk = 32 step × 33ms ≈ 1s 规划周期。比 ACT (chunk=100, 3.3s 周期) 灵活但比 DP DDIM-32 慢(200ms 周期)。
引用 / Citations
- X-VLA: Zhao et al., _X-VLA: Soft-Prompted Transformer as Scalable Cross-Embodiment Vision-Language-Action Model_, 2025.
- OFT recipe (L1 loss baseline): _Fine-Tuning VLA: Optimizing Speed and Success_, 2025.
- LeIsaac SO-101 PickOrange: LightwheelAI/leisaac.
- lerobot: HuggingFace lerobot.
License
Apache-2.0,与 lerobot / X-VLA-base 一致。
