| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #!/usr/bin/env python3
- """Teach the glm5next model classes their fused projection names.
- local-inference-lab/GLM-5.3-Flash-NVFP4-4p67 is the first checkpoint of this
- family that QUANTIZES the individual attention projections (per-shard
- MXFP8 entries `self_attn.q_proj` … in hf_quant_config). vLLM fuses those
- shards into single modules (`in_proj_qkvbfg_a`, `fused_qkv_a_proj`,
- `wk_weights_proj`), and the ModelOpt MIXED_PRECISION config resolves a
- fused module's quant_algo through its shards ONLY via the model class's
- `packed_modules_mapping` (handed to the quant config by
- model_executor/model_loader/utils.py). Without it every fused linear comes
- up UnquantizedLinearMethod and weight loading dies with
- KeyError: 'layers.0.self_attn.in_proj_qkvbfg_a.weight_scale'
- Anchors self-assert; idempotent.
- """
- import py_compile
- import sys
- B = "/usr/local/lib/python3.12/dist-packages/vllm/models/glm5next/nvidia"
- MAPPING = '''
- # NVFP4-4p67: quantized per-shard attention/shared-expert projections
- # are fused by vLLM; expose the shard names so the ModelOpt
- # MIXED_PRECISION config can resolve the fused module's quant_algo
- # (see model_loader/utils.py packed_modules_mapping pass-through).
- packed_modules_mapping = {
- "gate_up_proj": ["gate_proj", "up_proj"],
- "in_proj_qkvbfg_a": ["q_proj", "k_proj", "v_proj",
- "b_proj", "f_a_proj", "g_a_proj"],
- "fused_qkv_a_proj": ["q_a_proj", "kv_a_proj_with_mqa"],
- "wk_weights_proj": ["wk", "weights_proj"],
- }
- '''
- TARGETS = [
- (
- f"{B}/model.py",
- "class Glm5NextForCausalLM(\n"
- " nn.Module, HasInnerState, SupportsPP, MixtureOfExperts, IsHybrid\n"
- "):\n",
- ),
- (
- f"{B}/mtp.py",
- "class Glm5NextMTP(nn.Module, DeepseekV2MixtureOfExperts):\n",
- ),
- ]
- for path, anchor in TARGETS:
- src = open(path).read()
- if "packed_modules_mapping" in src:
- print(f"already patched: {path}")
- continue
- n = src.count(anchor)
- assert n == 1, f"anchor {n}x in {path} — day-0 image drifted, review me"
- open(path, "w").write(src.replace(anchor, anchor + MAPPING, 1))
- py_compile.compile(path, doraise=True)
- print(f"patched: {path}")
- print("patch_4p67 OK")
|