Push Tracker
experiments-07-07-12-local-.../POWER_ANALYSIS.md
2026-07-13 01:35:10 +00:00

129 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Dual-MI50 Power × Context Sweep
**Recommendation:** do **not** adopt 180 W or 160 W for large-context service; their 32K prefill retention falls to **71.1%** and **20.1%**. On the present data, use **225 W as the single safe cap**. If accepting a provisional split, use **225 W for interactive/chat** and **200 W for prefill-heavy long-context/RAG**, because 200 W retains **102.7%** of 32K prefill—but this split must be revalidated: decode measurements are highly non-monotonic and every `draw_w` value is missing.
Source: `mi50_pxc_sweep_20260712_191205.csv` (most recent sweep).
## Raw pivot tables
### Prefill throughput (`pp_tok_s`)
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 3.42 | 2.52 | 2.79 | 5.51 |
| 200 W | 3.14 | 2.68 | 3.52 | 5.66 |
| 180 W | 3.62 | 3.34 | 1.88 | 3.92 |
| 160 W | 2.96 | 2.99 | 1.41 | 1.11 |
### Decode throughput (`tg_tok_s`)
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 0.32 | 0.60 | 0.22 | 0.72 |
| 200 W | 0.16 | 0.34 | 0.22 | 0.41 |
| 180 W | 0.21 | 0.29 | 0.27 | 0.28 |
| 160 W | 0.24 | 0.16 | 0.23 | 0.53 |
The absolute throughput shape is suspicious: decode changes non-monotonically with both context and power, and 32K prefill is faster than several much smaller contexts. Some batching/overhead effects can make long prefills more efficient, but the size and inconsistency here require repeated measurements and variance reporting.
## Retention versus 225 W
Legend: **<95%**, ** <90%**. Values above 100% indicate measurement variance or a confound, not a physical efficiency gain that should be assumed reproducible.
### Prefill retention
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 100.0% | 100.0% | 100.0% | 100.0% |
| 200 W | ** 91.8%** | 106.3% | 126.2% | 102.7% |
| 180 W | 105.8% | 132.5% | ** 67.4%** | ** 71.1%** |
| 160 W | ** 86.5%** | 118.7% | ** 50.5%** | ** 20.1%** |
### Decode retention
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 100.0% | 100.0% | 100.0% | 100.0% |
| 200 W | ** 50.0%** | ** 56.7%** | 100.0% | ** 56.9%** |
| 180 W | ** 65.6%** | ** 48.3%** | 122.7% | ** 38.9%** |
| 160 W | ** 75.0%** | ** 26.7%** | 104.5% | ** 73.6%** |
No lower cap is consistently within 95% of baseline. For prefill, 200 W is effectively free at 4K32K in this sample, while 180/160 W collapse at 16K32K. Decode does **not** show the expected flat memory-bound behavior; almost every lower-power cell is below 90%, interspersed with implausible reversals at 16K.
## Decode versus prefill divergence
### Hypothesis verdict
**Partly confirmed for prefill; refuted by the recorded decode data, but the decode result is not yet trustworthy.**
- At small contexts, prefill appears insensitive/noisy: 180 W reports 105.8% retention at 512 and 132.5% at 4K; 160 W reports 86.5% and 118.7%.
- At large contexts, the compute penalty becomes decisive below 200 W: at 16K/32K, 180 W retains only **67.4%/71.1%**, and 160 W only **50.5%/20.1%**.
- 200 W does **not** starve large-context prefill in this run: it reports **126.2% at 16K** and **102.7% at 32K**. Those >100% values should be interpreted as “no detected loss,” not as a real speedup.
- Decode should be comparatively power-insensitive if purely HBM-bandwidth-bound, but the recorded results are not flat. At 200 W, decode retention is **50.0%, 56.7%, 100.0%, and 56.9%** across increasing contexts. At 160 W it rebounds from 26.7% at 4K to 104.5% at 16K. This pattern is too inconsistent for a clean architectural conclusion.
Direct answer to “is the optimal low-power config useless at the largest context?”: **160 W is clearly useless for 32K prefill, and 180 W imposes a meaningful ~29% loss. 200 W is the only lower cap that looks viable for large prefill.**
## Thermal and draw check
### Edge temperature (`edge_temp_c`)
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 32°C | 42°C | 54°C | 55°C |
| 200 W | 37°C | 43°C | 54°C | 55°C |
| 180 W | 38°C | 43°C | 54°C | 57°C |
| 160 W | 40°C | 44°C | 52°C | 53°C |
- Maximum observed edge temperature is **57°C**, which does not suggest thermal throttling for an MI50. The 225 W cells top out at 55°C, so there is no evidence that a thermally throttled baseline artificially favored 200 W.
- Temperature rises as the sweep progresses through context sizes and, at 512 tokens, lower caps are paradoxically hotter than 225 W. This strongly suggests run-order/warm-up history affects edge temperature; randomized power/context order or steady-state soak is needed.
- **Actual draw cannot be checked:** all 16 `draw_w` entries are `NA`. Therefore the sweep cannot establish whether the cards reached their caps, whether both GPUs drew similarly, or how many real watts a lower cap saved.
## Efficiency and knee
The requested actual `tg_tok_s / draw_w` metric is **not computable** because `draw_w` is missing everywhere. Substituting the configured cap would falsely assume actual draw equals the cap, so it is not used as the efficiency result.
For diagnosis only, the proxy `tg_tok_s / configured-power-W` is:
| Power | 512 | 4,096 | 16,384 | 32,768 |
|---:|---:|---:|---:|---:|
| 225 W | 0.001422 | 0.002667 | 0.000978 | 0.003200 |
| 200 W | 0.000800 | 0.001700 | 0.001100 | 0.002050 |
| 180 W | 0.001167 | 0.001611 | 0.001500 | 0.001556 |
| 160 W | 0.001500 | 0.001000 | 0.001437 | 0.003313 |
This proxy is internally inconsistent because the underlying decode measurements are. It cannot identify a defensible efficiency knee. The only repeatable-looking knee in the present sweep is the **prefill knee at 200 W**: dropping from 200 to 180 W changes 32K retention from 102.7% to 71.1%, and 16K from 126.2% to 67.4%.
Per-context provisional knees:
| Context | Provisional knee | Basis |
|---:|---:|---|
| 512 | Undetermined / 225 W safe | Lower-power pp and tg are non-monotonic; 200 W loses 8.2% pp and 50% tg. |
| 4,096 | Undetermined / 225 W safe | Prefill looks free at all caps, but decode falls 4373%. |
| 16,384 | 200 W | Prefill is retained at 200 W, then falls to 67.4% at 180 W; decode readings are too noisy. |
| 32,768 | 200 W for prefill, 225 W overall | Prefill is retained at 200 W, but measured decode falls to 56.9%; 180/160 W prefill is unacceptable. |
## Recommendation
### If setting one cap now
Set **225 W**. This is the only cap supported across all measured decode cells, and the data does not demonstrate that any lower setting is “free.” Temperatures at 225 W were modest (≤55°C), with no evidence of throttling.
### If splitting boxes provisionally
- **Interactive chat / Pi / decode-sensitive box: 225 W.** The recorded decode penalty at 200 W is 4350% at 512, 4K, and 32K. Those values may be measurement artifacts, but they make a lower recommendation unsafe until rerun.
- **Long-context prefill-heavy agent/RAG box: 200 W.** It shows no prefill loss at 16K/32K and avoids the severe large-context collapse at 180/160 W. If long generations follow the prefill, 225 W remains safer because 200 W's 32K decode was only 56.9% of baseline.
Thus the data does **not** support the hoped-for simple conclusion that low power is free for chat decode. It supports a narrower result: **200 W may be free for large prefills, while 180 W and especially 160 W are not.**
### Required rerun before cabinet deployment
1. Fix `draw_w` collection and record per-GPU draw plus total board draw.
2. Run at least 35 repetitions per cell and retain standard deviation/min/max, not only an average.
3. Randomize or alternate power order to remove warm-up/run-order bias.
4. Soak each cap to steady-state temperature before timing.
5. Record core clock, HBM clock, throttling flags, and GPU utilization.
6. Verify llama.cpp timing extraction; the decode reversals suggest parsing or run variance.
7. Add end-to-end latency: `prefill_time + generation_time`, weighted for real chat versus RAG request distributions.
Until that rerun, **225 W is the defensible production setting; 200 W is the promising cabinet-friendly candidate for long-context prefill, not yet a proven universal optimum.**