File size: 6,359 Bytes
f098956
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
---
language:
  - en
  - zh
license: mit
library_name: vllm
pipeline_tag: text-generation
tags:
  - glm-5.2
  - quantized
  - w4a16
  - int4
  - gptq
  - compressed-tensors
  - mtp
  - speculative-decoding
base_model: zai-org/GLM-5.2
---

# GLM-5.2 — W4A16 (INT4) + BF16 MTP

An **INT4 weight-only (W4A16) quantization of GLM-5.2** that preserves the BF16 multi-token-prediction (MTP)
layer for speculative decoding. Quantized from [zai-org/GLM-5.2](https://huggingface.co/zai-org/GLM-5.2)
with [llm-compressor](https://github.com/vllm-project/llm-compressor) (GPTQ).

## Purpose

GLM-5.2 (744B-parameter MoE) in BF16 needs ~1.49 TB of weights — eight 141 GB H200s, fully occupied, to serve
one replica. The goal of this artifact is a **smaller-footprint variant that matches FP8 quality** so the model
runs on **four H200s instead of eight** (freeing half the fleet, or two replicas per node), while keeping the
MTP draft head for speculative-decode speedups. It is a deployment-efficiency artifact, not a new model — all
capability comes from the base GLM-5.2.

## Details

| Field | Value |
|---|---|
| Base model | [zai-org/GLM-5.2](https://huggingface.co/zai-org/GLM-5.2) (BF16) |
| Architecture | `GlmMoeDsaForCausalLM` — 744B MoE, ~40B active, MLA + DeepSeek Sparse Attention, 1M context |
| Weight quantization | **W4A16, INT4, asymmetric, group-size 128** (GPTQ, compressed-tensors), **routed experts only** |
| Kept in BF16 | attention, dense layers (0–2), shared experts, router/gate, embeddings, lm_head, **MTP layer 78** |
| MTP | layer 78 preserved at BF16 for spec-decode (`num_speculative_tokens=5`) |
| Calibration | in-distribution chat/code set; **`calibrate_all_experts=True`** (visits every expert — see Method) |
| Size | ~405 GB (from ~1488 GB BF16) |
| License | MIT (inherited from the base model) |

> The "FP8" sometimes seen in the filename refers to the **fp8 KV-cache used at serving time**, not the
> weights — the weights are INT4 (W4A16) and the MTP layer is BF16.

## Evaluation — vs the FP8 baseline (same harness, 8×H200)

Measured against `zai-org/GLM-5.2-FP8` under an identical setup (generative tasks via chat-completions with a
16,384-token generation budget for the reasoning CoT; matched serve config with `--reasoning-parser`).

| Task | This (W4A16+MTP) | FP8 baseline |
|---|---|---|
| GSM8K (strict) | 0.960 | 0.955 |
| IFEval (prompt-strict / inst-strict) | 0.909 / 0.911 | 0.891 / 0.903 |
| MATH-500 (math-verify) | 0.954 | 0.958 |
| RULER @ 32K | 0.832 | 0.831 |
| RULER @ 64K | 0.841 | 0.813 |
| SWE-bench Verified (mini-SWE-agent + official grading) | **82.0%** (410/500) | 82.2% (411/500) |

**Quantization preserves quality:** scores track the FP8 baseline within run-to-run noise on reasoning,
instruction-following, long-context retrieval, and agentic coding. (MMLU-Pro: FP8 full-set = 0.820; the W4A16
subset run was not completed — the verdict was already conclusive from the six tasks above. RULER used 50
samples per sub-task, not the full 500.)

**Long context:** serves at `max_model_len=1,048,576` on 8×H200 and correctly retrieved a needle from a
~936K-token prompt (MLA + DSA compress the KV cache enough to fit 1M in the memory free after weights).

**MTP:** speculative-decode acceptance ~46–52% aggregate (~95% at draft position 0), confirming the injected
BF16 MTP layer is healthy.

**Throughput (8×H200, vLLM bench, output tok/s):**

| concurrency | This | FP8 |
|---|---|---|
| 1 | 132 (+48%) | 89 |
| 8 | 466 (+32%) | 354 |
| 32 | 825 (−13%) | 953 |

Faster than FP8 at low/medium concurrency (MTP speculative decoding helps most in the interactive regime) and
slightly slower at full saturation — honest trade-off, both directions shown.

## Serving (vLLM ≥ 0.23, Hopper / H200)

The asymmetric W4A16 MoE **requires expert parallelism** (`--enable-expert-parallel`); plain tensor-parallel
trips a Marlin scale-sharding bug. The DSA indexer needs an nvcc ≥ 12.8 toolchain (`CUDA_HOME`).

**8×H200 (up to 1M context):**
```bash
vllm serve <repo> \
  --tensor-parallel-size 8 --enable-expert-parallel \
  --kv-cache-dtype fp8 \
  --speculative-config '{"method":"mtp","num_speculative_tokens":5}' \
  --reasoning-parser glm45 --tool-call-parser glm47 --enable-auto-tool-choice \
  --max-model-len 1048576 --gpu-memory-utilization 0.90 --trust-remote-code
```

**4×H200 (the footprint win, ≤ ~128K context — 1M needs all 8):**
```bash
vllm serve <repo> --tensor-parallel-size 4 --enable-expert-parallel \
  --kv-cache-dtype fp8 --speculative-config '{"method":"mtp","num_speculative_tokens":5}' \
  --reasoning-parser glm45 --tool-call-parser glm47 --enable-auto-tool-choice \
  --max-model-len 32768 --gpu-memory-utilization 0.92 --trust-remote-code
```

Validated on Hopper (H200). On Blackwell (sm100) the serving kernels need extra flags and are not yet
recommended for this artifact.

## Method

1. **GPTQ W4A16** (group-128, asymmetric) on the routed experts only, with attention/dense/MTP/embeddings/
   lm_head held at BF16. `calibrate_all_experts=True` is required — calibrating only routed experts starves
   rarely-activated experts and produces a coherent-looking but degenerate model.
2. **MTP preservation (Option-Y):** GLM-5.2's MTP/nextn layer (index 78) isn't instantiated by
   `from_pretrained`, so quantization never sees it. It is injected back at BF16 from the source checkpoint
   after quantization and added to the `ignore` list so the serving stack treats it as unquantized.

The full recipe, evaluation methodology, and a log of the engineering walls hit and overcome are in the
companion repository (calibration memory limits, MoE sequential-target OOMs, the MTP-loss-on-save issue, the
asymmetric-MoE serving fix, and the Blackwell toolchain gaps).

## Limitations

- Throughput is ~13% below FP8 at very high concurrency (c32); the win is at low/medium concurrency.
- 1M-context serving requires all 8 H200s; 4×H200 is for ≤ ~128K.
- Asymmetric weights require `--enable-expert-parallel` to serve correctly.
- Recommended on Hopper; Blackwell serving needs additional kernel flags.

## Acknowledgements

Built on [zai-org/GLM-5.2](https://huggingface.co/zai-org/GLM-5.2) (MIT). Quantized with
[llm-compressor](https://github.com/vllm-project/llm-compressor); served with [vLLM](https://github.com/vllm-project/vllm).