94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
256 lines
8.9 KiB
Python
256 lines
8.9 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import TYPE_CHECKING, Optional
|
|
|
|
import torch
|
|
|
|
from sglang.srt.layers.moe import MoeRunner
|
|
from sglang.srt.layers.moe.moe_runner.marlin import MarlinMoeQuantInfo
|
|
from sglang.srt.layers.quantization.marlin_utils import (
|
|
apply_awq_marlin_linear,
|
|
awq_to_marlin_zero_points,
|
|
marlin_make_empty_g_idx,
|
|
marlin_make_workspace,
|
|
marlin_moe_permute_scales,
|
|
marlin_permute_scales,
|
|
moe_awq_to_marlin_zero_points,
|
|
)
|
|
from sglang.srt.layers.quantization.utils import get_scalar_types, replace_parameter
|
|
from sglang.srt.utils import is_hip, is_xpu
|
|
|
|
if TYPE_CHECKING:
|
|
from sglang.srt.layers.moe.token_dispatcher import (
|
|
CombineInput,
|
|
StandardDispatchOutput,
|
|
)
|
|
from sglang.srt.layers.quantization.base_config import QuantizationConfig
|
|
|
|
awq_marlin_moe_repack = None
|
|
awq_marlin_repack = None
|
|
|
|
|
|
def _unsupported_awq_dequantize(*args, **kwargs):
|
|
raise RuntimeError("AWQ GPU kernels are unavailable on the current platform.")
|
|
|
|
|
|
awq_dequantize = _unsupported_awq_dequantize
|
|
|
|
if is_xpu():
|
|
try:
|
|
from sgl_kernel import awq_dequantize
|
|
except ImportError:
|
|
pass
|
|
elif is_hip():
|
|
try:
|
|
from sglang.srt.layers.quantization.awq.awq_triton import (
|
|
awq_dequantize_triton as awq_dequantize,
|
|
)
|
|
except ImportError:
|
|
pass
|
|
else:
|
|
try:
|
|
from sglang.jit_kernel.awq_dequantize import awq_dequantize
|
|
from sglang.jit_kernel.awq_marlin_repack import (
|
|
awq_marlin_moe_repack,
|
|
awq_marlin_repack,
|
|
)
|
|
from sglang.srt.utils.custom_op import register_custom_op_from_extern
|
|
|
|
awq_dequantize = register_custom_op_from_extern(
|
|
awq_dequantize,
|
|
fake_impl=lambda qweight, scales, qzeros: qweight.new_empty(
|
|
qweight.shape[:-1] + (qweight.shape[-1] * 8,), dtype=scales.dtype
|
|
),
|
|
)
|
|
except ImportError:
|
|
try:
|
|
from sglang.srt.layers.quantization.awq.awq_triton import (
|
|
awq_dequantize_triton as awq_dequantize,
|
|
)
|
|
except ImportError:
|
|
try:
|
|
from sgl_kernel import awq_dequantize
|
|
except ImportError:
|
|
pass
|
|
|
|
_, scalar_types = get_scalar_types()
|
|
|
|
|
|
class AWQLinearKernel:
|
|
def __init__(self, quant_config: Optional[QuantizationConfig] = None):
|
|
self.quant_config = quant_config
|
|
|
|
def process_weights_after_loading(self, layer: torch.nn.Module) -> None:
|
|
layer.qweight = torch.nn.Parameter(layer.qweight.data, requires_grad=False)
|
|
layer.qzeros = torch.nn.Parameter(layer.qzeros.data, requires_grad=False)
|
|
layer.scales = torch.nn.Parameter(layer.scales.data, requires_grad=False)
|
|
|
|
def apply(
|
|
self,
|
|
layer: torch.nn.Module,
|
|
x: torch.Tensor,
|
|
bias: Optional[torch.Tensor] = None,
|
|
) -> torch.Tensor:
|
|
qweight = layer.qweight
|
|
scales = layer.scales
|
|
qzeros = layer.qzeros
|
|
pack_factor = self.quant_config.pack_factor
|
|
out_shape = x.shape[:-1] + (qweight.shape[-1] * pack_factor,)
|
|
reshaped_x = x.reshape(-1, x.shape[-1])
|
|
out = awq_dequantize(qweight, scales, qzeros)
|
|
out = torch.matmul(reshaped_x, out)
|
|
|
|
if bias is not None:
|
|
out.add_(bias)
|
|
return out.reshape(out_shape)
|
|
|
|
|
|
class AWQMarlinLinearKernel:
|
|
def __init__(self, quant_config: Optional[QuantizationConfig] = None):
|
|
self.quant_config = quant_config
|
|
|
|
def process_weights_after_loading(self, layer: torch.nn.Module) -> None:
|
|
device = layer.qweight.device
|
|
layer.qweight = torch.nn.Parameter(layer.qweight.data, requires_grad=False)
|
|
layer.qzeros = torch.nn.Parameter(layer.qzeros.data, requires_grad=False)
|
|
layer.scales = torch.nn.Parameter(layer.scales.data, requires_grad=False)
|
|
|
|
layer.workspace = marlin_make_workspace(device)
|
|
|
|
marlin_qweight = awq_marlin_repack(
|
|
layer.qweight,
|
|
size_k=layer.input_size_per_partition,
|
|
size_n=layer.output_size_per_partition,
|
|
num_bits=self.quant_config.quant_type.size_bits,
|
|
)
|
|
replace_parameter(layer, "qweight", marlin_qweight)
|
|
|
|
marlin_scales = marlin_permute_scales(
|
|
layer.scales,
|
|
size_k=layer.input_size_per_partition,
|
|
size_n=layer.output_size_per_partition,
|
|
group_size=self.quant_config.group_size,
|
|
)
|
|
replace_parameter(layer, "scales", marlin_scales)
|
|
|
|
marlin_zp = awq_to_marlin_zero_points(
|
|
layer.qzeros,
|
|
size_k=layer.num_groups,
|
|
size_n=layer.output_size_per_partition,
|
|
num_bits=self.quant_config.quant_type.size_bits,
|
|
)
|
|
replace_parameter(layer, "qzeros", marlin_zp)
|
|
|
|
layer.g_idx = marlin_make_empty_g_idx(device)
|
|
layer.g_idx_sort_indices = marlin_make_empty_g_idx(device)
|
|
|
|
def apply(
|
|
self,
|
|
layer: torch.nn.Module,
|
|
x: torch.Tensor,
|
|
bias: Optional[torch.Tensor] = None,
|
|
) -> torch.Tensor:
|
|
return apply_awq_marlin_linear(
|
|
input=x,
|
|
weight=layer.qweight,
|
|
weight_scale=layer.scales,
|
|
weight_zp=layer.qzeros,
|
|
g_idx=layer.g_idx,
|
|
g_idx_sort_indices=layer.g_idx_sort_indices,
|
|
workspace=layer.workspace,
|
|
quant_type=self.quant_config.quant_type,
|
|
output_size_per_partition=layer.output_size_per_partition,
|
|
input_size_per_partition=layer.input_size_per_partition,
|
|
bias=bias,
|
|
)
|
|
|
|
|
|
class AWQMoEKernel:
|
|
def __init__(self, quant_config: Optional[QuantizationConfig] = None):
|
|
self.quant_config = quant_config
|
|
self.runner: Optional[MoeRunner] = None
|
|
|
|
def process_weights_after_loading(self, layer: torch.nn.Module) -> None:
|
|
num_experts = layer.w13_qweight.shape[0]
|
|
device = layer.w13_qweight.device
|
|
|
|
layer.w13_g_idx_sort_indices = torch.nn.Parameter(
|
|
torch.empty((num_experts, 0), dtype=torch.int32, device=device),
|
|
requires_grad=False,
|
|
)
|
|
layer.w2_g_idx_sort_indices = torch.nn.Parameter(
|
|
torch.empty((num_experts, 0), dtype=torch.int32, device=device),
|
|
requires_grad=False,
|
|
)
|
|
|
|
marlin_w13_qweight = awq_marlin_moe_repack(
|
|
layer.w13_qweight,
|
|
layer.w13_g_idx_sort_indices,
|
|
size_k=layer.w13_qweight.shape[1],
|
|
size_n=layer.w13_qweight.shape[2] * self.quant_config.pack_factor,
|
|
num_bits=self.quant_config.weight_bits,
|
|
)
|
|
replace_parameter(layer, "w13_qweight", marlin_w13_qweight)
|
|
|
|
marlin_w2_qweight = awq_marlin_moe_repack(
|
|
layer.w2_qweight,
|
|
layer.w2_g_idx_sort_indices,
|
|
size_k=layer.w2_qweight.shape[1],
|
|
size_n=layer.w2_qweight.shape[2] * self.quant_config.pack_factor,
|
|
num_bits=self.quant_config.weight_bits,
|
|
)
|
|
replace_parameter(layer, "w2_qweight", marlin_w2_qweight)
|
|
|
|
marlin_w13_scales = marlin_moe_permute_scales(
|
|
s=layer.w13_scales,
|
|
size_k=layer.intermediate_size_per_partition,
|
|
size_n=layer.w13_scales.shape[2],
|
|
group_size=self.quant_config.group_size,
|
|
)
|
|
replace_parameter(layer, "w13_scales", marlin_w13_scales)
|
|
|
|
marlin_w2_scales = marlin_moe_permute_scales(
|
|
s=layer.w2_scales,
|
|
size_k=layer.intermediate_size_per_partition,
|
|
size_n=layer.w2_scales.shape[2],
|
|
group_size=self.quant_config.group_size,
|
|
)
|
|
replace_parameter(layer, "w2_scales", marlin_w2_scales)
|
|
|
|
marlin_w13_zp = moe_awq_to_marlin_zero_points(
|
|
layer.w13_qzeros,
|
|
size_k=layer.w13_qzeros.shape[1],
|
|
size_n=layer.w13_qzeros.shape[2] * self.quant_config.pack_factor,
|
|
num_bits=self.quant_config.weight_bits,
|
|
)
|
|
replace_parameter(layer, "w13_qzeros", marlin_w13_zp)
|
|
|
|
marlin_w2_zp = moe_awq_to_marlin_zero_points(
|
|
layer.w2_qzeros,
|
|
size_k=layer.w2_qzeros.shape[1],
|
|
size_n=layer.w2_qzeros.shape[2] * self.quant_config.pack_factor,
|
|
num_bits=self.quant_config.weight_bits,
|
|
)
|
|
replace_parameter(layer, "w2_qzeros", marlin_w2_zp)
|
|
|
|
def apply(
|
|
self,
|
|
layer: torch.nn.Module,
|
|
dispatch_output: StandardDispatchOutput,
|
|
) -> CombineInput:
|
|
if self.runner is None:
|
|
raise RuntimeError("moe runner is not initialized")
|
|
|
|
quant_info = MarlinMoeQuantInfo(
|
|
w13_qweight=layer.w13_qweight,
|
|
w2_qweight=layer.w2_qweight,
|
|
w13_scales=layer.w13_scales,
|
|
w2_scales=layer.w2_scales,
|
|
w13_g_idx_sort_indices=layer.w13_g_idx_sort_indices,
|
|
w2_g_idx_sort_indices=layer.w2_g_idx_sort_indices,
|
|
w13_qzeros=layer.w13_qzeros,
|
|
w2_qzeros=layer.w2_qzeros,
|
|
weight_bits=self.quant_config.weight_bits,
|
|
)
|
|
return self.runner.run(dispatch_output, quant_info)
|