> ## Documentation Index
> Fetch the complete documentation index at: https://developers.reflection.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# FP8 quantization

> How Beam's FP8 weights were quantized

export const MemoryBars = ({title, desc, series, rows, unit = "GiB", decimals = 2, max}) => {
  const width = 720;
  const barLeft = 72;
  const barRight = 560;
  const barHeight = 22;
  const barGap = 6;
  const top = 92;
  const domainMax = max || Math.max(...rows.flatMap(row => row.values));
  const scale = value => barLeft + value / domainMax * (barRight - barLeft);
  const barPath = (x1, y, h) => {
    const r = Math.min(4, (x1 - barLeft) / 2);
    return `M ${barLeft} ${y} H ${x1 - r} Q ${x1} ${y} ${x1} ${y + r} V ${y + h - r} Q ${x1} ${y + h} ${x1 - r} ${y + h} H ${barLeft} Z`;
  };
  const rowBlock = 34 + series.length * (barHeight + barGap) + 14;
  const height = top + rows.length * rowBlock;
  return <svg viewBox={`0 0 ${width} ${height}`} role="img" aria-label={title} className="w-full text-[#1e3207] dark:text-[#bdc8b5]" xmlns="http://www.w3.org/2000/svg">
      <title>{title}</title>
      <desc>{desc}</desc>
      <text x="16" y="32" fill="currentColor" fontSize="20" fontWeight="600">{title}</text>
      <rect x="16" y="54" width="14" height="14" rx="3" fill="currentColor" />
      <text x="38" y="66" fill="currentColor" fontSize="15">{series[0]}</text>
      <g className="text-[#b07a35] dark:text-[#b8803a]">
        <rect x="112" y="54" width="14" height="14" rx="3" fill="currentColor" />
      </g>
      <text x="134" y="66" fill="currentColor" fontSize="15">{series[1]}</text>
      {rows.map((row, rowIndex) => {
    const rowTop = top + rowIndex * rowBlock;
    const [a, b] = row.values;
    const reduction = ((1 - b / a) * 100).toFixed(1);
    return <g key={row.label}>
            <text x="16" y={rowTop + 20} fill="currentColor" fontSize="15" fontWeight="600">{row.label}</text>
            <text x={width - 16} y={rowTop + 20} textAnchor="end" fill="currentColor" fontSize="14" opacity="0.8">{`${reduction}% less with ${series[1]}`}</text>
            {row.values.map((value, i) => {
      const y = rowTop + 34 + i * (barHeight + barGap);
      const bar = <path d={barPath(scale(value), y, barHeight)} fill="currentColor" />;
      return <g key={series[i]}>
                  <title>{`${row.label}, ${series[i]}: ${value.toFixed(decimals)} ${unit}`}</title>
                  <text x={barLeft - 12} y={y + 16} textAnchor="end" fill="currentColor" fontSize="14">{series[i]}</text>
                  {i === 0 ? bar : <g className="text-[#b07a35] dark:text-[#b8803a]">{bar}</g>}
                  <text x={scale(value) + 8} y={y + 16} fill="currentColor" fontSize="14">{`${value.toFixed(decimals)} ${unit}`}</text>
                </g>;
    })}
          </g>;
  })}
    </svg>;
};

export const QualityDumbbell = ({title, desc, series, groups, domain = [0, 100], ticks = [0, 20, 40, 60, 80, 100], unit = "%"}) => {
  const width = 720;
  const plotLeft = 224;
  const plotRight = 604;
  const changeRight = 704;
  const rowHeight = 28;
  const groupHeight = 34;
  const plotTop = 112;
  const scale = value => plotLeft + (value - domain[0]) / (domain[1] - domain[0]) * (plotRight - plotLeft);
  const format = value => `${value.toFixed(1)}${unit}`;
  const formatChange = (a, b) => {
    const change = Math.round((b - a) * 10) / 10;
    if (change === 0) return "0.0";
    return change > 0 ? `+${change.toFixed(1)}` : `−${Math.abs(change).toFixed(1)}`;
  };
  let y = plotTop;
  const laidOut = groups.map(group => {
    const headerY = y + 22;
    y += groupHeight;
    const rows = group.rows.map(row => {
      const rowY = y + rowHeight / 2;
      y += rowHeight;
      return {
        ...row,
        rowY
      };
    });
    return {
      ...group,
      headerY,
      rows
    };
  });
  const plotBottom = y + 6;
  const height = plotBottom + 16;
  const [nameA, nameB] = series;
  return <svg viewBox={`0 0 ${width} ${height}`} role="img" aria-label={title} className="w-full text-[#1e3207] dark:text-[#bdc8b5]" xmlns="http://www.w3.org/2000/svg">
      <title>{title}</title>
      <desc>{desc}</desc>
      <text x="16" y="32" fill="currentColor" fontSize="20" fontWeight="600">{title}</text>
      <circle cx="22" cy="62" r="6" fill="currentColor" />
      <text x="36" y="67" fill="currentColor" fontSize="15">{nameA}</text>
      <g className="text-[#b07a35] dark:text-[#b8803a]">
        <path d={`M ${22 + 96} 54 L ${30 + 96} 62 L ${22 + 96} 70 L ${14 + 96} 62 Z`} fill="none" stroke="currentColor" strokeWidth="2.5" />
      </g>
      <text x={36 + 96} y="67" fill="currentColor" fontSize="15">{nameB}</text>
      {ticks.map(tick => <g key={`tick-${tick}`}>
          <line x1={scale(tick)} y1={plotTop} x2={scale(tick)} y2={plotBottom} stroke="currentColor" opacity="0.15" />
          <text x={scale(tick)} y={plotTop - 10} textAnchor="middle" fill="currentColor" fontSize="14" opacity="0.8">{`${tick}${unit}`}</text>
        </g>)}
      <text x={changeRight} y={plotTop - 10} textAnchor="end" fill="currentColor" fontSize="14" opacity="0.8">Change</text>
      {laidOut.map(group => <g key={group.title}>
          <text x="16" y={group.headerY} fill="currentColor" fontSize="14" fontWeight="600" opacity="0.75">{group.title}</text>
          {group.rows.map(row => {
    const [a, b] = row.values;
    return <g key={row.label}>
                <title>{`${row.label}: ${nameA} ${format(a)}, ${nameB} ${format(b)}`}</title>
                <rect x="8" y={row.rowY - rowHeight / 2} width={width - 16} height={rowHeight} rx="4" fill="currentColor" className="opacity-0 hover:opacity-10" />
                <text x="16" y={row.rowY + 5} fill="currentColor" fontSize="15">{row.label}</text>
                <line x1={scale(a)} y1={row.rowY} x2={scale(b)} y2={row.rowY} stroke="currentColor" strokeWidth="2" opacity="0.4" />
                <circle cx={scale(a)} cy={row.rowY} r="6" fill="currentColor" />
                <g className="text-[#b07a35] dark:text-[#b8803a]">
                  <path d={`M ${scale(b)} ${row.rowY - 8} L ${scale(b) + 8} ${row.rowY} L ${scale(b)} ${row.rowY + 8} L ${scale(b) - 8} ${row.rowY} Z`} fill="none" stroke="currentColor" strokeWidth="2.5" />
                </g>
                <text x={changeRight} y={row.rowY + 5} textAnchor="end" fill="currentColor" fontSize="14" opacity="0.8">{formatChange(a, b)}</text>
              </g>;
  })}
        </g>)}
    </svg>;
};

[Beam-1.0-501B-A23B-FP8](https://huggingface.co/reflection/Beam-1.0-501B-A23B-FP8) is the FP8-quantized version of [Beam-1.0-501B-A23B](https://huggingface.co/reflection/Beam-1.0-501B-A23B).

## Model details

* **Architecture, capabilities, and intended use:** see [Beam's model card](https://huggingface.co/reflection/Beam-1.0-501B-A23B).
* **License:** Apache 2.0

This checkpoint was quantized using [LLM Compressor](https://github.com/vllm-project/llm-compressor).

## Quantization scheme

The checkpoint uses **FP8\_DYNAMIC (W8A8)** with FP8 E4M3 weights and input activations. Weights have a fixed scale per output channel; activation scales are computed dynamically per token during inference.

Quantization covers the following linear projections:

* **Attention:** query, key, value, output, and attention gate projections.
* **Dense MLPs and MoE experts:** gate, up, and down projections.

Embeddings, the language modeling head, MoE routers, and normalization layers retain their original precision and values.

## Quantization method

We use **post-training quantization (PTQ)** to convert the selected weights of the BF16 Beam checkpoint to FP8 using LLM Compressor's **round-to-nearest (RTN)** method. During conversion, weights are divided by their scales and rounded to the nearest representable FP8 value. This requires no additional training or calibration dataset.

## Evaluation and performance

### Memory footprint

The measurements below were taken on a TP8 endpoint serving on 8×H200 GPUs with a BF16 KV cache.

<MemoryBars
  title="FP8 halves the checkpoint"
  desc="Checkpoint size falls from 933.81 GiB in BF16 to 468.72 GiB in FP8. Mean GPU memory used per GPU falls from 135.08 GiB to 88.40 GiB."
  series={["BF16", "FP8"]}
  rows={[
{ label: "Checkpoint size", values: [933.81, 468.72] },
{ label: "GPU memory used, mean per GPU", values: [135.08, 88.40] },
]}
/>

<Accordion title="Exact numbers">
  | **Measurement** | BF16 | FP8 |
  | - | - | - |
  | Checkpoint size | 933.81 GiB | 468.72 GiB |
  | GPU memory used, mean per GPU | 135.08 GiB | 88.40 GiB |
</Accordion>

### Quality

All evaluations used temperature 0.7 and top\_p 0.99, with an FP8 KV cache for the FP8 checkpoint.

<QualityDumbbell
  title="FP8 stays within 2 points of BF16"
  desc="Accuracy of Beam in BF16 and FP8 on 19 benchmarks, grouped by category. Every FP8 result is within 2 points of BF16."
  series={["BF16", "FP8"]}
  groups={[
{ title: "Agentic coding / terminal", rows: [
  { label: "DeepSWE v1.1", values: [43.3, 43.0] },
  { label: "SWE Bench Pro v2-Hard", values: [76.5, 78.4] },
  { label: "SWE Bench Pro v1", values: [66.1, 65.9] },
  { label: "Terminal Bench v2.1", values: [80.1, 78.9] },
  { label: "SWE Atlas Codebase QnA", values: [31.8, 32.2] },
  { label: "SWEBench Multilingual", values: [78.3, 78.1] },
  { label: "SWEBench Verified", values: [81.6, 80.2] },
] },
{ title: "Reasoning", rows: [
  { label: "AIME 2026", values: [97.7, 98.0] },
  { label: "HLE (no tools)", values: [36.0, 36.0] },
  { label: "HLE (with tools)", values: [51.1, 51.1] },
  { label: "SciCode", values: [49.2, 48.3] },
  { label: "CriPT AA", values: [16.3, 17.4] },
  { label: "GPQA Diamond", values: [90.6, 90.3] },
  { label: "LiveCodeBench", values: [88.3, 88.1] },
] },
{ title: "Tool calling / search", rows: [
  { label: "MCP Atlas", values: [80.8, 81.5] },
  { label: "Tau3 Banking", values: [36.1, 36.8] },
] },
{ title: "General capabilities", rows: [
  { label: "AA-LCR", values: [78.2, 79.4] },
  { label: "LongBench v2", values: [67.5, 67.6] },
  { label: "IFBench", values: [79.6, 80.7] },
] },
]}
/>

Two benchmarks report a score rather than a percentage, so they have their own scale:

<QualityDumbbell
  title="Score benchmarks, public split only"
  desc="AutomationBench scores 39.3 in BF16 and 38.2 in FP8. AA Omniscience (index) scores 10.8 in BF16 and 8.8 in FP8."
  series={["BF16", "FP8"]}
  domain={[0, 50]}
  ticks={[0, 10, 20, 30, 40, 50]}
  unit=""
  groups={[
{ title: "Tool calling / search", rows: [
  { label: "AutomationBench", values: [39.3, 38.2] },
] },
{ title: "General capabilities", rows: [
  { label: "AA Omniscience (index)", values: [10.8, 8.8] },
] },
]}
/>

<Accordion title="Exact numbers">
  | | *Beam (BF16)* | *Beam (FP8)* |
  | - | - | - |
  | **Agentic Coding / Terminal** | | |
  | DeepSWE v1.1 | 43.3% | 43.0% |
  | SWE Bench Pro v2-Hard | 76.5% | 78.4% |
  | SWE Bench Pro v1 | 66.1% | 65.9% |
  | Terminal Bench v2.1 | 80.1% | 78.9% |
  | SWE Atlas Codebase QnA | 31.8% | 32.2% |
  | SWEBench Multilingual | 78.3% | 78.1% |
  | SWEBench Verified | 81.6% | 80.2% |
  | **Reasoning** | | |
  | AIME 2026 | 97.7% | 98.0% |
  | HLE (no tools) | 36.0% | 36.0% |
  | HLE (with tools) | 51.1% | 51.1% |
  | SciCode | 49.2% | 48.3% |
  | CriPT AA | 16.3% | 17.4% |
  | GPQA Diamond | 90.6% | 90.3% |
  | LiveCodeBench | 88.3% | 88.1% |
  | **Tool Calling / Search** | | |
  | AutomationBench - public split only | 39.3 | 38.2 |
  | MCP Atlas | 80.8% | 81.5% |
  | Tau3 Banking | 36.1% | 36.8% |
  | **General Capabilities** | | |
  | AA-LCR | 78.2% | 79.4% |
  | LongBench v2 | 67.5% | 67.6% |
  | IFBench | 79.6% | 80.7% |
  | AA Omniscience (index) - public split only | 10.8 | 8.8 |
</Accordion>

## Hardware compatibility and serving

We recommend **CUTLASS for FP8 linear layers** and **Triton for MoE execution** on the following SGLang configurations. GPU counts are per replica and reflect validated layouts, rather than minimum requirements.

| **Hardware** | **Tensor parallelism** | **Linear backend** | **MoE runner** | **Attention backend** |
| - | - | - | - | - |
| 8 NVIDIA H200 GPUs | TP8 | CUTLASS | Triton | FlashAttention 3 (`fa3`) |
| 4 NVIDIA B300 GPUs | TP4 | CUTLASS | Triton | TensorRT-LLM MHA (`trtllm_mha`) |

<Tabs>
  <Tab title="SGLang">
    Select an [SGLang image](https://hub.docker.com/r/lmsysorg/sglang) release with Beam support, and pin it by digest.

    ```bash icon="docker" theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    docker pull lmsysorg/sglang:beam
    ```

    Launch on **8 H200 GPUs**:

    ```bash icon="docker" theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    docker run --gpus all \
      --ipc=host \
      -p 30000:30000 \
      -e USE_TRITON_W8A8_FP8_KERNEL=0 \
      -e SGLANG_ENABLE_FP8_GEMM_CONFIG_TUNE=0 \
      lmsysorg/sglang:beam \
      python -m sglang.launch_server \
      --model-path reflection/Beam-1.0-501B-A23B-FP8 \
      --tensor-parallel-size 8 \
      --attention-backend fa3 \
      --moe-runner-backend triton \
      --kv-cache-dtype fp8_e4m3 \
      --host 0.0.0.0 \
      --port 30000
    ```

    For **4 B300 GPUs**, use the same command with `--tensor-parallel-size 4` and `--attention-backend trtllm_mha`.

    <Note>
      FA4’s FP8 KV cache path on H200 requires a head dimension of 512, while Beam uses a head dimension of 128. We therefore recommend FA3 for this configuration.
    </Note>

    See the public [SGLang CLI reference](https://docs.sglang.io/advanced_features/server_arguments.html) for additional options.
  </Tab>

  <Tab title="vLLM">
    Select a [vLLM image](https://docs.vllm.ai/en/latest/deployment/docker/) release with Beam support, and pin it by digest.

    ```bash icon="docker" theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    docker pull vllm/vllm-openai:reflection-beam
    ```

    Launch on **8 H200 GPUs**:

    ```bash icon="docker" theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
    docker run --gpus all \
      --ipc=host \
      -p 8000:8000 \
      vllm/vllm-openai:reflection-beam \
      --model reflection/Beam-1.0-501B-A23B-FP8 \
      --tensor-parallel-size 8 \
      --attention-backend FLASH_ATTN \
      --linear-backend cutlass \
      --moe-backend triton \
      --kv-cache-dtype fp8_e4m3
    ```

    For **4 B300 GPUs**, use `--tensor-parallel-size 4` and `--attention-backend FLASHINFER`, keeping CUTLASS linears and Triton MoE.

    See the public [vLLM CLI reference](https://docs.vllm.ai/en/latest/cli/serve/) for additional options.
  </Tab>
</Tabs>

We thank the LLM Compressor team for developing and maintaining the quantization tooling used to produce this release and the SGLang team for their inference optimizations. We’re grateful to **Jinze Xue, Matthew Radzihovsky, Zhiyu Cheng, and Trenton Starkey at NVIDIA** for their technical expertise, guidance, and support in developing and refining our quantization recipes.
