|
| 1 | +# MiniMax-M2.7-NVFP4 on 2× RTX PRO 6000 Blackwell — microbench N=5 (+ the temp serving-trap) |
| 2 | + |
| 3 | +MiniMax-M2.7 (230B-A10B MoE), served as **NVFP4 on vLLM tensor-parallel (TP=2)**, run through the MMBT |
| 4 | +12-family agentic microbench. Added to the [397B vs Step-3.7-Flash entry](findings.md) as a fifth model. |
| 5 | + |
| 6 | +**N=5** per cell (60 cells). Comparators in the main entry are N=10 (397B) / N=1 (Step, 27B-Q4, Coder-Q4) — |
| 7 | +so MiniMax is **N=5, an asymmetry to read with the same caution this entry already documents for small N.** |
| 8 | + |
| 9 | +## TL;DR — two findings, the first is the bigger one |
| 10 | + |
| 11 | +1. **A serving trap, not a capability gap (the headline).** Run at the bench's cross-model default |
| 12 | + **`temperature=0.3`**, MiniMax-NVFP4 looked *broken* on coding: it ran the agent loop correctly for |
| 13 | + ~29 iterations, then on the **final text turn entered a repetition loop that generated tens of |
| 14 | + thousands of tokens to the `max_tokens` cap** (`finish_reason: model_exceeded_max_tokens`). Across the |
| 15 | + two coding families the temp=0.3 run reached before it was stopped: **14/19 cells ran away (74%)** — |
| 16 | + `p1_bugfix` 4/9, `p1_testwrite` **10/10**. Re-run at MiniMax's **model-card sampling |
| 17 | + (`temperature=1.0, top_p=0.95, top_k=40`)**, the *same cells on the same 131072 cap* produce **0/10 |
| 18 | + runaways** — clean `done_signal`. Across all **60** N=5 cells: **58 `done_signal`, 0 runaways**, 2 |
| 19 | + context-exhaustion. The clean A/B on the identical cell/cap proves the runaway was **sampling**, not |
| 20 | + the model and not a stingy token cap. *Greedy-ish decode on a reasoning model is a documented |
| 21 | + repetition-loop trap; MiniMax's card mandates temp=1.0.* |
| 22 | + |
| 23 | +2. **MiniMax is an "exhaustive completer" — a genuinely double-edged temperament.** Its instinct is to do |
| 24 | + the maximum: fix every bug it sees, write a full test suite + audit/ADR/CHANGELOG docs, research |
| 25 | + exhaustively. This **dominates open analysis** and **sinks scope-constrained edits** (see scorecard). |
| 26 | + It is the mirror image of 397B's surgical restraint. |
| 27 | + |
| 28 | +## The serving trap — before/after on the same cells |
| 29 | + |
| 30 | +| family | temp=0.3 (broken) | temp=1.0 (spec) | |
| 31 | +|---|---|---| |
| 32 | +| p1_bugfix | 5 `done_signal` / **4 runaway** (44%) | **5 `done_signal` / 0 runaway** | |
| 33 | +| p1_testwrite | 0 / **10 runaway (100%)** | **5 `done_signal` / 0 runaway** | |
| 34 | +| all 60 cells (spec) | — | **58 `done_signal`, 0 runaway, 2 ctx-exhaustion** | |
| 35 | + |
| 36 | +A temp=0.3-runaway cell generated **71k–106k tokens in a single final turn** (100% of the per-turn cap). |
| 37 | +That is degenerate repetition, not legitimate output — and the identically-capped 397B (also 131072, |
| 38 | +also temp 0.3-equivalent path) had **0 runaways in 240 cells**, so the cap is not the cause. |
| 39 | + |
| 40 | +## Scorecard (N=5; PASS = grader verdict, majority ≥3/5 marks the family ✓) |
| 41 | + |
| 42 | +| family | PASS/5 | avg iters | dominant fail-reason | |
| 43 | +|---|---|---|---| |
| 44 | +| p2_extract | **5/5** ✓ | 11 | — | |
| 45 | +| p2_ci | **5/5** ✓ | 41 | — | |
| 46 | +| p2_hallucination | **5/5** ✓ | 15 | — | |
| 47 | +| p2_triage | **5/5** ✓ | 13 | — | |
| 48 | +| p3_business | **5/5** ✓ | 18 | — | |
| 49 | +| p3_doc | **4/5** ✓ | 19 | 1× word-limit | |
| 50 | +| p3_pm | **3/5** ✓ | 14 | — | |
| 51 | +| p1_bugfix | 2/5 | 131 | `ruff_no_regression` ×3 (lint nits in its own new tests) | |
| 52 | +| p3_writing | 1/5 | 30 | length/quality | |
| 53 | +| p1_testwrite | 0/5 | 86 | `logalyzer_unchanged` ×5 (**scope violation**) | |
| 54 | +| p1_refactor | 0/5 | 75 | `tests_unchanged` ×5, `non_output_files_unchanged` ×2 (**scope violation**) | |
| 55 | +| p3_market | 0/5 | 51 | 2× **ctx-exhaustion (HTTP 400)** + 3 fail | |
| 56 | + |
| 57 | +**Aggregate: 7/12 families pass majority; 35/60 cells (58%).** This lands in the same **~7–8/12 band** as |
| 58 | +397B (8/12 no-think), Step-3.7-Flash, 27B-Q4 and Coder-Q4 — MiniMax **aggregate-ties the field, but the |
| 59 | +per-family *shape* is distinctive** (and that shape, not the tie, is the finding). |
| 60 | + |
| 61 | +## Qualitative — the "exhaustive completer" pattern (every claim cited to graded cells) |
| 62 | + |
| 63 | +- **Open analysis = pure upside. p2 is a perfect 20/20** (extract/ci/hallucination/triage all 5/5), fast |
| 64 | + (~11–41 iters). When there is no scope or length constraint, thoroughness only helps. Best-in-class here. |
| 65 | +- **Scope-constrained coding = real liability, not a grader artifact. `p1_testwrite` 0/5 and `p1_refactor` |
| 66 | + 0/5**, failing on **substantive** criteria: the test-writing task says *"add tests, leave the production |
| 67 | + code unchanged"* → MiniMax rewrites the production code anyway (`logalyzer_unchanged` fails 5/5); the |
| 68 | + refactor task says *"only touch the output package"* → it modifies tests and out-of-scope files |
| 69 | + (`tests_unchanged` 5/5, `non_output_files_unchanged` 2/5). It **cannot resist improving everything**, |
| 70 | + which is exactly what these guardrails forbid. This is the **opposite of 397B**, whose surgical restraint |
| 71 | + *passes* `p1_refactor`. |
| 72 | +- **`p1_bugfix` is the in-between case (2/5):** it fixes the planted bugs correctly (the O(n²) `load()` |
| 73 | + measured 11.9s→0.57–0.63s by the grader; the `collections.Iterable` import removed; 69–82 tests pass) |
| 74 | + but trips `ruff_no_regression` (2→3, 2→5) on **unused-import nits in its own newly-written tests** — |
| 75 | + a lint technicality. *Here* the binary score understates it; on testwrite/refactor it does not. |
| 76 | +- **Open-ended sinks exhaust context. `p3_market` 0/5**, with **2 cells hitting the 131072 ceiling |
| 77 | + outright (HTTP 400)** — it keeps issuing research tool-calls until the conversation won't fit. The p3 |
| 78 | + analog of over-delivery. |
| 79 | +- **Structured synthesis is fine** — `p3_business` 5/5, `p3_doc` 4/5, `p3_pm` 3/5. Where the deliverable |
| 80 | + is well-bounded, the thoroughness lands. |
| 81 | +- **Failure texture is its own category:** not 397B's quiet *stall* (omission), not Coder/Flash's |
| 82 | + *runaway* (over-generation cutoff) — MiniMax's misses are **self-inflicted: scope violations and context |
| 83 | + exhaustion from doing too much.** And it is **expensive** — 75–131 iters/cell on p1 (the high end of the |
| 84 | + field) vs ~11–18 on the analysis cells it aces. |
| 85 | + |
| 86 | +**One-line verdict:** complementary to 397B. MiniMax aces analysis where 397B is average; 397B respects |
| 87 | +guardrails where MiniMax bulldozes them. A task-class strengths finding, not a scaling-law tie. |
| 88 | + |
| 89 | +## GPU power — TP=2 is the heaviest simultaneous draw of the bench |
| 90 | + |
| 91 | +| | serving | combined draw | both GPUs hot at once | crosses 1000W | |
| 92 | +|---|---|---|---|---| |
| 93 | +| **MiniMax-M2.7** | vLLM **TP=2** (NVFP4) | active-decode median **~896W**, peak **1089W (91% of 1200 cap)** | **64% of samples** (>400W each) | **yes** | |
| 94 | +| 397B | llama.cpp **pipeline** | median 670W, max 985W | rarely | **never** (0 / 3868) | |
| 95 | + |
| 96 | +The cause is parallelism mode, not size: **tensor-parallel makes both GPUs compute the same layers |
| 97 | +simultaneously** (so they fire together and push toward the PSU ceiling), whereas **pipeline-parallel |
| 98 | +alternates** them (GPU0 leads, combined draw stays well under the cap). MiniMax is balanced per-GPU |
| 99 | +(320W/363W mean) — TP splits evenly — vs 397B's GPU0-leads pipeline asymmetry. |
| 100 | + |
| 101 | +## Caveats (read these with the numbers) |
| 102 | + |
| 103 | +- **Sampling deviation:** MiniMax ran at its **card-specified `temp=1.0/top_p=0.95/top_k=40`**, *not* the |
| 104 | + bench's cross-model `temp=0.3`. This is a deliberate, documented per-model deviation — at temp=0.3 the |
| 105 | + model is off-spec and degenerates (finding #1), so a temp=0.3 score would be meaningless. The receipt |
| 106 | + schema records `temperature` but **not** `top_p`/`top_k`; the full profile is recorded here and in the |
| 107 | + launch command. |
| 108 | +- **N=5 vs comparators' N=10/N=1** — directional. The per-family rates above (esp. the 0/5 and 5/5 ones) |
| 109 | + are stable enough to characterize, but treat the aggregate as ±1 family. |
| 110 | +- **131072 context** (vs Step/27B/Coder at 262144) — a real cap asymmetry, footnoted; it did not cause the |
| 111 | + runaways (those were sampling) but it is where `p3_market` exhausted context. MiniMax's native max is ~196k. |
| 112 | +- **NVFP4 on Blackwell SM120** is a maturity-rough surface (vLLM has open repetition/kernel issues for |
| 113 | + MiniMax-NVFP4); we did **not** use `--enable-expert-parallel` (the named trigger in vLLM #31856). |
| 114 | +- This build emits **no separate `<think>`/`reasoning_content`** despite MiniMax-M2 being an |
| 115 | + interleaved-thinking model — so the interleaved-thinking history requirement was moot here (the harness |
| 116 | + retains `reasoning_content` defensively regardless). |
| 117 | + |
| 118 | +## Reproduce |
| 119 | +```bash |
| 120 | +# Serve (vLLM TP=2, NVFP4). minimax_m2 parsers; no expert-parallel. |
| 121 | +docker run -d --name vllm-minimax --gpus all --shm-size 16g -e NCCL_P2P_DISABLE=1 \ |
| 122 | + -v $HOME/models:/models:ro -p 127.0.0.1:8001:8000 vllm/vllm-openai:latest \ |
| 123 | + --model /models/nvidia-MiniMax-M2.7-NVFP4 --served-model-name minimax-m2.7 \ |
| 124 | + --tensor-parallel-size 2 --gpu-memory-utilization 0.92 --quantization modelopt \ |
| 125 | + --trust-remote-code --max-model-len 131072 --disable-custom-all-reduce \ |
| 126 | + --tool-call-parser minimax_m2 --reasoning-parser minimax_m2 --enable-auto-tool-choice \ |
| 127 | + --host 0.0.0.0 --port 8000 |
| 128 | + |
| 129 | +# Run at the model card's sampling (BENCH_* env overrides the default temp=0.3): |
| 130 | +BENCH_TEMP=1.0 BENCH_TOP_P=0.95 BENCH_TOP_K=40 \ |
| 131 | + bash tooling/scripts/run_microbench.sh minimax-m2.7 8001 minimax-m2.7-spec 5 "" "" 131072 |
| 132 | +bash tooling/scripts/grade_microbench.sh minimax-m2.7-spec |
| 133 | +``` |
0 commit comments