[quant][bugfix] fix deepseek quant bug (#478)
see #465 Signed-off-by: MengqingCao <cmq0113@163.com> Co-authored-by: zzzzwwjj <1183291235@qq.com>
This commit is contained in:
@@ -24,7 +24,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
"""Inference-only DeepseekV2/DeepseekV3 model."""
|
"""Inference-only DeepseekV2/DeepseekV3 model."""
|
||||||
from typing import Iterable, List, Optional, Set, Tuple, Union
|
from typing import List, Optional, Union
|
||||||
|
|
||||||
import torch
|
import torch
|
||||||
from torch import nn
|
from torch import nn
|
||||||
@@ -40,14 +40,12 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
|
|||||||
from vllm.model_executor.layers.sampler import get_sampler
|
from vllm.model_executor.layers.sampler import get_sampler
|
||||||
from vllm.model_executor.layers.vocab_parallel_embedding import (
|
from vllm.model_executor.layers.vocab_parallel_embedding import (
|
||||||
ParallelLMHead, VocabParallelEmbedding)
|
ParallelLMHead, VocabParallelEmbedding)
|
||||||
from vllm.model_executor.model_loader.weight_utils import (
|
|
||||||
default_weight_loader, maybe_remap_kv_scale_name)
|
|
||||||
from vllm.model_executor.models.deepseek_v2 import ( # noqa
|
from vllm.model_executor.models.deepseek_v2 import ( # noqa
|
||||||
DeepseekV2Attention, DeepseekV2DecoderLayer, DeepseekV2ForCausalLM,
|
DeepseekV2Attention, DeepseekV2DecoderLayer, DeepseekV2ForCausalLM,
|
||||||
DeepseekV2MLAAttention, DeepseekV2MLP, DeepseekV2MoE)
|
DeepseekV2MLAAttention, DeepseekV2MLP, DeepseekV2MoE)
|
||||||
from vllm.model_executor.models.utils import (
|
from vllm.model_executor.models.utils import (
|
||||||
PPMissingLayer, is_pp_missing_parameter,
|
PPMissingLayer, make_empty_intermediate_tensors_factory, make_layers,
|
||||||
make_empty_intermediate_tensors_factory, make_layers, maybe_prefix)
|
maybe_prefix)
|
||||||
from vllm.sequence import IntermediateTensors
|
from vllm.sequence import IntermediateTensors
|
||||||
|
|
||||||
|
|
||||||
@@ -282,109 +280,6 @@ class CustomDeepseekV2ForCausalLM(DeepseekV2ForCausalLM):
|
|||||||
self.make_empty_intermediate_tensors = (
|
self.make_empty_intermediate_tensors = (
|
||||||
self.model.make_empty_intermediate_tensors)
|
self.model.make_empty_intermediate_tensors)
|
||||||
|
|
||||||
def load_weights(self, weights: Iterable[Tuple[str,
|
|
||||||
torch.Tensor]]) -> Set[str]:
|
|
||||||
stacked_params_mapping = [
|
|
||||||
# (param_name, shard_name, shard_id)
|
|
||||||
("gate_up_proj", "gate_proj", 0),
|
|
||||||
("gate_up_proj", "up_proj", 1),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Params for weights, fp8 weight scales, fp8 activation scales
|
|
||||||
# (param_name, weight_name, expert_id, shard_id)
|
|
||||||
expert_params_mapping = FusedMoE.make_expert_params_mapping(
|
|
||||||
ckpt_gate_proj_name="gate_proj",
|
|
||||||
ckpt_down_proj_name="down_proj",
|
|
||||||
ckpt_up_proj_name="up_proj",
|
|
||||||
num_experts=self.config.n_routed_experts)
|
|
||||||
|
|
||||||
params_dict = dict(self.named_parameters())
|
|
||||||
loaded_params: Set[str] = set()
|
|
||||||
for name, loaded_weight in weights:
|
|
||||||
if "rotary_emb.inv_freq" in name:
|
|
||||||
continue
|
|
||||||
|
|
||||||
spec_layer = get_spec_layer_idx_from_weight_name(self.config, name)
|
|
||||||
if spec_layer is not None:
|
|
||||||
continue # skip spec decode layers for main model
|
|
||||||
|
|
||||||
# w8a8 weight from modelslim need flatten before load_weight
|
|
||||||
if "scale" in name or "offset" in name:
|
|
||||||
loaded_weight = loaded_weight.flatten()
|
|
||||||
|
|
||||||
for (param_name, weight_name, shard_id) in stacked_params_mapping:
|
|
||||||
# Skip non-stacked layers and experts (experts handled below).
|
|
||||||
if weight_name not in name:
|
|
||||||
continue
|
|
||||||
# We have mlp.experts[0].gate_proj in the checkpoint.
|
|
||||||
# Since we handle the experts below in expert_params_mapping,
|
|
||||||
# we need to skip here BEFORE we update the name, otherwise
|
|
||||||
# name will be updated to mlp.experts[0].gate_up_proj, which
|
|
||||||
# will then be updated below in expert_params_mapping
|
|
||||||
# for mlp.experts[0].gate_gate_up_proj, which breaks load.
|
|
||||||
if (("mlp.experts." in name) and name not in params_dict):
|
|
||||||
continue
|
|
||||||
name = name.replace(weight_name, param_name)
|
|
||||||
# Skip loading extra bias for GPTQ models.
|
|
||||||
if name.endswith(".bias") and name not in params_dict:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if is_pp_missing_parameter(name, self):
|
|
||||||
continue
|
|
||||||
|
|
||||||
param = params_dict[name]
|
|
||||||
weight_loader = param.weight_loader
|
|
||||||
weight_loader(param, loaded_weight, shard_id)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
for mapping in expert_params_mapping:
|
|
||||||
param_name, weight_name, expert_id, shard_id = mapping
|
|
||||||
if weight_name not in name:
|
|
||||||
continue
|
|
||||||
name = name.replace(weight_name, param_name)
|
|
||||||
|
|
||||||
if is_pp_missing_parameter(name, self):
|
|
||||||
continue
|
|
||||||
|
|
||||||
param = params_dict[name]
|
|
||||||
weight_loader = param.weight_loader
|
|
||||||
weight_loader(param,
|
|
||||||
loaded_weight,
|
|
||||||
name,
|
|
||||||
shard_id=shard_id,
|
|
||||||
expert_id=expert_id)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
# Skip loading extra bias for GPTQ models.
|
|
||||||
if name.endswith(".bias") and name not in params_dict:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Remapping the name of FP8 kv-scale.
|
|
||||||
name = maybe_remap_kv_scale_name(name, params_dict)
|
|
||||||
if name is None:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if is_pp_missing_parameter(name, self):
|
|
||||||
continue
|
|
||||||
|
|
||||||
param = params_dict[name]
|
|
||||||
weight_loader = getattr(param, "weight_loader",
|
|
||||||
default_weight_loader)
|
|
||||||
weight_loader(param, loaded_weight)
|
|
||||||
loaded_params.add(name)
|
|
||||||
return loaded_params
|
|
||||||
|
|
||||||
|
|
||||||
class CustomDeepseekV3ForCausalLM(CustomDeepseekV2ForCausalLM):
|
class CustomDeepseekV3ForCausalLM(CustomDeepseekV2ForCausalLM):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_spec_layer_idx_from_weight_name(config: PretrainedConfig,
|
|
||||||
weight_name: str) -> Optional[int]:
|
|
||||||
if hasattr(config, "num_nextn_predict_layers") and (
|
|
||||||
config.num_nextn_predict_layers > 0):
|
|
||||||
layer_idx = config.num_hidden_layers
|
|
||||||
for i in range(config.num_nextn_predict_layers):
|
|
||||||
if weight_name.startswith(f"model.layers.{layer_idx+i}."):
|
|
||||||
return layer_idx + i
|
|
||||||
return None
|
|
||||||
|
|||||||
@@ -374,3 +374,7 @@ class AscendFusedMoEMethod(FusedMoEMethodBase):
|
|||||||
num_expert_group,
|
num_expert_group,
|
||||||
custom_routing_function, scoring_func,
|
custom_routing_function, scoring_func,
|
||||||
e_score_correction_bias)
|
e_score_correction_bias)
|
||||||
|
|
||||||
|
def process_weights_after_loading(self, layer: torch.nn.Module) -> None:
|
||||||
|
if hasattr(self.quant_method, "process_weights_after_loading"):
|
||||||
|
self.quant_method.process_weights_after_loading(layer)
|
||||||
|
|||||||
Reference in New Issue
Block a user