-
-
Notifications
You must be signed in to change notification settings - Fork 11.6k
[Model] Deepseek GGUF support #13167
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 20 commits
d528c24
625b658
c455901
a18d44b
8374b37
011fbfb
0f1c8ee
ec4de41
1ff2fd5
ea9eb0e
58022e9
ee1dc1f
8a7e61f
da3dff6
ae19a8a
bb4af45
b92793e
0ea9252
36f73b5
7caa1f7
a264af3
28baf15
e547394
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,13 +1,16 @@ | ||||||||||||||||||||||
| # SPDX-License-Identifier: Apache-2.0 | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| from typing import Any, Dict, List, Optional | ||||||||||||||||||||||
| from typing import Any, Callable, Dict, List, Optional | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| import gguf | ||||||||||||||||||||||
| import torch | ||||||||||||||||||||||
| from gguf import GGMLQuantizationType as WeightType | ||||||||||||||||||||||
| from torch.nn.parameter import Parameter, UninitializedParameter | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| from vllm import _custom_ops as ops | ||||||||||||||||||||||
| from vllm.model_executor.layers.activation import SiluAndMul | ||||||||||||||||||||||
| from vllm.model_executor.layers.fused_moe.layer import (FusedMoE, | ||||||||||||||||||||||
| FusedMoEMethodBase) | ||||||||||||||||||||||
| from vllm.model_executor.layers.linear import LinearBase, LinearMethodBase | ||||||||||||||||||||||
| from vllm.model_executor.layers.quantization.base_config import ( | ||||||||||||||||||||||
| QuantizationConfig, QuantizeMethodBase) | ||||||||||||||||||||||
|
|
@@ -49,6 +52,8 @@ def get_quant_method(self, layer: torch.nn.Module, | |||||||||||||||||||||
| return GGUFLinearMethod(self) | ||||||||||||||||||||||
| elif isinstance(layer, VocabParallelEmbedding): | ||||||||||||||||||||||
| return GGUFEmbeddingMethod(self) | ||||||||||||||||||||||
| elif isinstance(layer, FusedMoE): | ||||||||||||||||||||||
| return GGUFMoEMethod(self) | ||||||||||||||||||||||
| return None | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
@@ -184,6 +189,127 @@ def apply(self, | |||||||||||||||||||||
| return out | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| class GGUFMoEMethod(FusedMoEMethodBase): | ||||||||||||||||||||||
| """MoE method for GGUF. | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| Args: | ||||||||||||||||||||||
| quant_config: The GGUF quantization config. | ||||||||||||||||||||||
| """ | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| def __init__(self, quant_config: GGUFConfig): | ||||||||||||||||||||||
| self.quant_config = quant_config | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| def create_weights(self, layer: torch.nn.Module, num_experts: int, | ||||||||||||||||||||||
| hidden_size: int, intermediate_size_per_partition: int, | ||||||||||||||||||||||
| params_dtype: torch.dtype, **extra_weight_attrs): | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| assert intermediate_size_per_partition % 512 == 0, \ | ||||||||||||||||||||||
| "GGUF requires a block size of 512, you are running with " \ | ||||||||||||||||||||||
| f"{intermediate_size_per_partition}, please " \ | ||||||||||||||||||||||
| "adjust your tensor parallel size" | ||||||||||||||||||||||
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| tensor_shape = (num_experts, 2 * intermediate_size_per_partition, | ||||||||||||||||||||||
| hidden_size) | ||||||||||||||||||||||
| #gate up proj | ||||||||||||||||||||||
| w13_qweight = GGUFUninitializedParameter(requires_grad=False) | ||||||||||||||||||||||
| set_weight_attrs( | ||||||||||||||||||||||
| w13_qweight, { | ||||||||||||||||||||||
| "input_dim": 1, | ||||||||||||||||||||||
| "output_dim": 0, | ||||||||||||||||||||||
| "tensor_shape": tensor_shape, | ||||||||||||||||||||||
| "is_gguf_weight": True, | ||||||||||||||||||||||
| "data_container": [], | ||||||||||||||||||||||
| }) | ||||||||||||||||||||||
| set_weight_attrs(w13_qweight, extra_weight_attrs) | ||||||||||||||||||||||
| layer.register_parameter("w13_qweight", w13_qweight) | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| w13_qweight_type = Parameter(torch.empty(1, dtype=torch.uint8), | ||||||||||||||||||||||
| requires_grad=False) | ||||||||||||||||||||||
| set_weight_attrs(w13_qweight_type, { | ||||||||||||||||||||||
| "is_gguf_weight_type": True, | ||||||||||||||||||||||
| "weight_type": 0, | ||||||||||||||||||||||
| "ignore_warning": True | ||||||||||||||||||||||
| }) | ||||||||||||||||||||||
| set_weight_attrs(w13_qweight_type, extra_weight_attrs) | ||||||||||||||||||||||
| layer.register_parameter("w13_qweight_type", w13_qweight_type) | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| tensor_shape = (num_experts, intermediate_size_per_partition, | ||||||||||||||||||||||
| hidden_size) | ||||||||||||||||||||||
| #gate down proj | ||||||||||||||||||||||
| w2_qweight = GGUFUninitializedParameter(requires_grad=False) | ||||||||||||||||||||||
| set_weight_attrs( | ||||||||||||||||||||||
| w2_qweight, { | ||||||||||||||||||||||
| "input_dim": 1, | ||||||||||||||||||||||
| "output_dim": 0, | ||||||||||||||||||||||
| "tensor_shape": tensor_shape, | ||||||||||||||||||||||
| "is_gguf_weight": True, | ||||||||||||||||||||||
| "data_container": [], | ||||||||||||||||||||||
| }) | ||||||||||||||||||||||
| set_weight_attrs(w2_qweight, extra_weight_attrs) | ||||||||||||||||||||||
| layer.register_parameter("w2_qweight", w2_qweight) | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| w2_qweight_type = Parameter(torch.empty(1, dtype=torch.uint8), | ||||||||||||||||||||||
| requires_grad=False) | ||||||||||||||||||||||
| set_weight_attrs(w2_qweight_type, { | ||||||||||||||||||||||
| "is_gguf_weight_type": True, | ||||||||||||||||||||||
| "weight_type": 0, | ||||||||||||||||||||||
| "ignore_warning": True | ||||||||||||||||||||||
| }) | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| set_weight_attrs(w2_qweight_type, extra_weight_attrs) | ||||||||||||||||||||||
| layer.register_parameter("w2_qweight_type", w2_qweight_type) | ||||||||||||||||||||||
| self.act = SiluAndMul() | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| def apply( | ||||||||||||||||||||||
| self, | ||||||||||||||||||||||
| layer: torch.nn.Module, | ||||||||||||||||||||||
| x: torch.Tensor, | ||||||||||||||||||||||
| router_logits: torch.Tensor, | ||||||||||||||||||||||
| top_k: int, | ||||||||||||||||||||||
| renormalize: bool, | ||||||||||||||||||||||
| use_grouped_topk: bool = False, | ||||||||||||||||||||||
| topk_group: Optional[int] = None, | ||||||||||||||||||||||
| num_expert_group: Optional[int] = None, | ||||||||||||||||||||||
| global_num_experts: int = -1, | ||||||||||||||||||||||
| expert_map: Optional[torch.Tensor] = None, | ||||||||||||||||||||||
| custom_routing_function: Optional[Callable] = None, | ||||||||||||||||||||||
| scoring_func: str = "softmax", | ||||||||||||||||||||||
| e_score_correction_bias: Optional[torch.Tensor] = None, | ||||||||||||||||||||||
| ): | ||||||||||||||||||||||
| topk_weights, topk_ids = FusedMoE.select_experts( | ||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. After #13795 got merged, We may adapt what
Suggested change
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Updated, thanks for catching and pointing to a solution! |
||||||||||||||||||||||
| hidden_states=x, | ||||||||||||||||||||||
| router_logits=router_logits, | ||||||||||||||||||||||
| use_grouped_topk=use_grouped_topk, | ||||||||||||||||||||||
| top_k=top_k, | ||||||||||||||||||||||
| renormalize=renormalize, | ||||||||||||||||||||||
| topk_group=topk_group, | ||||||||||||||||||||||
| num_expert_group=num_expert_group, | ||||||||||||||||||||||
| custom_routing_function=custom_routing_function, | ||||||||||||||||||||||
| scoring_func=scoring_func, | ||||||||||||||||||||||
| e_score_correction_bias=e_score_correction_bias) | ||||||||||||||||||||||
| final_hidden_states = torch.empty_like(x) | ||||||||||||||||||||||
| for tok, (w, idx) in enumerate(zip(topk_weights, topk_ids)): | ||||||||||||||||||||||
| inp = x[tok].reshape((1, ) + x.shape[1:]) | ||||||||||||||||||||||
| current_hidden_state = None | ||||||||||||||||||||||
| for ww, ii in zip(w, idx): | ||||||||||||||||||||||
| expert_up = layer.w13_qweight[ii] | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| out = _fuse_mul_mat(inp, expert_up, | ||||||||||||||||||||||
| layer.w13_qweight_type.weight_type) | ||||||||||||||||||||||
| out = self.act(out) | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| expert_down = layer.w2_qweight[ii] | ||||||||||||||||||||||
| current_state = _fuse_mul_mat( | ||||||||||||||||||||||
| out, expert_down, | ||||||||||||||||||||||
| layer.w2_qweight_type.weight_type).mul_(ww) | ||||||||||||||||||||||
| if current_hidden_state is None: | ||||||||||||||||||||||
| current_hidden_state = current_state | ||||||||||||||||||||||
| else: | ||||||||||||||||||||||
| current_hidden_state.add_(current_state) | ||||||||||||||||||||||
Isotr0py marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||
| final_hidden_states[tok] = current_hidden_state | ||||||||||||||||||||||
| return final_hidden_states | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| class GGUFEmbeddingMethod(GGUFLinearMethod): | ||||||||||||||||||||||
| """Embedding method for GGUF. | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can just remove
torch.bfloat16(it's added by mistake) ingguf.py:vllm/vllm/model_executor/layers/quantization/gguf.py
Lines 31 to 32 in 444b0f0
So that we don't need extra dtype handling here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated