Results
Frozen protocol: 10 tasks × standard initial states 0–9, one rollout each, native budget of 400 decisions.
Success is the LIBERO task predicate.
Table with columns: Adapter, Successes| Adapter | Successes |
|---|
| Released Show-Harness 2B sim adapter, no LIBERO training | 0/100 |
| 4B v5 | 19/100 |
| 4B v6 | 63/100 |
| 2B v6 | 61/100 |
This adapter: 61/100. Evaluation tasks are the training tasks (standard LIBERO practice), so this measures
in-distribution control, not transfer to unseen tasks.
Training
Table | |
|---|
| Base model | Qwen/Qwen3.5-2B |
| LoRA | r=64, α=128, dropout 0.05, all language-model linear layers; vision tower and projector frozen; BF16 |
| Data | 433 converted LIBERO-Object demonstrations; 389 train / 44 validation episodes (split by episode) |
| Optimisation | lr 1e-4, cosine, 10% warm-up, effective batch 32, seed 42 (LLaMA-Factory, qwen3_5_nothink template, cutoff 2048) |
| Checkpoint | adapter-3500 (update 3,500 of 6,928) |
| v6 changes | robot-state line in the prompt (gripper open/closed, net turn since start), 3-move history, every action change and GRASP/RELEASE/DONE row repeated 4× in training |
| Selection | best snapshot on a held-out, teacher-forced changepoint check; the end-of-training adapter (6,928) had overfitted |
training-config.yaml is the exported LLaMA-Factory config; the run overrode the update count and micro-batch on the
command line (see the repository's commands/ folder). dataset-manifest.json records the dataset hashes.
Usage
The adapter is meant to be served with vLLM next to the base model and driven by the evaluation loop in the
repository, which builds the prompt (prompt-v6-state-1cm-5deg.txt), sends both camera images and executes the returned tokens in
LIBERO:
vllm serve Qwen/Qwen3.5-2B --enable-lora --max-lora-rank 64 \ --lora-modules libero=kugelblytz/qwen3.5-2b-libero-object-v6-lora
Loading it in Python:
from peft import PeftModelfrom transformers import AutoModelForImageTextToText base = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3.5-2B", torch_dtype="bfloat16")model = PeftModel.from_pretrained(base, "kugelblytz/qwen3.5-2b-libero-object-v6-lora")
The model only works with the exact prompt format and action executor of the pipeline; the prompt file is included.
Limitations
- Simulation only (LIBERO), evaluated on its training tasks; one rollout per start.
- Failures are mostly missed grasps; 2B also holds some objects without placing them.
- adapter-3500 is a mid-schedule snapshot (learning rate about 58% of peak), not a settled model.
Integrity
adapter_model.safetensors SHA-256: 812f971095fd75183514be5ab3a602eb6f26f5a888bf83e704abfc31d8f00489. This is the hash recorded in the frozen evaluation that
produced the result above.
Context
Trained within the EdgeWise research project (edge-first robot intelligence). Built on Show-Harness
(Chen et al., 2026) and LIBERO.