Model card: drop the 'curated weights' claim (weights are third-party, not shipped) and the internal host names
Browse files
README.md
CHANGED
|
@@ -21,13 +21,14 @@ pipeline_tag: text-generation
|
|
| 21 |
|
| 22 |
# OldIron
|
| 23 |
|
| 24 |
-
|
| 25 |
written off. OldIron is a product line: each variant names the *lowest* machine it must serve, and nothing in it
|
| 26 |
-
is allowed to be slower than that floor needs.
|
|
|
|
| 27 |
|
| 28 |
| variant | lowest supported CPU | lowest supported GPU | status |
|
| 29 |
|---|---|---|---|
|
| 30 |
-
| **OldIron-AVX** | Xeon E5-2665 (Sandy Bridge-EP, **AVX1**: no AVX2/FMA/F16C/BMI2) | RTX 3060 8 GB (**sm_86**) | built, staged, **measured on
|
| 31 |
| OldIron-Core2 (planned) | SSE4.1/SSSE3 (2007) | none | not started |
|
| 32 |
|
| 33 |
## Results, plainly
|
|
@@ -37,8 +38,8 @@ is allowed to be slower than that floor needs.
|
|
| 37 |
the first version of this README **did not survive the engine tests and is retracted below** — the large multiple
|
| 38 |
on this hardware is on the GPU lane, not in the matvec.
|
| 39 |
|
| 40 |
-
All numbers measured on
|
| 41 |
-
throughout, `nice -n 19`, box verified idle between arms.
|
| 42 |
|
| 43 |
### CPU lane — shipped state
|
| 44 |
|
|
@@ -80,8 +81,8 @@ but it is a size regression in exchange for the speed.
|
|
| 80 |
|
| 81 |
### Where the multiple actually is: the GPU lane
|
| 82 |
|
| 83 |
-
The CPU lane is at its ISA ceiling. The 16 GB card is not. Best long-context split on the
|
| 84 |
-
|
| 85 |
|
| 86 |
| config | prompt | generation | peak VRAM |
|
| 87 |
|---|---|---|---|
|
|
@@ -132,19 +133,26 @@ VERDICT: AVX1-clean and using 256-bit width
|
|
| 132 |
mnemonics (`vpermd`, `vpermq`, `vpbroadcast[dwq]`, `vpsllvd`, `vpgather*`, `vpblendd`) and (b) **integer-vector ops
|
| 133 |
on `%ymm`** — AVX1 has no 256-bit integer arithmetic at all. `vmovdqa/vmovdqu` on `%ymm` are AVX1-legitimate.
|
| 134 |
|
| 135 |
-
###
|
| 136 |
|
| 137 |
-
`Qwen3.6-35B-A3B
|
| 138 |
-
|
| 139 |
-
|
|
|
|
|
|
|
| 140 |
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
|
|
|
| 144 |
|
| 145 |
-
|
|
|
|
|
|
|
| 146 |
|
| 147 |
-
|
|
|
|
|
|
|
| 148 |
("The capital of France is **Paris**.").
|
| 149 |
|
| 150 |
| lane | config | decode | prefill | peak VRAM | verdict |
|
|
@@ -169,7 +177,7 @@ sequential streaming figure — see the retractions above for why the difference
|
|
| 169 |
|
| 170 |
### Earlier proxy run (kept for comparison)
|
| 171 |
|
| 172 |
-
`gpt-oss-20b Q4_K_M`, 20.9B total / 3.6B active, 10.81 GiB, measured before the
|
| 173 |
|
| 174 |
| lane | decode | prefill | note |
|
| 175 |
|---|---|---|---|
|
|
@@ -197,7 +205,7 @@ Same source (2744e48d1), same model, same flags, built both ways on the Z820 its
|
|
| 197 |
| OldIron-AVX floor (`-march=sandybridge`, cross-built on Zen4) | 8.55 / 9.03 t/s | 23.9 ± 0.9 t/s |
|
| 198 |
| native (`-march=native`, built on the E5-2665) | 8.74 / 8.83 t/s | ~25 t/s |
|
| 199 |
|
| 200 |
-
Parity within run-to-run spread. Repeated on the
|
| 201 |
vs native **7.63 ± 0.05** t/s — ~1% apart. One detached harness pass measured the two back to back:
|
| 202 |
floor **7.38 ± 0.02** vs native **7.43 ± 0.05**: **0.7%**, which is the run-to-run spread itself. Three independent passes of the same arms now agree within ~3-6%, so the floor is confirmed free. The two targets differ only in `-maes` (AES-NI), which no inference kernel
|
| 203 |
uses, so the cross-built floor is not leaving AVX1 performance on the table and OldIron-AVX can be built anywhere.
|
|
@@ -224,8 +232,8 @@ Same OldIron-AVX binary, CPU lane, `-ngl 0 -nopo 1`:
|
|
| 224 |
|
| 225 |
| host | CPU | quant | decode | prefill | effective weight throughput |
|
| 226 |
|---|---|---|---|---|---|
|
| 227 |
-
|
|
| 228 |
-
|
|
| 229 |
|
| 230 |
Normalised for quant, the two boxes move **within 0.7% of the same bytes per second** — decode is DRAM-bound, so the
|
| 231 |
29% clock advantage buys nothing there, exactly as the memory model predicts. Prefill is compute-bound and *does*
|
|
@@ -238,7 +246,7 @@ the only thing that changed the token rate was the weight file.
|
|
| 238 |
|
| 239 |
- **Run the harness detached, in tmux** — the wifi link to the Z820s drops ssh sessions mid-run. tmux is installed
|
| 240 |
without root on both Z820s (`scripts/install-tmux-noroot.sh`: `apt-get download` + `dpkg -x` into `~/tmux-local`,
|
| 241 |
-
wrapper at `~/bin/tmux`);
|
| 242 |
- **Under tmux the CLI gets a pty and enters its interactive REPL** after the first turn, hanging until the timeout
|
| 243 |
instead of exiting. Every non-interactive CLI arm needs `< /dev/null`. `llama-cli` also writes a **0-byte log**
|
| 244 |
under a tmux pty; capture CLI output over a plain ssh pipe (`llama-bench` is fine under tmux).
|
|
@@ -296,6 +304,7 @@ are in `NOTICE`.
|
|
| 296 |
isa-audit.sh the ISA gate (see note above about the pattern)
|
| 297 |
stage-to-target.sh relocatable copy + load check
|
| 298 |
fetch-weights.sh parallel-stream weight transfer (link is wifi/WAN here)
|
| 299 |
-
acceptance-
|
| 300 |
```
|
| 301 |
-
On
|
|
|
|
|
|
| 21 |
|
| 22 |
# OldIron
|
| 23 |
|
| 24 |
+
An inference engine plus **one named weight file**, built for hardware that current engines have
|
| 25 |
written off. OldIron is a product line: each variant names the *lowest* machine it must serve, and nothing in it
|
| 26 |
+
is allowed to be slower than that floor needs. The weights are third-party and are not shipped here — see
|
| 27 |
+
*The weights* below.
|
| 28 |
|
| 29 |
| variant | lowest supported CPU | lowest supported GPU | status |
|
| 30 |
|---|---|---|---|
|
| 31 |
+
| **OldIron-AVX** | Xeon E5-2665 (Sandy Bridge-EP, **AVX1**: no AVX2/FMA/F16C/BMI2) | RTX 3060 8 GB (**sm_86**) | built, staged, **measured on two HP Z820s**; CPU kernel work finished (+13.5% at fixed format, +6.4% net) |
|
| 32 |
| OldIron-Core2 (planned) | SSE4.1/SSSE3 (2007) | none | not started |
|
| 33 |
|
| 34 |
## Results, plainly
|
|
|
|
| 38 |
the first version of this README **did not survive the engine tests and is retracted below** — the large multiple
|
| 39 |
on this hardware is on the GPU lane, not in the matvec.
|
| 40 |
|
| 41 |
+
All numbers measured on an HP Z820 (2× Xeon E5-2665, 32 GB DDR3, RTX 5060 Ti) with the 35B-A3B weight file named in
|
| 42 |
+
each run, coherent output throughout, `nice -n 19`, box verified idle between arms.
|
| 43 |
|
| 44 |
### CPU lane — shipped state
|
| 45 |
|
|
|
|
| 81 |
|
| 82 |
### Where the multiple actually is: the GPU lane
|
| 83 |
|
| 84 |
+
The CPU lane is at its ISA ceiling. The 16 GB card is not. Best long-context split on the 35B weights, measured at
|
| 85 |
+
a real 32k context with a 140 KB prompt (not `llama-bench`'s short context):
|
| 86 |
|
| 87 |
| config | prompt | generation | peak VRAM |
|
| 88 |
|---|---|---|---|
|
|
|
|
| 133 |
mnemonics (`vpermd`, `vpermq`, `vpbroadcast[dwq]`, `vpsllvd`, `vpgather*`, `vpblendd`) and (b) **integer-vector ops
|
| 134 |
on `%ymm`** — AVX1 has no 256-bit integer arithmetic at all. `vmovdqa/vmovdqu` on `%ymm` are AVX1-legitimate.
|
| 135 |
|
| 136 |
+
### The weights: third-party, and not shipped
|
| 137 |
|
| 138 |
+
`Qwen3.6-35B-A3B` in GGUF — 35B total / 3B active, arch `qwen35moe` (256 experts, 8 routed + 1 shared, 40 layers,
|
| 139 |
+
3:1 Gated DeltaNet : full attention, 262k context, 248320 vocab, MTP-trained). Three files appear in these
|
| 140 |
+
measurements: the stock `Qwen3.6-35B-A3B-IQ3_M.gguf` (**16.9 GB, 3.52 bits per weight**), an `IQ3_S` mix
|
| 141 |
+
(3.66 bpw, 15.73 GiB) used for the lane matrix, and a `Q4_0` re-quant of the same model (4.50 bpw, ~19 GiB)
|
| 142 |
+
written only to A/B the AVX1 kernel.
|
| 143 |
|
| 144 |
+
**These weights are not ours, and this project does not include them.** They are third-party GGUF files of a public
|
| 145 |
+
model, downloaded and checksum-verified in transit; the `Q4_0` copy is a local re-quant of the same model and is a
|
| 146 |
+
test artefact, not a product. What is published here is engine source, kernel source, scripts and measurements — no
|
| 147 |
+
weight file is redistributed, and no weight file is claimed as part of the deliverable.
|
| 148 |
|
| 149 |
+
Why this shape of model: decode speed is set by *active* parameters and RAM is the scarce resource, so a 35B/3B
|
| 150 |
+
MoE at 3.5-4.5 bits fits a 32 GB box with ~15 GB to spare for a long-context KV cache (20 KB/token → 32k ctx
|
| 151 |
+
≈ 0.67 GB), where a 27B dense at a higher quant would be ~7× slower for less quality headroom.
|
| 152 |
|
| 153 |
+
## Measured: HP Z820 (2× E5-2665, 16 cores, RTX 5060 Ti)
|
| 154 |
+
|
| 155 |
+
`Qwen3.6-35B-A3B-IQ3_S` mix, 3.66 bpw, 15.73 GiB, 34.66B params — coherent on every lane
|
| 156 |
("The capital of France is **Paris**.").
|
| 157 |
|
| 158 |
| lane | config | decode | prefill | peak VRAM | verdict |
|
|
|
|
| 177 |
|
| 178 |
### Earlier proxy run (kept for comparison)
|
| 179 |
|
| 180 |
+
`gpt-oss-20b Q4_K_M`, 20.9B total / 3.6B active, 10.81 GiB, measured before the 35B weights finished copying:
|
| 181 |
|
| 182 |
| lane | decode | prefill | note |
|
| 183 |
|---|---|---|---|
|
|
|
|
| 205 |
| OldIron-AVX floor (`-march=sandybridge`, cross-built on Zen4) | 8.55 / 9.03 t/s | 23.9 ± 0.9 t/s |
|
| 206 |
| native (`-march=native`, built on the E5-2665) | 8.74 / 8.83 t/s | ~25 t/s |
|
| 207 |
|
| 208 |
+
Parity within run-to-run spread. Repeated on the 35B weights: floor **7.56 ± 0.03** (t=24) / 7.25 ± 0.10 (t=16)
|
| 209 |
vs native **7.63 ± 0.05** t/s — ~1% apart. One detached harness pass measured the two back to back:
|
| 210 |
floor **7.38 ± 0.02** vs native **7.43 ± 0.05**: **0.7%**, which is the run-to-run spread itself. Three independent passes of the same arms now agree within ~3-6%, so the floor is confirmed free. The two targets differ only in `-maes` (AES-NI), which no inference kernel
|
| 211 |
uses, so the cross-built floor is not leaving AVX1 performance on the table and OldIron-AVX can be built anywhere.
|
|
|
|
| 232 |
|
| 233 |
| host | CPU | quant | decode | prefill | effective weight throughput |
|
| 234 |
|---|---|---|---|---|---|
|
| 235 |
+
| Z820 #1 | 2× E5-2665 @ 2.4 GHz | IQ3_M, 3.66 bpw | 7.45 ± 0.04 t/s (t=24) | 28.5 t/s | **11.96 GB/s** |
|
| 236 |
+
| Z820 #2 | 2× E5-2687W @ 3.1 GHz | Q4_K_M, 4.85 bpw | 5.66 ± 0.02 t/s (t=16) | 40.7 t/s | **12.04 GB/s** |
|
| 237 |
|
| 238 |
Normalised for quant, the two boxes move **within 0.7% of the same bytes per second** — decode is DRAM-bound, so the
|
| 239 |
29% clock advantage buys nothing there, exactly as the memory model predicts. Prefill is compute-bound and *does*
|
|
|
|
| 246 |
|
| 247 |
- **Run the harness detached, in tmux** — the wifi link to the Z820s drops ssh sessions mid-run. tmux is installed
|
| 248 |
without root on both Z820s (`scripts/install-tmux-noroot.sh`: `apt-get download` + `dpkg -x` into `~/tmux-local`,
|
| 249 |
+
wrapper at `~/bin/tmux`); the build host has it from apt.
|
| 250 |
- **Under tmux the CLI gets a pty and enters its interactive REPL** after the first turn, hanging until the timeout
|
| 251 |
instead of exiting. Every non-interactive CLI arm needs `< /dev/null`. `llama-cli` also writes a **0-byte log**
|
| 252 |
under a tmux pty; capture CLI output over a plain ssh pipe (`llama-bench` is fine under tmux).
|
|
|
|
| 304 |
isa-audit.sh the ISA gate (see note above about the pattern)
|
| 305 |
stage-to-target.sh relocatable copy + load check
|
| 306 |
fetch-weights.sh parallel-stream weight transfer (link is wifi/WAN here)
|
| 307 |
+
acceptance-hp-z820.sh the full matrix on the Z820
|
| 308 |
```
|
| 309 |
+
On a target machine the engine sits at `<root>/engine/{bin,lib}` with the weight file wherever you keep it — nothing
|
| 310 |
+
under this repository's tree.
|