File size: 10,241 Bytes
c1ebdfc 41e34ee c1ebdfc addcae1 41e34ee c1ebdfc 41e34ee c1ebdfc 41e34ee c1ebdfc 41e34ee c1ebdfc 41e34ee c1ebdfc bfb0ad7 41e34ee c1ebdfc 41e34ee c1ebdfc 434b56b c1ebdfc 434b56b c1ebdfc 41e34ee c1ebdfc addcae1 c1ebdfc 434b56b 41e34ee c1ebdfc 434b56b c1ebdfc 41e34ee c1ebdfc 434b56b c1ebdfc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | ---
license: cc-by-nc-4.0
library_name: pytorch
pipeline_tag: robotics
tags:
- robotics
- vision-language-action
- vla
- imitation-learning
- onnx
- amp-toy-robotics
---
# AMP Tadpole
**A small vision-language-action model that drives a robot arm from three
camera images and a plain-English instruction.** It has 6.5M parameters
and runs on a laptop CPU (and, through ONNX, in a web browser).

AMP Tadpole is trained from scratch on the
[AMP Toy Robotics Benchmark](https://github.com/Adaptive-Machine-Patterns/amp-toy-robotics), and is
the first model of [Adaptive Machine Patterns](https://adaptive-machine-patterns.com).
**Try it in your browser:** the
[AMP Embodied AI Workbench Demo](https://huggingface.co/spaces/Adaptive-Machine-Patterns/amp-embodied-ai-workbench-demo) runs AMP
Tadpole live (through ONNX), and shows it inside, layer by layer.
> **v0.2.0 is a preview.** Later versions will be published under new
> tags (see [Versions](#versions)).
## What it does
Every 8 steps the model is given:
- the **top, side and isometric camera images** (512 × 512 RGB each);
- the **arm's state**: 6 joint angles and the gripper opening;
- **one instruction clause**, e.g. *"Pick up the lime star"*.
It returns **the next 8 steps** of joint angles and gripper opening. It is
never told where the objects are: it has to find them in the pictures and
work out which one the words mean. The benchmark's closed loop executes
the steps and asks again, until the model asks for no further motion.
Instructions: `pick up the X`, `move to the X`,
`move to the midpoint between X and Y`, `open the gripper`,
`close the gripper`, `return home`, chained with "then".
## Results
On the benchmark's standard 300 held-out scenes (never seen in training),
with the model driving the arm itself:
| clauses | pick | move | midpoint | open | close | home | all | path vs teacher |
|---|---|---|---|---|---|---|---|---|
| 898 | 93% | 94% | 75% | 100% | 100% | 100% | **93.7%** | 1.03 |
The reference teacher, a scripted controller that knows where everything
is, scores 99.4% on the same scenes.
Grounding tests (100 further held-out scenes; see the benchmark's README):
| named object | other objects | image swap | instruction swap | blank instruction |
|---|---|---|---|---|
| 0.98 | 0.31 | 1.00 | 1.00 | 0.95 |
Told "move to the X", its motion points the way the teacher's does
(0.98, where 1 is the same direction), and not toward the other objects
in the scene (0.31). When two objects swap places, or the instruction
names another object, its motion changes as much as the teacher's does
(1.00). So it uses both the cameras and the words.
These results are the same under the benchmark's version 0.2.0, which adds a
joint speed limit (no joint faster than 0.12 rad per step): it slowed 0.13% of
AMP Tadpole's steps, and no clause came out differently. AMP Tadpole takes 1.13
times the teacher's steps on the clauses both complete, and its path is 1.96
times a straight line (the teacher's: 1.90).
**How the checkpoint was chosen.** The training run checked itself every
2,500 steps on 100 held-out scenes, and those turned out to be the first
100 of the 300 above (seeds 9,010,000 to 9,010,099); v0.1.0 was picked
that way. For v0.2.0 the two final candidates (steps 300,000 and 330,000)
were compared on 300 separate validation scenes (seeds from 9,100,000),
where they tied at 94.2%; by a rule set beforehand, the tie went to the
longer-trained one. On the 200 benchmark scenes that no choice ever looked
at (608 clauses), v0.2.0 scores **93.1%**.
**These numbers are a line in the sand, not a ceiling.** They are
published as a reference point for small models on the benchmark:
something to beat.
These come from `amp-bench eval --policy amp-tadpole` on a CPU (about 40
minutes). Other hardware can differ in the last digits of the arithmetic,
so a clause or two may come out differently.
## Use it
With the benchmark (`pip install "amp-toy-robotics[packages]"`):
```bash
hf download Adaptive-Machine-Patterns/amp-tadpole --revision v0.2.1 --local-dir amp-tadpole
amp-bench eval --policy amp-tadpole
```
In Python, this repository is a model package:
```python
import importlib.util
from safetensors.torch import load_file
spec = importlib.util.spec_from_file_location("tadpole", "amp-tadpole/model.py")
tadpole = importlib.util.module_from_spec(spec); spec.loader.exec_module(tadpole)
model = tadpole.build()
model.load_state_dict(load_file("amp-tadpole/weights.safetensors"))
model.eval()
chunk = tadpole.predict(model, images, state, "Pick up the lime star") # (8, 7)
```
With [LeRobot](https://github.com/huggingface/lerobot): install
[lerobot-policy-tadpole](https://github.com/Adaptive-Machine-Patterns/lerobot-policy-tadpole)
and load [amp-tadpole-lerobot](https://huggingface.co/Adaptive-Machine-Patterns/amp-tadpole-lerobot),
the same weights in LeRobot's format (`--policy.path=Adaptive-Machine-Patterns/amp-tadpole-lerobot`).
With ONNX Runtime (any language, or the browser): `amp-tadpole.onnx` takes
`images` uint8 (1, 3, 3, 512, 512), `tokens` int64 (1, 48), `token_mask`
bool (1, 48) and `state` float32 (1, 7), and returns `chunk` (1, 8, 7).
`instructions.json` gives the tokens for every canonical clause.
## How it works
| part | what it does |
|---|---|
| CNN, shared by the cameras | 512 × 512 pixels (plus two pixel-coordinate channels) to a 16 × 16 grid of tokens per camera |
| word embeddings | the clause's tokens (up to 48) |
| state token | the 7 numbers, with sines and cosines of the joint angles |
| 8 action tokens | learned; one per output step |
| transformer | 6 layers, width 256, 8 heads, over all 825 tokens |
| head | each action token gives one step's change; the changes are added up |
It predicts the 8 steps directly in one pass (no sampling), which suits a
teacher whose action is a fixed function of the state.
## Training
- **Data:** generated on the fly from scene seeds by the benchmark
(`amp_toy_robotics.data`), labelled by the scripted teacher. No external
data, no dataset files, no human demonstrations. Scenes from seed
9,000,000 up were never used.
- **Inputs only:** the images, the state and the text, under the
benchmark's rules. No object positions, no progress reward, no path
penalty.
- **Recipe:** 330,000 steps, batch 64, AdamW (peak learning rate 3e-4, 1,000-step warm-up, cosine decay; the run was extended and resumed several times), the
state hidden from half the samples (so the model must use the cameras),
and an auxiliary loss in which each image token redraws its patch of
the image. The redraw head is used only in training and is not included.
- **The word table** was cut to the 32 tokens the instructions use. This
changes no output, and takes the model from 19.2M to 6.5M parameters.
## Limitations
- It knows only this simulated world: one arm, three fixed cameras, 8
colours and 5 shapes. It has not seen a real camera.
- It reads only canonical clauses (`instructions.json`); the benchmark
rewrites free text into canonical form first.
- The midpoint instruction is its weakest (75%; see Results). It is not
overfitting: on teacher-labelled samples its errors are the same on
scenes it trained on and scenes it never saw. Midpoint is simply less
well learned. Its target is an empty spot between two objects, so there
is nothing to aim at in the pictures, and it is 10% of the training
clauses; its error was still shrinking when training ended.
- **What these results do not show.** The teacher is deterministic and
unlimited and the cameras are fixed: that is why a 6.5M-parameter model
does well here. It is not evidence against larger VLAs on benchmarks of
human demonstrations, which are varied, finite and often use a wrist
camera.
- All results come from one training run; it has not been repeated with
other random seeds.
## Versions
| version | tag | what changed |
|---|---|---|
| 0.2.1 | `v0.2.1` | `model.py` now finds `instructions.json` when loaded from the Hugging Face cache; weights unchanged. AMP Tadpole for LeRobot: [amp-tadpole-lerobot](https://huggingface.co/Adaptive-Machine-Patterns/amp-tadpole-lerobot) |
| 0.2.0 | `v0.2.0` | step 330,000, the end of the training run: 93.7% (from 88.2%), midpoint 75% (from 63%); checkpoint chosen on separate validation scenes |
| 0.1.0 | `v0.1.0` | first preview: step 250,000. Its card said the 300 scenes were not used to choose the checkpoint; the training run's own checks used 100 of them (see Results) |
Pin a version with `revision="v0.2.1"` (or `--revision v0.2.1`).
## Licence
**Free for non-commercial use** under
[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) (see
LICENSE and NOTICE). **For commercial use**, licences are available from
Adaptive Machine Patterns Ltd:
[adaptive-machine-patterns.com/embodied-ai-workbench](https://adaptive-machine-patterns.com/embodied-ai-workbench)
or amp@adaptive-machine-patterns.com.
**No warranty.** AMP Tadpole is a research preview, provided "as is",
without warranty of any kind, and Adaptive Machine Patterns Ltd accepts
no liability for its use, as set out in sections 5 and 6 of the licence.
It is not suitable for controlling real machinery, or for any use where
a wrong movement could cause harm or damage.
## Credits
- The token ids in `instructions.json` come from the tokenizer of
[SmolVLM2-500M-Video-Instruct](https://huggingface.co/HuggingFaceTB/SmolVLM2-500M-Video-Instruct)
(Apache-2.0; Marafioti et al., *SmolVLM: Redefining small and efficient
multimodal models*, arXiv:2504.05299). The model's weights are AMP's own,
trained from scratch.
- Written with the help of AI coding assistants (Anthropic Claude, Qwen, OpenAI ChatGPT).
## Cite
```bibtex
@misc{amp_tadpole_2026,
author = {Whyte, Andy and {Adaptive Machine Patterns Ltd}},
title = {{AMP Tadpole}: a small vision-language-action model},
year = {2026},
version = {0.2.1},
publisher = {Hugging Face},
url = {https://huggingface.co/Adaptive-Machine-Patterns/amp-tadpole}
}
```
© 2026 Adaptive Machine Patterns Ltd, registered in England & Wales, no. 15618869.
|