main
py 78 lines 2.61 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 import torch
5
6 from vllm.model_executor.layers.quantization.utils.humming import (
7 apply_humming_linear,
8 convert_linear_layer_to_humming_standard,
9 get_humming_linear_compute_config,
10 prepare_humming_linear_layer_config,
11 quant_key_to_input_schema,
12 )
13 from vllm.platforms import current_platform
14 from vllm.utils.import_utils import has_humming
15
16 from .base import MxFp4LinearKernel, MxFp4LinearLayerConfig
17
18
19 class HummingMxFp4LinearKernel(MxFp4LinearKernel):
20 """Humming GEMM Kernel for MXFP4."""
21
22 @classmethod
23 def is_supported(
24 cls, compute_capability: int | None = None
25 ) -> tuple[bool, str | None]:
26 if not current_platform.is_cuda():
27 return False, "Humming only supported on CUDA"
28
29 if not has_humming():
30 return False, "Humming is not installed"
31
32 if not current_platform.has_device_capability(75):
33 return False, "Humming only supported on SM75+"
34
35 return True, None
36
37 @classmethod
38 def can_implement(cls, config: MxFp4LinearLayerConfig) -> tuple[bool, str | None]:
39 try:
40 quant_key_to_input_schema(config.activation_quant_key)
41 except ValueError as error:
42 return False, str(error)
43 return True, None
44
45 def process_weights_after_loading(self, layer: torch.nn.Module) -> None:
46 layer.weight_scale.data = layer.weight_scale.data.view(torch.float8_e8m0fnu)
47 name_map = {"weight": "weight", "weight_scale": "weight_scale"}
48
49 quant_config = {
50 "quant_method": "humming",
51 "dtype": "float4e2m1",
52 "scale_dtype": "float8e8m0",
53 "group_size": 32,
54 "weight_scale_type": "group",
55 }
56
57 convert_linear_layer_to_humming_standard(layer=layer, name_map=name_map)
58 input_schema = quant_key_to_input_schema(self.config.activation_quant_key)
59 self.layer_config = prepare_humming_linear_layer_config(
60 layer, quant_config, input_schema=input_schema
61 )
62 self.compute_config = get_humming_linear_compute_config()
63 self.locks = torch.zeros(1024, dtype=torch.int32, device=layer.weight.device)
64
65 def apply_weights(
66 self,
67 layer: torch.nn.Module,
68 x: torch.Tensor,
69 bias: torch.Tensor | None = None,
70 ) -> torch.Tensor:
71 return apply_humming_linear(
72 layer,
73 x,
74 skip_bias_add=bias is None,
75 layer_config=self.layer_config,
76 compute_config=self.compute_config,
77 locks=self.locks,
78 )