sraivante commited on
Commit
74f9a90
·
verified ·
1 Parent(s): cf325b3

Add verified Raspberry Pi 5 edge performance measurements

Browse files

Record actual 16 GB Pi 5 latency, RAM and correctness with frozen evaluation inputs, raw per-call measurements, runtime hashes and reproducible settings. Preserve weights and existing training data.

.gitattributes CHANGED
@@ -1,3 +1,4 @@
1
  *.safetensors filter=lfs diff=lfs merge=lfs -text
2
  *.gz filter=lfs diff=lfs merge=lfs -text
3
  *.zip filter=lfs diff=lfs merge=lfs -text
 
 
1
  *.safetensors filter=lfs diff=lfs merge=lfs -text
2
  *.gz filter=lfs diff=lfs merge=lfs -text
3
  *.zip filter=lfs diff=lfs merge=lfs -text
4
+ edge_benchmarks/rpi5-2026-09-26/temperature_latency.png filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -1,255 +1,270 @@
1
- ---
2
- license: apache-2.0
3
- library_name: transformers
4
- pipeline_tag: text-generation
5
- language:
6
- - en
7
- - hi
8
- tags:
9
- - text-to-json
10
- - home-automation
11
- - tiny-model
12
- - from-scratch
13
- - experimental
14
- - edge-ai
15
- datasets:
16
- - sraivante/home-commands-json-v1
17
- ---
18
-
19
- # Superfast Tiny Home Robotics JSON 1M v1
20
-
21
- A **1,094,240-parameter model trained from scratch** to turn short English and
22
- Romanized Hindi/Hinglish home commands into `activity`, `subject`, `action` JSON.
23
- It has **3 decoder layers** and **4.38 MB of FP32 weights**. It is an
24
- text-to-command parser for use as small local models and edge inference.
25
-
26
- **Observed limitation:** it has no reject/no-op class and can turn
27
- `Do not turn on the fan` into an `ON` command. The examples below only return data; they execute no
28
- device actions. Native-script Hindi is not supported by the reported results.
29
-
30
- | Release | Value |
31
- | --- | --- |
32
- | Author / publisher | sraivante |
33
- | Release date | 2026-09-25 |
34
- | Version | `v1.0.2` |
35
- | Related dataset | [home-commands-json-v1](https://huggingface.co/datasets/sraivante/home-commands-json-v1/tree/v1.0.2) |
36
- | Architecture | Llama-style causal decoder, randomly initialized; no pretrained base weights |
37
- | Output space | 30 commands: 10 device types × ON / OFF / STATUS |
38
-
39
- ## Edge-device use and measured speed
40
-
41
- The small weights make this an edge-inference research candidate. **The timings
42
- below were measured on an Intel CPU, not on a Raspberry Pi.** ARM latency, power,
43
- thermal throttling and end-to-end robot performance remain unmeasured.
44
-
45
- Host: **Intel Core i7-1360P**, Windows 11, Python 3.13.14, CPU PyTorch 2.12.0,
46
- Transformers 4.56.2. Batch size 1, FP32, 20 warmups and 200 timed requests per
47
- run. Timing includes tokenization and constrained JSON generation, and excludes
48
- HTTP, speech recognition, sensors, ROS and actuation.
49
-
50
- | CPU threads | Median latency | p95 latency | p99 latency | Serial throughput |
51
- | --- | ---: | ---: | ---: | ---: |
52
- | 1 | **17.35 ms/command** | **22.31 ms** | 28.46 ms | 55.30 commands/s |
53
- | 4 | 19.80 ms/command | 24.70 ms | 26.90 ms | 49.72 commands/s |
54
-
55
- Weights occupy **4,380,048 bytes (4.38 MB / 4.18 MiB)**. The complete desktop
56
- Python/PyTorch process used approximately **440 MiB resident RAM**, with roughly
57
- 442 MiB peak working set; this includes substantial runtime overhead. Weight
58
- size is not total deployment RAM. Libraries took 6.79 seconds to import;
59
- weight loading after import took 0.013 seconds with filesystem caches potentially
60
- warm. No core pinning or power-mode control was used.
61
-
62
- Reproduce on 64-bit Raspberry Pi/ARM Linux from a downloaded repository:
63
-
64
- ```bash
65
- python -m pip install -r requirements.txt psutil
66
- python assessment/benchmark_device.py --model . --threads 1 --repeats 2000 --out pi-1thread.json
67
- python assessment/benchmark_device.py --model . --threads 4 --repeats 2000 --out pi-4threads.json
68
- ```
69
-
70
- Run these sequentially, then compare p95/p99, memory and sustained thermal
71
- behavior on the actual target. This release has no validated quantized or
72
- compiled edge-runtime export. [Full desktop benchmark records](assessment/robotics_edge_v1/desktop_cpu_1thread.json)
73
- and [detailed assessment](assessment/robotics_edge_v1/REPORT.md) are included.
74
-
75
- ## Quick start: JSON command output
76
-
77
- Install PyTorch for your platform and the tested Transformers/tokenizer versions:
78
-
79
- ```bash
80
- pip install "torch>=2.6,<3" "transformers==4.56.2" "tokenizers==0.22.1" "huggingface_hub>=0.35,<2"
81
- ```
82
-
83
- Download the versioned repository and use the included inference helper:
84
-
85
- ```python
86
- import sys
87
- from huggingface_hub import snapshot_download
88
-
89
- folder = snapshot_download("sraivante/superfast-tiny-home-robotics-json-1m-v1", revision="v1.0.2")
90
- sys.path.insert(0, folder)
91
- from tiny_json_llm.infer import JsonCommandModel
92
-
93
- model = JsonCommandModel(folder, device="cpu")
94
- print(model.predict("Please turn on the fan"))
95
- # {'action': 'ON', 'activity': 'air', 'subject': 'fan'}
96
-
97
- print(model.predict("pankha band karo"))
98
- # {'action': 'OFF', 'activity': 'air', 'subject': 'fan'}
99
-
100
- print(model.predict("check the water pump status"))
101
- # {'action': 'STATUS', 'activity': 'water', 'subject': 'motor'}
102
- ```
103
-
104
- The helper uses a token trie of the 30 training-observed JSON commands. This
105
- ensures membership in the command set, **not semantic correctness or permission
106
- to actuate**. Empty/overlong input raises `ValueError`; unsupported short input
107
- can still return an unrelated command.
108
-
109
- Command-line use after downloading the repository:
110
-
111
- ```bash
112
- python -m tiny_json_llm.infer --model . --device cpu --input "turn on the light"
113
- ```
114
-
115
- ## Standard Transformers usage: unconstrained generation
116
-
117
- The release includes a chat template that exactly reproduces the training
118
- framing for **one user message**. It deliberately rejects conversation history
119
- and system prompts, which were not trained as supported tasks.
120
-
121
- ```python
122
- import torch
123
- from transformers import AutoModelForCausalLM, AutoTokenizer
124
-
125
- repo = "sraivante/superfast-tiny-home-robotics-json-1m-v1"
126
- tokenizer = AutoTokenizer.from_pretrained(repo, revision="v1.0.2")
127
- model = AutoModelForCausalLM.from_pretrained(repo, revision="v1.0.2").eval()
128
- inputs = tokenizer.apply_chat_template(
129
- [{"role": "user", "content": "Please turn on the fan"}],
130
- add_generation_prompt=True, return_tensors="pt", return_dict=True,
131
- )
132
- with torch.inference_mode():
133
- result = model.generate(
134
- **inputs, max_new_tokens=32, do_sample=False,
135
- pad_token_id=tokenizer.pad_token_id,
136
- eos_token_id=tokenizer.eos_token_id,
137
- )
138
- print(tokenizer.decode(result[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
139
- ```
140
-
141
- This second example is raw generation; JSON validity is not constrained. The
142
- context is 128 tokens including framing and output. Keep input short and
143
- validate both generated JSON and its intended meaning before downstream use.
144
-
145
- ## Output schema and scope
146
-
147
- ```json
148
- {"action":"ON","activity":"air","subject":"fan"}
149
- ```
150
-
151
- Actions: `ON`, `OFF`, `STATUS`.
152
-
153
- | Subject | Activity |
154
- | --- | --- |
155
- | fan | air |
156
- | light | light |
157
- | motor | water |
158
- | speaker | music |
159
- | geyser | heating |
160
- | cooler | cooling |
161
- | washing_machine | laundry |
162
- | tv | entertainment |
163
- | ac | cooling |
164
- | sprinkler | garden |
165
-
166
- `motor` means the dataset's **water-pump motor**, not an arbitrary robot motor.
167
- The schema has no speed, position, distance, duration, device instance, room,
168
- conditional execution, multi-action or reject field. No chat, reasoning,
169
- native-script Hindi, perception, motion planning or robotic-control capability
170
- is claimed.
171
-
172
- ## Evaluation
173
-
174
- All results below use the same weights identified in `weights_sha256.json`.
175
- The original test data is templated and overlaps the training distribution.
176
- The later stress test was frozen before inference and is a small manually
177
- authored diagnostic, not a representative sample or safety certification.
178
-
179
- | Evaluation | Correct / total | Exact JSON accuracy |
180
- | --- | ---: | ---: |
181
- | Original held-out test, constrained generation | 104,723 / 104,723 | 100% |
182
- | Original stratified raw-generation diagnostic | 1,816 / 1,816 | 100% |
183
- | Later supported-command challenges | 68 / 140 | 48.6% |
184
- | Challenges with no source-phrase overlap | 48 / 120 | 40.0% |
185
- | New paraphrase wording | 14 / 30 | 46.7% |
186
- | Hinglish variations | 8 / 30 | 26.7% |
187
- | Typos / ASR-style text perturbations | 6 / 30 | 20.0% |
188
- | Contrastive negation | 10 / 20 | 50.0% |
189
-
190
- The later supported-command accuracies were identical with constrained and raw
191
- generation; both produced valid JSON for all 140 supported-command challenges.
192
- Native-script Hindi passed 0/10 diagnostic cases. Four empty/overlong input
193
- guards passed. Neither decoding mode produced an explicit reject/no-op response
194
- on 130 requests requiring abstention. Constrained mode emitted a known command
195
- for all 130, including **33 ON/OFF commands**.
196
-
197
- Concrete failures:
198
-
199
- - `Do not turn on the fan.` → fan `ON`.
200
- - `Turn the fan on, not off.` → fan `OFF`.
201
- - `thank you` → water-pump motor `ON`.
202
-
203
- The 284 challenge cases, all 568 predictions across both modes, overlap audit,
204
- metrics and reproducible evaluation scripts are included. The challenge data
205
- is also versioned in the linked dataset's `robotics_edge_v1` configuration.
206
- If these cases guide future training, reserve fresh tests for the next release.
207
-
208
- ## Training and reproducibility
209
-
210
- Source: user-supplied `home-commands-3.4M.jsonl`, 3,458,816 rows. Normalized-input
211
- deduplication removed 2,340,890 rows, leaving 1,117,926 examples. Phrase-family
212
- grouping reduced case/punctuation/politeness leakage; other paraphrase overlap
213
- can remain. The split is stratified by command class across 2,868 phrase families.
214
-
215
- | Split | Examples | Phrase families |
216
- | --- | ---: | ---: |
217
- | Train | 910,114 | 2,292 |
218
- | Validation | 103,089 | 288 |
219
- | Test | 104,723 | 288 |
220
-
221
- Tokenizer: training-only byte-level BPE, vocabulary 1,024. Architecture: hidden
222
- width 160, intermediate width 432, 5 attention heads of dimension 32, 3 layers,
223
- RoPE, RMSNorm, SwiGLU, tied embeddings/output, context 128.
224
-
225
- Training completed on NVIDIA A100-SXM4-80GB: one epoch, 1,778 updates and
226
- 22,655,302 nonpadding prediction tokens. Objective: full-sequence causal
227
- next-token loss. AdamW LR 0.001, betas (0.9, 0.95), weight decay 0.1, 5% warmup,
228
- cosine decay to 10% of peak LR, gradient clipping 1, microbatch 128, effective
229
- batch 512, BF16 computation and FP32 weights/optimizer. Seed: 20260925.
230
- Validation response NLL on a fixed 4,096-example subset selected the best model;
231
- best and final exports are identical at step 1,778.
232
-
233
- The 20.70 training-tokens/parameter ratio is a **Chinchilla-inspired sizing
234
- heuristic**, not evidence of compute optimality. This small, highly templated
235
- corpus is outside the original experiments' scale and diversity.
236
-
237
- The linked dataset includes the exact source, prepared train/validation/test
238
- JSONL, tokenizer/memmap training bundle and the manifest used in training.
239
- See `training/` for source code, run summary and logs, and `release_manifest.json`
240
- for source, model, package and artifact hashes. No extra fine-tuning occurred.
241
-
242
- ## License, provenance and attribution
243
-
244
- Apache License 2.0 for this original release material; see [LICENSE](https://huggingface.co/sraivante/superfast-tiny-home-robotics-json-1m-v1/blob/v1.0.2/LICENSE)
245
- and [NOTICE](https://huggingface.co/sraivante/superfast-tiny-home-robotics-json-1m-v1/blob/v1.0.2/NOTICE). **Copyright (c) 2026 sraivante** applies to original user
246
- contributions and original selection/arrangement. Third-party ownership and
247
- license terms remain unchanged. The source was supplied by the publisher; its
248
- upstream generation process and historical source revision were not provided
249
- or independently verified. The source SHA identifies the exact received file.
250
- No external corpus or pretrained base weights were added in this run.
251
-
252
- Packaging adds a one-user chat template and corrects tokenizer context metadata
253
- to 128; token IDs, vocabulary and learned weights are unchanged. The historical
254
- assessment and training manifest are preserved. Their pre-publication packaging
255
- notes are superseded by this release's cards, license and authorization record.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ library_name: transformers
4
+ pipeline_tag: text-generation
5
+ language:
6
+ - en
7
+ - hi
8
+ tags:
9
+ - text-to-json
10
+ - home-automation
11
+ - tiny-model
12
+ - from-scratch
13
+ - experimental
14
+ - edge-ai
15
+ datasets:
16
+ - sraivante/home-commands-json-v1
17
+ ---
18
+
19
+ # Superfast Tiny Home Robotics JSON 1M v1
20
+
21
+ A **1,094,240-parameter model trained from scratch** to turn short English and
22
+ Romanized Hindi/Hinglish home commands into `activity`, `subject`, `action` JSON.
23
+ It has **3 decoder layers** and **4.38 MB of FP32 weights**. It is an
24
+ text-to-command parser for use as small local models and edge inference.
25
+
26
+ **Observed limitation:** it has no reject/no-op class and can turn
27
+ `Do not turn on the fan` into an `ON` command. The examples below only return data; they execute no
28
+ device actions. Native-script Hindi is not supported by the reported results.
29
+
30
+ | Release | Value |
31
+ | --- | --- |
32
+ | Author / publisher | sraivante |
33
+ | Release date | 2026-09-25 |
34
+ | Version | `v1.0.2` |
35
+ | Related dataset | [home-commands-json-v1](https://huggingface.co/datasets/sraivante/home-commands-json-v1/tree/v1.0.2) |
36
+ | Architecture | Llama-style causal decoder, randomly initialized; no pretrained base weights |
37
+ | Output space | 30 commands: 10 device types × ON / OFF / STATUS |
38
+
39
+ <!-- rpi5-measurements -->
40
+ ## Raspberry Pi 5 edge-device performance
41
+
42
+ Measured **2026-09-26** on a **Raspberry Pi 5 Model B, 16 GB RAM**, Debian 13.2/aarch64, Python 3.13.5. Measurement update: `edge-rpi5-20260926`; weights and training data are unchanged.
43
+
44
+ | Threads | Median ms | p95 ms | p99 ms | Serial requests/s | Process RSS MiB | CPU °C min–mean–max | Timed correct |
45
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
46
+ | 1 | 87.95 | 99.85 | 100.80 | 11.20 | 398.83 | 55.1–57.1–59.5 | 500/500 |
47
+ | 4 | 96.34 | 111.38 | 128.25 | 10.05 | 399.16 | 60.0–65.6–68.3 | 500/500 |
48
+
49
+ Batch 1; 20 warmups and 500 timed calls per row, cycling over 10 frozen model-specific inputs. **Each timed reading has a matching CPU-temperature sample**, captured immediately afterward outside the latency timer; the table shows min–mean–max temperature. RSS includes Python/runtime overhead. Timings include local text-to-output inference and exclude loading, SSH/HTTP, speech recognition and actuation. Throughput is serial reciprocal mean. Runs used one and four CPU/BLAS threads sequentially. These synthetic workloads do not establish cross-model superiority or robot-control reliability.
50
+
51
+ On-device quality check: **72/284** on existing frozen stress/regression suite, constrained decoding only. See the report for per-category results and previously observed limitations.
52
+
53
+ [Full Pi methodology, temperature plot and reproduction](edge_benchmarks/rpi5-2026-09-26/REPORT.md) · [Every latency/temperature reading](edge_benchmarks/rpi5-2026-09-26/readings.csv) · [Raw measurements](edge_benchmarks/rpi5-2026-09-26/results) · [Versioned evaluation data](https://huggingface.co/datasets/sraivante/home-commands-json-v1/tree/edge-rpi5-20260926/edge_benchmarks/rpi5-2026-09-26).
54
+ <!-- /rpi5-measurements -->
55
+
56
+ ## Edge-device use and measured speed
57
+
58
+ The small weights make this an edge-inference research candidate. The new Raspberry Pi measurements are recorded above. The following table preserves the earlier Intel desktop results. Power, sustained thermal behavior and end-to-end robot performance remain unmeasured.
59
+
60
+ Host: **Intel Core i7-1360P**, Windows 11, Python 3.13.14, CPU PyTorch 2.12.0,
61
+ Transformers 4.56.2. Batch size 1, FP32, 20 warmups and 200 timed requests per
62
+ run. Timing includes tokenization and constrained JSON generation, and excludes
63
+ HTTP, speech recognition, sensors, ROS and actuation.
64
+
65
+ | CPU threads | Median latency | p95 latency | p99 latency | Serial throughput |
66
+ | --- | ---: | ---: | ---: | ---: |
67
+ | 1 | **17.35 ms/command** | **22.31 ms** | 28.46 ms | 55.30 commands/s |
68
+ | 4 | 19.80 ms/command | 24.70 ms | 26.90 ms | 49.72 commands/s |
69
+
70
+ Weights occupy **4,380,048 bytes (4.38 MB / 4.18 MiB)**. The complete desktop
71
+ Python/PyTorch process used approximately **440 MiB resident RAM**, with roughly
72
+ 442 MiB peak working set; this includes substantial runtime overhead. Weight
73
+ size is not total deployment RAM. Libraries took 6.79 seconds to import;
74
+ weight loading after import took 0.013 seconds with filesystem caches potentially
75
+ warm. No core pinning or power-mode control was used.
76
+
77
+ Reproduce on 64-bit Raspberry Pi/ARM Linux from a downloaded repository:
78
+
79
+ ```bash
80
+ python -m pip install -r requirements.txt psutil
81
+ python assessment/benchmark_device.py --model . --threads 1 --repeats 2000 --out pi-1thread.json
82
+ python assessment/benchmark_device.py --model . --threads 4 --repeats 2000 --out pi-4threads.json
83
+ ```
84
+
85
+ Run these sequentially, then compare p95/p99, memory and sustained thermal
86
+ behavior on the actual target. This release has no validated quantized or
87
+ compiled edge-runtime export. [Full desktop benchmark records](assessment/robotics_edge_v1/desktop_cpu_1thread.json)
88
+ and [detailed assessment](assessment/robotics_edge_v1/REPORT.md) are included.
89
+
90
+ ## Quick start: JSON command output
91
+
92
+ Install PyTorch for your platform and the tested Transformers/tokenizer versions:
93
+
94
+ ```bash
95
+ pip install "torch>=2.6,<3" "transformers==4.56.2" "tokenizers==0.22.1" "huggingface_hub>=0.35,<2"
96
+ ```
97
+
98
+ Download the versioned repository and use the included inference helper:
99
+
100
+ ```python
101
+ import sys
102
+ from huggingface_hub import snapshot_download
103
+
104
+ folder = snapshot_download("sraivante/superfast-tiny-home-robotics-json-1m-v1", revision="v1.0.2")
105
+ sys.path.insert(0, folder)
106
+ from tiny_json_llm.infer import JsonCommandModel
107
+
108
+ model = JsonCommandModel(folder, device="cpu")
109
+ print(model.predict("Please turn on the fan"))
110
+ # {'action': 'ON', 'activity': 'air', 'subject': 'fan'}
111
+
112
+ print(model.predict("pankha band karo"))
113
+ # {'action': 'OFF', 'activity': 'air', 'subject': 'fan'}
114
+
115
+ print(model.predict("check the water pump status"))
116
+ # {'action': 'STATUS', 'activity': 'water', 'subject': 'motor'}
117
+ ```
118
+
119
+ The helper uses a token trie of the 30 training-observed JSON commands. This
120
+ ensures membership in the command set, **not semantic correctness or permission
121
+ to actuate**. Empty/overlong input raises `ValueError`; unsupported short input
122
+ can still return an unrelated command.
123
+
124
+ Command-line use after downloading the repository:
125
+
126
+ ```bash
127
+ python -m tiny_json_llm.infer --model . --device cpu --input "turn on the light"
128
+ ```
129
+
130
+ ## Standard Transformers usage: unconstrained generation
131
+
132
+ The release includes a chat template that exactly reproduces the training
133
+ framing for **one user message**. It deliberately rejects conversation history
134
+ and system prompts, which were not trained as supported tasks.
135
+
136
+ ```python
137
+ import torch
138
+ from transformers import AutoModelForCausalLM, AutoTokenizer
139
+
140
+ repo = "sraivante/superfast-tiny-home-robotics-json-1m-v1"
141
+ tokenizer = AutoTokenizer.from_pretrained(repo, revision="v1.0.2")
142
+ model = AutoModelForCausalLM.from_pretrained(repo, revision="v1.0.2").eval()
143
+ inputs = tokenizer.apply_chat_template(
144
+ [{"role": "user", "content": "Please turn on the fan"}],
145
+ add_generation_prompt=True, return_tensors="pt", return_dict=True,
146
+ )
147
+ with torch.inference_mode():
148
+ result = model.generate(
149
+ **inputs, max_new_tokens=32, do_sample=False,
150
+ pad_token_id=tokenizer.pad_token_id,
151
+ eos_token_id=tokenizer.eos_token_id,
152
+ )
153
+ print(tokenizer.decode(result[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
154
+ ```
155
+
156
+ This second example is raw generation; JSON validity is not constrained. The
157
+ context is 128 tokens including framing and output. Keep input short and
158
+ validate both generated JSON and its intended meaning before downstream use.
159
+
160
+ ## Output schema and scope
161
+
162
+ ```json
163
+ {"action":"ON","activity":"air","subject":"fan"}
164
+ ```
165
+
166
+ Actions: `ON`, `OFF`, `STATUS`.
167
+
168
+ | Subject | Activity |
169
+ | --- | --- |
170
+ | fan | air |
171
+ | light | light |
172
+ | motor | water |
173
+ | speaker | music |
174
+ | geyser | heating |
175
+ | cooler | cooling |
176
+ | washing_machine | laundry |
177
+ | tv | entertainment |
178
+ | ac | cooling |
179
+ | sprinkler | garden |
180
+
181
+ `motor` means the dataset's **water-pump motor**, not an arbitrary robot motor.
182
+ The schema has no speed, position, distance, duration, device instance, room,
183
+ conditional execution, multi-action or reject field. No chat, reasoning,
184
+ native-script Hindi, perception, motion planning or robotic-control capability
185
+ is claimed.
186
+
187
+ ## Evaluation
188
+
189
+ All results below use the same weights identified in `weights_sha256.json`.
190
+ The original test data is templated and overlaps the training distribution.
191
+ The later stress test was frozen before inference and is a small manually
192
+ authored diagnostic, not a representative sample or safety certification.
193
+
194
+ | Evaluation | Correct / total | Exact JSON accuracy |
195
+ | --- | ---: | ---: |
196
+ | Original held-out test, constrained generation | 104,723 / 104,723 | 100% |
197
+ | Original stratified raw-generation diagnostic | 1,816 / 1,816 | 100% |
198
+ | Later supported-command challenges | 68 / 140 | 48.6% |
199
+ | Challenges with no source-phrase overlap | 48 / 120 | 40.0% |
200
+ | New paraphrase wording | 14 / 30 | 46.7% |
201
+ | Hinglish variations | 8 / 30 | 26.7% |
202
+ | Typos / ASR-style text perturbations | 6 / 30 | 20.0% |
203
+ | Contrastive negation | 10 / 20 | 50.0% |
204
+
205
+ The later supported-command accuracies were identical with constrained and raw
206
+ generation; both produced valid JSON for all 140 supported-command challenges.
207
+ Native-script Hindi passed 0/10 diagnostic cases. Four empty/overlong input
208
+ guards passed. Neither decoding mode produced an explicit reject/no-op response
209
+ on 130 requests requiring abstention. Constrained mode emitted a known command
210
+ for all 130, including **33 ON/OFF commands**.
211
+
212
+ Concrete failures:
213
+
214
+ - `Do not turn on the fan.` → fan `ON`.
215
+ - `Turn the fan on, not off.` → fan `OFF`.
216
+ - `thank you` → water-pump motor `ON`.
217
+
218
+ The 284 challenge cases, all 568 predictions across both modes, overlap audit,
219
+ metrics and reproducible evaluation scripts are included. The challenge data
220
+ is also versioned in the linked dataset's `robotics_edge_v1` configuration.
221
+ If these cases guide future training, reserve fresh tests for the next release.
222
+
223
+ ## Training and reproducibility
224
+
225
+ Source: user-supplied `home-commands-3.4M.jsonl`, 3,458,816 rows. Normalized-input
226
+ deduplication removed 2,340,890 rows, leaving 1,117,926 examples. Phrase-family
227
+ grouping reduced case/punctuation/politeness leakage; other paraphrase overlap
228
+ can remain. The split is stratified by command class across 2,868 phrase families.
229
+
230
+ | Split | Examples | Phrase families |
231
+ | --- | ---: | ---: |
232
+ | Train | 910,114 | 2,292 |
233
+ | Validation | 103,089 | 288 |
234
+ | Test | 104,723 | 288 |
235
+
236
+ Tokenizer: training-only byte-level BPE, vocabulary 1,024. Architecture: hidden
237
+ width 160, intermediate width 432, 5 attention heads of dimension 32, 3 layers,
238
+ RoPE, RMSNorm, SwiGLU, tied embeddings/output, context 128.
239
+
240
+ Training completed on NVIDIA A100-SXM4-80GB: one epoch, 1,778 updates and
241
+ 22,655,302 nonpadding prediction tokens. Objective: full-sequence causal
242
+ next-token loss. AdamW LR 0.001, betas (0.9, 0.95), weight decay 0.1, 5% warmup,
243
+ cosine decay to 10% of peak LR, gradient clipping 1, microbatch 128, effective
244
+ batch 512, BF16 computation and FP32 weights/optimizer. Seed: 20260925.
245
+ Validation response NLL on a fixed 4,096-example subset selected the best model;
246
+ best and final exports are identical at step 1,778.
247
+
248
+ The 20.70 training-tokens/parameter ratio is a **Chinchilla-inspired sizing
249
+ heuristic**, not evidence of compute optimality. This small, highly templated
250
+ corpus is outside the original experiments' scale and diversity.
251
+
252
+ The linked dataset includes the exact source, prepared train/validation/test
253
+ JSONL, tokenizer/memmap training bundle and the manifest used in training.
254
+ See `training/` for source code, run summary and logs, and `release_manifest.json`
255
+ for source, model, package and artifact hashes. No extra fine-tuning occurred.
256
+
257
+ ## License, provenance and attribution
258
+
259
+ Apache License 2.0 for this original release material; see [LICENSE](https://huggingface.co/sraivante/superfast-tiny-home-robotics-json-1m-v1/blob/v1.0.2/LICENSE)
260
+ and [NOTICE](https://huggingface.co/sraivante/superfast-tiny-home-robotics-json-1m-v1/blob/v1.0.2/NOTICE). **Copyright (c) 2026 sraivante** applies to original user
261
+ contributions and original selection/arrangement. Third-party ownership and
262
+ license terms remain unchanged. The source was supplied by the publisher; its
263
+ upstream generation process and historical source revision were not provided
264
+ or independently verified. The source SHA identifies the exact received file.
265
+ No external corpus or pretrained base weights were added in this run.
266
+
267
+ Packaging adds a one-user chat template and corrects tokenizer context metadata
268
+ to 128; token IDs, vocabulary and learned weights are unchanged. The historical
269
+ assessment and training manifest are preserved. Their pre-publication packaging
270
+ notes are superseded by this release's cards, license and authorization record.
edge_benchmarks/rpi5-2026-09-26/REPORT.md ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Raspberry Pi 5 measurements — Tiny Home Robotics JSON 1M v1
2
+
3
+ Measured on 2026-09-26; measurement revision `edge-rpi5-20260926`. The model weights and training data were not changed.
4
+
5
+ Hardware: **Raspberry Pi 5 Model B Rev 1.1**, 15.84 GiB OS-visible RAM (16 GB model), four CPU cores, aarch64, Debian 13.2, kernel `6.12.47+rpt-rpi-2712`. Python 3.13.5. The device's governor and library versions are recorded in each JSON result. Cooling and power-supply model were not inspected.
6
+
7
+ ## Measured performance
8
+
9
+ | Threads | Median ms | p95 ms | p99 ms | Serial requests/s | Process RSS MiB | CPU °C min–mean–max | Timed correct |
10
+ | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
11
+ | 1 | 87.95 | 99.85 | 100.80 | 11.20 | 398.83 | 55.1–57.1–59.5 | 500/500 |
12
+ | 4 | 96.34 | 111.38 | 128.25 | 10.05 | 399.16 | 60.0–65.6–68.3 | 500/500 |
13
+
14
+ Each row is a separate sequential process: batch 1, 20 warmups, 500 timed requests cycling over 10 frozen synthetic inputs. Timing covers the adapter's complete local text-to-output call; it excludes model loading, SSH/network transfer, HTTP/UI, speech recognition, and actuation. RSS includes Python and runtime overhead. Peak RSS is Linux VmHWM sampled after the timed loop and includes imports/initialization. Serial requests/s is 1000 divided by mean latency; it is not concurrent-serving throughput. These model-specific input sets do not establish a controlled cross-model speed ranking.
15
+
16
+ Runtime: FP32 PyTorch; greedy generation constrained to the 30 training-observed JSON commands.
17
+
18
+ Thread counts set PyTorch/BLAS intra-op limits; PyTorch inter-op is one. No CPU affinity or power mode was changed. Actual loaded thread-pool metadata is in the raw results.
19
+
20
+ The benchmark runs left existing host services running. CPU temperature is read immediately after **every timed inference**, outside the latency timer, with per-call UTC timestamps. Sensor reads add a small gap between requests. The table reports the minimum, mean and maximum of those 500 matched temperature readings per row. The sensor types are recorded in each JSON. Thread configurations ran one then four without a controlled cooldown; temperatures depend on run order and background load. Start/end snapshots ranged from 54.5 to 67.2 °C; observed firmware flags: `throttled=0x0`. This short run is not a power or long-duration stability measurement.
21
+
22
+ ![Latency and CPU temperature for each reading](temperature_latency.png)
23
+
24
+ [Download all matched latency/temperature readings](readings.csv). Mean latency, import/load times and peak RSS are in the raw result JSON.
25
+
26
+ ## Command correctness on this device
27
+
28
+ | Diagnostic group | Correct / cases |
29
+ | --- | ---: |
30
+ | supported/literal_control | 30/30 |
31
+ | supported/paraphrase | 14/30 |
32
+ | supported/hinglish | 8/30 |
33
+ | supported/typos_and_asr_style | 6/30 |
34
+ | supported/contrastive_negation | 10/20 |
35
+ | unclaimed_language/native_hindi_diagnostic | 0/10 |
36
+ | reject/prohibition | 0/20 |
37
+ | reject/quoted_or_hypothetical | 0/10 |
38
+ | reject/delayed_or_conditional | 0/10 |
39
+ | reject/unsupported_device | 0/20 |
40
+ | reject/robotics_or_unrepresentable_parameter | 0/20 |
41
+ | reject/ambiguous_or_multi_step | 0/20 |
42
+ | reject/out_of_domain | 0/20 |
43
+ | reject/noise_or_instruction_injection | 0/10 |
44
+ | guard/input_guard | 4/4 |
45
+
46
+ existing frozen stress/regression suite, constrained decoding only. Previously inspected synthetic suite; not a new blind holdout. Original per-case source-overlap metadata retained.
47
+
48
+ Timed-correct counts above describe the repeated ten-input latency set, not an independent accuracy estimate. Recorded inference errors: 0 across the timed runs. No model retraining, output correction, host action or device actuation was performed.
49
+
50
+ ## Artifact and dataset identity
51
+
52
+ - Published model tested: [`sraivante/superfast-tiny-home-robotics-json-1m-v1@cf325b380e8ed560a729ec2de09f878a8a917259`](https://huggingface.co/sraivante/superfast-tiny-home-robotics-json-1m-v1/tree/cf325b380e8ed560a729ec2de09f878a8a917259). All tested runtime assets were checked against this revision.
53
+ - Learned weight SHA-256: `7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3` (4,380,048 bytes).
54
+ - Associated preserved training dataset: [`sraivante/home-commands-json-v1@8479d12161767c5aabd7dfc097e6f6c41790201a`](https://huggingface.co/datasets/sraivante/home-commands-json-v1/tree/8479d12161767c5aabd7dfc097e6f6c41790201a). Existing source/split hashes and historical provenance remain in that snapshot. No fine-tuning was performed for this measurement update.
55
+ - The [versioned evaluation inputs and Pi predictions](https://huggingface.co/datasets/sraivante/home-commands-json-v1/tree/edge-rpi5-20260926/edge_benchmarks/rpi5-2026-09-26) record the new diagnostic snapshot. `provenance.json` records its hashes, counts, source revisions, and historical identity limitations.
56
+ - [Runtime identity check](runtime_identity.json); [raw per-call records](results); [exact environment](environment.lock.txt).
57
+
58
+ ## Reproduce
59
+
60
+ Use a 64-bit Raspberry Pi in an isolated environment. Download this model repository at `edge-rpi5-20260926`, then run:
61
+
62
+ ```bash
63
+ python3 -m venv .venv
64
+ . .venv/bin/activate
65
+ python -m pip install -r edge_benchmarks/rpi5-2026-09-26/environment.lock.txt
66
+ python edge_benchmarks/rpi5-2026-09-26/reproduce.py --threads 1
67
+ python edge_benchmarks/rpi5-2026-09-26/reproduce.py --threads 4
68
+ ```
69
+
70
+ The helper downloads the pinned runtime files above, checks SHA-256, stages the exact case files, and invokes the included `benchmark.py`. It refuses to report a non-Pi host as a Pi result. Downloading requires network access; timed inference runs offline. The original run's full bundle hash differs from the per-model reproduction manifest; the original hash is retained inside each result.
71
+
72
+ ## License and limitations
73
+
74
+ Copyright (c) 2026 sraivante for original benchmark code, evaluation material and selection/arrangement, under Apache License 2.0. Third-party ownership and licenses remain unchanged. Synthetic/regression diagnostics do not establish real-user or robot-control reliability. Existing model-specific limitations still apply; latency is not a safety or end-to-end performance guarantee.
edge_benchmarks/rpi5-2026-09-26/benchmark.py ADDED
@@ -0,0 +1,268 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Batch-one inference benchmark for five frozen workspace projects.
2
+
3
+ No executor, host adapter, server, MQTT, or GPIO code is imported or called.
4
+ Copyright (c) 2026 sraivante. Licensed under Apache License 2.0.
5
+ """
6
+ from __future__ import annotations
7
+
8
+ import argparse
9
+ from collections import defaultdict
10
+ from datetime import datetime, timezone
11
+ import hashlib
12
+ import importlib.metadata
13
+ import json
14
+ import os
15
+ from pathlib import Path
16
+ import platform
17
+ import statistics
18
+ import subprocess
19
+ import sys
20
+ import time
21
+
22
+ HERE = Path(__file__).resolve().parent
23
+
24
+
25
+ def digest(path):
26
+ with Path(path).open("rb") as stream:
27
+ return hashlib.file_digest(stream, "sha256").hexdigest()
28
+
29
+
30
+ def read_text(path):
31
+ try:
32
+ return Path(path).read_text().strip("\x00\n")
33
+ except OSError:
34
+ return None
35
+
36
+
37
+ def host_state():
38
+ import psutil
39
+ throttled = None
40
+ try:
41
+ throttled = subprocess.check_output(["vcgencmd", "get_throttled"], text=True, timeout=5).strip()
42
+ except (OSError, subprocess.SubprocessError):
43
+ pass
44
+ return {
45
+ "load_average": list(os.getloadavg()) if hasattr(os, "getloadavg") else None,
46
+ "available_ram_bytes": psutil.virtual_memory().available,
47
+ "temperature_c": {p.parent.name: float(p.read_text()) / 1000
48
+ for p in Path("/sys/class/thermal").glob("thermal_zone*/temp")},
49
+ "cpu_frequency_khz": {p.parent.parent.name: int(p.read_text())
50
+ for p in Path("/sys/devices/system/cpu").glob("cpu*/cpufreq/scaling_cur_freq")},
51
+ "throttled": throttled,
52
+ }
53
+
54
+
55
+ def hardware():
56
+ import psutil
57
+ return {"raspberry_pi_model": read_text("/proc/device-tree/model"),
58
+ "system": platform.system(), "kernel": platform.release(),
59
+ "architecture": platform.machine(), "os_release": read_text("/etc/os-release"),
60
+ "logical_cpus": psutil.cpu_count(), "physical_cpus": psutil.cpu_count(logical=False),
61
+ "ram_bytes": psutil.virtual_memory().total,
62
+ "temperature_sensor_types": {p.parent.name: p.read_text().strip()
63
+ for p in Path("/sys/class/thermal").glob("thermal_zone*/type")},
64
+ "governors": {p.parent.parent.name: p.read_text().strip()
65
+ for p in Path("/sys/devices/system/cpu").glob("cpu*/cpufreq/scaling_governor")}}
66
+
67
+
68
+ def memory():
69
+ import psutil
70
+ info = psutil.Process().memory_info()._asdict()
71
+ status = read_text("/proc/self/status") or ""
72
+ for line in status.splitlines():
73
+ if line.startswith("VmHWM:"):
74
+ info["peak_rss"] = int(line.split()[1]) * 1024
75
+ return info
76
+
77
+
78
+ def temperature():
79
+ return {p.parent.name: float(p.read_text()) / 1000
80
+ for p in Path("/sys/class/thermal").glob("thermal_zone*/temp")}
81
+
82
+
83
+ def summary(values):
84
+ ordered = sorted(values)
85
+ def quantile(q):
86
+ rank = (len(ordered) - 1) * q
87
+ lo = int(rank)
88
+ hi = min(lo + 1, len(ordered) - 1)
89
+ return ordered[lo] + (ordered[hi] - ordered[lo]) * (rank - lo)
90
+ return {"n": len(values), "mean": statistics.mean(values), "p50": quantile(.5),
91
+ "p95": quantile(.95), "p99": quantile(.99), "min": min(values), "max": max(values)}
92
+
93
+
94
+ def load_adapter(key, root, threads):
95
+ start = time.perf_counter()
96
+ if key == "poc1":
97
+ sys.path.insert(0, str(root))
98
+ import torch
99
+ from tiny_json_llm.infer import JsonCommandModel
100
+ torch.set_num_threads(threads)
101
+ torch.set_num_interop_threads(1)
102
+ imports = time.perf_counter() - start
103
+ start = time.perf_counter()
104
+ model = JsonCommandModel(root / "best_model", device="cpu")
105
+ predict = lambda row: model.predict(row["text"])
106
+ params = sum(p.numel() for p in model.model.parameters())
107
+ mode = "FP32 PyTorch; greedy generation constrained to the 30 training-observed JSON commands"
108
+ elif key == "poc2":
109
+ sys.path.insert(0, str(root))
110
+ import engine
111
+ imports = time.perf_counter() - start
112
+ start = time.perf_counter()
113
+ engine.init(str(root / "model"))
114
+ predict = lambda row: json.loads(engine.parse_scored(row["text"])[0])
115
+ params = sum(p.size for p in engine._W.values())
116
+ mode = "FP16 NPZ storage expanded to FP32 NumPy; KV-cached greedy character generation, max_new=170; JSON parsing included, catalog validation excluded"
117
+ elif key == "poc3":
118
+ sys.path.insert(0, str(root))
119
+ from edge_command import Interpreter
120
+ imports = time.perf_counter() - start
121
+ start = time.perf_counter()
122
+ model = Interpreter(str(root))
123
+ predict = lambda row: model.parse(row["text"])
124
+ params = None
125
+ mode = "Standard-library action classifier with rules and read-only SQLite catalog; not an autoregressive LLM"
126
+ elif key == "agent_claude":
127
+ sys.path.insert(0, str(root / "model"))
128
+ from runtime import CommandModel
129
+ imports = time.perf_counter() - start
130
+ start = time.perf_counter()
131
+ model = CommandModel(str(root / "artifacts/final"))
132
+ def predict(row):
133
+ value = model.predict(row["text"])
134
+ return {k: v for k, v in value.items() if k != "_meta"}
135
+ params = sum(p.size for p in model.W.values())
136
+ mode = "NumPy encoder/decoder transformer with grammar constraints; FP32 runtime; includes normalization and JSON conversion"
137
+ elif key == "agent_codex":
138
+ sys.path.insert(0, str(root / "app"))
139
+ from inference import local_model, predict as infer
140
+ imports = time.perf_counter() - start
141
+ start = time.perf_counter()
142
+ local_model()
143
+ predict = lambda row: infer(row["text"], platform=row.get("platform", "pi"), engine="local")
144
+ params = None
145
+ mode = "scikit-learn intent classifier with policy and argument parsing; not an autoregressive LLM; no host execution"
146
+ else:
147
+ raise ValueError(key)
148
+ return predict, params, mode, imports, time.perf_counter() - start
149
+
150
+
151
+ def outcome(row, value, error):
152
+ if row.get("match") == "rejection":
153
+ return bool(error or (isinstance(value, dict) and ("error" in value or value.get("action") in {"unknown", "REJECT", "NOOP", "CLARIFY", "ABSTAIN"})))
154
+ if error:
155
+ return False
156
+ if row.get("match") == "subset":
157
+ return isinstance(value, dict) and all(value.get(k) == v for k, v in row["expected"].items())
158
+ return value == row["expected"]
159
+
160
+
161
+ def call(predict, row):
162
+ started = time.perf_counter_ns()
163
+ try:
164
+ value, error = predict(row), None
165
+ except (ValueError, KeyError, IndexError) as exc:
166
+ value, error = None, f"{type(exc).__name__}: {exc}"
167
+ elapsed = (time.perf_counter_ns() - started) / 1e6
168
+ return value, error, elapsed
169
+
170
+
171
+ def main():
172
+ parser = argparse.ArgumentParser(description=__doc__)
173
+ parser.add_argument("--model", required=True)
174
+ parser.add_argument("--threads", type=int, default=1, choices=(1, 4))
175
+ parser.add_argument("--repeats", type=int, default=500)
176
+ parser.add_argument("--warmup", type=int, default=20)
177
+ parser.add_argument("--quality", action="store_true")
178
+ parser.add_argument("--allow-nonpi", action="store_true", help="Development checks only, recorded as non-Pi")
179
+ parser.add_argument("--out", type=Path, required=True)
180
+ args = parser.parse_args()
181
+ assert args.repeats >= 20 and args.warmup >= 0
182
+ for name in ("OMP_NUM_THREADS", "OPENBLAS_NUM_THREADS", "MKL_NUM_THREADS", "BLIS_NUM_THREADS", "VECLIB_MAXIMUM_THREADS", "NUMEXPR_NUM_THREADS"):
183
+ os.environ[name] = str(args.threads)
184
+ os.environ["TOKENIZERS_PARALLELISM"] = "false"
185
+ os.environ["HF_HUB_OFFLINE"] = "1"
186
+ host = hardware()
187
+ is_pi = bool(host["raspberry_pi_model"] and "Raspberry Pi" in host["raspberry_pi_model"])
188
+ assert is_pi or args.allow_nonpi, "This run must execute on real Raspberry Pi hardware"
189
+ manifest = json.loads((HERE / "bundle_manifest.json").read_text())
190
+ spec = manifest["models"][args.model]
191
+ # Verify the full runtime and evaluation input before importing any model code.
192
+ for rel, entry in spec["files"].items():
193
+ assert digest(HERE / rel) == entry["sha256"], f"Frozen input differs: {rel}"
194
+ latency_cases = json.loads((HERE / "cases" / f"{args.model}_latency.json").read_text())
195
+ before = host_state()
196
+ memory_before = memory()
197
+ predict, params, mode, import_s, load_s = load_adapter(args.model, HERE / "projects" / args.model, args.threads)
198
+ memory_loaded = memory()
199
+ for i in range(args.warmup):
200
+ call(predict, latency_cases[i % len(latency_cases)])
201
+ samples = []
202
+ for i in range(args.repeats):
203
+ row = latency_cases[i % len(latency_cases)]
204
+ started_utc = datetime.now(timezone.utc).isoformat()
205
+ value, error, elapsed = call(predict, row)
206
+ samples.append({"case_id": row["id"], "elapsed_ms": elapsed,
207
+ "started_utc": started_utc, "temperature_c": temperature(),
208
+ "temperature_sampled_utc": datetime.now(timezone.utc).isoformat(),
209
+ "correct": outcome(row, value, error), "output": value, "error": error})
210
+ if (i + 1) % 100 == 0:
211
+ print(f"{args.model} threads={args.threads}: latency {i + 1}/{args.repeats}", flush=True)
212
+ memory_after_latency, after_latency = memory(), host_state()
213
+ lat = summary([s["elapsed_ms"] for s in samples])
214
+ result = {"created_utc": datetime.now(timezone.utc).isoformat(), "model": args.model,
215
+ "is_raspberry_pi": is_pi, "hardware": host, "environment_before": before,
216
+ "environment_after_latency": after_latency,
217
+ "bundle_manifest_sha256": digest(HERE / "bundle_manifest.json"),
218
+ "benchmark_script_sha256": digest(Path(__file__)), "model_spec": spec,
219
+ "settings": {"threads_requested": args.threads, "batch_size": 1,
220
+ "warmup_requests": args.warmup, "timed_requests": args.repeats,
221
+ "unique_latency_cases": len(latency_cases), "mode": mode,
222
+ "cpu_pinning": False, "power_mode_changed": False},
223
+ "parameters": params, "import_seconds": import_s, "load_seconds_after_import": load_s,
224
+ "latency_ms": lat, "serial_requests_per_second": 1000 / lat["mean"],
225
+ "timed_correct": sum(s["correct"] for s in samples),
226
+ "timed_errors": sum(s["error"] is not None for s in samples),
227
+ "memory_bytes": {"before_runtime_import": memory_before, "after_model_load": memory_loaded,
228
+ "after_latency": memory_after_latency},
229
+ "latency_samples": samples,
230
+ "temperature_measurement": "Linux thermal-zone CPU temperature read immediately after every timed inference, outside the latency timer; start and temperature-read UTC timestamps are retained per call. Sensor reads add a small gap between requests. These samples do not establish power consumption or a long-duration thermal limit.",
231
+ "measurement_scope": "Warm local Python process, full text-to-structured-output call through the specified adapter, serial batch one. Timing excludes SSH, HTTP/UI, model loading, speech recognition, actuation and per-call correctness checks. Small repeated synthetic input set with warm OS/model caches; throughput is reciprocal mean, not concurrent serving. Other host services were left running. No power meter or sustained thermal test; cooling and power-supply model were not inspected."}
232
+ result["software"] = {"python": platform.python_version(), "sqlite": __import__("sqlite3").sqlite_version}
233
+ for package in ("torch", "transformers", "tokenizers", "safetensors", "numpy", "scipy", "scikit-learn", "joblib", "threadpoolctl", "psutil"):
234
+ try:
235
+ result["software"][package] = importlib.metadata.version(package)
236
+ except importlib.metadata.PackageNotFoundError:
237
+ pass
238
+ try:
239
+ from threadpoolctl import threadpool_info
240
+ result["thread_pools"] = [{k: v for k, v in p.items() if k != "filepath"} for p in threadpool_info()]
241
+ except ImportError:
242
+ result["thread_pools"] = []
243
+ if args.quality:
244
+ rows = json.loads((HERE / "cases" / f"{args.model}_quality.json").read_text())
245
+ predictions, groups = [], defaultdict(list)
246
+ for i, row in enumerate(rows):
247
+ value, error, elapsed = call(predict, row)
248
+ ok = outcome(row, value, error)
249
+ predictions.append({**row, "output": value, "error": error, "correct": ok, "elapsed_ms": elapsed,
250
+ "temperature_c": temperature(), "temperature_sampled_utc": datetime.now(timezone.utc).isoformat()})
251
+ groups[row["category"]].append(ok)
252
+ if (i + 1) % 100 == 0:
253
+ print(f"{args.model}: quality {i + 1}/{len(rows)}", flush=True)
254
+ result["quality"] = {"cases": len(rows), "correct": sum(p["correct"] for p in predictions),
255
+ "by_category": {k: {"n": len(v), "correct": sum(v)} for k, v in groups.items()},
256
+ "provenance": spec["quality_provenance"], "predictions": predictions}
257
+ result["environment_after_quality"] = host_state()
258
+ args.out.parent.mkdir(parents=True, exist_ok=True)
259
+ temporary = args.out.with_suffix(".partial.json")
260
+ temporary.write_text(json.dumps(result, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
261
+ temporary.replace(args.out)
262
+ print(json.dumps({"model": args.model, "threads": args.threads, "latency_ms": lat,
263
+ "rss_mib": memory_after_latency["rss"] / 1024**2,
264
+ "timed_correct": result["timed_correct"], "result": str(args.out)}), flush=True)
265
+
266
+
267
+ if __name__ == "__main__":
268
+ main()
edge_benchmarks/rpi5-2026-09-26/bundle_manifest.json ADDED
@@ -0,0 +1,479 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "models": {
3
+ "poc1": {
4
+ "workspace_project": "POC-1",
5
+ "weight_sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3",
6
+ "weight_bytes": 4380048,
7
+ "files": {
8
+ "projects/poc1/tiny_json_llm/data.py": {
9
+ "bytes": 18760,
10
+ "sha256": "b1c6dd1207327bc8b9a325391d60762d419589b900ad1329ed21a13df48bc66b",
11
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/data.py"
12
+ },
13
+ "projects/poc1/tiny_json_llm/evaluate.py": {
14
+ "bytes": 6317,
15
+ "sha256": "1efd2f862da1fdc6fb17006547de7c53321dbd29aa16c4097daccbfb8dc41e4d",
16
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/evaluate.py"
17
+ },
18
+ "projects/poc1/tiny_json_llm/infer.py": {
19
+ "bytes": 4260,
20
+ "sha256": "2b5074bce3f07127fa254c4ec62e25c6b8ce58743b937cdd301d7bb05128a5c8",
21
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/infer.py"
22
+ },
23
+ "projects/poc1/tiny_json_llm/train.py": {
24
+ "bytes": 17277,
25
+ "sha256": "911848ac7816a1a58bbad171a75e1e5e74a9e2790f18492e69d41e0ec4c8ed2a",
26
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/train.py"
27
+ },
28
+ "projects/poc1/tiny_json_llm/__init__.py": {
29
+ "bytes": 103,
30
+ "sha256": "e8edab0c5d6fc4202a0b3005dfb4009894ed4c06f216c801943a88f88b7653c2",
31
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/__init__.py"
32
+ },
33
+ "projects/poc1/best_model/allowed_outputs.json": {
34
+ "bytes": 2590,
35
+ "sha256": "317d35bd27a25e6db66deea50112633b63f7eae907178cc7f50f12dd8ad6aba1",
36
+ "workspace_source": "POC-1/publication/model/allowed_outputs.json"
37
+ },
38
+ "projects/poc1/best_model/config.json": {
39
+ "bytes": 682,
40
+ "sha256": "a66629f39ecb44414aefdf78aa947829e37daf6e6a44be8d710e944ec90ef60a",
41
+ "workspace_source": "POC-1/publication/model/config.json"
42
+ },
43
+ "projects/poc1/best_model/generation_config.json": {
44
+ "bytes": 132,
45
+ "sha256": "9b962893b09457be3f8b0d343c8d64d33048443e2e57fbe421cd40d2dec8edf9",
46
+ "workspace_source": "POC-1/publication/model/generation_config.json"
47
+ },
48
+ "projects/poc1/best_model/manifest.json": {
49
+ "bytes": 12618,
50
+ "sha256": "2ead74207a38ad593819da12c52392bad8a273cc62e6842a8278ebffaa561eaa",
51
+ "workspace_source": "POC-1/publication/model/manifest.json"
52
+ },
53
+ "projects/poc1/best_model/model.safetensors": {
54
+ "bytes": 4380048,
55
+ "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3",
56
+ "workspace_source": "POC-1/publication/model/model.safetensors"
57
+ },
58
+ "projects/poc1/best_model/output_schema.json": {
59
+ "bytes": 797,
60
+ "sha256": "e5c670db2756306cfb58f43e020426a174aef2f60c643ec0cc72920be4aaae86",
61
+ "workspace_source": "POC-1/publication/model/output_schema.json"
62
+ },
63
+ "projects/poc1/best_model/special_tokens_map.json": {
64
+ "bytes": 531,
65
+ "sha256": "eae55585dbdfe3c1875015bd0a96dee1b5103a5ab4ef97797de606fb385ea51d",
66
+ "workspace_source": "POC-1/publication/model/special_tokens_map.json"
67
+ },
68
+ "projects/poc1/best_model/tokenizer.json": {
69
+ "bytes": 54877,
70
+ "sha256": "0e2e4281172d6ff20e5562d8e0df4c796ca6c0a9e1804067e1b62bdefe38317e",
71
+ "workspace_source": "POC-1/publication/model/tokenizer.json"
72
+ },
73
+ "projects/poc1/best_model/tokenizer_config.json": {
74
+ "bytes": 2077,
75
+ "sha256": "66e9e99973752a3b3b6adf621fa1574aa576da1fd2f344b8673196de207da9ad",
76
+ "workspace_source": "POC-1/publication/model/tokenizer_config.json"
77
+ },
78
+ "projects/poc1/best_model/training_metadata.json": {
79
+ "bytes": 1190,
80
+ "sha256": "5fd7ee7df81d8699b853cfa2e33ee70b5ff8172ef8de67b11aee54e8cf73d11f",
81
+ "workspace_source": "POC-1/publication/model/training_metadata.json"
82
+ },
83
+ "projects/poc1/best_model/weights_sha256.json": {
84
+ "bytes": 94,
85
+ "sha256": "0d186660bf35658801dea63222e4de0612c237ba13553569535f5b5077824ba1",
86
+ "workspace_source": "POC-1/publication/model/weights_sha256.json"
87
+ },
88
+ "cases/poc1_quality.json": {
89
+ "bytes": 193903,
90
+ "sha256": "a3e20755d442252731b96f8faff4a9d5b4e4074af130f9b4c9063be5e60504ee"
91
+ },
92
+ "cases/poc1_latency.json": {
93
+ "bytes": 2180,
94
+ "sha256": "157cb10e338b20c09e7c383eb9d5ed1f23984ded1984f32f2d228b65ee8e6700"
95
+ }
96
+ },
97
+ "quality_provenance": {
98
+ "kind": "existing frozen stress/regression suite, constrained decoding only",
99
+ "source": "POC-1\\assessment\\robotics_edge_v1\\cases.jsonl",
100
+ "sha256": "30cb9a6de18cc12cefcbb6e1aac8a29c7371b0f4ea537e516f38d02b3f417d6c",
101
+ "notes": "Previously inspected synthetic suite; not a new blind holdout. Original per-case source-overlap metadata retained."
102
+ },
103
+ "hf": {
104
+ "model": "sraivante/superfast-tiny-home-robotics-json-1m-v1",
105
+ "dataset": "sraivante/home-commands-json-v1",
106
+ "local_weight": "POC-1/tiny_home_json_model_v1/best_model/model.safetensors",
107
+ "weight_name": "model.safetensors",
108
+ "repositories": {
109
+ "model": {
110
+ "repo_id": "sraivante/superfast-tiny-home-robotics-json-1m-v1",
111
+ "commit": "cf325b380e8ed560a729ec2de09f878a8a917259",
112
+ "files": [
113
+ {
114
+ "path": ".gitattributes",
115
+ "bytes": 133,
116
+ "sha256": null
117
+ },
118
+ {
119
+ "path": "LICENSE",
120
+ "bytes": 11357,
121
+ "sha256": null
122
+ },
123
+ {
124
+ "path": "NOTICE",
125
+ "bytes": 728,
126
+ "sha256": null
127
+ },
128
+ {
129
+ "path": "README.md",
130
+ "bytes": 11097,
131
+ "sha256": null
132
+ },
133
+ {
134
+ "path": "allowed_outputs.json",
135
+ "bytes": 2590,
136
+ "sha256": null
137
+ },
138
+ {
139
+ "path": "assessment/RASPBERRY_PI.md",
140
+ "bytes": 709,
141
+ "sha256": null
142
+ },
143
+ {
144
+ "path": "assessment/benchmark_device.py",
145
+ "bytes": 6302,
146
+ "sha256": null
147
+ },
148
+ {
149
+ "path": "assessment/build_challenge.py",
150
+ "bytes": 10121,
151
+ "sha256": null
152
+ },
153
+ {
154
+ "path": "assessment/evaluate_edge.py",
155
+ "bytes": 5579,
156
+ "sha256": null
157
+ },
158
+ {
159
+ "path": "assessment/robotics_edge_v1/REPORT.md",
160
+ "bytes": 10707,
161
+ "sha256": null
162
+ },
163
+ {
164
+ "path": "assessment/robotics_edge_v1/cases.jsonl",
165
+ "bytes": 95602,
166
+ "sha256": null
167
+ },
168
+ {
169
+ "path": "assessment/robotics_edge_v1/desktop_cpu_1thread.json",
170
+ "bytes": 8389,
171
+ "sha256": null
172
+ },
173
+ {
174
+ "path": "assessment/robotics_edge_v1/desktop_cpu_4threads.json",
175
+ "bytes": 8390,
176
+ "sha256": null
177
+ },
178
+ {
179
+ "path": "assessment/robotics_edge_v1/hf_compatibility.json",
180
+ "bytes": 457,
181
+ "sha256": null
182
+ },
183
+ {
184
+ "path": "assessment/robotics_edge_v1/manifest.json",
185
+ "bytes": 1694,
186
+ "sha256": null
187
+ },
188
+ {
189
+ "path": "assessment/robotics_edge_v1/metrics.json",
190
+ "bytes": 14385,
191
+ "sha256": null
192
+ },
193
+ {
194
+ "path": "assessment/robotics_edge_v1/predictions.jsonl",
195
+ "bytes": 389133,
196
+ "sha256": null
197
+ },
198
+ {
199
+ "path": "config.json",
200
+ "bytes": 682,
201
+ "sha256": null
202
+ },
203
+ {
204
+ "path": "evaluation/metrics.json",
205
+ "bytes": 10936,
206
+ "sha256": null
207
+ },
208
+ {
209
+ "path": "evaluation/raw_diagnostic_predictions.jsonl.gz",
210
+ "bytes": 16504,
211
+ "sha256": "dc834114aafc7c28982f8440e2493e59e24cbafa79476a3e00f0d048c33b803f"
212
+ },
213
+ {
214
+ "path": "evaluation/test_predictions.jsonl.gz",
215
+ "bytes": 498154,
216
+ "sha256": "cfd68ce95dd52db54461812a9c1e61679d693c117576e35b59728f4ef9e8fb01"
217
+ },
218
+ {
219
+ "path": "generation_config.json",
220
+ "bytes": 132,
221
+ "sha256": null
222
+ },
223
+ {
224
+ "path": "manifest.json",
225
+ "bytes": 12618,
226
+ "sha256": null
227
+ },
228
+ {
229
+ "path": "model.safetensors",
230
+ "bytes": 4380048,
231
+ "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3"
232
+ },
233
+ {
234
+ "path": "output_schema.json",
235
+ "bytes": 797,
236
+ "sha256": null
237
+ },
238
+ {
239
+ "path": "release_manifest.json",
240
+ "bytes": 9317,
241
+ "sha256": null
242
+ },
243
+ {
244
+ "path": "requirements.txt",
245
+ "bytes": 111,
246
+ "sha256": null
247
+ },
248
+ {
249
+ "path": "special_tokens_map.json",
250
+ "bytes": 531,
251
+ "sha256": null
252
+ },
253
+ {
254
+ "path": "tiny_json_llm/__init__.py",
255
+ "bytes": 103,
256
+ "sha256": null
257
+ },
258
+ {
259
+ "path": "tiny_json_llm/data.py",
260
+ "bytes": 18760,
261
+ "sha256": null
262
+ },
263
+ {
264
+ "path": "tiny_json_llm/evaluate.py",
265
+ "bytes": 6317,
266
+ "sha256": null
267
+ },
268
+ {
269
+ "path": "tiny_json_llm/infer.py",
270
+ "bytes": 4260,
271
+ "sha256": null
272
+ },
273
+ {
274
+ "path": "tiny_json_llm/train.py",
275
+ "bytes": 17277,
276
+ "sha256": null
277
+ },
278
+ {
279
+ "path": "tokenizer.json",
280
+ "bytes": 54877,
281
+ "sha256": null
282
+ },
283
+ {
284
+ "path": "tokenizer_config.json",
285
+ "bytes": 2077,
286
+ "sha256": null
287
+ },
288
+ {
289
+ "path": "training/Tiny_Home_JSON_A100.ipynb",
290
+ "bytes": 61976,
291
+ "sha256": null
292
+ },
293
+ {
294
+ "path": "training/audit_dataset.py",
295
+ "bytes": 4051,
296
+ "sha256": null
297
+ },
298
+ {
299
+ "path": "training/build_notebook.py",
300
+ "bytes": 10392,
301
+ "sha256": null
302
+ },
303
+ {
304
+ "path": "training/prepare_home.py",
305
+ "bytes": 11051,
306
+ "sha256": null
307
+ },
308
+ {
309
+ "path": "training/run.json",
310
+ "bytes": 1024,
311
+ "sha256": null
312
+ },
313
+ {
314
+ "path": "training/train_log.jsonl",
315
+ "bytes": 14843,
316
+ "sha256": null
317
+ },
318
+ {
319
+ "path": "training/verify_pipeline.py",
320
+ "bytes": 3744,
321
+ "sha256": null
322
+ },
323
+ {
324
+ "path": "training_metadata.json",
325
+ "bytes": 1190,
326
+ "sha256": null
327
+ },
328
+ {
329
+ "path": "verification/downloaded_model_verification.json",
330
+ "bytes": 1218,
331
+ "sha256": null
332
+ },
333
+ {
334
+ "path": "verification/release_examples.json",
335
+ "bytes": 477,
336
+ "sha256": null
337
+ },
338
+ {
339
+ "path": "verification/verification_report.json",
340
+ "bytes": 600,
341
+ "sha256": null
342
+ },
343
+ {
344
+ "path": "weights_sha256.json",
345
+ "bytes": 94,
346
+ "sha256": null
347
+ }
348
+ ]
349
+ },
350
+ "dataset": {
351
+ "repo_id": "sraivante/home-commands-json-v1",
352
+ "commit": "8479d12161767c5aabd7dfc097e6f6c41790201a",
353
+ "files": [
354
+ {
355
+ "path": ".gitattributes",
356
+ "bytes": 133,
357
+ "sha256": null
358
+ },
359
+ {
360
+ "path": "LICENSE",
361
+ "bytes": 11357,
362
+ "sha256": null
363
+ },
364
+ {
365
+ "path": "NOTICE",
366
+ "bytes": 728,
367
+ "sha256": null
368
+ },
369
+ {
370
+ "path": "README.md",
371
+ "bytes": 8459,
372
+ "sha256": null
373
+ },
374
+ {
375
+ "path": "artifacts/home_commands_training_bundle.zip",
376
+ "bytes": 19263019,
377
+ "sha256": "3e0340a0081c3ede31ff8a548c0531470ddaa92486d5f556493b4a50af069b57"
378
+ },
379
+ {
380
+ "path": "data/test.jsonl.gz",
381
+ "bytes": 1154130,
382
+ "sha256": "38bbae4cf7fd0347035059e11961fb7c60ef0fb69263e391f9cf6e88981cb69c"
383
+ },
384
+ {
385
+ "path": "data/train.jsonl.gz",
386
+ "bytes": 9587393,
387
+ "sha256": "04266e5dbfcb210a5216f723a1bb575fd168382cb06d61260ac670e9c935bb73"
388
+ },
389
+ {
390
+ "path": "data/validation.jsonl.gz",
391
+ "bytes": 1129727,
392
+ "sha256": "e37ec83a8454734c9a1ad57cbc492de11d20cba49301c888dde1f9be63860b47"
393
+ },
394
+ {
395
+ "path": "evaluation/build_challenge.py",
396
+ "bytes": 10121,
397
+ "sha256": null
398
+ },
399
+ {
400
+ "path": "evaluation/robotics_edge_v1/cases.jsonl",
401
+ "bytes": 95602,
402
+ "sha256": null
403
+ },
404
+ {
405
+ "path": "evaluation/robotics_edge_v1/manifest.json",
406
+ "bytes": 1694,
407
+ "sha256": null
408
+ },
409
+ {
410
+ "path": "metadata/allowed_outputs.json",
411
+ "bytes": 2590,
412
+ "sha256": null
413
+ },
414
+ {
415
+ "path": "metadata/model_config.json",
416
+ "bytes": 403,
417
+ "sha256": null
418
+ },
419
+ {
420
+ "path": "metadata/output_schema.json",
421
+ "bytes": 797,
422
+ "sha256": null
423
+ },
424
+ {
425
+ "path": "metadata/phrase_groups.json",
426
+ "bytes": 277559,
427
+ "sha256": null
428
+ },
429
+ {
430
+ "path": "preparation/audit_dataset.py",
431
+ "bytes": 4051,
432
+ "sha256": null
433
+ },
434
+ {
435
+ "path": "preparation/prepare_home.py",
436
+ "bytes": 11051,
437
+ "sha256": null
438
+ },
439
+ {
440
+ "path": "preparation/requirements.txt",
441
+ "bytes": 163,
442
+ "sha256": null
443
+ },
444
+ {
445
+ "path": "preparation/tiny_json_llm/__init__.py",
446
+ "bytes": 103,
447
+ "sha256": null
448
+ },
449
+ {
450
+ "path": "preparation/tiny_json_llm/data.py",
451
+ "bytes": 18760,
452
+ "sha256": null
453
+ },
454
+ {
455
+ "path": "release_manifest.json",
456
+ "bytes": 6223,
457
+ "sha256": null
458
+ },
459
+ {
460
+ "path": "source/home-commands-3.4M.jsonl.gz",
461
+ "bytes": 37947929,
462
+ "sha256": "33edbdedc942ac56444e2196d4b368fc52638eebd6c0cf01264a634261fcf9d1"
463
+ },
464
+ {
465
+ "path": "training_snapshot_manifest.json",
466
+ "bytes": 12618,
467
+ "sha256": null
468
+ }
469
+ ]
470
+ }
471
+ },
472
+ "remote_weight_path": "model.safetensors",
473
+ "verified_weight_sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3"
474
+ },
475
+ "publication": "existing model and dataset repositories"
476
+ }
477
+ },
478
+ "scope": "Per-model reproduction projection; the original run manifest hash is preserved in raw results."
479
+ }
edge_benchmarks/rpi5-2026-09-26/cases/poc1_latency.json ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "id": "latency-0",
4
+ "text": "Please turn on the fan",
5
+ "expected": {
6
+ "subject": "fan",
7
+ "action": "ON"
8
+ },
9
+ "match": "subset",
10
+ "category": "supported_short_command"
11
+ },
12
+ {
13
+ "id": "latency-1",
14
+ "text": "pankha band karo",
15
+ "expected": {
16
+ "subject": "fan",
17
+ "action": "OFF"
18
+ },
19
+ "match": "subset",
20
+ "category": "supported_short_command"
21
+ },
22
+ {
23
+ "id": "latency-2",
24
+ "text": "check the water pump status",
25
+ "expected": {
26
+ "subject": "motor",
27
+ "action": "STATUS"
28
+ },
29
+ "match": "subset",
30
+ "category": "supported_short_command"
31
+ },
32
+ {
33
+ "id": "latency-3",
34
+ "text": "switch off the speaker",
35
+ "expected": {
36
+ "subject": "speaker",
37
+ "action": "OFF"
38
+ },
39
+ "match": "subset",
40
+ "category": "supported_short_command"
41
+ },
42
+ {
43
+ "id": "latency-4",
44
+ "text": "turn on the light",
45
+ "expected": {
46
+ "subject": "light",
47
+ "action": "ON"
48
+ },
49
+ "match": "subset",
50
+ "category": "supported_short_command"
51
+ },
52
+ {
53
+ "id": "latency-5",
54
+ "text": "ac chalu karo",
55
+ "expected": {
56
+ "subject": "ac",
57
+ "action": "ON"
58
+ },
59
+ "match": "subset",
60
+ "category": "supported_short_command"
61
+ },
62
+ {
63
+ "id": "latency-6",
64
+ "text": "turn off the washing machine",
65
+ "expected": {
66
+ "subject": "washing_machine",
67
+ "action": "OFF"
68
+ },
69
+ "match": "subset",
70
+ "category": "supported_short_command"
71
+ },
72
+ {
73
+ "id": "latency-7",
74
+ "text": "check the sprinkler status",
75
+ "expected": {
76
+ "subject": "sprinkler",
77
+ "action": "STATUS"
78
+ },
79
+ "match": "subset",
80
+ "category": "supported_short_command"
81
+ },
82
+ {
83
+ "id": "latency-8",
84
+ "text": "turn on the geyser",
85
+ "expected": {
86
+ "subject": "geyser",
87
+ "action": "ON"
88
+ },
89
+ "match": "subset",
90
+ "category": "supported_short_command"
91
+ },
92
+ {
93
+ "id": "latency-9",
94
+ "text": "switch off the TV",
95
+ "expected": {
96
+ "subject": "tv",
97
+ "action": "OFF"
98
+ },
99
+ "match": "subset",
100
+ "category": "supported_short_command"
101
+ }
102
+ ]
edge_benchmarks/rpi5-2026-09-26/cases/poc1_quality.json ADDED
The diff for this file is too large to render. See raw diff
 
edge_benchmarks/rpi5-2026-09-26/environment.lock.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ certifi==2026.7.22
2
+ charset-normalizer==3.5.1
3
+ filelock==4.0.3
4
+ fsspec==2026.9.0
5
+ hf-xet==1.6.0
6
+ huggingface_hub==0.36.2
7
+ idna==3.20
8
+ Jinja2==3.1.6
9
+ joblib==1.5.3
10
+ MarkupSafe==3.0.3
11
+ mpmath==1.3.0
12
+ networkx==3.7
13
+ numpy==2.3.5
14
+ packaging==26.3
15
+ psutil==7.2.2
16
+ PyYAML==6.0.3
17
+ regex==2026.9.10
18
+ requests==2.34.2
19
+ safetensors==0.8.0
20
+ scikit-learn==1.8.0
21
+ scipy==1.17.0
22
+ setuptools==84.0.0
23
+ sympy==1.14.0
24
+ threadpoolctl==3.7.0
25
+ tokenizers==0.22.1
26
+ torch==2.8.0
27
+ tqdm==4.70.1
28
+ transformers==4.56.2
29
+ typing_extensions==4.16.0
30
+ urllib3==2.8.0
edge_benchmarks/rpi5-2026-09-26/provenance.json ADDED
@@ -0,0 +1,257 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "measurement_revision": "edge-rpi5-20260926",
3
+ "model": {
4
+ "repo_id": "sraivante/superfast-tiny-home-robotics-json-1m-v1",
5
+ "revision": "cf325b380e8ed560a729ec2de09f878a8a917259",
6
+ "files": [
7
+ {
8
+ "bundle_path": "projects/poc1/tiny_json_llm/data.py",
9
+ "repo_path": "tiny_json_llm/data.py",
10
+ "sha256": "b1c6dd1207327bc8b9a325391d60762d419589b900ad1329ed21a13df48bc66b",
11
+ "bytes": 18760,
12
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/data.py"
13
+ },
14
+ {
15
+ "bundle_path": "projects/poc1/tiny_json_llm/evaluate.py",
16
+ "repo_path": "tiny_json_llm/evaluate.py",
17
+ "sha256": "1efd2f862da1fdc6fb17006547de7c53321dbd29aa16c4097daccbfb8dc41e4d",
18
+ "bytes": 6317,
19
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/evaluate.py"
20
+ },
21
+ {
22
+ "bundle_path": "projects/poc1/tiny_json_llm/infer.py",
23
+ "repo_path": "tiny_json_llm/infer.py",
24
+ "sha256": "2b5074bce3f07127fa254c4ec62e25c6b8ce58743b937cdd301d7bb05128a5c8",
25
+ "bytes": 4260,
26
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/infer.py"
27
+ },
28
+ {
29
+ "bundle_path": "projects/poc1/tiny_json_llm/train.py",
30
+ "repo_path": "tiny_json_llm/train.py",
31
+ "sha256": "911848ac7816a1a58bbad171a75e1e5e74a9e2790f18492e69d41e0ec4c8ed2a",
32
+ "bytes": 17277,
33
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/train.py"
34
+ },
35
+ {
36
+ "bundle_path": "projects/poc1/tiny_json_llm/__init__.py",
37
+ "repo_path": "tiny_json_llm/__init__.py",
38
+ "sha256": "e8edab0c5d6fc4202a0b3005dfb4009894ed4c06f216c801943a88f88b7653c2",
39
+ "bytes": 103,
40
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/__init__.py"
41
+ },
42
+ {
43
+ "bundle_path": "projects/poc1/best_model/allowed_outputs.json",
44
+ "repo_path": "allowed_outputs.json",
45
+ "sha256": "317d35bd27a25e6db66deea50112633b63f7eae907178cc7f50f12dd8ad6aba1",
46
+ "bytes": 2590,
47
+ "workspace_source": "POC-1/publication/model/allowed_outputs.json"
48
+ },
49
+ {
50
+ "bundle_path": "projects/poc1/best_model/config.json",
51
+ "repo_path": "config.json",
52
+ "sha256": "a66629f39ecb44414aefdf78aa947829e37daf6e6a44be8d710e944ec90ef60a",
53
+ "bytes": 682,
54
+ "workspace_source": "POC-1/publication/model/config.json"
55
+ },
56
+ {
57
+ "bundle_path": "projects/poc1/best_model/generation_config.json",
58
+ "repo_path": "generation_config.json",
59
+ "sha256": "9b962893b09457be3f8b0d343c8d64d33048443e2e57fbe421cd40d2dec8edf9",
60
+ "bytes": 132,
61
+ "workspace_source": "POC-1/publication/model/generation_config.json"
62
+ },
63
+ {
64
+ "bundle_path": "projects/poc1/best_model/manifest.json",
65
+ "repo_path": "manifest.json",
66
+ "sha256": "2ead74207a38ad593819da12c52392bad8a273cc62e6842a8278ebffaa561eaa",
67
+ "bytes": 12618,
68
+ "workspace_source": "POC-1/publication/model/manifest.json"
69
+ },
70
+ {
71
+ "bundle_path": "projects/poc1/best_model/model.safetensors",
72
+ "repo_path": "model.safetensors",
73
+ "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3",
74
+ "bytes": 4380048,
75
+ "workspace_source": "POC-1/publication/model/model.safetensors"
76
+ },
77
+ {
78
+ "bundle_path": "projects/poc1/best_model/output_schema.json",
79
+ "repo_path": "output_schema.json",
80
+ "sha256": "e5c670db2756306cfb58f43e020426a174aef2f60c643ec0cc72920be4aaae86",
81
+ "bytes": 797,
82
+ "workspace_source": "POC-1/publication/model/output_schema.json"
83
+ },
84
+ {
85
+ "bundle_path": "projects/poc1/best_model/special_tokens_map.json",
86
+ "repo_path": "special_tokens_map.json",
87
+ "sha256": "eae55585dbdfe3c1875015bd0a96dee1b5103a5ab4ef97797de606fb385ea51d",
88
+ "bytes": 531,
89
+ "workspace_source": "POC-1/publication/model/special_tokens_map.json"
90
+ },
91
+ {
92
+ "bundle_path": "projects/poc1/best_model/tokenizer.json",
93
+ "repo_path": "tokenizer.json",
94
+ "sha256": "0e2e4281172d6ff20e5562d8e0df4c796ca6c0a9e1804067e1b62bdefe38317e",
95
+ "bytes": 54877,
96
+ "workspace_source": "POC-1/publication/model/tokenizer.json"
97
+ },
98
+ {
99
+ "bundle_path": "projects/poc1/best_model/tokenizer_config.json",
100
+ "repo_path": "tokenizer_config.json",
101
+ "sha256": "66e9e99973752a3b3b6adf621fa1574aa576da1fd2f344b8673196de207da9ad",
102
+ "bytes": 2077,
103
+ "workspace_source": "POC-1/publication/model/tokenizer_config.json"
104
+ },
105
+ {
106
+ "bundle_path": "projects/poc1/best_model/training_metadata.json",
107
+ "repo_path": "training_metadata.json",
108
+ "sha256": "5fd7ee7df81d8699b853cfa2e33ee70b5ff8172ef8de67b11aee54e8cf73d11f",
109
+ "bytes": 1190,
110
+ "workspace_source": "POC-1/publication/model/training_metadata.json"
111
+ },
112
+ {
113
+ "bundle_path": "projects/poc1/best_model/weights_sha256.json",
114
+ "repo_path": "weights_sha256.json",
115
+ "sha256": "0d186660bf35658801dea63222e4de0612c237ba13553569535f5b5077824ba1",
116
+ "bytes": 94,
117
+ "workspace_source": "POC-1/publication/model/weights_sha256.json"
118
+ }
119
+ ],
120
+ "all_match": true
121
+ },
122
+ "training_dataset_snapshot": {
123
+ "repo_id": "sraivante/home-commands-json-v1",
124
+ "commit": "8479d12161767c5aabd7dfc097e6f6c41790201a",
125
+ "files": [
126
+ {
127
+ "path": ".gitattributes",
128
+ "bytes": 133,
129
+ "sha256": null
130
+ },
131
+ {
132
+ "path": "LICENSE",
133
+ "bytes": 11357,
134
+ "sha256": null
135
+ },
136
+ {
137
+ "path": "NOTICE",
138
+ "bytes": 728,
139
+ "sha256": null
140
+ },
141
+ {
142
+ "path": "README.md",
143
+ "bytes": 8459,
144
+ "sha256": null
145
+ },
146
+ {
147
+ "path": "artifacts/home_commands_training_bundle.zip",
148
+ "bytes": 19263019,
149
+ "sha256": "3e0340a0081c3ede31ff8a548c0531470ddaa92486d5f556493b4a50af069b57"
150
+ },
151
+ {
152
+ "path": "data/test.jsonl.gz",
153
+ "bytes": 1154130,
154
+ "sha256": "38bbae4cf7fd0347035059e11961fb7c60ef0fb69263e391f9cf6e88981cb69c"
155
+ },
156
+ {
157
+ "path": "data/train.jsonl.gz",
158
+ "bytes": 9587393,
159
+ "sha256": "04266e5dbfcb210a5216f723a1bb575fd168382cb06d61260ac670e9c935bb73"
160
+ },
161
+ {
162
+ "path": "data/validation.jsonl.gz",
163
+ "bytes": 1129727,
164
+ "sha256": "e37ec83a8454734c9a1ad57cbc492de11d20cba49301c888dde1f9be63860b47"
165
+ },
166
+ {
167
+ "path": "evaluation/build_challenge.py",
168
+ "bytes": 10121,
169
+ "sha256": null
170
+ },
171
+ {
172
+ "path": "evaluation/robotics_edge_v1/cases.jsonl",
173
+ "bytes": 95602,
174
+ "sha256": null
175
+ },
176
+ {
177
+ "path": "evaluation/robotics_edge_v1/manifest.json",
178
+ "bytes": 1694,
179
+ "sha256": null
180
+ },
181
+ {
182
+ "path": "metadata/allowed_outputs.json",
183
+ "bytes": 2590,
184
+ "sha256": null
185
+ },
186
+ {
187
+ "path": "metadata/model_config.json",
188
+ "bytes": 403,
189
+ "sha256": null
190
+ },
191
+ {
192
+ "path": "metadata/output_schema.json",
193
+ "bytes": 797,
194
+ "sha256": null
195
+ },
196
+ {
197
+ "path": "metadata/phrase_groups.json",
198
+ "bytes": 277559,
199
+ "sha256": null
200
+ },
201
+ {
202
+ "path": "preparation/audit_dataset.py",
203
+ "bytes": 4051,
204
+ "sha256": null
205
+ },
206
+ {
207
+ "path": "preparation/prepare_home.py",
208
+ "bytes": 11051,
209
+ "sha256": null
210
+ },
211
+ {
212
+ "path": "preparation/requirements.txt",
213
+ "bytes": 163,
214
+ "sha256": null
215
+ },
216
+ {
217
+ "path": "preparation/tiny_json_llm/__init__.py",
218
+ "bytes": 103,
219
+ "sha256": null
220
+ },
221
+ {
222
+ "path": "preparation/tiny_json_llm/data.py",
223
+ "bytes": 18760,
224
+ "sha256": null
225
+ },
226
+ {
227
+ "path": "release_manifest.json",
228
+ "bytes": 6223,
229
+ "sha256": null
230
+ },
231
+ {
232
+ "path": "source/home-commands-3.4M.jsonl.gz",
233
+ "bytes": 37947929,
234
+ "sha256": "33edbdedc942ac56444e2196d4b368fc52638eebd6c0cf01264a634261fcf9d1"
235
+ },
236
+ {
237
+ "path": "training_snapshot_manifest.json",
238
+ "bytes": 12618,
239
+ "sha256": null
240
+ }
241
+ ]
242
+ },
243
+ "evaluation": {
244
+ "kind": "existing frozen stress/regression suite, constrained decoding only",
245
+ "source": "POC-1\\assessment\\robotics_edge_v1\\cases.jsonl",
246
+ "sha256": "30cb9a6de18cc12cefcbb6e1aac8a29c7371b0f4ea537e516f38d02b3f417d6c",
247
+ "notes": "Previously inspected synthetic suite; not a new blind holdout. Original per-case source-overlap metadata retained."
248
+ },
249
+ "quality_case_count": 284,
250
+ "latency_case_count": 10,
251
+ "case_file_sha256": {
252
+ "poc1_latency.json": "157cb10e338b20c09e7c383eb9d5ed1f23984ded1984f32f2d228b65ee8e6700",
253
+ "poc1_quality.json": "a3e20755d442252731b96f8faff4a9d5b4e4074af130f9b4c9063be5e60504ee"
254
+ },
255
+ "no_training_or_fine_tuning": true,
256
+ "copyright": "Copyright (c) 2026 sraivante for original material and selection/arrangement only; Apache License 2.0; third-party terms unchanged."
257
+ }
edge_benchmarks/rpi5-2026-09-26/readings.csv ADDED
The diff for this file is too large to render. See raw diff
 
edge_benchmarks/rpi5-2026-09-26/reproduce.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Reproduce this pinned model's Pi benchmark without changing model weights."""
2
+ import argparse, hashlib, json, shutil, subprocess, sys
3
+ from pathlib import Path
4
+ from huggingface_hub import hf_hub_download
5
+ HERE=Path(__file__).resolve().parent
6
+ ap=argparse.ArgumentParser(); ap.add_argument('--threads',type=int,choices=(1,4),default=1); args=ap.parse_args()
7
+ identity=json.loads((HERE/'runtime_identity.json').read_text())
8
+ manifest=json.loads((HERE/'bundle_manifest.json').read_text()); key=next(iter(manifest['models']))
9
+ if key=='poc3' and args.threads!=1: ap.error('This interpreter is single-threaded')
10
+ target=Path.cwd()/('rpi-reproduction-'+key); target.mkdir(exist_ok=True)
11
+ for item in identity['files']:
12
+ source=Path(hf_hub_download(identity['repo_id'],item['repo_path'],revision=identity['revision']))
13
+ assert hashlib.sha256(source.read_bytes()).hexdigest()==item['sha256']
14
+ dest=target/item['bundle_path']; dest.parent.mkdir(parents=True,exist_ok=True); shutil.copyfile(source,dest)
15
+ for name in ('benchmark.py','bundle_manifest.json'):
16
+ shutil.copyfile(HERE/name,target/name)
17
+ for source in (HERE/'cases').glob('*.json'):
18
+ dest=target/'cases'/source.name; dest.parent.mkdir(exist_ok=True); shutil.copyfile(source,dest)
19
+ command=[sys.executable,'-u',str(target/'benchmark.py'),'--model',key,'--threads',str(args.threads),'--out',str(target/('result_t'+str(args.threads)+'.json'))]
20
+ if args.threads==1: command.append('--quality')
21
+ subprocess.run(command,check=True)
edge_benchmarks/rpi5-2026-09-26/results/poc1_t1.json ADDED
The diff for this file is too large to render. See raw diff
 
edge_benchmarks/rpi5-2026-09-26/results/poc1_t4.json ADDED
The diff for this file is too large to render. See raw diff
 
edge_benchmarks/rpi5-2026-09-26/runtime_identity.json ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "repo_id": "sraivante/superfast-tiny-home-robotics-json-1m-v1",
3
+ "revision": "cf325b380e8ed560a729ec2de09f878a8a917259",
4
+ "files": [
5
+ {
6
+ "bundle_path": "projects/poc1/tiny_json_llm/data.py",
7
+ "repo_path": "tiny_json_llm/data.py",
8
+ "sha256": "b1c6dd1207327bc8b9a325391d60762d419589b900ad1329ed21a13df48bc66b",
9
+ "bytes": 18760,
10
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/data.py"
11
+ },
12
+ {
13
+ "bundle_path": "projects/poc1/tiny_json_llm/evaluate.py",
14
+ "repo_path": "tiny_json_llm/evaluate.py",
15
+ "sha256": "1efd2f862da1fdc6fb17006547de7c53321dbd29aa16c4097daccbfb8dc41e4d",
16
+ "bytes": 6317,
17
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/evaluate.py"
18
+ },
19
+ {
20
+ "bundle_path": "projects/poc1/tiny_json_llm/infer.py",
21
+ "repo_path": "tiny_json_llm/infer.py",
22
+ "sha256": "2b5074bce3f07127fa254c4ec62e25c6b8ce58743b937cdd301d7bb05128a5c8",
23
+ "bytes": 4260,
24
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/infer.py"
25
+ },
26
+ {
27
+ "bundle_path": "projects/poc1/tiny_json_llm/train.py",
28
+ "repo_path": "tiny_json_llm/train.py",
29
+ "sha256": "911848ac7816a1a58bbad171a75e1e5e74a9e2790f18492e69d41e0ec4c8ed2a",
30
+ "bytes": 17277,
31
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/train.py"
32
+ },
33
+ {
34
+ "bundle_path": "projects/poc1/tiny_json_llm/__init__.py",
35
+ "repo_path": "tiny_json_llm/__init__.py",
36
+ "sha256": "e8edab0c5d6fc4202a0b3005dfb4009894ed4c06f216c801943a88f88b7653c2",
37
+ "bytes": 103,
38
+ "workspace_source": "POC-1/publication/model/tiny_json_llm/__init__.py"
39
+ },
40
+ {
41
+ "bundle_path": "projects/poc1/best_model/allowed_outputs.json",
42
+ "repo_path": "allowed_outputs.json",
43
+ "sha256": "317d35bd27a25e6db66deea50112633b63f7eae907178cc7f50f12dd8ad6aba1",
44
+ "bytes": 2590,
45
+ "workspace_source": "POC-1/publication/model/allowed_outputs.json"
46
+ },
47
+ {
48
+ "bundle_path": "projects/poc1/best_model/config.json",
49
+ "repo_path": "config.json",
50
+ "sha256": "a66629f39ecb44414aefdf78aa947829e37daf6e6a44be8d710e944ec90ef60a",
51
+ "bytes": 682,
52
+ "workspace_source": "POC-1/publication/model/config.json"
53
+ },
54
+ {
55
+ "bundle_path": "projects/poc1/best_model/generation_config.json",
56
+ "repo_path": "generation_config.json",
57
+ "sha256": "9b962893b09457be3f8b0d343c8d64d33048443e2e57fbe421cd40d2dec8edf9",
58
+ "bytes": 132,
59
+ "workspace_source": "POC-1/publication/model/generation_config.json"
60
+ },
61
+ {
62
+ "bundle_path": "projects/poc1/best_model/manifest.json",
63
+ "repo_path": "manifest.json",
64
+ "sha256": "2ead74207a38ad593819da12c52392bad8a273cc62e6842a8278ebffaa561eaa",
65
+ "bytes": 12618,
66
+ "workspace_source": "POC-1/publication/model/manifest.json"
67
+ },
68
+ {
69
+ "bundle_path": "projects/poc1/best_model/model.safetensors",
70
+ "repo_path": "model.safetensors",
71
+ "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3",
72
+ "bytes": 4380048,
73
+ "workspace_source": "POC-1/publication/model/model.safetensors"
74
+ },
75
+ {
76
+ "bundle_path": "projects/poc1/best_model/output_schema.json",
77
+ "repo_path": "output_schema.json",
78
+ "sha256": "e5c670db2756306cfb58f43e020426a174aef2f60c643ec0cc72920be4aaae86",
79
+ "bytes": 797,
80
+ "workspace_source": "POC-1/publication/model/output_schema.json"
81
+ },
82
+ {
83
+ "bundle_path": "projects/poc1/best_model/special_tokens_map.json",
84
+ "repo_path": "special_tokens_map.json",
85
+ "sha256": "eae55585dbdfe3c1875015bd0a96dee1b5103a5ab4ef97797de606fb385ea51d",
86
+ "bytes": 531,
87
+ "workspace_source": "POC-1/publication/model/special_tokens_map.json"
88
+ },
89
+ {
90
+ "bundle_path": "projects/poc1/best_model/tokenizer.json",
91
+ "repo_path": "tokenizer.json",
92
+ "sha256": "0e2e4281172d6ff20e5562d8e0df4c796ca6c0a9e1804067e1b62bdefe38317e",
93
+ "bytes": 54877,
94
+ "workspace_source": "POC-1/publication/model/tokenizer.json"
95
+ },
96
+ {
97
+ "bundle_path": "projects/poc1/best_model/tokenizer_config.json",
98
+ "repo_path": "tokenizer_config.json",
99
+ "sha256": "66e9e99973752a3b3b6adf621fa1574aa576da1fd2f344b8673196de207da9ad",
100
+ "bytes": 2077,
101
+ "workspace_source": "POC-1/publication/model/tokenizer_config.json"
102
+ },
103
+ {
104
+ "bundle_path": "projects/poc1/best_model/training_metadata.json",
105
+ "repo_path": "training_metadata.json",
106
+ "sha256": "5fd7ee7df81d8699b853cfa2e33ee70b5ff8172ef8de67b11aee54e8cf73d11f",
107
+ "bytes": 1190,
108
+ "workspace_source": "POC-1/publication/model/training_metadata.json"
109
+ },
110
+ {
111
+ "bundle_path": "projects/poc1/best_model/weights_sha256.json",
112
+ "repo_path": "weights_sha256.json",
113
+ "sha256": "0d186660bf35658801dea63222e4de0612c237ba13553569535f5b5077824ba1",
114
+ "bytes": 94,
115
+ "workspace_source": "POC-1/publication/model/weights_sha256.json"
116
+ }
117
+ ],
118
+ "all_match": true
119
+ }
edge_benchmarks/rpi5-2026-09-26/temperature_latency.png ADDED

Git LFS Details

  • SHA256: b84806634d248d984b85ec0603a61be8ade6b6738c59f7c4c1f2f401b85d586d
  • Pointer size: 131 Bytes
  • Size of remote file: 155 kB
release_manifest.json CHANGED
@@ -36,10 +36,26 @@
36
  "bytes": 133,
37
  "sha256": "8c6dce8d82b0d8705faef37c0a2b838fd47a481f814682d67c369618ac324100"
38
  },
 
 
 
 
 
 
 
 
 
 
 
 
39
  "allowed_outputs.json": {
40
  "bytes": 2590,
41
  "sha256": "317d35bd27a25e6db66deea50112633b63f7eae907178cc7f50f12dd8ad6aba1"
42
  },
 
 
 
 
43
  "assessment/benchmark_device.py": {
44
  "bytes": 6302,
45
  "sha256": "4a188470cb99e67fb804bb0fbdc3def5ae6751fdf686ae15476604d4862ab552"
@@ -52,9 +68,9 @@
52
  "bytes": 5579,
53
  "sha256": "8df51447b3b6416bc551bced731a4ea732a32a13a2693247ae239f71450356f4"
54
  },
55
- "assessment/RASPBERRY_PI.md": {
56
- "bytes": 709,
57
- "sha256": "44e705c5bbf3c3488738170fc831418543d572a4a929d4c58bfeeb721b6d192d"
58
  },
59
  "assessment/robotics_edge_v1/cases.jsonl": {
60
  "bytes": 95602,
@@ -84,14 +100,62 @@
84
  "bytes": 389133,
85
  "sha256": "71cc0ac4c6a6195863a25b2788a21d839415058eeca5cc4a92091487dc496d7b"
86
  },
87
- "assessment/robotics_edge_v1/REPORT.md": {
88
- "bytes": 10707,
89
- "sha256": "64c6e4aa8a79ef4ca070fc72682fecff09cd20bc15f5c084b60280a5a6ea270d"
90
- },
91
  "config.json": {
92
  "bytes": 682,
93
  "sha256": "a66629f39ecb44414aefdf78aa947829e37daf6e6a44be8d710e944ec90ef60a"
94
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
  "evaluation/metrics.json": {
96
  "bytes": 10936,
97
  "sha256": "9f53479d2b67bd06fc3a5b56f2dba2856bcb11778cef1fe0afa0e0a39a99d6c9"
@@ -108,10 +172,6 @@
108
  "bytes": 132,
109
  "sha256": "9b962893b09457be3f8b0d343c8d64d33048443e2e57fbe421cd40d2dec8edf9"
110
  },
111
- "LICENSE": {
112
- "bytes": 11357,
113
- "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4"
114
- },
115
  "manifest.json": {
116
  "bytes": 12618,
117
  "sha256": "2ead74207a38ad593819da12c52392bad8a273cc62e6842a8278ebffaa561eaa"
@@ -120,18 +180,10 @@
120
  "bytes": 4380048,
121
  "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3"
122
  },
123
- "NOTICE": {
124
- "bytes": 728,
125
- "sha256": "3dce4a2870f76ab3b86cc84067bb017d32e8b726892fc87a8ca4110cac79219b"
126
- },
127
  "output_schema.json": {
128
  "bytes": 797,
129
  "sha256": "e5c670db2756306cfb58f43e020426a174aef2f60c643ec0cc72920be4aaae86"
130
  },
131
- "README.md": {
132
- "bytes": 11097,
133
- "sha256": "b282fe69815c7991578042ed038e0297933cbdbcd2cd24e3f673eb7bb949e1e1"
134
- },
135
  "requirements.txt": {
136
  "bytes": 111,
137
  "sha256": "e565b0c29221c7e17347cdbaeaa7cba2efee571d2ca8f742d4882925705db460"
@@ -168,6 +220,10 @@
168
  "bytes": 2077,
169
  "sha256": "66e9e99973752a3b3b6adf621fa1574aa576da1fd2f344b8673196de207da9ad"
170
  },
 
 
 
 
171
  "training/audit_dataset.py": {
172
  "bytes": 4051,
173
  "sha256": "687b8c1cfabb9031eb9ddc901de47b4c2115b77d4aa22c6b35912556ae7f9f4e"
@@ -184,10 +240,6 @@
184
  "bytes": 1024,
185
  "sha256": "1cafbddca61420914c6435de449af55007fd8ec7cc06ba58b399ffc9a7d113ea"
186
  },
187
- "training/Tiny_Home_JSON_A100.ipynb": {
188
- "bytes": 61976,
189
- "sha256": "ed056ea07f969f1983b1d5efa98030df5ce72ab571b0369616b3e33b6a5d8365"
190
- },
191
  "training/train_log.jsonl": {
192
  "bytes": 14843,
193
  "sha256": "c371de9912ae1d6e589551685c20735be1ff5177271d375eeb69ba5fc7195075"
@@ -219,5 +271,11 @@
219
  },
220
  "documentation_patch": "Repository renamed at the publisher's request; model title, usage and linked dataset references updated. Weights, runtime code and all training/evaluation data are unchanged.",
221
  "previous_release_commit": "89ccd2a58be3831640b13e9e1c63d1234d25ea39",
222
- "renamed_from": "sraivante/tiny-home-json-1m-v1"
 
 
 
 
 
 
223
  }
 
36
  "bytes": 133,
37
  "sha256": "8c6dce8d82b0d8705faef37c0a2b838fd47a481f814682d67c369618ac324100"
38
  },
39
+ "LICENSE": {
40
+ "bytes": 11357,
41
+ "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4"
42
+ },
43
+ "NOTICE": {
44
+ "bytes": 728,
45
+ "sha256": "3dce4a2870f76ab3b86cc84067bb017d32e8b726892fc87a8ca4110cac79219b"
46
+ },
47
+ "README.md": {
48
+ "bytes": 13219,
49
+ "sha256": "24dd95bd6c005414bf54860b8c53a1da9a42dc1cb367eaa215af729361ba68a8"
50
+ },
51
  "allowed_outputs.json": {
52
  "bytes": 2590,
53
  "sha256": "317d35bd27a25e6db66deea50112633b63f7eae907178cc7f50f12dd8ad6aba1"
54
  },
55
+ "assessment/RASPBERRY_PI.md": {
56
+ "bytes": 709,
57
+ "sha256": "44e705c5bbf3c3488738170fc831418543d572a4a929d4c58bfeeb721b6d192d"
58
+ },
59
  "assessment/benchmark_device.py": {
60
  "bytes": 6302,
61
  "sha256": "4a188470cb99e67fb804bb0fbdc3def5ae6751fdf686ae15476604d4862ab552"
 
68
  "bytes": 5579,
69
  "sha256": "8df51447b3b6416bc551bced731a4ea732a32a13a2693247ae239f71450356f4"
70
  },
71
+ "assessment/robotics_edge_v1/REPORT.md": {
72
+ "bytes": 10707,
73
+ "sha256": "64c6e4aa8a79ef4ca070fc72682fecff09cd20bc15f5c084b60280a5a6ea270d"
74
  },
75
  "assessment/robotics_edge_v1/cases.jsonl": {
76
  "bytes": 95602,
 
100
  "bytes": 389133,
101
  "sha256": "71cc0ac4c6a6195863a25b2788a21d839415058eeca5cc4a92091487dc496d7b"
102
  },
 
 
 
 
103
  "config.json": {
104
  "bytes": 682,
105
  "sha256": "a66629f39ecb44414aefdf78aa947829e37daf6e6a44be8d710e944ec90ef60a"
106
  },
107
+ "edge_benchmarks/rpi5-2026-09-26/REPORT.md": {
108
+ "bytes": 6252,
109
+ "sha256": "6fc28a537a7261320a96b93f0a55108904d0abca69419b690f336b86af8de990"
110
+ },
111
+ "edge_benchmarks/rpi5-2026-09-26/benchmark.py": {
112
+ "bytes": 13816,
113
+ "sha256": "2a2a0694235642db38ffdbfe3838d5318224309cb4161b85e33486c1743f2061"
114
+ },
115
+ "edge_benchmarks/rpi5-2026-09-26/bundle_manifest.json": {
116
+ "bytes": 17568,
117
+ "sha256": "29754d52abb0f2201d55819186df85d0df8f733a740d2e128b2830f587027b38"
118
+ },
119
+ "edge_benchmarks/rpi5-2026-09-26/cases/poc1_latency.json": {
120
+ "bytes": 2180,
121
+ "sha256": "157cb10e338b20c09e7c383eb9d5ed1f23984ded1984f32f2d228b65ee8e6700"
122
+ },
123
+ "edge_benchmarks/rpi5-2026-09-26/cases/poc1_quality.json": {
124
+ "bytes": 193903,
125
+ "sha256": "a3e20755d442252731b96f8faff4a9d5b4e4074af130f9b4c9063be5e60504ee"
126
+ },
127
+ "edge_benchmarks/rpi5-2026-09-26/environment.lock.txt": {
128
+ "bytes": 506,
129
+ "sha256": "0dae9933461ff1551edb8afdc7cc89e1b63dacddcd1dcca33d4be07b7e5bd0ba"
130
+ },
131
+ "edge_benchmarks/rpi5-2026-09-26/provenance.json": {
132
+ "bytes": 9358,
133
+ "sha256": "f5a12e015ad46ccd193afe2cd9aa7e2ed757384e07367578256fd328ea0e874c"
134
+ },
135
+ "edge_benchmarks/rpi5-2026-09-26/readings.csv": {
136
+ "bytes": 103401,
137
+ "sha256": "1c487fd04aa8f1a608aa2f81f4ca275a7bdc2bd121e0bd2cd72131b39eeae7ff"
138
+ },
139
+ "edge_benchmarks/rpi5-2026-09-26/reproduce.py": {
140
+ "bytes": 1503,
141
+ "sha256": "1fb5bb68f46b02329ecccb66f3de20b301f66e0d41c4eaba53fa7e3224c982ee"
142
+ },
143
+ "edge_benchmarks/rpi5-2026-09-26/results/poc1_t1.json": {
144
+ "bytes": 542969,
145
+ "sha256": "67d94f301dddf46c0899ce9161c1a3ccab66faca9ec08ebc80b874a908f438f6"
146
+ },
147
+ "edge_benchmarks/rpi5-2026-09-26/results/poc1_t4.json": {
148
+ "bytes": 230245,
149
+ "sha256": "afba1ed7e145a64149508e3b7f61264ea0e7a5155acf06ef7cb0a2c91f2af141"
150
+ },
151
+ "edge_benchmarks/rpi5-2026-09-26/runtime_identity.json": {
152
+ "bytes": 5078,
153
+ "sha256": "d5b81efe500eaa4550833a6dd3883e7f9d2a03a9a7e77932386cffcba81b3780"
154
+ },
155
+ "edge_benchmarks/rpi5-2026-09-26/temperature_latency.png": {
156
+ "bytes": 154941,
157
+ "sha256": "b84806634d248d984b85ec0603a61be8ade6b6738c59f7c4c1f2f401b85d586d"
158
+ },
159
  "evaluation/metrics.json": {
160
  "bytes": 10936,
161
  "sha256": "9f53479d2b67bd06fc3a5b56f2dba2856bcb11778cef1fe0afa0e0a39a99d6c9"
 
172
  "bytes": 132,
173
  "sha256": "9b962893b09457be3f8b0d343c8d64d33048443e2e57fbe421cd40d2dec8edf9"
174
  },
 
 
 
 
175
  "manifest.json": {
176
  "bytes": 12618,
177
  "sha256": "2ead74207a38ad593819da12c52392bad8a273cc62e6842a8278ebffaa561eaa"
 
180
  "bytes": 4380048,
181
  "sha256": "7eed2ed8eb5455f4195cba48ff38b2bc8ff8228cefaf7ee6c477200c776a8ea3"
182
  },
 
 
 
 
183
  "output_schema.json": {
184
  "bytes": 797,
185
  "sha256": "e5c670db2756306cfb58f43e020426a174aef2f60c643ec0cc72920be4aaae86"
186
  },
 
 
 
 
187
  "requirements.txt": {
188
  "bytes": 111,
189
  "sha256": "e565b0c29221c7e17347cdbaeaa7cba2efee571d2ca8f742d4882925705db460"
 
220
  "bytes": 2077,
221
  "sha256": "66e9e99973752a3b3b6adf621fa1574aa576da1fd2f344b8673196de207da9ad"
222
  },
223
+ "training/Tiny_Home_JSON_A100.ipynb": {
224
+ "bytes": 61976,
225
+ "sha256": "ed056ea07f969f1983b1d5efa98030df5ce72ab571b0369616b3e33b6a5d8365"
226
+ },
227
  "training/audit_dataset.py": {
228
  "bytes": 4051,
229
  "sha256": "687b8c1cfabb9031eb9ddc901de47b4c2115b77d4aa22c6b35912556ae7f9f4e"
 
240
  "bytes": 1024,
241
  "sha256": "1cafbddca61420914c6435de449af55007fd8ec7cc06ba58b399ffc9a7d113ea"
242
  },
 
 
 
 
243
  "training/train_log.jsonl": {
244
  "bytes": 14843,
245
  "sha256": "c371de9912ae1d6e589551685c20735be1ff5177271d375eeb69ba5fc7195075"
 
271
  },
272
  "documentation_patch": "Repository renamed at the publisher's request; model title, usage and linked dataset references updated. Weights, runtime code and all training/evaluation data are unchanged.",
273
  "previous_release_commit": "89ccd2a58be3831640b13e9e1c63d1234d25ea39",
274
+ "renamed_from": "sraivante/tiny-home-json-1m-v1",
275
+ "edge_measurement_update": {
276
+ "revision": "edge-rpi5-20260926",
277
+ "date": "2026-09-26",
278
+ "weights_and_training_data_changed": false,
279
+ "files": "edge_benchmarks/rpi5-2026-09-26"
280
+ }
281
  }