[Bugfix] Restore is_sym guard for zp in GPTQ/CT MoE to fix symmetric quant regression (#45656)

Signed-off-by: yuwenzho <yuwen.zhou@intel.com>

Yuwen Zhou committed Jun 19, 2026 at 00:20 UTC 058cc0a8b6e33523b1ed75db933726959df43791
2 files changed +10 -4
vllm/model_executor/layers/quantization/auto_gptq.py
+8 -2
@@ -25,6 +25,7 @@ from vllm.model_executor.layers.fused_moe import (
25 UnquantizedFusedMoEMethod,
26 )
27 from vllm.model_executor.layers.fused_moe.oracle.int_wna16 import (
28 + WNA16MoEBackend,
29 convert_to_wna16_moe_kernel_format,
30 make_wna16_moe_kernel,
31 select_wna16_moe_backend,
@@ -753,13 +754,18 @@ class AutoGPTQMoEMethod(FusedMoEMethodBase):
754 gptq_marlin_moe_quant_config,
755 )
756
757 + # CPU fused_experts_cpu requires zero points even for symmetric quant
758 + use_zp = (
759 + not self.quant_config.is_sym
760 + or self.wna16_moe_backend == WNA16MoEBackend.CPU
761 + )
762 return gptq_marlin_moe_quant_config(
763 w1_scale=layer.w13_scales,
764 w2_scale=layer.w2_scales,
765 weight_bits=self.quant_config.weight_bits,
766 group_size=self.quant_config.group_size,
761 - w1_zp=getattr(layer, "w13_qzeros", None),
762 - w2_zp=getattr(layer, "w2_qzeros", None),
767 + w1_zp=getattr(layer, "w13_qzeros", None) if use_zp else None,
768 + w2_zp=getattr(layer, "w2_qzeros", None) if use_zp else None,
769 w1_bias=getattr(layer, "w13_bias", None),
770 w2_bias=getattr(layer, "w2_bias", None),
771 )
vllm/model_executor/layers/quantization/compressed_tensors/compressed_tensors_moe/compressed_tensors_moe_wna16_marlin.py
+2 -2
@@ -415,9 +415,9 @@ class CompressedTensorsWNA16MarlinMoEMethod(CompressedTensorsMoEMethod):
415 replace_parameter(layer, "w13_weight_scale", w13_scales)
416 replace_parameter(layer, "w2_weight_scale", w2_scales)
417
418 - if w13_qzeros is not None:
418 + # CPU fused_experts_cpu requires zero points even for symmetric quant
419 + if not self.symmetric or self.wna16_backend == WNA16MoEBackend.CPU:
420 replace_parameter(layer, "w13_weight_zero_point", w13_qzeros)
420 - if w2_qzeros is not None:
421 replace_parameter(layer, "w2_weight_zero_point", w2_qzeros)
422
423 # Marlin-specific parameters (not needed for Flashinfer)