# 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 4K–32K in this sample, while 180/160 W collapse at 16K–32K. 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 43–73%. | | 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 43–50% 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 3–5 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.**