Build with Beam · measured, not estimated

Running Beam‑1.0 (501B) on workstation GPUs

Can you self-host Reflection's Beam on RTX PRO 6000 cards instead of B200s, and what do you actually get? I set it up on 4 GPUs and measured quality, speed, DFlash2, context and cost. I also built a 4-bit version of the community REAP model that runs on just 2 GPUs.

100 tok/s
one user, official NVFP4 on 4 GPUs
168 tok/s
same, with DFlash2 speculative decoding
1,174 tok/s
total output at 64 users
957k
tokens of KV cache across 4 GPUs

The question

Reflection's vLLM recipe lists B200/B300 or 8× H100 for the NVFP4 checkpoint. Many teams that want to self-host for privacy or cost have RTX PRO 6000 cards (Blackwell workstation chip, SM120, 96 GB, PCIe, no NVLink) instead. Nobody had published whether Beam runs there, which flags it needs, or how fast and how good it is. So I measured it:

Setup

Hardware8× NVIDIA RTX PRO 6000 Blackwell, 96 GB each (Nebius VM). Official model on 4 GPUs, 2-GPU build on 2.
Softwarevllm/vllm-openai:reflection-beam (vLLM 0.1.dev23042+g8e0922e88). Beam support isn't in a pip release yet.
Modelsreflection/Beam-1.0-501B-A23B-NVFP4 (official), mrfakename/Beam-1.0-REAP-255B-A23B (BF16, community pruning), my NVFP4A16 build of it.
Samplingtemperature 0.7, top_p 0.99 (Reflection's eval settings), up to 32k generated tokens incl. thinking, seed 42, one run each.

What it took on SM120

1. Set --moe-backend marlin

In this image the FP4 experts run weight-only on SM120 (BF16 activations) through the Marlin kernel. With that flag the official checkpoint loads at TP4 and leaves 957k tokens of FP8 KV cache.

2. DFlash2: the recipe config fails, two changes fix it

The recipe's "attention_backend":"FLASH_ATTN" errors because FP8 KV cache needs FA3 (SM90) or FA4 (SM100). Leaving it on auto fails DFlash2's own check (only FLASH_ATTN or FLASHINFER are allowed). FLASHINFER works, but only with adaptive verification turned off.

3. First start is slow

Kernel autotuning takes a while; set VLLM_ENGINE_READY_TIMEOUT_S=3600 so the API server doesn't give up.

4. Benchmark trap: lm-eval's humaneval_instruct scores 0

That task prefills the start of the answer, which doesn't work with Beam's thinking template, so every answer comes back empty. I used a plain chat-based HumanEval runner instead (humaneval_chat.py in the dataset).

Full serve command (official NVFP4, 4 GPUs, with DFlash2)
docker run -d --name beam --gpus '"device=0,1,2,3"' --ipc=host -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -e VLLM_ENGINE_READY_TIMEOUT_S=3600 \
  --entrypoint vllm vllm/vllm-openai:reflection-beam \
  serve reflection/Beam-1.0-501B-A23B-NVFP4 \
  --tensor-parallel-size 4 --max-model-len 65536 \
  --kv-cache-dtype fp8 --moe-backend marlin \
  --reasoning-parser beam --enable-auto-tool-choice --tool-call-parser beam \
  --speculative-config '{"method":"dflash","model":"reflection/Beam-1.0-501B-A23B-DFlash2",
    "num_speculative_tokens":7,"attention_backend":"FLASHINFER",
    "enable_adaptive_verification":false}'

Quality

Three models, same harness: the official NVFP4 on 4 GPUs, mrfakename's REAP version (half the experts removed) in BF16 on 8 GPUs, and my 4-bit build of that REAP model on 2 GPUs. MMLU-Pro uses 30 questions per subject (420 total); IFEval and HumanEval are complete.

Benchmark scores
Higher is better. Error bars: ±1 standard error.
Show as table
MMLU-ProIFEval strictHumanEvalEmpty answers
Official NVFP4 · 4 GPUs0.843 ± 0.0170.939 ± 0.0100.963 (158/164)1 / 2
REAP BF16 · 8 GPUs0.721 ± 0.0210.913 ± 0.0120.951 (156/164)3 / 2
REAP NVFP4A16 · 2 GPUs0.702 ± 0.0220.896 ± 0.0130.951 (156/164)1 / 4

Empty answers = MMLU-Pro / IFEval prompts where the model was still thinking at the 32k-token limit. Under 1% everywhere.

The official NVFP4 checkpoint works on RTX PRO 6000: 0.843 on MMLU-Pro, 0.939 on IFEval, 158/164 on HumanEval. No sign of broken output from the Marlin weight-only path on SM120: 1 empty answer in 420 MMLU-Pro questions, 2 in 541 IFEval prompts.

The 4-bit step is within noise; the pruning step is not. Comparing answers question by question:

Paired comparison (same questions)MMLU-ProIFEvalHumanEval
Official → REAP BF16 (pruning)70 lost / 19 gained
p < 0.001
27 / 13
p = 0.04
2 / 0
p = 0.5
REAP BF16 → NVFP4A16 (4-bit)27 / 19
p = 0.30
29 / 20
p = 0.25
3 / 3
p = 1.0

Exact two-sided McNemar test on discordant pairs. One sampled run each, so part of each difference is sampling noise.

MMLU-Pro by subject
Share correct, 30 questions per subject (±0.09). Sorted by how much the 2-GPU build loses.

Where the pruning hurts: REAP picked its experts on code and agent text. Math, physics and computer science stay within a few questions of the official model. Health, law, economics and philosophy each lose 7 to 9 questions out of 30. Coding (HumanEval) is 156 vs 158.

Speed

Output throughput
vllm bench serve, 1024 tokens in / 512 out, random prompts
Show as table
UsersOfficial · 4 GPUsTime/tokenFirst tokenREAP NVFP4 · 2 GPUsTime/tokenFirst token
197.8 tok/s9.9 ms0.17 s80.4 tok/s12.1 ms0.19 s
16599.525.0 ms0.85 s428.335.3 ms1.08 s
641,173.850.8 ms1.94 s988.860.1 ms2.40 s
One user, real prompts
20 prompts one at a time (10 HumanEval, 10 everyday questions), thinking + answer, tok/s

DFlash2 makes a single user 1.67× faster (100.5 → 167.7 tok/s), most on code (194.7 tok/s) where the draft model guesses well. The drafter's mean acceptance length was about 3.2–3.8 tokens, and 70–79% of first guesses were accepted. I didn't measure DFlash2 under many concurrent users, where speculative decoding usually helps less.

Context: with FP8 KV cache the 4-GPU server holds 957,317 tokens of KV cache (with DFlash2 loaded), 14.6 full 64k conversations at once. The 2-GPU build holds 553,601 (8.4×). Beam's sliding-window attention (44 of 52 layers use a 512-token window) keeps the cache small.

Cost

Cost per million output tokens
GPU rental ÷ measured throughput, server busy the whole hour. Input tokens not counted separately.

Default: Nebius on-demand list price for RTX PRO 6000, $1.80/GPU-hour (computeprices.com, Oct 2026). Change it to your own price.

At full load the official model costs about $1.70 per million output tokens on rented RTX PRO 6000s. A single user alone on the box costs about 12× more per token, so self-hosting only pays when the server is shared. Per GPU, the 2-GPU build serves 1.7× more tokens, but only for work where its knowledge gap doesn't matter.

The 2-GPU coding build

mrfakename's REAP model removes 128 of each layer's 256 experts, keeping the 16 most-used per routing group on ~925k tokens of code/agent text. It was released with a perplexity check only. In BF16 it still needs 8 GPUs.

I quantized its experts to NVFP4 weights (BF16 activations) with llm-compressor's data-free model_free_ptq, same split as Reflection's official NVFP4: experts in 4-bit, attention, router, dense layers, embeddings and LM head in BF16. Result: 145 GiB (155 GB), fits on 2× RTX PRO 6000, 80 tok/s for one user, 989 tok/s at 64 users.

Use it when you only have 2 GPUs and the work is mostly code. For anything knowledge-heavy, the official model on 4 GPUs is clearly better (0.84 vs 0.70 MMLU-Pro). All pruning credit goes to mrfakename; Beam is Reflection's.

Serve the 2-GPU build
docker run -d --name beam-reap --gpus '"device=0,1"' --ipc=host -p 8000:8000 \
  -v ~/.cache/huggingface:/root/.cache/huggingface \
  -e VLLM_ENGINE_READY_TIMEOUT_S=3600 \
  --entrypoint vllm vllm/vllm-openai:reflection-beam \
  serve peterhdd/Beam-1.0-REAP-255B-A23B-NVFP4A16 \
  --tensor-parallel-size 2 --max-model-len 65536 \
  --kv-cache-dtype fp8 --moe-backend marlin \
  --reasoning-parser beam --enable-auto-tool-choice --tool-call-parser beam

Limits

Reproduce

Every script, raw lm-eval sample file, HumanEval answer and benchmark log is in the dataset peterhdd/beam-rtx-pro-6000-runs: serve.sh, quick_eval.sh (MMLU-Pro + IFEval), humaneval_chat.py, speed.sh, real_speed.py, quantize_reap.py.