HelloSun commited on
Commit
f1303ff
·
verified ·
1 Parent(s): 72d8cb5

Fix runmem threshold unit bug; re-run all memory tiers enforced (native, v1, v2, v2 forced); add native data and forced-vs-designed explanation

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. README.md +59 -46
  2. flint-epq.patch +4 -3
  3. results/logs/common/mem_enforced_2g_arena128_summary.txt +9 -0
  4. results/logs/common/mem_enforced_summary.txt +60 -0
  5. results/logs/native/mem_enforced_native_16g_run1.log +1 -0
  6. results/logs/native/mem_enforced_native_16g_run2.log +1 -0
  7. results/logs/native/mem_enforced_native_16g_run3.log +1 -0
  8. results/logs/native/mem_enforced_native_2g_run1.log +1 -0
  9. results/logs/native/mem_enforced_native_2g_run2.log +1 -0
  10. results/logs/native/mem_enforced_native_2g_run3.log +1 -0
  11. results/logs/native/mem_enforced_native_32g_run1.log +37 -0
  12. results/logs/native/mem_enforced_native_32g_run2.log +37 -0
  13. results/logs/native/mem_enforced_native_32g_run3.log +37 -0
  14. results/logs/native/mem_enforced_native_4g_run1.log +1 -0
  15. results/logs/native/mem_enforced_native_4g_run2.log +1 -0
  16. results/logs/native/mem_enforced_native_4g_run3.log +1 -0
  17. results/logs/native/mem_enforced_native_8g_run1.log +1 -0
  18. results/logs/native/mem_enforced_native_8g_run2.log +1 -0
  19. results/logs/native/mem_enforced_native_8g_run3.log +1 -0
  20. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run1.log +0 -0
  21. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run2.log +0 -0
  22. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run3.log +0 -0
  23. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run1.log +0 -0
  24. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run2.log +0 -0
  25. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run3.log +0 -0
  26. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run1.log +0 -0
  27. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run2.log +0 -0
  28. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run3.log +0 -0
  29. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run1.log +0 -0
  30. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run2.log +0 -0
  31. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run3.log +0 -0
  32. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run1.log +0 -0
  33. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run2.log +0 -0
  34. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run3.log +0 -0
  35. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run1.log +0 -0
  36. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run2.log +0 -0
  37. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run3.log +0 -0
  38. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run1.log +0 -0
  39. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run2.log +0 -0
  40. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run3.log +0 -0
  41. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run1.log +0 -0
  42. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run2.log +0 -0
  43. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run3.log +0 -0
  44. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run1.log +0 -0
  45. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run2.log +0 -0
  46. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run3.log +0 -0
  47. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run1.log +0 -0
  48. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run2.log +0 -0
  49. results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run3.log +0 -0
  50. results/logs/{common → superseded_runmem_threshold_bug}/mem_summary.txt +0 -0
README.md CHANGED
@@ -14,12 +14,13 @@ tags:
14
 
15
  CPU expert paging for the Unsloth `flint-UD-Q4_K_XL.gguf` checkpoint. Routed gate/up/down expert weights stay on disk and are copied into a bounded RAM arena as needed. Flint's router, selected-expert weights, shared expert, attention and dense layers remain on the upstream llama.cpp graph.
16
 
17
- Two versions are measured throughout:
18
 
 
19
  - **v1**: expert paging with the per-expert custom op ("mode C"). `SDQ_PRELOAD=0 SDQ_ROW_PARALLEL=0`.
20
- - **v2**: v1 plus preload of all experts into the arena and row-parallel decode for gated (gate/up/down) experts. `SDQ_PRELOAD=1 SDQ_ROW_PARALLEL=1`, arena ≥ 28.6 GiB.
21
-
22
- Native llama.cpp (`SDQ_PAGER=0`) is the reference.
23
 
24
  ## Source model
25
 
@@ -35,17 +36,17 @@ System information recorded on 2026-10-23:
35
  |---|---|
36
  | CPU | Intel Xeon Platinum 8559C, 2 sockets × 48 cores, SMT enabled (192 host logical CPUs) |
37
  | CPU features | AVX2, AVX-512, VNNI, BF16; AMX available on host but disabled for this build |
38
- | Container CPU quota | 16 CPUs (`cpu.max` = 1,600,000 / 100,000); v1 memory tiers used 16 threads, v2 and the throughput runs used 16 threads |
39
  | Host memory | 2.0 TiB reported by `free` |
40
  | Container memory limit | 104,000,000,000 bytes (about 96.9 GiB), cgroup v2 |
41
  | Container swap limit | 2,936,848,384 bytes (about 2.74 GiB); measured test processes used 0 swap |
42
  | GPU | No GPU used; CPU-only build and inference |
43
  | OS / kernel | Amazon Linux 2023 x86_64, Linux 6.18.48 |
44
- | llama.cpp | `970b51ce7c9ba5fff0726c5e9994f1c2f0e4eedc` (`970b51c`) + `flint-epq.patch` (sha256 `f6ae3fd33dcd29a132e37bfebacc6c452778e752266bb963718f8ec6f9522572`) |
45
 
46
  ## Build
47
 
48
- Start from llama.cpp commit `970b51ce7c9ba5fff0726c5e9994f1c2f0e4eedc`, apply `flint-epq.patch`, then build CPU tools. This exact sequence was verified on a fresh checkout.
49
 
50
  ```bash
51
  git clone https://github.com/ggml-org/llama.cpp
@@ -77,7 +78,7 @@ SDQ_PAGER=1 SDQ_PREFETCH=0 SDQ_ARENA_MB=29400 SDQ_PRELOAD=1 SDQ_ROW_PARALLEL=1 \
77
  -p 'Explain in one sentence why the sky is blue.' -n 32 -t 16 --temp 0 --single-turn --simple-io
78
  ```
79
 
80
- `SDQ_PAGER=0` selects the native llama.cpp MoE path. `SDQ_ARENA_MB` sets the expert cache size. `SDQ_STATS_FILE=/path/to/stats.jsonl` writes JSON statistics.
81
 
82
  ## Numerical validation
83
 
@@ -93,60 +94,72 @@ Reference: native llama.cpp (`SDQ_PAGER=0`) on the same binary. Text: the first
93
  | Decode KL vs native (`-ub 1`, 16 threads, 2 chunks) | — | 0.044057; top-1 92.5 % | 0.044057; top-1 92.5 % |
94
  | **Control:** native `-ub 64` vs native `-ub 1` (only float order changes) | — | — | mean KLD 0.034464; top-1 90.2 % |
95
  | Decode v2 vs v1 (`-ub 1`, 16 threads) | — | — | KLD 1e-6 (max 3.8e-5); top-1 100 % |
 
96
  | Layer-wise MoE output, layers 2–6, EPQ vs native (same input) | — | max relative diff ≤ 1.6e-5 | — |
97
 
98
  Findings:
99
 
100
  - **v2 row-parallel is numerically equivalent to v1** in decode (KL 1e-6, top-1 100 %) and identical to v1 in prefill (prefill does not use row-parallel). It is not bit-identical.
101
- - **EPQ is not bit-identical to native.** Float summation order differs, and 8-bit activation quantization amplifies the difference through the layers. The native `-ub 1` vs `-ub 64` control gives a KL divergence of the same magnitude (0.034 vs 0.044). The deviation is in the range of ordinary reordering sensitivity for this checkpoint; it is a measured conclusion from these runs, not a proof of exact equivalence.
102
- - **Greedy text identity is fragile.** At 8 threads the 24-token output matches native exactly; at 16 threads it diverges after 12 characters, for v1 and v2 alike. The divergence is a near-tie argmax flip caused by the reordering above.
103
 
104
- ## Memory benchmark: v1 and v2 at each tier
105
 
106
- `bench.sh <GiB> <pager 0|1>` runs a fixed prompt and samples process-tree RSS every 20 ms. If sampled RSS exceeds the requested limit, the watchdog kills the run. This is a sampled RSS watchdog, not a kernel/cgroup hard limit: RSS may briefly exceed the threshold between samples, and it counts file-backed pages as reported by `/proc`. `tools/runmem_cgroup.py` (cgroup-v2 `MemoryMax`) is included but **untested in this environment**; it requires a host with writable cgroup v2 and systemd.
107
 
108
- Version is selected with environment variables:
109
 
110
- - **v1**: `SDQ_PRELOAD=0 SDQ_ROW_PARALLEL=0` (the `bench.sh` defaults)
111
- - **v2 as designed**: `SDQ_PRELOAD=1 SDQ_ROW_PARALLEL=1`
112
- - **v2 forced (ablation)**: as v2, plus `SDQ_ROWPAR_MAX_MISS=100000`, which lets row-parallel run even when some needed experts are not resident
113
 
114
- ```bash
115
- for cap in 2 4 8 16 32; do ./bench.sh "$cap" 1; done # v1, 16 threads
116
- SDQ_PRELOAD=1 SDQ_ROW_PARALLEL=1 ARENA_MB=29400 ./bench.sh 32 1 # v2 at 32 GiB
117
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
 
119
- Workload: context 128, batch 32, ubatch 16, 8 generated tokens, 16 threads, prefetch off. Each row is the median of 3 runs, with all runs exited 0, swap 0 and below their threshold. The path counter (`MoE op 路徑計數`) is printed at exit and shows how many MoE ops used row-parallel (RP) and mode C.
 
 
 
120
 
121
- | Tier | Version | Arena (slots) | Peak RSS | Prompt | Generation | RP / mode C ops |
122
- |---:|---|---:|---:|---:|---:|---:|
123
- | 2 GiB | v1 | 256 MiB (105) | 2.014 GiB | 6.9 t/s | 3.9 t/s | 0 / 516 |
124
- | 2 GiB | v2 as designed | 256 MiB (105) | 2.014 GiB | 6.9 t/s | 3.9 t/s | 0 / 516 |
125
- | 2 GiB | v2 forced | 256 MiB (105) | 2.009 GiB | 6.9 t/s | 3.9 t/s | 425 / 91 |
126
- | 4 GiB | v1 | 1 GiB (420) | 2.765 GiB | 7.1 t/s | 4.4 t/s | 0 / 516 |
127
- | 4 GiB | v2 as designed | 1 GiB (420) | 2.765 GiB | 7.1 t/s | 4.6 t/s | 0 / 516 |
128
- | 4 GiB | v2 forced | 1 GiB (420) | 2.759 GiB | 7.2 t/s | 4.8 t/s | 425 / 91 |
129
- | 8 GiB | v1 | 3 GiB (1,260) | 4.766 GiB | 9.4 t/s | 4.4 t/s | 0 / 516 |
130
- | 8 GiB | v2 as designed | 3 GiB (1,260) | 4.766 GiB | 9.6 t/s | 4.7 t/s | 0 / 516 |
131
- | 8 GiB | v2 forced | 3 GiB (1,260) | 4.759 GiB | 9.6 t/s | 5.0 t/s | 425 / 91 |
132
- | 16 GiB | v1 | 10 GiB (4,201) | 11.767 GiB | 12.5 t/s | 5.2 t/s | 0 / 516 |
133
- | 16 GiB | v2 as designed | 10 GiB (4,201) | 11.767 GiB | 13.0 t/s | 5.3 t/s | 12 / 504 |
134
- | 16 GiB | v2 forced | 10 GiB (4,201) | 11.760 GiB | 12.6 t/s | 5.3 t/s | 425 / 91 |
135
- | 32 GiB | v1 | 18 GiB (7,561 of 12,032) | 19.766 GiB | 12.0 t/s | 5.2 t/s | 0 / 516 |
136
- | 32 GiB | v2 as designed | 28.7 GiB (12,061, all experts) | 30.473 GiB | 35.0 t/s | 14.2 t/s | 425 / 91 |
137
- | 32 GiB | v2 forced | 18 GiB (7,561 of 12,032) | 19.759 GiB | 11.1 t/s | 5.8 t/s | 425 / 91 |
138
 
139
- What this shows:
140
 
141
- - **v2 as designed only activates at the 32 GiB tier with a full arena.** The preload and the row-parallel guard need every needed expert resident. At 2–8 GiB no layer ever has all its experts resident, so v2 runs the same mode C path as v1 (0 RP ops). The 4 and 8 GiB rows differ from v1 only by run-to-run noise (about ±10 %). At 16 GiB, 12 of 516 ops happened to find their experts resident and took the row-parallel path; the effect on speed is within noise.
142
- - **v2 at 32 GiB with the full arena: generation 14.2 t/s vs 5.2 t/s for v1 at the same tier (about 2.7×).** Peak RSS 30.5 GiB, under the 32 GiB watchdog. This is the only v2 configuration that the design targets.
143
- - **Forced row-parallel (ablation):** generation rises about 9–14 % at 4, 8 and 32 GiB (4.8, 5.0, 5.8 t/s vs 4.4, 4.4, 5.2). These gains are at the edge of the run-to-run noise and need more runs before they are claimed. Output is numerically unchanged: decode-mode KL at a 1 GiB forced arena is 0.044057, identical at reported precision to v1 with a full arena (see `results/logs/v2/kl_decode_ub1_t16_forced_rowpar_1g_vs_native.log`).
144
 
145
- Raw logs: v1 `results/logs/v1/mem_v1_*.log`; v2 `results/logs/v2/mem_default_*.log` and `results/logs/v2/mem_forced_*.log`; summaries `results/logs/common/v2_mem_summary.txt` and `results/logs/common/mem_summary.txt`. The earlier `results/logs/v2/v2_32g_run*.log` are the same 32 GiB configuration from an earlier command and are superseded by `mem_default_32g_*`.
146
 
147
- ## Throughput (v1, v2, native)
148
 
149
- Separate workload from the memory tiers: context 512, batch 128, ubatch 32, 32 generated tokens, 16 threads, 3 runs each (median).
150
 
151
  | Configuration | Prompt | Generation | Peak RSS | Logs |
152
  |---|---:|---:|---:|---|
@@ -155,7 +168,7 @@ Separate workload from the memory tiers: context 512, batch 128, ubatch 32, 32 g
155
  | v1, arena 28.7 GiB, no preload | 12.3 t/s | 5.5 t/s | 30.51 GiB | `results/logs/v1/perf_c512_v1_arena28g_*` |
156
  | **v2**, arena 28.7 GiB, preload + row-parallel | **32.4 t/s** | **16.2 t/s** | 30.50 GiB | `results/logs/v2/perf_c512_v2_arena28g_*` |
157
 
158
- v2 generates about 2.9× faster than v1 and about 75 % of native generation speed. The prompt phase is also faster in v2 (likely because the preload removes SSD reads during prefill, which still uses mode C; not separately measured). The v1 and v2 rows at 28.7 GiB have nearly the same RSS because the prompt already touches most experts in both runs.
159
 
160
  ## Version coverage
161
 
 
14
 
15
  CPU expert paging for the Unsloth `flint-UD-Q4_K_XL.gguf` checkpoint. Routed gate/up/down expert weights stay on disk and are copied into a bounded RAM arena as needed. Flint's router, selected-expert weights, shared expert, attention and dense layers remain on the upstream llama.cpp graph.
16
 
17
+ Three configurations are measured throughout:
18
 
19
+ - **native**: unmodified llama.cpp MoE path (`SDQ_PAGER=0`), the reference.
20
  - **v1**: expert paging with the per-expert custom op ("mode C"). `SDQ_PRELOAD=0 SDQ_ROW_PARALLEL=0`.
21
+ - **v2**: v1 plus preload of all experts into the arena and row-parallel decode for gated (gate/up/down) experts. `SDQ_PRELOAD=1 SDQ_ROW_PARALLEL=1`, arena ≥ 28.6 GiB. Two sub-variants:
22
+ - **v2 as designed**: row-parallel runs only when every needed expert is resident (default guard).
23
+ - **v2 forced**: `SDQ_ROWPAR_MAX_MISS=100000`, row-parallel runs even when some needed experts are missing (ablation; see below).
24
 
25
  ## Source model
26
 
 
36
  |---|---|
37
  | CPU | Intel Xeon Platinum 8559C, 2 sockets × 48 cores, SMT enabled (192 host logical CPUs) |
38
  | CPU features | AVX2, AVX-512, VNNI, BF16; AMX available on host but disabled for this build |
39
+ | Container CPU quota | 16 CPUs (`cpu.max` = 1,600,000 / 100,000). All memory and throughput runs used 16 threads |
40
  | Host memory | 2.0 TiB reported by `free` |
41
  | Container memory limit | 104,000,000,000 bytes (about 96.9 GiB), cgroup v2 |
42
  | Container swap limit | 2,936,848,384 bytes (about 2.74 GiB); measured test processes used 0 swap |
43
  | GPU | No GPU used; CPU-only build and inference |
44
  | OS / kernel | Amazon Linux 2023 x86_64, Linux 6.18.48 |
45
+ | llama.cpp | `970b51ce7c9ba5fff0726c5e9994f1c2f0e4eedc` (`970b51c`) + `flint-epq.patch` (sha256 `b8a4e77af3743bd35bd4c14258c70c12031e60ba264f95ab93593519ea0ab08c`) |
46
 
47
  ## Build
48
 
49
+ Start from llama.cpp commit `970b51ce7c9ba5fff0726c5e9994f1c2f0e4eedc`, apply `flint-epq.patch`, then build CPU tools. The patch was verified on a fresh checkout.
50
 
51
  ```bash
52
  git clone https://github.com/ggml-org/llama.cpp
 
78
  -p 'Explain in one sentence why the sky is blue.' -n 32 -t 16 --temp 0 --single-turn --simple-io
79
  ```
80
 
81
+ `SDQ_PAGER=0` selects the native llama.cpp MoE path. `SDQ_ARENA_MB` sets the expert cache size. `SDQ_STATS_FILE=/path/to/stats.jsonl` writes JSON statistics. At exit the program prints `MoE op 路徑計數:row-parallel N 次,mode C M 次`, which shows which path each MoE op used.
82
 
83
  ## Numerical validation
84
 
 
94
  | Decode KL vs native (`-ub 1`, 16 threads, 2 chunks) | — | 0.044057; top-1 92.5 % | 0.044057; top-1 92.5 % |
95
  | **Control:** native `-ub 64` vs native `-ub 1` (only float order changes) | — | — | mean KLD 0.034464; top-1 90.2 % |
96
  | Decode v2 vs v1 (`-ub 1`, 16 threads) | — | — | KLD 1e-6 (max 3.8e-5); top-1 100 % |
97
+ | Decode, v2 forced with 1 GiB arena vs native | — | — | 0.044057; identical to v1 at reported precision |
98
  | Layer-wise MoE output, layers 2–6, EPQ vs native (same input) | — | max relative diff ≤ 1.6e-5 | — |
99
 
100
  Findings:
101
 
102
  - **v2 row-parallel is numerically equivalent to v1** in decode (KL 1e-6, top-1 100 %) and identical to v1 in prefill (prefill does not use row-parallel). It is not bit-identical.
103
+ - **EPQ is not bit-identical to native.** Float summation order differs, and 8-bit activation quantization amplifies the difference through the layers. The native `-ub 1` vs `-ub 64` control gives a KL divergence of the same magnitude (0.034 vs 0.044). This is a measured conclusion from these runs, not a proof of exact equivalence.
104
+ - **Greedy text identity is fragile.** At 8 threads the 24-token output matches native exactly; at 16 threads it diverges after 12 characters, for v1 and v2 alike.
105
 
106
+ ## Memory benchmark (RSS watchdog, enforced)
107
 
108
+ `bench.sh <GiB> <pager 0|1>` runs a fixed prompt and samples process-tree RSS every 20 ms. If sampled RSS exceeds the tier, the watchdog kills the run (exit −9). This is a sampled watchdog, not a kernel/cgroup hard limit: RSS may briefly exceed the threshold between samples, and it counts file-backed pages as reported by `/proc`. `tools/runmem_cgroup.py` (cgroup-v2 `MemoryMax`) is included but **untested in this environment**.
109
 
110
+ > **Correction.** The threshold check in `tools/runmem.py` compared `VmRSS` in kB against GiB in bytes, so the watchdog never fired. Every "PASS, under threshold" statement in earlier versions of this card was therefore unverified. The peak RSS values were measured correctly. The check is fixed in this patch, and all tier results below are re-run with enforcement. The earlier tables are in `results/logs/superseded_runmem_threshold_bug/`.
111
 
112
+ Settings: context 128, batch 32, ubatch 16, 8 generated tokens, 16 threads, prefetch off. Each row is the median of 3 runs. "killed" means the watchdog terminated all 3 runs. Path counts are RP (row-parallel) / mode C ops.
 
 
113
 
114
+ Native llama.cpp needs about 24.3 GiB, so it cannot run below 32 GiB under this watchdog. For 2 GiB, the 256 MiB arena from the earlier table sits right at the threshold (peak 2.000–2.001 GiB) and is killed, so the table adds a 128 MiB arena row that passes.
115
+
116
+ | Tier | Configuration | Arena (slots) | Result | Peak RSS | Prompt | Generation | RP / mode C |
117
+ |---:|---|---:|---|---:|---:|---:|---:|
118
+ | 2 GiB | native | — | killed (peak 2.2–3.0 GiB at kill) | — | — | — | — |
119
+ | 2 GiB | v1 | 256 MiB (105) | killed | 2.000–2.001 GiB at kill | — | — | 0 / 516 |
120
+ | 2 GiB | v2 as designed | 256 MiB (105) | killed | 2.000–2.001 GiB at kill | — | — | 0 / 516 |
121
+ | 2 GiB | v2 forced | 256 MiB (105) | killed | 2.001 GiB at kill | — | — | 425 / 91 |
122
+ | 2 GiB | v1 | 128 MiB (52) | pass | 1.887 GiB | 6.3 t/s | 3.9 t/s | 0 / 516 |
123
+ | 2 GiB | v2 as designed | 128 MiB (52) | pass | 1.886 GiB | 6.1 t/s | 3.8 t/s | 0 / 516 |
124
+ | 2 GiB | v2 forced | 128 MiB (52) | pass | 1.883 GiB | 6.1 t/s | 3.9 t/s | 425 / 91 |
125
+ | 4 GiB | native | — | killed (peak 4.1–4.3 GiB at kill) | — | — | — | — |
126
+ | 4 GiB | v1 | 1 GiB (420) | pass | 2.765 GiB | 6.5 t/s | 4.7 t/s | 0 / 516 |
127
+ | 4 GiB | v2 as designed | 1 GiB (420) | pass | 2.765 GiB | 7.1 t/s | 4.8 t/s | 0 / 516 |
128
+ | 4 GiB | v2 forced | 1 GiB (420) | pass | 2.759 GiB | 7.0 t/s | 4.7 t/s | 425 / 91 |
129
+ | 8 GiB | native | — | killed (peak 8.1–8.2 GiB at kill) | — | — | — | — |
130
+ | 8 GiB | v1 | 3 GiB (1,260) | pass | 4.766 GiB | 8.8 t/s | 4.8 t/s | 0 / 516 |
131
+ | 8 GiB | v2 as designed | 3 GiB (1,260) | pass | 4.765 GiB | 9.3 t/s | 4.9 t/s | 0 / 516 |
132
+ | 8 GiB | v2 forced | 3 GiB (1,260) | pass | 4.759 GiB | 9.1 t/s | 5.3 t/s | 425 / 91 |
133
+ | 16 GiB | native | — | killed (peak 16.0–16.5 GiB at kill) | — | — | — | — |
134
+ | 16 GiB | v1 | 10 GiB (4,201) | pass | 11.766 GiB | 11.2 t/s | 5.5 t/s | 0 / 516 |
135
+ | 16 GiB | v2 as designed | 10 GiB (4,201) | pass | 11.766 GiB | 12.1 t/s | 5.5 t/s | 12 / 504 |
136
+ | 16 GiB | v2 forced | 10 GiB (4,201) | pass | 11.760 GiB | 12.6 t/s | 5.5 t/s | 425 / 91 |
137
+ | 32 GiB | native | — | pass | 24.286 GiB | 50.3 t/s | 21.8 t/s | — |
138
+ | 32 GiB | v1 | 18 GiB (7,561 of 12,032) | pass | 19.765 GiB | 11.3 t/s | 5.7 t/s | 0 / 516 |
139
+ | 32 GiB | v2 as designed | 28.7 GiB (12,061, all experts) | pass | 30.473 GiB | 34.7 t/s | 14.6 t/s | 425 / 91 |
140
+ | 32 GiB | v2 forced | 18 GiB (7,561 of 12,032) | pass | 19.759 GiB | 12.7 t/s | 5.2 t/s | 425 / 91 |
141
+
142
+ Throughput is noisy: single runs vary by about ±15 %, and one v1 4 GiB run produced 2.6 t/s. Read the speed columns as approximate.
143
+
144
+ ### What the enforced results show
145
 
146
+ - **Native llama.cpp is killed at 2, 4, 8 and 16 GiB.** It runs only with at least 24.3 GiB. EPQ is the only one of the two that runs under the lower tiers.
147
+ - **At the 2 GiB tier the expert arena must be about 128 MiB.** With 256 MiB the process peaks at 2.000–2.001 GiB and is killed.
148
+ - **v2 as designed differs from v1 only at 32 GiB with the full arena.** At 2–8 GiB no layer has all its experts resident, so v2 runs mode C (0 RP ops). At 16 GiB, 12 of 516 ops were row-parallel, which makes no measurable difference. At 32 GiB, v2 generates 14.6 t/s against 5.7 t/s for v1 (about 2.6×).
149
+ - **Forced row-parallel shows no reliable speed gain.** Its medians are within run-to-run noise of v1 and v2 at every tier. The +9–14 % gains reported in the previous version of this card came from the unenforced runs and are retracted. Output is numerically unchanged (decode KL 0.044057 at a 1 GiB forced arena).
150
 
151
+ ## Forced vs as designed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
+ Row-parallel decode computes all experts for a layer in one pass across all threads. That is only efficient when every expert it needs is already in the arena:
154
 
155
+ - **As designed** (`SDQ_ROWPAR_MAX_MISS=0`, the default). A layer uses row-parallel only if every needed expert is resident. Otherwise it falls back to mode C, which reads each expert from SSD while computing the previous one, so I/O and compute overlap.
156
+ - **Forced** (`SDQ_ROWPAR_MAX_MISS=100000`). A decode op uses row-parallel whenever the number of needed experts is below the thread count, even if some experts are missing. Missing experts are then loaded with blocking reads inside row-parallel setup before compute starts, so I/O and compute no longer overlap.
 
157
 
158
+ The forced mode trades that overlap for a larger parallel region. In these runs the trade is neutral: the forced variant does 425 row-parallel ops at every tier and gives the same speed within noise. It is an ablation, not a recommended setting. A workload with many misses could be slower than mode C, which this card does not measure.
159
 
160
+ ## Throughput (native, v1, v2)
161
 
162
+ Separate workload from the memory tiers: context 512, batch 128, ubatch 32, 32 generated tokens, 16 threads, 3 runs each (median). No watchdog was applied to these runs.
163
 
164
  | Configuration | Prompt | Generation | Peak RSS | Logs |
165
  |---|---:|---:|---:|---|
 
168
  | v1, arena 28.7 GiB, no preload | 12.3 t/s | 5.5 t/s | 30.51 GiB | `results/logs/v1/perf_c512_v1_arena28g_*` |
169
  | **v2**, arena 28.7 GiB, preload + row-parallel | **32.4 t/s** | **16.2 t/s** | 30.50 GiB | `results/logs/v2/perf_c512_v2_arena28g_*` |
170
 
171
+ v2 generates about 2.9× faster than v1 and about 75 % of native generation speed in this workload. The prompt phase is also faster in v2, likely because the preload removes SSD reads during prefill; this was not measured separately.
172
 
173
  ## Version coverage
174
 
flint-epq.patch CHANGED
@@ -4688,10 +4688,10 @@ index 0000000..b109f33
4688
 
4689
  diff --git a/tools/runmem.py b/tools/runmem.py
4690
  new file mode 100644
4691
- index 0000000..765be84
4692
  --- /dev/null
4693
  +++ b/tools/runmem.py
4694
- @@ -0,0 +1,79 @@
4695
  +#!/usr/bin/env python3
4696
  +"""Sample process-tree RSS/swap while running a command."""
4697
  +
@@ -4746,7 +4746,8 @@ index 0000000..765be84
4746
  + pass
4747
  + peak_rss = max(peak_rss, rss)
4748
  + peak_swap = max(peak_swap, swap)
4749
- + if args.rss_limit_gib is not None and rss > args.rss_limit_gib * (1024 ** 3):
 
4750
  + exceeded = True
4751
  + process.send_signal(signal.SIGKILL)
4752
  + break
 
4688
 
4689
  diff --git a/tools/runmem.py b/tools/runmem.py
4690
  new file mode 100644
4691
+ index 0000000..9d5e96c
4692
  --- /dev/null
4693
  +++ b/tools/runmem.py
4694
+ @@ -0,0 +1,80 @@
4695
  +#!/usr/bin/env python3
4696
  +"""Sample process-tree RSS/swap while running a command."""
4697
  +
 
4746
  + pass
4747
  + peak_rss = max(peak_rss, rss)
4748
  + peak_swap = max(peak_swap, swap)
4749
+ + # VmRSS 以 kB 為單位,門檻須換算成 kB(1 GiB = 1024 * 1024 kB)
4750
+ + if args.rss_limit_gib is not None and rss > args.rss_limit_gib * (1024 ** 2):
4751
  + exceeded = True
4752
  + process.send_signal(signal.SIGKILL)
4753
  + break
results/logs/common/mem_enforced_2g_arena128_summary.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ v1 2 GiB arena128 run1 | Prompt: 6.7 t/s | Generation: 3.9 | peak "peak_gib": 1.887 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
2
+ v2 2 GiB arena128 run1 | Prompt: 6.1 t/s | Generation: 3.8 | peak "peak_gib": 1.887 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
3
+ v2forced 2 GiB arena128 run1 | Prompt: 4.1 t/s | Generation: 3.9 | peak "peak_gib": 1.883 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
4
+ v1 2 GiB arena128 run2 | Prompt: 6.1 t/s | Generation: 3.9 | peak "peak_gib": 1.887 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
5
+ v2 2 GiB arena128 run2 | Prompt: 6.8 t/s | Generation: 3.9 | peak "peak_gib": 1.886 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
6
+ v2forced 2 GiB arena128 run2 | Prompt: 6.2 t/s | Generation: 3.8 | peak "peak_gib": 1.883 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
7
+ v1 2 GiB arena128 run3 | Prompt: 6.3 t/s | Generation: 3.9 | peak "peak_gib": 1.887 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
8
+ v2 2 GiB arena128 run3 | Prompt: 6.1 t/s | Generation: 3.8 | peak "peak_gib": 1.886 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
9
+ v2forced 2 GiB arena128 run3 | Prompt: 6.1 t/s | Generation: 3.9 | peak "peak_gib": 1.883 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
results/logs/common/mem_enforced_summary.txt ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ native 2 GiB run1 | | peak "peak_gib": 3.039 | exceeded "limit_exceeded": true | exit "exit": -9 |
2
+ native 2 GiB run2 | | peak "peak_gib": 2.422 | exceeded "limit_exceeded": true | exit "exit": -9 |
3
+ native 2 GiB run3 | | peak "peak_gib": 2.214 | exceeded "limit_exceeded": true | exit "exit": -9 |
4
+ v1 2 GiB run1 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
5
+ v1 2 GiB run2 | | peak "peak_gib": 2.0 | exceeded "limit_exceeded": true | exit "exit": -9 |
6
+ v1 2 GiB run3 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
7
+ v2 2 GiB run1 | | peak "peak_gib": 2.0 | exceeded "limit_exceeded": true | exit "exit": -9 |
8
+ v2 2 GiB run2 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
9
+ v2 2 GiB run3 | | peak "peak_gib": 2.0 | exceeded "limit_exceeded": true | exit "exit": -9 |
10
+ v2forced 2 GiB run1 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
11
+ v2forced 2 GiB run2 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
12
+ v2forced 2 GiB run3 | | peak "peak_gib": 2.001 | exceeded "limit_exceeded": true | exit "exit": -9 |
13
+ native 4 GiB run1 | | peak "peak_gib": 4.195 | exceeded "limit_exceeded": true | exit "exit": -9 |
14
+ native 4 GiB run2 | | peak "peak_gib": 4.123 | exceeded "limit_exceeded": true | exit "exit": -9 |
15
+ native 4 GiB run3 | | peak "peak_gib": 4.274 | exceeded "limit_exceeded": true | exit "exit": -9 |
16
+ v1 4 GiB run1 | Prompt: 7.4 t/s | Generation: 4.7 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
17
+ v1 4 GiB run2 | Prompt: 5.9 t/s | Generation: 2.6 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
18
+ v1 4 GiB run3 | Prompt: 6.5 t/s | Generation: 4.7 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
19
+ v2 4 GiB run1 | Prompt: 7.3 t/s | Generation: 4.8 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
20
+ v2 4 GiB run2 | Prompt: 7.1 t/s | Generation: 4.8 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
21
+ v2 4 GiB run3 | Prompt: 7.0 t/s | Generation: 4.6 | peak "peak_gib": 2.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
22
+ v2forced 4 GiB run1 | Prompt: 7.2 t/s | Generation: 4.8 | peak "peak_gib": 2.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
23
+ v2forced 4 GiB run2 | Prompt: 7.0 t/s | Generation: 4.7 | peak "peak_gib": 2.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
24
+ v2forced 4 GiB run3 | Prompt: 7.0 t/s | Generation: 4.7 | peak "peak_gib": 2.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
25
+ native 8 GiB run1 | | peak "peak_gib": 8.143 | exceeded "limit_exceeded": true | exit "exit": -9 |
26
+ native 8 GiB run2 | | peak "peak_gib": 8.08 | exceeded "limit_exceeded": true | exit "exit": -9 |
27
+ native 8 GiB run3 | | peak "peak_gib": 8.179 | exceeded "limit_exceeded": true | exit "exit": -9 |
28
+ v1 8 GiB run1 | Prompt: 8.5 t/s | Generation: 4.8 | peak "peak_gib": 4.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
29
+ v1 8 GiB run2 | Prompt: 9.7 t/s | Generation: 5.1 | peak "peak_gib": 4.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
30
+ v1 8 GiB run3 | Prompt: 8.8 t/s | Generation: 4.8 | peak "peak_gib": 4.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
31
+ v2 8 GiB run1 | Prompt: 9.3 t/s | Generation: 4.7 | peak "peak_gib": 4.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
32
+ v2 8 GiB run2 | Prompt: 8.4 t/s | Generation: 4.9 | peak "peak_gib": 4.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
33
+ v2 8 GiB run3 | Prompt: 9.7 t/s | Generation: 5.0 | peak "peak_gib": 4.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
34
+ v2forced 8 GiB run1 | Prompt: 8.5 t/s | Generation: 4.8 | peak "peak_gib": 4.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
35
+ v2forced 8 GiB run2 | Prompt: 9.7 t/s | Generation: 5.3 | peak "peak_gib": 4.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
36
+ v2forced 8 GiB run3 | Prompt: 9.1 t/s | Generation: 5.4 | peak "peak_gib": 4.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
37
+ native 16 GiB run1 | | peak "peak_gib": 16.544 | exceeded "limit_exceeded": true | exit "exit": -9 |
38
+ native 16 GiB run2 | | peak "peak_gib": 16.025 | exceeded "limit_exceeded": true | exit "exit": -9 |
39
+ native 16 GiB run3 | | peak "peak_gib": 16.306 | exceeded "limit_exceeded": true | exit "exit": -9 |
40
+ v1 16 GiB run1 | Prompt: 11.2 t/s | Generation: 5.5 | peak "peak_gib": 11.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
41
+ v1 16 GiB run2 | Prompt: 11.4 t/s | Generation: 5.6 | peak "peak_gib": 11.767 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
42
+ v1 16 GiB run3 | Prompt: 10.9 t/s | Generation: 5.5 | peak "peak_gib": 11.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
43
+ v2 16 GiB run1 | Prompt: 11.9 t/s | Generation: 5.4 | peak "peak_gib": 11.767 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 12 次,mode C 504 次
44
+ v2 16 GiB run2 | Prompt: 12.1 t/s | Generation: 5.5 | peak "peak_gib": 11.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 12 次,mode C 504 次
45
+ v2 16 GiB run3 | Prompt: 12.8 t/s | Generation: 5.6 | peak "peak_gib": 11.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 12 次,mode C 504 次
46
+ v2forced 16 GiB run1 | Prompt: 12.6 t/s | Generation: 5.5 | peak "peak_gib": 11.76 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
47
+ v2forced 16 GiB run2 | Prompt: 11.3 t/s | Generation: 5.4 | peak "peak_gib": 11.76 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
48
+ v2forced 16 GiB run3 | Prompt: 13.1 t/s | Generation: 5.7 | peak "peak_gib": 11.76 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
49
+ native 32 GiB run1 | Prompt: 46.9 t/s | Generation: 21.8 | peak "peak_gib": 24.286 | exceeded "limit_exceeded": false | exit "exit": 0 |
50
+ native 32 GiB run2 | Prompt: 50.3 t/s | Generation: 21.6 | peak "peak_gib": 24.286 | exceeded "limit_exceeded": false | exit "exit": 0 |
51
+ native 32 GiB run3 | Prompt: 60.5 t/s | Generation: 28.8 | peak "peak_gib": 24.286 | exceeded "limit_exceeded": false | exit "exit": 0 |
52
+ v1 32 GiB run1 | Prompt: 11.8 t/s | Generation: 5.9 | peak "peak_gib": 19.766 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
53
+ v1 32 GiB run2 | Prompt: 11.1 t/s | Generation: 5.7 | peak "peak_gib": 19.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
54
+ v1 32 GiB run3 | Prompt: 11.3 t/s | Generation: 5.4 | peak "peak_gib": 19.765 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 0 次,mode C 516 次
55
+ v2 32 GiB run1 | Prompt: 34.6 t/s | Generation: 16.5 | peak "peak_gib": 30.473 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
56
+ v2 32 GiB run2 | Prompt: 36.3 t/s | Generation: 14.6 | peak "peak_gib": 30.473 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
57
+ v2 32 GiB run3 | Prompt: 34.7 t/s | Generation: 13.8 | peak "peak_gib": 30.473 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
58
+ v2forced 32 GiB run1 | Prompt: 13.3 t/s | Generation: 5.2 | peak "peak_gib": 19.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
59
+ v2forced 32 GiB run2 | Prompt: 12.7 t/s | Generation: 5.4 | peak "peak_gib": 19.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
60
+ v2forced 32 GiB run3 | Prompt: 12.6 t/s | Generation: 5.2 | peak "peak_gib": 19.759 | exceeded "limit_exceeded": false | exit "exit": 0 | 路徑計數:row-parallel 425 次,mode C 91 次
results/logs/native/mem_enforced_native_16g_run1.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 17348012, "peak_gib": 16.544, "limit_gib": 16.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 1.72, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=10240", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_16g_run2.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 16803060, "peak_gib": 16.025, "limit_gib": 16.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 1.55, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=10240", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_16g_run3.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 17097556, "peak_gib": 16.306, "limit_gib": 16.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 1.46, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=10240", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_2g_run1.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 3186608, "peak_gib": 3.039, "limit_gib": 2.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.52, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=256", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_2g_run2.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 2539860, "peak_gib": 2.422, "limit_gib": 2.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.52, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=256", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_2g_run3.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 2321728, "peak_gib": 2.214, "limit_gib": 2.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.53, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=256", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_32g_run1.log ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ Loading model...
4
+
5
+ ▄▄ ▄▄
6
+ ██ ██
7
+ ██ ██ ▀▀█▄ ███▄███▄ ▀▀█▄ ▄████ ████▄ ████▄
8
+ ██ ██ ▄█▀██ ██ ██ ██ ▄█▀██ ██ ██ ██ ██ ██
9
+ ██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
10
+ ██ ██
11
+ ▀▀ ▀▀
12
+
13
+ build : b1-970b51c
14
+ model : /tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf
15
+ ftype : Q4_K - Medium
16
+ modalities : text
17
+
18
+ available commands:
19
+ /exit or Ctrl+C stop or exit
20
+ /regen regenerate the last response
21
+ /clear clear the chat history
22
+ /read <file> add a text file
23
+ /glob <pattern> add text files using globbing pattern
24
+
25
+
26
+
27
+ > Explain in one sentence why the sky is blue.
28
+
29
+ [Start thinking]
30
+
31
+ The user is asking for a one
32
+
33
+ [ Prompt: 46.9 t/s | Generation: 21.8 t/s ]
34
+
35
+
36
+ Exiting...
37
+ RUNMEM {"peak_kb": 25465768, "peak_gib": 24.286, "limit_gib": 32.0, "limit_exceeded": false, "swap_kb": 0, "wall_s": 3.97, "exit": 0, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=18432", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_32g_run2.log ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ Loading model...
4
+
5
+ ▄▄ ▄▄
6
+ ██ ██
7
+ ██ ██ ▀▀█▄ ███▄███▄ ▀▀█▄ ▄████ ████▄ ████▄
8
+ ██ ██ ▄█▀██ ██ ██ ██ ▄█▀██ ██ ██ ██ ██ ██
9
+ ██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
10
+ ██ ██
11
+ ▀▀ ▀▀
12
+
13
+ build : b1-970b51c
14
+ model : /tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf
15
+ ftype : Q4_K - Medium
16
+ modalities : text
17
+
18
+ available commands:
19
+ /exit or Ctrl+C stop or exit
20
+ /regen regenerate the last response
21
+ /clear clear the chat history
22
+ /read <file> add a text file
23
+ /glob <pattern> add text files using globbing pattern
24
+
25
+
26
+
27
+ > Explain in one sentence why the sky is blue.
28
+
29
+ [Start thinking]
30
+
31
+ The user is asking for a one
32
+
33
+ [ Prompt: 50.3 t/s | Generation: 21.6 t/s ]
34
+
35
+
36
+ Exiting...
37
+ RUNMEM {"peak_kb": 25465372, "peak_gib": 24.286, "limit_gib": 32.0, "limit_exceeded": false, "swap_kb": 0, "wall_s": 3.82, "exit": 0, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=18432", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_32g_run3.log ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+
3
+ Loading model...
4
+
5
+ ▄▄ ▄▄
6
+ ██ ██
7
+ ██ ██ ▀▀█▄ ███▄███▄ ▀▀█▄ ▄████ ████▄ ████▄
8
+ ██ ██ ▄█▀██ ██ ██ ██ ▄█▀██ ██ ██ ██ ██ ██
9
+ ██ ██ ▀█▄██ ██ ██ ██ ▀█▄██ ██ ▀████ ████▀ ████▀
10
+ ██ ██
11
+ ▀▀ ▀▀
12
+
13
+ build : b1-970b51c
14
+ model : /tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf
15
+ ftype : Q4_K - Medium
16
+ modalities : text
17
+
18
+ available commands:
19
+ /exit or Ctrl+C stop or exit
20
+ /regen regenerate the last response
21
+ /clear clear the chat history
22
+ /read <file> add a text file
23
+ /glob <pattern> add text files using globbing pattern
24
+
25
+
26
+
27
+ > Explain in one sentence why the sky is blue.
28
+
29
+ [Start thinking]
30
+
31
+ The user is asking for a one
32
+
33
+ [ Prompt: 60.5 t/s | Generation: 28.8 t/s ]
34
+
35
+
36
+ Exiting...
37
+ RUNMEM {"peak_kb": 25465896, "peak_gib": 24.286, "limit_gib": 32.0, "limit_exceeded": false, "swap_kb": 0, "wall_s": 3.61, "exit": 0, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=18432", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_4g_run1.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 4399196, "peak_gib": 4.195, "limit_gib": 4.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.65, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=1024", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_4g_run2.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 4323576, "peak_gib": 4.123, "limit_gib": 4.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.61, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=1024", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_4g_run3.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 4481508, "peak_gib": 4.274, "limit_gib": 4.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.66, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=1024", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_8g_run1.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 8538404, "peak_gib": 8.143, "limit_gib": 8.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 1.01, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=3072", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_8g_run2.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 8472136, "peak_gib": 8.08, "limit_gib": 8.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.95, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=3072", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/native/mem_enforced_native_8g_run3.log ADDED
@@ -0,0 +1 @@
 
 
1
+ RUNMEM {"peak_kb": 8576276, "peak_gib": 8.179, "limit_gib": 8.0, "limit_exceeded": true, "swap_kb": 0, "wall_s": 0.98, "exit": -9, "cmd": ["env", "SDQ_PAGER=0", "SDQ_PREFETCH=0", "SDQ_ARENA_MB=3072", "SDQ_PRELOAD=0", "SDQ_ROW_PARALLEL=0", "/tmp/opencode/flint-work/llama.cpp/build/bin/llama-cli", "-m", "/tmp/opencode/flint-work/llama.cpp/models/flint-UD-Q4_K_XL.gguf", "-c", "128", "-b", "32", "-ub", "16", "-p", "Explain in one sentence why the sky is blue.", "-n", "8", "-t", "16", "--temp", "0", "-st", "--simple-io"], "method": "procfs-rss-watchdog"}
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_16g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_2g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_32g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_4g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_default_8g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_16g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_2g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_32g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_4g_run3.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run1.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run2.log RENAMED
File without changes
results/logs/{v2 → superseded_runmem_threshold_bug}/mem_forced_8g_run3.log RENAMED
File without changes
results/logs/{common → superseded_runmem_threshold_bug}/mem_summary.txt RENAMED
File without changes