GLM-5.2-W4A16-MTP / README.md
pastapaul's picture
Upload README.md with huggingface_hub
f098956 verified
|
Raw
History Blame
6.36 kB
---
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).