Remove unnecessary `load_weights` methods (#44589)
Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>
Harry Mellor committed
Jun 29, 2026 at 09:52 UTC
5051698e41b7dc3da421f1c50bfe178a92dc7881
54 files changed
+821
-1975
tests/model_executor/test_weight_utils.py
+121
@@ -160,5 +160,126 @@ class TestMaybeRemapKvScaleName:
160
assert result is None
161
162
163
+class TestKvCacheScaleMapper:
164
+ """The `WeightsMapper` returned by `get_cache_scale_mapper` replaces the
165
+ per-model `maybe_remap_kv_scale_name` calls. It must remap the same set of
166
+ checkpoint formats (the non-`params_dict`-dependent ones) and be idempotent
167
+ so it composes safely with a model's own qkv/gate_up `hf_to_vllm_mapper`."""
168
+
169
+ def _mapper(self):
170
+ # `get_cache_scale_mapper` does not use `self`; call it on the base
171
+ # class to get the default (non-config-specific) mapper.
172
+ from vllm.model_executor.layers.quantization.base_config import (
173
+ QuantizationConfig,
174
+ )
175
+
176
+ return QuantizationConfig.get_cache_scale_mapper()
177
+
178
+ def _map(self, name: str) -> str | None:
179
+ return self._mapper()._map_name(name)
180
+
181
+ @pytest.mark.parametrize(
182
+ "name,expected",
183
+ [
184
+ # Qwen3-MoE / llm-compressor fused qkv_proj
185
+ (
186
+ "model.layers.0.self_attn.qkv_proj.k_scale",
187
+ "model.layers.0.self_attn.attn.k_scale",
188
+ ),
189
+ (
190
+ "model.layers.0.self_attn.qkv_proj.v_scale",
191
+ "model.layers.0.self_attn.attn.v_scale",
192
+ ),
193
+ # ModelOpt / NVFP4 k_proj/v_proj
194
+ (
195
+ "model.layers.0.self_attn.k_proj.k_scale",
196
+ "model.layers.0.self_attn.attn.k_scale",
197
+ ),
198
+ (
199
+ "model.layers.0.self_attn.v_proj.v_scale",
200
+ "model.layers.0.self_attn.attn.v_scale",
201
+ ),
202
+ # deprecated fused kv_scale and bare scales
203
+ (
204
+ "model.layers.0.self_attn.kv_scale",
205
+ "model.layers.0.self_attn.attn.k_scale",
206
+ ),
207
+ (
208
+ "model.layers.0.self_attn.k_scale",
209
+ "model.layers.0.self_attn.attn.k_scale",
210
+ ),
211
+ # NemotronH mixer
212
+ (
213
+ "model.layers.0.mixer.k_proj.k_scale",
214
+ "model.layers.0.mixer.attn.k_scale",
215
+ ),
216
+ # already in vLLM form -> unchanged (idempotent)
217
+ (
218
+ "model.layers.0.self_attn.attn.k_scale",
219
+ "model.layers.0.self_attn.attn.k_scale",
220
+ ),
221
+ # non-kv scales must not be touched
222
+ (
223
+ "model.layers.0.self_attn.k_proj.weight_scale",
224
+ "model.layers.0.self_attn.k_proj.weight_scale",
225
+ ),
226
+ (
227
+ "model.layers.0.self_attn.k_proj.input_scale",
228
+ "model.layers.0.self_attn.k_proj.input_scale",
229
+ ),
230
+ # regular weights untouched
231
+ (
232
+ "model.layers.0.self_attn.q_proj.weight",
233
+ "model.layers.0.self_attn.q_proj.weight",
234
+ ),
235
+ ],
236
+ )
237
+ def test_remap(self, name, expected):
238
+ assert self._map(name) == expected
239
+
240
+ @pytest.mark.parametrize(
241
+ "name",
242
+ [
243
+ "model.layers.0.self_attn.k_scale",
244
+ "model.layers.0.self_attn.k_proj.k_scale",
245
+ "model.layers.0.self_attn.qkv_proj.v_scale",
246
+ "model.layers.0.mixer.k_proj.k_scale",
247
+ ],
248
+ )
249
+ def test_idempotent(self, name):
250
+ once = self._map(name)
251
+ assert once is not None
252
+ assert self._map(once) == once
253
+
254
+ def test_composes_with_qkv_mapper(self):
255
+ """Applied together with a model's qkv/gate_up mapper, the regex scale
256
+ rules run before the substr rename, so scales are normalized to `.attn.`
257
+ and regular projections are still fused correctly."""
258
+ from vllm.model_executor.models.utils import WeightsMapper
259
+
260
+ model_mapper = WeightsMapper(
261
+ orig_to_new_substr={
262
+ ".q_proj": ".qkv_proj.q",
263
+ ".k_proj": ".qkv_proj.k",
264
+ ".v_proj": ".qkv_proj.v",
265
+ }
266
+ )
267
+ # AutoWeightsLoader does `mapper |= cache_scale_mapper`
268
+ combined = model_mapper | self._mapper()
269
+
270
+ assert (
271
+ combined._map_name("model.layers.0.self_attn.q_proj.weight")
272
+ == "model.layers.0.self_attn.qkv_proj.q.weight"
273
+ )
274
+ assert (
275
+ combined._map_name("model.layers.0.self_attn.k_proj.k_scale")
276
+ == "model.layers.0.self_attn.attn.k_scale"
277
+ )
278
+ assert (
279
+ combined._map_name("model.layers.0.self_attn.k_scale")
280
+ == "model.layers.0.self_attn.attn.k_scale"
281
+ )
282
+
283
+
284
if __name__ == "__main__":
285
test_download_weights_from_hf()
vllm/lora/worker_manager.py
+5
-1
@@ -128,9 +128,13 @@ class WorkerLoRAManager:
128
peft_helper.validate_legal(self.lora_config)
129
130
# For some models like Qwen2VL, we need to use hf_to_vllm_mapper
131
- # to ensure correct loading of lora weights.
131
+ # to ensure correct loading of lora weights. Drop the QKV/MLP fusion
132
+ # substr maps so constituent names (e.g. `q_proj`) survive for the
133
+ # LoRA manager to pack, while keeping genuine renames/prefixes.
134
model = self._adapter_manager.model
135
hf_to_vllm_mapper = getattr(model, "hf_to_vllm_mapper", None)
136
+ if hf_to_vllm_mapper is not None:
137
+ hf_to_vllm_mapper = hf_to_vllm_mapper.get_unstacked_mapper()
138
139
# Get model-defined prefixes to skip during LoRA loading.
140
lora_skip_prefixes = getattr(model, "lora_skip_prefixes", None)
vllm/model_executor/layers/linear.py
+85
-37
@@ -3,9 +3,12 @@
3
4
import itertools
5
from abc import abstractmethod
6
+from collections.abc import Iterable
7
+from typing import Any
8
9
import torch
10
from torch.nn.parameter import Parameter
11
+from typing_extensions import TypeIs
12
13
import vllm.envs as envs
14
from vllm.distributed import (
@@ -632,31 +635,31 @@ class MergedColumnParallelLinear(ColumnParallelLinear):
635
disable_tp=disable_tp,
636
)
637
635
- def validate_shard_id(self, loaded_shard_id: int | tuple[int, ...] | None):
636
- if loaded_shard_id is None:
637
- return
638
- if isinstance(loaded_shard_id, tuple):
639
- for idx in loaded_shard_id:
638
+ def validate_shard_id(self, shard_id: Any) -> TypeIs[int | tuple[int, ...] | None]:
639
+ if isinstance(shard_id, int):
640
+ if shard_id < 0 or shard_id >= len(self.output_sizes):
641
+ raise ValueError(
642
+ f"Shard id should be between 0 and {len(self.output_sizes) - 1}. "
643
+ f"Got shard id {shard_id}."
644
+ )
645
+ return True
646
+ if shard_id is None:
647
+ return True
648
+ if isinstance(shard_id, tuple):
649
+ for idx in shard_id:
650
if not (0 <= idx < len(self.output_sizes)):
651
raise ValueError(
652
f"Shard id index {idx} should be between 0 and "
643
- f"{len(self.output_sizes) - 1}. Got shard id {loaded_shard_id}."
653
+ f"{len(self.output_sizes) - 1}. Got shard id {shard_id}."
654
)
645
- if len(loaded_shard_id) > 1 and any(
646
- b - a != 1 for a, b in zip(loaded_shard_id[:-1], loaded_shard_id[1:])
655
+ if len(shard_id) > 1 and any(
656
+ b - a != 1 for a, b in zip(shard_id[:-1], shard_id[1:])
657
):
658
raise ValueError(
659
"Shard id with multiple indices should be consecutive. "
650
- f"Got shard id {loaded_shard_id}."
660
+ f"Got shard id {shard_id}."
661
)
652
- return
653
- elif isinstance(loaded_shard_id, int):
654
- if loaded_shard_id < 0 or loaded_shard_id >= len(self.output_sizes):
655
- raise ValueError(
656
- f"Shard id should be between 0 and {len(self.output_sizes) - 1}. "
657
- f"Got shard id {loaded_shard_id}."
658
- )
659
- return
662
+ return True
663
raise ValueError("This line should not be reached")
664
665
def weight_loader(
@@ -910,6 +913,31 @@ class MergedColumnParallelLinear(ColumnParallelLinear):
913
tp_rank=self.tp_rank,
914
)
915
916
+ def load_weights(
917
+ self, weights: Iterable[tuple[str, torch.Tensor]]
918
+ ) -> Iterable[str]:
919
+ for name, loaded_weight in weights:
920
+ shard_id = getattr(loaded_weight, "shard_id", None)
921
+ self.validate_shard_id(shard_id)
922
+ # Load into self if name is not an attr of self or its submodules
923
+ param: Parameter
924
+ if "." in name:
925
+ submodule, _, attr = name.rpartition(".")
926
+ param = getattr(self.get_submodule(submodule), attr, self)
927
+ else:
928
+ param = getattr(self, name, self)
929
+ if param is None and name == "bias":
930
+ continue
931
+ param.weight_loader(param, loaded_weight, shard_id)
932
+ logger.debug(
933
+ "Loaded shard %s with shape %s into %s.%s",
934
+ shard_id,
935
+ loaded_weight.shape,
936
+ self.prefix,
937
+ name,
938
+ )
939
+ yield name
940
+
941
942
class QKVParallelLinear(ColumnParallelLinear):
943
"""Linear layers for the attention's QKV transformation.
@@ -996,17 +1024,13 @@ class QKVParallelLinear(ColumnParallelLinear):
1024
disable_tp=disable_tp,
1025
)
1026
999
- def validate_shard_id(self, loaded_shard_id: str | None):
1000
- if loaded_shard_id is None:
1001
- return
1002
- if isinstance(loaded_shard_id, str):
1003
- if loaded_shard_id not in ["q", "k", "v"]:
1004
- raise ValueError(
1005
- "Shard id for QKVParallelLinear should be 'q', 'k', or 'v', "
1006
- f"got shard id {loaded_shard_id}."
1007
- )
1008
- return
1009
- raise ValueError("This line should not be reached")
1027
+ def validate_shard_id(self, shard_id: Any) -> TypeIs[str | None]:
1028
+ if shard_id in {"q", "k", "v"} or shard_id is None:
1029
+ return True
1030
+ raise ValueError(
1031
+ "Shard id for QKVParallelLinear should be 'q', 'k', or 'v', "
1032
+ f"got shard id {shard_id}."
1033
+ )
1034
1035
def _get_shard_offset_mapping(self, loaded_shard_id: str):
1036
shard_offset_mapping = {
@@ -1302,6 +1326,31 @@ class QKVParallelLinear(ColumnParallelLinear):
1326
assert param_data.shape == loaded_weight.shape
1327
param_data.copy_(loaded_weight)
1328
1329
+ def load_weights(
1330
+ self, weights: Iterable[tuple[str, torch.Tensor]]
1331
+ ) -> Iterable[str]:
1332
+ for name, loaded_weight in weights:
1333
+ shard_id = getattr(loaded_weight, "shard_id", None)
1334
+ self.validate_shard_id(shard_id)
1335
+ # Load into self if name is not an attr of self or its submodules
1336
+ param: Parameter
1337
+ if "." in name:
1338
+ submodule, _, attr = name.rpartition(".")
1339
+ param = getattr(self.get_submodule(submodule), attr, self)
1340
+ else:
1341
+ param = getattr(self, name, self)
1342
+ if param is None and name == "bias":
1343
+ continue
1344
+ param.weight_loader(param, loaded_weight, shard_id)
1345
+ logger.debug(
1346
+ "Loaded shard %s with shape %s into %s.%s",
1347
+ shard_id,
1348
+ loaded_weight.shape,
1349
+ self.prefix,
1350
+ name,
1351
+ )
1352
+ yield name
1353
+
1354
1355
class MinimaxM3QKVParallelLinearWithIndexer(QKVParallelLinear):
1356
"""QKV projection fused with a lightning-indexer's index_q/index_k.
@@ -1387,15 +1436,14 @@ class MinimaxM3QKVParallelLinearWithIndexer(QKVParallelLinear):
1436
prefix=prefix,
1437
)
1438
1390
- def validate_shard_id(self, loaded_shard_id: str | None) -> None:
1391
- if loaded_shard_id is None:
1392
- return
1393
- if loaded_shard_id not in ("q", "k", "v", "index_q", "index_k"):
1394
- raise ValueError(
1395
- "Shard id for MinimaxM3QKVParallelLinearWithIndexer must be one of "
1396
- "'q', 'k', 'v', 'index_q', 'index_k'; got "
1397
- f"{loaded_shard_id}."
1398
- )
1439
+ def validate_shard_id(self, shard_id: Any) -> TypeIs[str | None]:
1440
+ if shard_id in {"q", "k", "v", "index_q", "index_k"} or shard_id is None:
1441
+ return True
1442
+ raise ValueError(
1443
+ "Shard id for MinimaxM3QKVParallelLinearWithIndexer must be one of "
1444
+ "'q', 'k', 'v', 'index_q', 'index_k'; got "
1445
+ f"{shard_id}."
1446
+ )
1447
1448
def _get_shard_offset_mapping(self, loaded_shard_id: str) -> int | None:
1449
h = self.head_size
vllm/model_executor/layers/quantization/base_config.py
+46
-5
@@ -5,6 +5,7 @@ import inspect
5
from abc import ABC, abstractmethod
6
from typing import TYPE_CHECKING, Any
7
8
+import regex as re
9
import torch
10
from torch import nn
11
from transformers import PretrainedConfig
@@ -19,10 +20,12 @@ else:
20
class QuantizeMethodBase(ABC):
21
"""Base class for different quantized methods."""
22
22
- # Whether this method creates weights on meta device for online quantization.
23
- # When True, weights are created on meta device and quantized layer-wise
24
- # in process_weights_after_loading, reducing peak memory during loading.
23
uses_meta_device: bool = False
24
+ """
25
+ Whether this method creates weights on meta device for online quantization.
26
+ When True, weights are created on meta device and quantized layer-wise
27
+ in process_weights_after_loading, reducing peak memory during loading.
28
+ """
29
30
@abstractmethod
31
def create_weights(
@@ -84,6 +87,18 @@ def method_has_implemented_embedding(method_class: type[QuantizeMethodBase]) ->
87
class QuantizationConfig(ABC):
88
"""Base class for quantization configs."""
89
90
+ _ignore_unexpected_suffixes = (
91
+ ".q_scale",
92
+ ".k_scale",
93
+ ".v_scale",
94
+ ".q_zero_point",
95
+ ".k_zero_point",
96
+ ".v_zero_point",
97
+ )
98
+ """Suffixes of quantization parameters that may be present in the checkpoint but
99
+ not in the model, and should be ignored if unexpected during loading. These are used
100
+ after remapping, so should be in vLLM format (e.g. .q_scale, not .q.scale)."""
101
+
102
def __init__(self):
103
super().__init__()
104
# mapping is updated by models as they initialize
@@ -176,14 +191,40 @@ class QuantizationConfig(ABC):
191
"""
192
raise NotImplementedError
193
179
- def get_cache_scale_mapper(self) -> "WeightsMapper | None":
194
+ @staticmethod
195
+ def get_cache_scale_mapper() -> "WeightsMapper":
196
"""Mapping from checkpoint KV-cache scale names to vLLM scale names.
197
198
Returning a mapper here causes `AutoWeightsLoader` to apply it to the
199
weight stream automatically; individual model `load_weights` methods
200
do not need to know about KV-cache scales.
201
"""
186
- return None
202
+ from vllm.model_executor.models.utils import WeightsMapper
203
+
204
+ orig_to_new_regex = {
205
+ # Deprecated fused kv_scale -> attn.k_scale
206
+ re.compile(r"\.kv_scale$"): r".attn.k_scale",
207
+ # ModelOpt: .self_attn.{k,v}_proj.{k,v}_scale -> .self_attn.attn.*
208
+ re.compile(r"\.self_attn\.[kv]_proj\.([kv])_scale$"): (
209
+ r".self_attn.attn.\1_scale"
210
+ ),
211
+ # Fused QKV / qkqkv proj: .self_attn.qk(qk)v_proj.{k,v}_scale -> attn
212
+ re.compile(r"\.self_attn\.qk(?:qk)?v_proj\.([kv])_scale$"): (
213
+ r".self_attn.attn.\1_scale"
214
+ ),
215
+ # NemotronH: .mixer.{k,v}_proj.{k,v}_scale -> .mixer.attn.*
216
+ re.compile(r"\.mixer\.[kv]_proj\.([kv])_scale$"): r".mixer.attn.\1_scale",
217
+ # HYV3: .self_attn.q.scale -> .self_attn.attn.q_scale
218
+ re.compile(r"\.self_attn\.q\.scale$"): r".self_attn.attn.q_scale",
219
+ # HYV3: .self_attn.{k,v}_cache.scale -> .self_attn.attn.{k,v}_scale
220
+ re.compile(r"\.self_attn\.([kv])_cache\.scale$"): (
221
+ r".self_attn.attn.\1_scale"
222
+ ),
223
+ # Default: .{q,k,v}_scale -> .attn.{q,k,v}_scale (unless already .attn)
224
+ re.compile(r"(?<!\.attn)\.([qkv])_scale$"): r".attn.\1_scale",
225
+ re.compile(r"(?<!\.attn)\.([qkv])_zero_point$"): r".attn.\1_zero_point",
226
+ }
227
+ return WeightsMapper(orig_to_new_regex=orig_to_new_regex)
228
229
def apply_vllm_mapper( # noqa: B027
230
self, hf_to_vllm_mapper: "WeightsMapper"
vllm/model_executor/layers/quantization/fp8.py
+10
-9
@@ -219,18 +219,19 @@ class Fp8Config(QuantizationConfig):
219
return Fp8KVCacheMethod(self)
220
return None
221
222
- def get_cache_scale_mapper(self) -> "WeightsMapper":
222
+ @staticmethod
223
+ def get_cache_scale_mapper() -> "WeightsMapper":
224
"""Map compressed-tensors KV-cache scale names to vLLM names."""
225
from vllm.model_executor.models.utils import WeightsMapper
226
226
- return WeightsMapper(
227
- orig_to_new_suffix={
228
- ".k_proj.output_scale": ".attn.k_scale",
229
- ".v_proj.output_scale": ".attn.v_scale",
230
- ".q_proj.output_scale": ".attn.q_scale",
231
- ".self_attn.prob_output_scale": ".self_attn.attn.prob_scale",
232
- }
233
- )
227
+ orig_to_new_suffix = {
228
+ ".k_proj.output_scale": ".attn.k_scale",
229
+ ".v_proj.output_scale": ".attn.v_scale",
230
+ ".q_proj.output_scale": ".attn.q_scale",
231
+ ".self_attn.prob_output_scale": ".self_attn.attn.prob_scale",
232
+ }
233
+ cache_scale_mapper = WeightsMapper(orig_to_new_suffix=orig_to_new_suffix)
234
+ return cache_scale_mapper | QuantizationConfig.get_cache_scale_mapper()
235
236
237
class CopyNumelCounter(TorchDispatchMode):
vllm/model_executor/layers/quantization/quark/quark.py
+10
-9
@@ -679,16 +679,17 @@ class QuarkConfig(QuantizationConfig):
679
680
return scheme
681
682
- def get_cache_scale_mapper(self) -> "WeightsMapper":
682
+ @staticmethod
683
+ def get_cache_scale_mapper() -> "WeightsMapper":
684
"""Map Quark KV-cache scale names to vLLM names."""
684
- return WeightsMapper(
685
- orig_to_new_suffix={
686
- ".k_proj.output_scale": ".attn.k_scale",
687
- ".v_proj.output_scale": ".attn.v_scale",
688
- ".q_proj.output_scale": ".attn.q_scale",
689
- ".self_attn.prob_output_scale": ".self_attn.attn.prob_scale",
690
- }
691
- )
685
+ orig_to_new_suffix = {
686
+ ".k_proj.output_scale": ".attn.k_scale",
687
+ ".v_proj.output_scale": ".attn.v_scale",
688
+ ".q_proj.output_scale": ".attn.q_scale",
689
+ ".self_attn.prob_output_scale": ".self_attn.attn.prob_scale",
690
+ }
691
+ cache_scale_mapper = WeightsMapper(orig_to_new_suffix=orig_to_new_suffix)
692
+ return cache_scale_mapper | QuantizationConfig.get_cache_scale_mapper()
693
694
695
class QuarkLinearMethod(LinearMethodBase):
vllm/model_executor/model_loader/bitsandbytes_loader.py
+2
-1
@@ -576,7 +576,8 @@ class BitsAndBytesModelLoader(BaseModelLoader):
576
# For some models like Molmo, we need to use hf_to_vllm_mapper
577
# to ensure correct loading of weights.
578
if hf_to_vllm_mapper := getattr(model, "hf_to_vllm_mapper", None):
579
- self.weight_mapper = lambda name: hf_to_vllm_mapper._map_name(name)
579
+ unstacked_mapper = hf_to_vllm_mapper.get_unstacked_mapper()
580
+ self.weight_mapper = lambda name, m=unstacked_mapper: m._map_name(name)
581
582
self._get_bnb_target_modules(model)
583
self._classify_module_sharding(model)
vllm/model_executor/model_loader/reload/layerwise.py
+10
-1
@@ -131,8 +131,11 @@ def initialize_online_processing(layer: torch.nn.Module):
131
# Track loading progress to determine when to process/copy
132
info.load_numel = 0
133
info.load_numel_total = get_layer_size(layer)
134
+ _wrap_parameters_weight_loader(layer)
135
135
- # Wrap each parameter's weight loader
136
+
137
+def _wrap_parameters_weight_loader(layer: torch.nn.Module) -> None:
138
+ """Wrap each parameter's weight loader."""
139
# Note that nested wrapping will occur for shared tensors
140
for name, tensor in get_layer_tensors(layer).items():
141
if name in SKIP_TENSORS:
@@ -168,6 +171,12 @@ def make_online_process_loader(layer: torch.nn.Module, param_name: str) -> Calla
171
logger.debug("%s: Excessive loading", layer.__class__.__name__)
172
return
173
174
+ # Re-run on each load: layers may register parameters later (e.g., `bias`).
175
+ # Wrap late parameters and refresh `load_numel_total` so processing waits
176
+ # until all parameters are loaded.
177
+ info.load_numel_total = get_layer_size(layer)
178
+ _wrap_parameters_weight_loader(layer)
179
+
180
# Bind and normalize arguments
181
bound_args = loader_signature.bind(*args, **kwargs)
182
bound_args.apply_defaults()
vllm/model_executor/model_loader/utils.py
+1
-1
@@ -290,6 +290,6 @@ def configure_quant_config(
290
291
# pass mappings by reference to quant_config
292
if hf_to_vllm_mapper is not None:
293
- quant_config.apply_vllm_mapper(hf_to_vllm_mapper)
293
+ quant_config.apply_vllm_mapper(hf_to_vllm_mapper.get_unstacked_mapper())
294
if packed_mapping is not None:
295
quant_config.packed_modules_mapping = packed_mapping
vllm/model_executor/models/arcee.py
+10
-67
@@ -26,10 +26,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
26
ParallelLMHead,
27
VocabParallelEmbedding,
28
)
29
-from vllm.model_executor.model_loader.weight_utils import (
30
- default_weight_loader,
31
- maybe_remap_kv_scale_name,
32
-)
29
from vllm.sequence import IntermediateTensors
30
31
from .interfaces import (
@@ -42,7 +38,7 @@ from .interfaces import (
38
from .utils import (
39
AutoWeightsLoader,
40
PPMissingLayer,
45
- is_pp_missing_parameter,
41
+ WeightsMapper,
42
make_empty_intermediate_tensors_factory,
43
make_layers,
44
maybe_prefix,
@@ -276,67 +272,6 @@ class ArceeModel(nn.Module, EagleModelMixin):
272
return hidden_states, aux_hidden_states
273
return hidden_states
274
279
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
280
- """Load weights, mapping q/k/v projections to fused qkv_proj."""
281
- stacked_params_mapping = [
282
- (".qkv_proj", ".q_proj", "q"),
283
- (".qkv_proj", ".k_proj", "k"),
284
- (".qkv_proj", ".v_proj", "v"),
285
- ]
286
-
287
- params_dict = dict(self.named_parameters())
288
- loaded_params: set[str] = set()
289
-
290
- for name, loaded_weight in weights:
291
- if "rotary_emb.inv_freq" in name:
292
- continue
293
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
294
- continue
295
-
296
- if "scale" in name or "zero_point" in name:
297
- remapped_name = maybe_remap_kv_scale_name(name, params_dict)
298
- if remapped_name is None:
299
- continue
300
- name = remapped_name
301
-
302
- mapped = False
303
- for param_name, weight_name, shard_id in stacked_params_mapping:
304
- if weight_name not in name:
305
- continue
306
-
307
- name = name.replace(weight_name, param_name)
308
-
309
- if name.endswith(".bias") and name not in params_dict:
310
- mapped = True
311
- break
312
-
313
- if is_pp_missing_parameter(name, self):
314
- mapped = True
315
- break
316
-
317
- param = params_dict[name]
318
- weight_loader = param.weight_loader # type: ignore[attr-defined]
319
- weight_loader(param, loaded_weight, shard_id)
320
- loaded_params.add(name)
321
- mapped = True
322
- break
323
-
324
- if mapped:
325
- continue
326
-
327
- if name.endswith(".bias") and name not in params_dict:
328
- continue
329
-
330
- if is_pp_missing_parameter(name, self):
331
- continue
332
-
333
- param = params_dict[name]
334
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
335
- weight_loader(param, loaded_weight)
336
- loaded_params.add(name)
337
-
338
- return loaded_params
339
-
275
276
class ArceeForCausalLM(
277
nn.Module, SupportsLoRA, SupportsPP, SupportsEagle, SupportsEagle3
@@ -344,6 +279,14 @@ class ArceeForCausalLM(
279
"""Arcee Model for causal language modeling, integrated with vLLM
280
runtime."""
281
282
+ hf_to_vllm_mapper = WeightsMapper(
283
+ orig_to_new_stacked={
284
+ # weight_name: (param_name, shard_id)
285
+ ".q_proj": (".qkv_proj", "q"),
286
+ ".k_proj": (".qkv_proj", "k"),
287
+ ".v_proj": (".qkv_proj", "v"),
288
+ }
289
+ )
290
# Map fused module names to their submodule components
291
# (for quantization and LoRA)
292
packed_modules_mapping = {
@@ -420,4 +363,4 @@ class ArceeForCausalLM(
363
)
364
# AutoWeightLoader handles weight name remapping, including fusing
365
# separate q_proj, k_proj, v_proj into qkv_proj
423
- return loader.load_weights(weights)
366
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/chatglm.py
+6
-47
@@ -30,7 +30,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
30
ParallelLMHead,
31
VocabParallelEmbedding,
32
)
33
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
33
from vllm.sequence import IntermediateTensors
34
from vllm.transformers_utils.configs.chatglm import ChatGLMConfig
35
@@ -38,7 +37,6 @@ from .interfaces import SupportsLoRA, SupportsPP, SupportsQuant
37
from .utils import (
38
AutoWeightsLoader,
39
WeightsMapper,
41
- is_pp_missing_parameter,
40
make_empty_intermediate_tensors_factory,
41
make_layers,
42
maybe_prefix,
@@ -316,12 +314,9 @@ class GLMTransformer(nn.Module):
314
315
@support_torch_compile
316
class ChatGLMModel(nn.Module, SupportsQuant):
319
- packed_modules_mapping = {
320
- "linear_proj.merged_proj": [
321
- "linear_proj.gate_proj",
322
- "linear_proj.dense_h_to_4h",
323
- ]
324
- }
317
+ hf_to_vllm_mapper = WeightsMapper(
318
+ orig_to_new_substr={".word_embeddings": ""},
319
+ )
320
321
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
322
super().__init__()
@@ -386,47 +381,11 @@ class ChatGLMModel(nn.Module, SupportsQuant):
381
return hidden_states
382
383
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
389
- stacked_params_mapping = [
390
- # (param_name, shard_name, shard_id)
391
- ("linear_proj.merged_proj", "linear_proj.gate_proj", 0),
392
- ("linear_proj.merged_proj", "linear_proj.dense_h_to_4h", 1),
393
- ]
394
- params_dict = dict(self.named_parameters())
395
- loaded_params: set[str] = set()
396
-
397
- for name, loaded_weight in weights:
398
- for param_name, weight_name, shard_id in stacked_params_mapping:
399
- if weight_name not in name:
400
- continue
401
- name = name.replace(weight_name, param_name)
402
- # Skip loading extra bias for GPTQ models.
403
- if name.endswith(".bias") and name not in params_dict:
404
- continue
405
- if is_pp_missing_parameter(name, self):
406
- continue
407
- param = params_dict[name]
408
- weight_loader = param.weight_loader
409
- weight_loader(param, loaded_weight, shard_id)
410
- break
411
- else:
412
- if "rotary_pos_emb.inv_freq" in name:
413
- continue
414
- if name.endswith(".bias") and name not in params_dict:
415
- continue
416
- if is_pp_missing_parameter(name, self):
417
- continue
418
- param = params_dict[name]
419
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
420
- weight_loader(param, loaded_weight)
421
- loaded_params.add(name)
422
- return loaded_params
384
+ loader = AutoWeightsLoader(self)
385
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
386
387
388
class ChatGLMBaseModel(nn.Module):
426
- hf_to_vllm_mapper = WeightsMapper(
427
- orig_to_new_substr={".word_embeddings": ""},
428
- )
429
-
389
def __init__(
390
self,
391
*,
@@ -467,7 +426,7 @@ class ChatGLMBaseModel(nn.Module):
426
427
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]):
428
loader = AutoWeightsLoader(self)
470
- return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
429
+ return loader.load_weights(weights)
430
431
432
class ChatGLMForCausalLM(ChatGLMBaseModel, SupportsLoRA, SupportsPP, SupportsQuant):
vllm/model_executor/models/cohere_eagle.py
+3
-38
@@ -14,7 +14,6 @@ from vllm.model_executor.layers.linear import ReplicatedLinear
14
from vllm.model_executor.layers.logits_processor import LogitsProcessor
15
from vllm.model_executor.layers.quantization.base_config import QuantizationConfig
16
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
17
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
17
from vllm.model_executor.models.commandr import (
18
CohereDecoderLayer,
19
CohereForCausalLM,
@@ -134,42 +133,6 @@ class CohereEagleModel(nn.Module):
133
hidden_states, _ = self.norm(hidden_states, residual)
134
return hidden_states, hidden_states
135
137
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
138
- stacked_params_mapping = [
139
- # (param_name, shard_name, shard_id)
140
- (".qkv_proj", ".q_proj", "q"),
141
- (".qkv_proj", ".k_proj", "k"),
142
- (".qkv_proj", ".v_proj", "v"),
143
- (".gate_up_proj", ".gate_proj", 0),
144
- (".gate_up_proj", ".up_proj", 1),
145
- ]
146
- params_dict = dict(self.named_parameters())
147
- loaded_params: set[str] = set()
148
-
149
- for name, loaded_weight in weights:
150
- if "rotary_emb.inv_freq" in name:
151
- continue
152
-
153
- for param_name, weight_name, shard_id in stacked_params_mapping:
154
- if weight_name not in name:
155
- continue
156
- name = name.replace(weight_name, param_name)
157
- if name.endswith(".bias") and name not in params_dict:
158
- continue
159
- param = params_dict[name]
160
- weight_loader = param.weight_loader
161
- weight_loader(param, loaded_weight, shard_id)
162
- break
163
- else:
164
- if name.endswith(".bias") and name not in params_dict:
165
- continue
166
-
167
- param = params_dict[name]
168
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
169
- weight_loader(param, loaded_weight)
170
- loaded_params.add(name)
171
- return loaded_params
172
-
136
137
class EagleCohereForCausalLM(CohereForCausalLM):
138
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -225,7 +188,9 @@ class EagleCohereForCausalLM(CohereForCausalLM):
188
),
189
)
190
228
- loaded_weight_names = loader.load_weights(map(_track_and_forward, weights))
191
+ loaded_weight_names = loader.load_weights(
192
+ map(_track_and_forward, weights), mapper=self.hf_to_vllm_mapper
193
+ )
194
195
# Embed tokens are tied with the target model and therefore not
196
# present in the EAGLE checkpoint; mark them as loaded explicitly to
vllm/model_executor/models/commandr.py
+12
-54
@@ -45,8 +45,6 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
45
from vllm.model_executor.layers.rotary_embedding import get_rope
46
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
47
from vllm.model_executor.model_loader.weight_utils import (
48
- default_weight_loader,
49
- maybe_remap_kv_scale_name,
48
row_parallel_weight_loader,
49
)
50
from vllm.model_executor.utils import set_weight_attrs
@@ -58,7 +56,6 @@ from .utils import (
56
AutoWeightsLoader,
57
WeightsMapper,
58
extract_layer_index,
61
- is_pp_missing_parameter,
59
make_empty_intermediate_tensors_factory,
60
make_layers,
61
maybe_prefix,
@@ -341,60 +338,21 @@ class CohereModel(nn.Module):
338
hidden_states, _ = self.norm(hidden_states, residual)
339
return hidden_states
340
344
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
345
- stacked_params_mapping = [
346
- # (param_name, shard_name, shard_id)
347
- ("qkv_proj", "q_proj", "q"),
348
- ("qkv_proj", "k_proj", "k"),
349
- ("qkv_proj", "v_proj", "v"),
350
- ("gate_up_proj", "gate_proj", 0),
351
- ("gate_up_proj", "up_proj", 1),
352
- ]
353
- params_dict = dict(self.named_parameters())
354
- loaded_params: set[str] = set()
355
- for name, loaded_weight in weights:
356
- for param_name, shard_name, shard_id in stacked_params_mapping:
357
- if shard_name not in name:
358
- continue
359
- name = name.replace(shard_name, param_name)
360
- # Skip loading extra bias for GPTQ models.
361
- if name.endswith(".bias") and name not in params_dict:
362
- continue
363
- if is_pp_missing_parameter(name, self):
364
- continue
365
- param = params_dict[name]
366
- weight_loader = param.weight_loader
367
- weight_loader(param, loaded_weight, shard_id)
368
- break
369
- else:
370
- # Skip loading extra bias for GPTQ models.
371
- if name.endswith(".bias") and name not in params_dict:
372
- continue
373
- # Remapping the name of FP8 kv-scale.
374
- name = maybe_remap_kv_scale_name(name, params_dict)
375
- if name is None:
376
- continue
377
-
378
- if is_pp_missing_parameter(name, self):
379
- continue
380
- param = params_dict[name]
381
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
382
- weight_loader(param, loaded_weight)
383
- loaded_params.add(name)
384
- return loaded_params
385
-
341
342
class CohereForCausalLM(nn.Module, SupportsLoRA, SupportsPP, SupportsQuant):
343
+ hf_to_vllm_mapper = WeightsMapper(
344
+ orig_to_new_stacked={
345
+ # weight_name: (param_name, shard_id)
346
+ ".q_proj": (".qkv_proj", "q"),
347
+ ".k_proj": (".qkv_proj", "k"),
348
+ ".v_proj": (".qkv_proj", "v"),
349
+ ".gate_proj": (".gate_up_proj", 0),
350
+ ".up_proj": (".gate_up_proj", 1),
351
+ }
352
+ )
353
packed_modules_mapping = {
389
- "qkv_proj": [
390
- "q_proj",
391
- "k_proj",
392
- "v_proj",
393
- ],
394
- "gate_up_proj": [
395
- "gate_proj",
396
- "up_proj",
397
- ],
354
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
355
+ "gate_up_proj": ["gate_proj", "up_proj"],
356
}
357
# LoRA specific attributes
358
embedding_modules = {"embed_tokens": "input_embeddings"}
vllm/model_executor/models/exaone.py
+14
-67
@@ -50,17 +50,13 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
50
ParallelLMHead,
51
VocabParallelEmbedding,
52
)
53
-from vllm.model_executor.model_loader.weight_utils import (
54
- default_weight_loader,
55
- maybe_remap_kv_scale_name,
56
-)
53
from vllm.sequence import IntermediateTensors
54
55
from .interfaces import SupportsLoRA, SupportsPP
56
from .utils import (
57
AutoWeightsLoader,
58
PPMissingLayer,
63
- is_pp_missing_parameter,
59
+ WeightsMapper,
60
make_empty_intermediate_tensors_factory,
61
make_layers,
62
maybe_prefix,
@@ -370,70 +366,21 @@ class ExaoneModel(nn.Module):
366
hidden_states, _ = self.ln_f(hidden_states, residual)
367
return hidden_states
368
373
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
374
- stacked_params_mapping = [
375
- # (param_name, shard_name, shard_id)
376
- (".qkv_proj", ".q_proj", "q"),
377
- (".qkv_proj", ".k_proj", "k"),
378
- (".qkv_proj", ".v_proj", "v"),
379
- (".gate_up_proj", ".c_fc_0", 0),
380
- (".gate_up_proj", ".c_fc_1", 1),
381
- ]
382
- params_dict = dict(self.named_parameters())
383
- loaded_params: set[str] = set()
384
- for name, loaded_weight in weights:
385
- if "rotary_emb.inv_freq" in name:
386
- continue
387
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
388
- # Models trained using ColossalAI may include these tensors in
389
- # the checkpoint. Skip them.
390
- continue
391
- for param_name, weight_name, shard_id in stacked_params_mapping:
392
- if weight_name not in name:
393
- continue
394
- name = name.replace(weight_name, param_name)
395
- # Skip loading extra bias for GPTQ models.
396
- if name.endswith(".bias") and name not in params_dict:
397
- continue
398
-
399
- if is_pp_missing_parameter(name, self):
400
- continue
401
-
402
- param = params_dict[name]
403
- weight_loader = param.weight_loader
404
- weight_loader(param, loaded_weight, shard_id)
405
-
406
- break
407
- else:
408
- # Skip loading extra bias for GPTQ models.
409
- if name.endswith(".bias") and name not in params_dict:
410
- continue
411
- # Remapping the name of FP8 kv-scale.
412
- name = maybe_remap_kv_scale_name(name, params_dict)
413
- if name is None:
414
- continue
415
-
416
- if is_pp_missing_parameter(name, self):
417
- continue
418
-
419
- param = params_dict[name]
420
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
421
- weight_loader(param, loaded_weight)
422
- loaded_params.add(name)
423
- return loaded_params
424
-
369
370
class ExaoneForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
371
+ hf_to_vllm_mapper = WeightsMapper(
372
+ orig_to_new_stacked={
373
+ # weight_name: (param_name, shard_id)
374
+ ".q_proj": (".qkv_proj", "q"),
375
+ ".k_proj": (".qkv_proj", "k"),
376
+ ".v_proj": (".qkv_proj", "v"),
377
+ ".c_fc_0": (".gate_up_proj", 0),
378
+ ".c_fc_1": (".gate_up_proj", 1),
379
+ }
380
+ )
381
packed_modules_mapping = {
428
- "qkv_proj": [
429
- "q_proj",
430
- "k_proj",
431
- "v_proj",
432
- ],
433
- "gate_up_proj": [
434
- "c_fc_0",
435
- "c_fc_1",
436
- ],
382
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
383
+ "gate_up_proj": ["c_fc_0", "c_fc_1"],
384
}
385
386
# LoRA specific attributes
@@ -506,4 +453,4 @@ class ExaoneForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
453
# processed with quantization, LoRA, fine-tuning, etc.
454
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
455
)
509
- return loader.load_weights(weights)
456
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/exaone4.py
+14
-67
@@ -46,10 +46,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
46
ParallelLMHead,
47
VocabParallelEmbedding,
48
)
49
-from vllm.model_executor.model_loader.weight_utils import (
50
- default_weight_loader,
51
- maybe_remap_kv_scale_name,
52
-)
49
from vllm.sequence import IntermediateTensors
50
from vllm.transformers_utils.config import set_default_rope_theta
51
@@ -57,8 +53,8 @@ from .interfaces import SupportsLoRA, SupportsPP
53
from .utils import (
54
AutoWeightsLoader,
55
PPMissingLayer,
56
+ WeightsMapper,
57
extract_layer_index,
61
- is_pp_missing_parameter,
58
make_empty_intermediate_tensors_factory,
59
make_layers,
60
maybe_prefix,
@@ -368,70 +364,21 @@ class Exaone4Model(nn.Module):
364
hidden_states = self.norm(hidden_states)
365
return hidden_states
366
371
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
372
- stacked_params_mapping = [
373
- # (param_name, shard_name, shard_id)
374
- (".qkv_proj", ".q_proj", "q"),
375
- (".qkv_proj", ".k_proj", "k"),
376
- (".qkv_proj", ".v_proj", "v"),
377
- (".gate_up_proj", ".gate_proj", 0),
378
- (".gate_up_proj", ".up_proj", 1),
379
- ]
380
- params_dict = dict(self.named_parameters())
381
- loaded_params: set[str] = set()
382
- for name, loaded_weight in weights:
383
- if "rotary_emb.inv_freq" in name:
384
- continue
385
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
386
- # Models trained using ColossalAI may include these tensors in
387
- # the checkpoint. Skip them.
388
- continue
389
- for param_name, weight_name, shard_id in stacked_params_mapping:
390
- if weight_name not in name:
391
- continue
392
- name = name.replace(weight_name, param_name)
393
- # Skip loading extra bias for GPTQ models.
394
- if name.endswith(".bias") and name not in params_dict:
395
- continue
396
-
397
- if is_pp_missing_parameter(name, self):
398
- continue
399
-
400
- param = params_dict[name]
401
- weight_loader = param.weight_loader
402
- weight_loader(param, loaded_weight, shard_id)
403
-
404
- break
405
- else:
406
- # Skip loading extra bias for GPTQ models.
407
- if name.endswith(".bias") and name not in params_dict:
408
- continue
409
- # Remapping the name of FP8 kv-scale.
410
- name = maybe_remap_kv_scale_name(name, params_dict)
411
- if name is None:
412
- continue
413
-
414
- if is_pp_missing_parameter(name, self):
415
- continue
416
-
417
- param = params_dict[name]
418
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
419
- weight_loader(param, loaded_weight)
420
- loaded_params.add(name)
421
- return loaded_params
422
-
367
368
class Exaone4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
369
+ hf_to_vllm_mapper = WeightsMapper(
370
+ orig_to_new_stacked={
371
+ # weight_name: (param_name, shard_id)
372
+ ".q_proj": (".qkv_proj", "q"),
373
+ ".k_proj": (".qkv_proj", "k"),
374
+ ".v_proj": (".qkv_proj", "v"),
375
+ ".gate_proj": (".gate_up_proj", 0),
376
+ ".up_proj": (".gate_up_proj", 1),
377
+ }
378
+ )
379
packed_modules_mapping = {
426
- "qkv_proj": [
427
- "q_proj",
428
- "k_proj",
429
- "v_proj",
430
- ],
431
- "gate_up_proj": [
432
- "gate_proj",
433
- "up_proj",
434
- ],
380
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
381
+ "gate_up_proj": ["gate_proj", "up_proj"],
382
}
383
384
# LoRA specific attributes
@@ -503,4 +450,4 @@ class Exaone4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
450
# processed with quantization, LoRA, fine-tuning, etc.
451
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
452
)
506
- return loader.load_weights(weights)
453
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/fairseq2_llama.py
+2
-4
@@ -79,10 +79,8 @@ class Fairseq2LlamaForCausalLM(LlamaForCausalLM):
79
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
80
)
81
return loader.load_weights(
82
- (
83
- self.reshape_fairseq2_weights(name, loaded_weight, params)
84
- for name, loaded_weight in weights
85
- )
82
+ self.reshape_fairseq2_weights(name, loaded_weight, params)
83
+ for name, loaded_weight in weights
84
)
85
86
def flag_sharded_weights(self, params: dict[str, Parameter]):
vllm/model_executor/models/gemma.py
+16
-52
@@ -42,13 +42,12 @@ from vllm.model_executor.layers.logits_processor import LogitsProcessor
42
from vllm.model_executor.layers.quantization import QuantizationConfig
43
from vllm.model_executor.layers.rotary_embedding import get_rope
44
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
45
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
45
from vllm.sequence import IntermediateTensors
46
48
-from .interfaces import SupportsLoRA, SupportsPP
47
+from .interfaces import SupportsLoRA, SupportsPP, SupportsQuant
48
from .utils import (
49
AutoWeightsLoader,
51
- is_pp_missing_parameter,
50
+ WeightsMapper,
51
make_empty_intermediate_tensors_factory,
52
make_layers,
53
maybe_prefix,
@@ -324,56 +323,21 @@ class GemmaModel(nn.Module):
323
hidden_states, _ = self.norm(hidden_states, residual)
324
return hidden_states
325
327
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
328
- stacked_params_mapping = [
329
- # (param_name, shard_name, shard_id)
330
- ("qkv_proj", "q_proj", "q"),
331
- ("qkv_proj", "k_proj", "k"),
332
- ("qkv_proj", "v_proj", "v"),
333
- ("gate_up_proj", "gate_proj", 0),
334
- ("gate_up_proj", "up_proj", 1),
335
- ]
336
- params_dict = dict(self.named_parameters())
337
- loaded_params: set[str] = set()
338
- for name, loaded_weight in weights:
339
- for param_name, shard_name, shard_id in stacked_params_mapping:
340
- if shard_name not in name:
341
- continue
342
- name = name.replace(shard_name, param_name)
343
- # Skip loading extra bias for GPTQ models.
344
- if name.endswith(".bias") and name not in params_dict:
345
- continue
346
- if is_pp_missing_parameter(name, self):
347
- continue
348
- param = params_dict[name]
349
- weight_loader = param.weight_loader
350
- weight_loader(param, loaded_weight, shard_id)
351
- break
352
- else:
353
- # Skip loading extra bias for GPTQ models.
354
- if name.endswith(".bias") and name not in params_dict:
355
- continue
356
- if is_pp_missing_parameter(name, self):
357
- continue
358
- param = params_dict[name]
359
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
360
- weight_loader(param, loaded_weight)
361
- loaded_params.add(name)
362
-
363
- return loaded_params
364
-
326
366
-class GemmaForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
327
+class GemmaForCausalLM(nn.Module, SupportsLoRA, SupportsPP, SupportsQuant):
328
+ hf_to_vllm_mapper = WeightsMapper(
329
+ orig_to_new_stacked={
330
+ # weight_name: (param_name, shard_id)
331
+ ".q_proj": (".qkv_proj", "q"),
332
+ ".k_proj": (".qkv_proj", "k"),
333
+ ".v_proj": (".qkv_proj", "v"),
334
+ ".gate_proj": (".gate_up_proj", 0),
335
+ ".up_proj": (".gate_up_proj", 1),
336
+ }
337
+ )
338
packed_modules_mapping = {
368
- "qkv_proj": [
369
- "q_proj",
370
- "k_proj",
371
- "v_proj",
372
- ],
373
- "gate_up_proj": [
374
- "gate_proj",
375
- "up_proj",
376
- ],
339
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
340
+ "gate_up_proj": ["gate_proj", "up_proj"],
341
}
342
343
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -421,4 +385,4 @@ class GemmaForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
385
self,
386
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
387
)
424
- return loader.load_weights(weights)
388
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/gemma2.py
+14
-57
@@ -39,17 +39,13 @@ from vllm.model_executor.layers.logits_processor import LogitsProcessor
39
from vllm.model_executor.layers.quantization import QuantizationConfig
40
from vllm.model_executor.layers.rotary_embedding import get_rope
41
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
42
-from vllm.model_executor.model_loader.weight_utils import (
43
- default_weight_loader,
44
- maybe_remap_kv_scale_name,
45
-)
42
from vllm.sequence import IntermediateTensors
43
44
from .interfaces import SupportsLoRA, SupportsPP
45
from .utils import (
46
AutoWeightsLoader,
47
+ WeightsMapper,
48
extract_layer_index,
52
- is_pp_missing_parameter,
49
make_empty_intermediate_tensors_factory,
50
make_layers,
51
maybe_prefix,
@@ -316,60 +312,21 @@ class Gemma2Model(nn.Module):
312
hidden_states, _ = self.norm(hidden_states, residual)
313
return hidden_states
314
319
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
320
- stacked_params_mapping = [
321
- # (param_name, shard_name, shard_id)
322
- ("qkv_proj", "q_proj", "q"),
323
- ("qkv_proj", "k_proj", "k"),
324
- ("qkv_proj", "v_proj", "v"),
325
- ("gate_up_proj", "gate_proj", 0),
326
- ("gate_up_proj", "up_proj", 1),
327
- ]
328
- params_dict = dict(self.named_parameters())
329
- loaded_params: set[str] = set()
330
- for name, loaded_weight in weights:
331
- for param_name, shard_name, shard_id in stacked_params_mapping:
332
- if shard_name not in name:
333
- continue
334
- name = name.replace(shard_name, param_name)
335
- # Skip loading extra bias for GPTQ models.
336
- if name.endswith(".bias") and name not in params_dict:
337
- continue
338
- if is_pp_missing_parameter(name, self):
339
- continue
340
- param = params_dict[name]
341
- weight_loader = param.weight_loader
342
- weight_loader(param, loaded_weight, shard_id)
343
- break
344
- else:
345
- # Skip loading extra bias for GPTQ models.
346
- if name.endswith(".bias") and name not in params_dict:
347
- continue
348
- # Remapping the name of FP8 kv-scale.
349
- name = maybe_remap_kv_scale_name(name, params_dict)
350
- if name is None:
351
- continue
352
- if is_pp_missing_parameter(name, self):
353
- continue
354
- param = params_dict[name]
355
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
356
- weight_loader(param, loaded_weight)
357
- loaded_params.add(name)
358
-
359
- return loaded_params
360
-
315
316
class Gemma2ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
317
+ hf_to_vllm_mapper = WeightsMapper(
318
+ orig_to_new_stacked={
319
+ # weight_name: (param_name, shard_id)
320
+ ".q_proj": (".qkv_proj", "q"),
321
+ ".k_proj": (".qkv_proj", "k"),
322
+ ".v_proj": (".qkv_proj", "v"),
323
+ ".gate_proj": (".gate_up_proj", 0),
324
+ ".up_proj": (".gate_up_proj", 1),
325
+ }
326
+ )
327
packed_modules_mapping = {
364
- "qkv_proj": [
365
- "q_proj",
366
- "k_proj",
367
- "v_proj",
368
- ],
369
- "gate_up_proj": [
370
- "gate_proj",
371
- "up_proj",
372
- ],
328
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
329
+ "gate_up_proj": ["gate_proj", "up_proj"],
330
}
331
332
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -418,4 +375,4 @@ class Gemma2ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
375
self,
376
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
377
)
421
- return loader.load_weights(weights)
378
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/gemma3.py
+12
-63
@@ -44,18 +44,14 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
44
ParallelLMHead,
45
VocabParallelEmbedding,
46
)
47
-from vllm.model_executor.model_loader.weight_utils import (
48
- default_weight_loader,
49
- maybe_remap_kv_scale_name,
50
-)
47
from vllm.sequence import IntermediateTensors
48
from vllm.v1.attention.backend import AttentionType
49
50
from .interfaces import SupportsLoRA, SupportsPP
51
from .utils import (
52
AutoWeightsLoader,
53
+ WeightsMapper,
54
extract_layer_index,
58
- is_pp_missing_parameter,
55
make_empty_intermediate_tensors_factory,
56
make_layers,
57
maybe_prefix,
@@ -365,65 +361,18 @@ class Gemma3Model(nn.Module):
361
hidden_states, _ = self.norm(hidden_states, residual)
362
return hidden_states
363
368
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
369
- stacked_params_mapping = [
370
- # (param_name, shard_name, shard_id)
371
- ("qkv_proj", "q_proj", "q"),
372
- ("qkv_proj", "k_proj", "k"),
373
- ("qkv_proj", "v_proj", "v"),
374
- ("gate_up_proj", "gate_proj", 0),
375
- ("gate_up_proj", "up_proj", 1),
376
- ]
377
- params_dict = dict(self.named_parameters())
378
- loaded_params: set[str] = set()
379
- for name, loaded_weight in weights:
380
- # Check if this is a scale parameter that needs remapping first
381
- if name.endswith((".k_scale", ".v_scale", ".q_scale", ".prob_scale")):
382
- # Try to remap the scale name first
383
- remapped_name = maybe_remap_kv_scale_name(name, params_dict)
384
- if remapped_name is not None and remapped_name in params_dict:
385
- # Successfully remapped, use the remapped name
386
- param = params_dict[remapped_name]
387
- weight_loader = getattr(
388
- param, "weight_loader", default_weight_loader
389
- )
390
- weight_loader(param, loaded_weight)
391
- loaded_params.add(remapped_name)
392
- continue
393
- # If remapping failed, continue with normal processing
394
-
395
- for param_name, shard_name, shard_id in stacked_params_mapping:
396
- if shard_name not in name:
397
- continue
398
- name = name.replace(shard_name, param_name)
399
- # Skip loading extra bias for GPTQ models.
400
- if name.endswith(".bias") and name not in params_dict:
401
- continue
402
- if is_pp_missing_parameter(name, self):
403
- continue
404
- param = params_dict[name]
405
- weight_loader = param.weight_loader
406
- weight_loader(param, loaded_weight, shard_id)
407
- break
408
- else:
409
- # Skip loading extra bias for GPTQ models.
410
- if name.endswith(".bias") and name not in params_dict:
411
- continue
412
- # Remapping the name of FP8 kv-scale.
413
- name = maybe_remap_kv_scale_name(name, params_dict)
414
- if name is None:
415
- continue
416
- if is_pp_missing_parameter(name, self):
417
- continue
418
- param = params_dict[name]
419
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
420
- weight_loader(param, loaded_weight)
421
- loaded_params.add(name)
422
-
423
- return loaded_params
424
-
364
365
class Gemma3ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
366
+ hf_to_vllm_mapper = WeightsMapper(
367
+ orig_to_new_stacked={
368
+ # weight_name: (param_name, shard_id)
369
+ ".q_proj": (".qkv_proj", "q"),
370
+ ".k_proj": (".qkv_proj", "k"),
371
+ ".v_proj": (".qkv_proj", "v"),
372
+ ".gate_proj": (".gate_up_proj", 0),
373
+ ".up_proj": (".gate_up_proj", 1),
374
+ }
375
+ )
376
packed_modules_mapping = {
377
"qkv_proj": [
378
"q_proj",
@@ -491,4 +440,4 @@ class Gemma3ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
440
self,
441
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
442
)
494
- return loader.load_weights(weights)
443
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/glm4.py
+11
-73
@@ -39,10 +39,6 @@ from vllm.model_executor.layers.logits_processor import LogitsProcessor
39
from vllm.model_executor.layers.quantization import QuantizationConfig
40
from vllm.model_executor.layers.rotary_embedding import get_rope
41
from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
42
-from vllm.model_executor.model_loader.weight_utils import (
43
- default_weight_loader,
44
- maybe_remap_kv_scale_name,
45
-)
42
from vllm.sequence import IntermediateTensors
43
from vllm.v1.attention.backend import AttentionType
44
@@ -52,7 +48,6 @@ from .llama import LlamaModel
48
from .utils import (
49
AutoWeightsLoader,
50
PPMissingLayer,
55
- is_pp_missing_parameter,
51
maybe_prefix,
52
)
53
@@ -237,73 +232,11 @@ class Glm4Model(LlamaModel):
232
vllm_config=vllm_config, prefix=prefix, layer_type=Glm4DecoderLayer
233
)
234
240
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
241
- stacked_params_mapping = [
242
- # (param_name, shard_name, shard_id)
243
- (".qkv_proj", ".q_proj", "q"),
244
- (".qkv_proj", ".k_proj", "k"),
245
- (".qkv_proj", ".v_proj", "v"),
246
- (".gate_up_proj", ".gate_proj", 0),
247
- (".gate_up_proj", ".up_proj", 1),
248
- ]
249
- params_dict = dict(self.named_parameters())
250
- loaded_params: set[str] = set()
251
- for name, loaded_weight in weights:
252
- spec_layer = get_spec_layer_idx_from_weight_name(self.config, name)
253
- if spec_layer is not None:
254
- continue
255
- if "rotary_emb.inv_freq" in name:
256
- continue
257
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
258
- # Models trained using ColossalAI may include these tensors in
259
- # the checkpoint. Skip them.
260
- continue
261
- if "scale" in name or "zero_point" in name:
262
- # Remapping the name of FP8 kv-scale or zero point.
263
- name = maybe_remap_kv_scale_name(name, params_dict)
264
- if name is None:
265
- continue
266
- for param_name, weight_name, shard_id in stacked_params_mapping:
267
- if weight_name not in name:
268
- continue
269
- name = name.replace(weight_name, param_name)
270
- # Skip loading extra bias for GPTQ models.
271
- if name.endswith(".bias") and name not in params_dict:
272
- continue
273
-
274
- if is_pp_missing_parameter(name, self):
275
- continue
276
-
277
- param = params_dict[name]
278
- weight_loader = param.weight_loader
279
- weight_loader(param, loaded_weight, shard_id)
280
- break
281
- else:
282
- # Skip loading extra bias for GPTQ models.
283
- if name.endswith(".bias") and name not in params_dict:
284
- continue
285
-
286
- if is_pp_missing_parameter(name, self):
287
- continue
288
-
289
- param = params_dict[name]
290
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
291
- weight_loader(param, loaded_weight)
292
- loaded_params.add(name)
293
- return loaded_params
294
-
235
236
class Glm4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
237
packed_modules_mapping = {
298
- "qkv_proj": [
299
- "q_proj",
300
- "k_proj",
301
- "v_proj",
302
- ],
303
- "gate_up_proj": [
304
- "gate_proj",
305
- "up_proj",
306
- ],
238
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
239
+ "gate_up_proj": ["gate_proj", "up_proj"],
240
}
241
242
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -360,10 +293,15 @@ class Glm4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
293
return logits
294
295
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
363
- loader = AutoWeightsLoader(
364
- self,
365
- skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
366
- )
296
+ skip_prefixes = ["lm_head."] if self.config.tie_word_embeddings else []
297
+ # Skip the speculative (MTP) layers, which are loaded by the
298
+ # draft model instead.
299
+ num_nextn_layers = getattr(self.config, "num_nextn_predict_layers", 0)
300
+ skip_prefixes += [
301
+ f"model.layers.{self.config.num_hidden_layers + i}."
302
+ for i in range(num_nextn_layers)
303
+ ]
304
+ loader = AutoWeightsLoader(self, skip_prefixes=skip_prefixes)
305
return loader.load_weights(weights)
306
307
vllm/model_executor/models/glm4v.py
+13
@@ -61,6 +61,7 @@ from .interfaces import (
61
SupportsMultiModal,
62
SupportsPP,
63
)
64
+from .utils import WeightsMapper
65
66
67
class GLMVImagePixelInputs(TensorSchema):
@@ -376,6 +377,15 @@ class EVA2CLIPModel(nn.Module):
377
378
379
class GLM4VModel(ChatGLMModel):
380
+ hf_to_vllm_mapper = ChatGLMModel.hf_to_vllm_mapper | WeightsMapper(
381
+ orig_to_new_stacked={
382
+ # weight_name: (param_name, shard_id)
383
+ # Vision GLU projections
384
+ "linear_proj.gate_proj": ("linear_proj.merged_proj", 0),
385
+ "linear_proj.dense_h_to_4h": ("linear_proj.merged_proj", 1),
386
+ }
387
+ )
388
+
389
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
390
super().__init__(vllm_config=vllm_config, prefix=prefix)
391
@@ -507,6 +517,9 @@ class GLM4VMultiModalProcessor(BaseMultiModalProcessor[GLM4VProcessingInfo]):
517
class GLM4VForCausalLM(
518
ChatGLMBaseModel, SupportsMultiModal, SupportsLoRA, SupportsPP, SupportsMRoPE
519
):
520
+ # NOTE: we must bring this to the surface because GLM4VModel.hf_to_vllm_mapper
521
+ # contains non-stacking related mappings which LoRA/BnB needs to know about
522
+ hf_to_vllm_mapper = GLM4VModel.hf_to_vllm_mapper
523
packed_modules_mapping = {
524
"query_key_value": ["query_key_value"],
525
"dense_h_to_4h": ["dense_h_to_4h"],
vllm/model_executor/models/gpt_j.py
+12
-50
@@ -43,16 +43,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
43
ParallelLMHead,
44
VocabParallelEmbedding,
45
)
46
-from vllm.model_executor.model_loader.weight_utils import (
47
- default_weight_loader,
48
- maybe_remap_kv_scale_name,
49
-)
46
from vllm.sequence import IntermediateTensors
47
48
from .interfaces import SupportsPP
49
from .utils import (
50
AutoWeightsLoader,
55
- is_pp_missing_parameter,
51
+ WeightsMapper,
52
make_empty_intermediate_tensors_factory,
53
make_layers,
54
maybe_prefix,
@@ -239,51 +235,17 @@ class GPTJModel(nn.Module):
235
hidden_states = self.ln_f(hidden_states)
236
return hidden_states
237
242
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
243
- stacked_params_mapping = [
244
- # (param_name, shard_name, shard_id)
245
- ("qkv_proj", "q_proj", "q"),
246
- ("qkv_proj", "k_proj", "k"),
247
- ("qkv_proj", "v_proj", "v"),
248
- ("gate_up_proj", "gate_proj", 0),
249
- ("gate_up_proj", "up_proj", 1),
250
- ]
251
- params_dict = dict(self.named_parameters())
252
- loaded_params: set[str] = set()
253
- for name, loaded_weight in weights:
254
- if "attn.bias" in name or "attn.masked_bias" in name:
255
- continue
256
-
257
- for param_name, weight_name, shard_id in stacked_params_mapping:
258
- if weight_name not in name:
259
- continue
260
- name = name.replace(weight_name, param_name)
261
- # Skip loading extra bias for GPTQ models.
262
- if name.endswith(".bias") and name not in params_dict:
263
- continue
264
- if is_pp_missing_parameter(name, self):
265
- continue
266
- param = params_dict[name]
267
- weight_loader = param.weight_loader
268
- weight_loader(param, loaded_weight, shard_id)
269
- break
270
- else:
271
- name = maybe_remap_kv_scale_name(name, params_dict)
272
- if name is None:
273
- continue
274
- # Skip loading extra bias for GPTQ models.
275
- if name.endswith(".bias") and name not in params_dict:
276
- continue
277
- if is_pp_missing_parameter(name, self):
278
- continue
279
- param = params_dict[name]
280
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
281
- weight_loader(param, loaded_weight)
282
- loaded_params.add(name)
283
- return loaded_params
284
-
238
239
class GPTJForCausalLM(nn.Module, SupportsPP):
240
+ hf_to_vllm_mapper = WeightsMapper(
241
+ orig_to_new_stacked={
242
+ # weight_name: (param_name, shard_id)
243
+ ".q_proj": (".qkv_proj", "q"),
244
+ ".k_proj": (".qkv_proj", "k"),
245
+ ".v_proj": (".qkv_proj", "v"),
246
+ }
247
+ )
248
+
249
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
250
super().__init__()
251
config = vllm_config.model_config.hf_config
@@ -329,5 +291,5 @@ class GPTJForCausalLM(nn.Module, SupportsPP):
291
return logits
292
293
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
332
- loader = AutoWeightsLoader(self)
333
- return loader.load_weights(weights)
294
+ loader = AutoWeightsLoader(self, skip_substrs=["attn.bias", "attn.masked_bias"])
295
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/granite.py
+20
-62
@@ -49,17 +49,13 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
49
ParallelLMHead,
50
VocabParallelEmbedding,
51
)
52
-from vllm.model_executor.model_loader.weight_utils import (
53
- default_weight_loader,
54
- maybe_remap_kv_scale_name,
55
-)
52
from vllm.sequence import IntermediateTensors
53
58
-from .interfaces import SupportsLoRA, SupportsPP
54
+from .interfaces import SupportsLoRA, SupportsPP, SupportsQuant
55
from .utils import (
56
AutoWeightsLoader,
57
PPMissingLayer,
62
- is_pp_missing_parameter,
58
+ WeightsMapper,
59
make_layers,
60
maybe_prefix,
61
)
@@ -252,6 +248,17 @@ class GraniteDecoderLayer(nn.Module):
248
249
@support_torch_compile
250
class GraniteModel(nn.Module):
251
+ hf_to_vllm_mapper = WeightsMapper(
252
+ orig_to_new_stacked={
253
+ # weight_name: (param_name, shard_id)
254
+ ".q_proj": (".qkv_proj", "q"),
255
+ ".k_proj": (".qkv_proj", "k"),
256
+ ".v_proj": (".qkv_proj", "v"),
257
+ ".gate_proj": (".gate_up_proj", 0),
258
+ ".up_proj": (".gate_up_proj", 1),
259
+ }
260
+ )
261
+
262
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
263
super().__init__()
264
@@ -322,66 +329,17 @@ class GraniteModel(nn.Module):
329
return hidden_states
330
331
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
325
- stacked_params_mapping = [
326
- # (param_name, shard_name, shard_id)
327
- (".qkv_proj", ".q_proj", "q"),
328
- (".qkv_proj", ".k_proj", "k"),
329
- (".qkv_proj", ".v_proj", "v"),
330
- (".gate_up_proj", ".gate_proj", 0),
331
- (".gate_up_proj", ".up_proj", 1),
332
- ]
333
- params_dict = dict(self.named_parameters())
334
- loaded_params: set[str] = set()
335
- for name, loaded_weight in weights:
336
- for param_name, weight_name, shard_id in stacked_params_mapping:
337
- if weight_name not in name:
338
- continue
339
- name = name.replace(weight_name, param_name)
340
- # Skip loading extra bias for GPTQ models.
341
- if name.endswith(".bias") and name not in params_dict:
342
- continue
343
-
344
- if is_pp_missing_parameter(name, self):
345
- continue
346
-
347
- param = params_dict[name]
348
- weight_loader = param.weight_loader
349
- weight_loader(param, loaded_weight, shard_id)
350
-
351
- break
352
- else:
353
- # Skip loading extra bias for GPTQ models.
354
- if name.endswith(".bias") and name not in params_dict:
355
- continue
356
- # Remapping the name of FP8 kv-scale.
357
- name = maybe_remap_kv_scale_name(name, params_dict)
358
- if name is None:
359
- continue
360
-
361
- if is_pp_missing_parameter(name, self):
362
- continue
332
+ loader = AutoWeightsLoader(self)
333
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
334
364
- param = params_dict[name]
365
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
366
- weight_loader(param, loaded_weight)
367
- loaded_params.add(name)
368
- return loaded_params
335
370
-
371
-class GraniteForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
336
+class GraniteForCausalLM(nn.Module, SupportsLoRA, SupportsPP, SupportsQuant):
337
+ hf_to_vllm_mapper = GraniteModel.hf_to_vllm_mapper
338
+ # LoRA specific attributes
339
packed_modules_mapping = {
373
- "qkv_proj": [
374
- "q_proj",
375
- "k_proj",
376
- "v_proj",
377
- ],
378
- "gate_up_proj": [
379
- "gate_proj",
380
- "up_proj",
381
- ],
340
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
341
+ "gate_up_proj": ["gate_proj", "up_proj"],
342
}
383
-
384
- # LoRA specific attributes
343
embedding_modules = {
344
"embed_tokens": "input_embeddings",
345
"lm_head": "output_embeddings",
vllm/model_executor/models/hyperclovax.py
+14
-68
@@ -50,10 +50,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
50
ParallelLMHead,
51
VocabParallelEmbedding,
52
)
53
-from vllm.model_executor.model_loader.weight_utils import (
54
- default_weight_loader,
55
- maybe_remap_kv_scale_name,
56
-)
53
from vllm.sequence import IntermediateTensors
54
from vllm.transformers_utils.configs.hyperclovax import HyperCLOVAXConfig
55
@@ -61,7 +57,7 @@ from .interfaces import SupportsLoRA, SupportsPP
57
from .utils import (
58
AutoWeightsLoader,
59
PPMissingLayer,
64
- is_pp_missing_parameter,
60
+ WeightsMapper,
61
make_empty_intermediate_tensors_factory,
62
make_layers,
63
maybe_prefix,
@@ -377,71 +373,21 @@ class HyperCLOVAXModel(nn.Module):
373
hidden_states = self.norm(hidden_states)
374
return hidden_states
375
380
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
381
- stacked_params_mapping = [
382
- # (param_name, shard_name, shard_id)
383
- (".qkv_proj", ".q_proj", "q"),
384
- (".qkv_proj", ".k_proj", "k"),
385
- (".qkv_proj", ".v_proj", "v"),
386
- (".gate_up_proj", ".gate_proj", 0),
387
- (".gate_up_proj", ".up_proj", 1),
388
- ]
389
- params_dict = dict(self.named_parameters())
390
- loaded_params: set[str] = set()
391
- for name, loaded_weight in weights:
392
- if "rotary_emb.inv_freq" in name:
393
- continue
394
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
395
- # Models trained using ColossalAI may include these tensors in
396
- # the checkpoint. Skip them.
397
- continue
398
- if "scale" in name or "zero_point" in name:
399
- # Remapping the name of FP8 kv-scale or zero point.
400
- remapped_name = maybe_remap_kv_scale_name(name, params_dict)
401
- if remapped_name is None:
402
- continue
403
- name = remapped_name
404
- for param_name, weight_name, shard_id in stacked_params_mapping:
405
- if weight_name not in name:
406
- continue
407
- name = name.replace(weight_name, param_name)
408
- # Skip loading extra bias for GPTQ models.
409
- if name.endswith(".bias") and name not in params_dict:
410
- continue
411
-
412
- if is_pp_missing_parameter(name, self):
413
- continue
414
-
415
- param = params_dict[name]
416
- weight_loader = param.weight_loader # type: ignore[attr-defined]
417
- weight_loader(param, loaded_weight, shard_id)
418
- break
419
- else:
420
- # Skip loading extra bias for GPTQ models.
421
- if name.endswith(".bias") and name not in params_dict:
422
- continue
423
-
424
- if is_pp_missing_parameter(name, self):
425
- continue
426
-
427
- param = params_dict[name]
428
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
429
- weight_loader(param, loaded_weight)
430
- loaded_params.add(name)
431
- return loaded_params
432
-
376
377
class HyperCLOVAXForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
378
+ hf_to_vllm_mapper = WeightsMapper(
379
+ orig_to_new_stacked={
380
+ # weight_name: (param_name, shard_id)
381
+ ".q_proj": (".qkv_proj", "q"),
382
+ ".k_proj": (".qkv_proj", "k"),
383
+ ".v_proj": (".qkv_proj", "v"),
384
+ ".gate_proj": (".gate_up_proj", 0),
385
+ ".up_proj": (".gate_up_proj", 1),
386
+ }
387
+ )
388
packed_modules_mapping = {
436
- "qkv_proj": [
437
- "q_proj",
438
- "k_proj",
439
- "v_proj",
440
- ],
441
- "gate_up_proj": [
442
- "gate_proj",
443
- "up_proj",
444
- ],
389
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
390
+ "gate_up_proj": ["gate_proj", "up_proj"],
391
}
392
393
# LoRA specific attributes
@@ -536,4 +482,4 @@ class HyperCLOVAXForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
482
self,
483
skip_prefixes=["lm_head."] if self.config.tie_word_embeddings else None,
484
)
539
- return loader.load_weights(weights)
485
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/interfaces.py
+2
-1
@@ -1033,7 +1033,8 @@ class SupportsQuant:
1033
if self.quant_config is None:
1034
return
1035
if (hf_to_vllm_mapper := self.hf_to_vllm_mapper) is not None:
1036
- self.quant_config.apply_vllm_mapper(hf_to_vllm_mapper)
1036
+ unstacked_mapper = hf_to_vllm_mapper.get_unstacked_mapper()
1037
+ self.quant_config.apply_vllm_mapper(unstacked_mapper)
1038
if self.packed_modules_mapping is not None:
1039
self.quant_config.packed_modules_mapping.update(self.packed_modules_mapping)
1040
vllm/model_executor/models/internlm2.py
+16
-40
@@ -35,15 +35,14 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
35
ParallelLMHead,
36
VocabParallelEmbedding,
37
)
38
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
38
from vllm.sequence import IntermediateTensors
39
41
-from .interfaces import SupportsLoRA, SupportsPP
40
+from .interfaces import SupportsLoRA, SupportsPP, SupportsQuant
41
from .interfaces_base import default_pooling_type
42
from .utils import (
43
AutoWeightsLoader,
44
StageMissingLayer,
46
- is_pp_missing_parameter,
45
+ WeightsMapper,
46
make_empty_intermediate_tensors_factory,
47
make_layers,
48
maybe_prefix,
@@ -249,6 +248,14 @@ class InternLMDecoderLayer(nn.Module):
248
249
@support_torch_compile
250
class InternLM2Model(nn.Module):
251
+ hf_to_vllm_mapper = WeightsMapper(
252
+ orig_to_new_stacked={
253
+ # weight_name: (param_name, shard_id)
254
+ ".w1": (".gate_up_proj", 0),
255
+ ".w3": (".gate_up_proj", 1),
256
+ }
257
+ )
258
+
259
def __init__(
260
self,
261
*,
@@ -310,43 +317,12 @@ class InternLM2Model(nn.Module):
317
return hidden_states
318
319
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
313
- stacked_params_mapping = [
314
- # (param_name, shard_name, shard_id)
315
- ("gate_up_proj", "w1", 0),
316
- ("gate_up_proj", "w3", 1),
317
- ]
318
- params_dict = dict(self.named_parameters())
319
- loaded_params: set[str] = set()
320
- for name, loaded_weight in weights:
321
- if "rotary_emb.inv_freq" in name:
322
- continue
323
- for param_name, weight_name, shard_id in stacked_params_mapping:
324
- if weight_name not in name:
325
- continue
326
- name = name.replace(weight_name, param_name)
327
- # Skip loading extra bias for GPTQ models.
328
- if name.endswith(".bias") and name not in params_dict:
329
- continue
330
- if is_pp_missing_parameter(name, self):
331
- continue
332
- param = params_dict[name]
333
- weight_loader = param.weight_loader
334
- weight_loader(param, loaded_weight, shard_id)
335
- break
336
- else:
337
- # Skip loading extra bias for GPTQ models.
338
- if name.endswith(".bias") and name not in params_dict:
339
- continue
340
- if is_pp_missing_parameter(name, self):
341
- continue
342
- param = params_dict[name]
343
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
344
- weight_loader(param, loaded_weight)
345
- loaded_params.add(name)
346
- return loaded_params
347
-
348
-
349
-class InternLM2ForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
320
+ loader = AutoWeightsLoader(self)
321
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
322
+
323
+
324
+class InternLM2ForCausalLM(nn.Module, SupportsPP, SupportsLoRA, SupportsQuant):
325
+ hf_to_vllm_mapper = InternLM2Model.hf_to_vllm_mapper
326
packed_modules_mapping = {
327
"wqkv": ["wqkv"],
328
"gate_up_proj": ["w1", "w3"],
vllm/model_executor/models/jais2.py
+10
-59
@@ -51,18 +51,14 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
51
ParallelLMHead,
52
VocabParallelEmbedding,
53
)
54
-from vllm.model_executor.model_loader.weight_utils import (
55
- default_weight_loader,
56
- maybe_remap_kv_scale_name,
57
-)
54
from vllm.sequence import IntermediateTensors
55
56
from .interfaces import SupportsLoRA, SupportsPP
57
from .utils import (
58
AutoWeightsLoader,
59
PPMissingLayer,
60
+ WeightsMapper,
61
extract_layer_index,
65
- is_pp_missing_parameter,
62
make_empty_intermediate_tensors_factory,
63
make_layers,
64
maybe_prefix,
@@ -366,61 +362,16 @@ class Jais2Model(nn.Module):
362
hidden_states, _ = self.norm(hidden_states + residual), residual
363
return hidden_states
364
369
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
370
- stacked_params_mapping = [
371
- # (param_name, shard_name, shard_id)
372
- (".qkv_proj", ".q_proj", "q"),
373
- (".qkv_proj", ".k_proj", "k"),
374
- (".qkv_proj", ".v_proj", "v"),
375
- ]
376
- params_dict = dict(self.named_parameters())
377
- loaded_params: set[str] = set()
378
- for name, loaded_weight in weights:
379
- if "rotary_emb.inv_freq" in name:
380
- continue
381
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
382
- # Models trained using ColossalAI may include these tensors in
383
- # the checkpoint. Skip them.
384
- continue
385
- if "scale" in name:
386
- name = maybe_remap_kv_scale_name(name, params_dict)
387
- if name is None:
388
- continue
389
- for param_name, weight_name, shard_id in stacked_params_mapping:
390
- if weight_name not in name:
391
- continue
392
- name = name.replace(weight_name, param_name)
393
- # Skip loading extra bias for GPTQ models.
394
- if name.endswith(".bias") and name not in params_dict:
395
- continue
396
-
397
- if is_pp_missing_parameter(name, self):
398
- continue
399
-
400
- param = params_dict[name]
401
- weight_loader = param.weight_loader
402
- weight_loader(param, loaded_weight, shard_id)
403
- break
404
- else:
405
- # Skip loading extra bias for GPTQ models.
406
- if name.endswith(".bias") and name not in params_dict:
407
- continue
408
- # Remapping the name of FP8 kv-scale.
409
- name = maybe_remap_kv_scale_name(name, params_dict)
410
- if name is None:
411
- continue
412
-
413
- if is_pp_missing_parameter(name, self):
414
- continue
415
-
416
- param = params_dict[name]
417
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
418
- weight_loader(param, loaded_weight)
419
- loaded_params.add(name)
420
- return loaded_params
421
-
365
366
class Jais2ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
367
+ hf_to_vllm_mapper = WeightsMapper(
368
+ orig_to_new_stacked={
369
+ # weight_name: (param_name, shard_id)
370
+ ".q_proj": (".qkv_proj", "q"),
371
+ ".k_proj": (".qkv_proj", "k"),
372
+ ".v_proj": (".qkv_proj", "v"),
373
+ }
374
+ )
375
packed_modules_mapping = {
376
"qkv_proj": ["q_proj", "k_proj", "v_proj"],
377
}
@@ -490,4 +441,4 @@ class Jais2ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
441
self,
442
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
443
)
493
- return loader.load_weights(weights)
444
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/jina.py
+3
-2
@@ -254,5 +254,6 @@ class JinaEmbeddingsV5Model(Qwen3ForCausalLM, VllmModelForPooling):
254
tensor = tensor + (lora_B @ lora_A) * scaling
255
yield name, tensor
256
257
- loaded = self.model.load_weights(_merge_weights(weights))
258
- return {f"model.{name}" for name in loaded}
257
+ loader = AutoWeightsLoader(self.model, ignore_unexpected_prefixes=["lm_head."])
258
+ weights = _merge_weights(weights)
259
+ return loader.load_weights(weights, mapper=self.model.hf_to_vllm_mapper)
vllm/model_executor/models/llama.py
+24
-58
@@ -52,10 +52,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
52
ParallelLMHead,
53
VocabParallelEmbedding,
54
)
55
-from vllm.model_executor.model_loader.weight_utils import (
56
- default_weight_loader,
57
- maybe_remap_kv_scale_name,
58
-)
55
from vllm.sequence import IntermediateTensors
56
from vllm.v1.attention.backend import AttentionType
57
@@ -67,12 +63,13 @@ from .interfaces import (
63
SupportsEagle3,
64
SupportsLoRA,
65
SupportsPP,
66
+ SupportsQuant,
67
)
68
from .utils import (
69
AutoWeightsLoader,
70
PPMissingLayer,
71
+ WeightsMapper,
72
extract_layer_index,
75
- is_pp_missing_parameter,
73
make_empty_intermediate_tensors_factory,
74
make_layers,
75
maybe_prefix,
@@ -345,6 +342,17 @@ class LlamaDecoderLayer(nn.Module):
342
},
343
)
344
class LlamaModel(nn.Module, EagleModelMixin):
345
+ hf_to_vllm_mapper = WeightsMapper(
346
+ orig_to_new_stacked={
347
+ # weight_name: (param_name, shard_id)
348
+ ".q_proj": (".qkv_proj", "q"),
349
+ ".k_proj": (".qkv_proj", "k"),
350
+ ".v_proj": (".qkv_proj", "v"),
351
+ ".gate_proj": (".gate_up_proj", 0),
352
+ ".up_proj": (".gate_up_proj", 1),
353
+ }
354
+ )
355
+
356
def __init__(
357
self,
358
*,
@@ -431,67 +439,25 @@ class LlamaModel(nn.Module, EagleModelMixin):
439
return hidden_states
440
441
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
434
- stacked_params_mapping = [
435
- # (param_name, shard_name, shard_id)
436
- (".qkv_proj", ".q_proj", "q"),
437
- (".qkv_proj", ".k_proj", "k"),
438
- (".qkv_proj", ".v_proj", "v"),
439
- (".gate_up_proj", ".gate_proj", 0),
440
- (".gate_up_proj", ".up_proj", 1),
441
- ]
442
- params_dict = dict(self.named_parameters())
443
- loaded_params: set[str] = set()
444
- for name, loaded_weight in weights:
445
- if "rotary_emb.inv_freq" in name:
446
- continue
447
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
448
- # Models trained using ColossalAI may include these tensors in
449
- # the checkpoint. Skip them.
450
- continue
451
- if "scale" in name or "zero_point" in name:
452
- # Remapping the name of FP8 kv-scale or zero point.
453
- name = maybe_remap_kv_scale_name(name, params_dict)
454
- if name is None:
455
- continue
456
- for param_name, weight_name, shard_id in stacked_params_mapping:
457
- if weight_name not in name:
458
- continue
459
- name = name.replace(weight_name, param_name)
460
- # Skip loading extra bias for GPTQ models.
461
- if name.endswith(".bias") and name not in params_dict:
462
- continue
463
-
464
- if is_pp_missing_parameter(name, self):
465
- continue
466
-
467
- param = params_dict[name]
468
- weight_loader = param.weight_loader
469
- weight_loader(param, loaded_weight, shard_id)
470
- break
471
- else:
472
- # Skip loading extra bias for GPTQ models.
473
- if name.endswith(".bias") and name not in params_dict:
474
- continue
475
-
476
- if is_pp_missing_parameter(name, self):
477
- continue
478
-
479
- param = params_dict[name]
480
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
481
- weight_loader(param, loaded_weight)
482
- loaded_params.add(name)
483
- return loaded_params
442
+ loader = AutoWeightsLoader(self)
443
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
444
445
446
class LlamaForCausalLM(
487
- LocalArgmaxMixin, nn.Module, SupportsLoRA, SupportsPP, SupportsEagle, SupportsEagle3
447
+ LocalArgmaxMixin,
448
+ nn.Module,
449
+ SupportsLoRA,
450
+ SupportsPP,
451
+ SupportsEagle,
452
+ SupportsEagle3,
453
+ SupportsQuant,
454
):
455
+ hf_to_vllm_mapper = LlamaModel.hf_to_vllm_mapper
456
+ # LoRA specific attributes
457
packed_modules_mapping = {
458
"qkv_proj": ["q_proj", "k_proj", "v_proj"],
459
"gate_up_proj": ["gate_proj", "up_proj"],
460
}
493
-
494
- # LoRA specific attributes
461
embedding_modules = {
462
"embed_tokens": "input_embeddings",
463
"lm_head": "output_embeddings",
vllm/model_executor/models/mamba.py
+4
-21
@@ -26,7 +26,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
26
ParallelLMHead,
27
VocabParallelEmbedding,
28
)
29
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
29
from vllm.model_executor.models.interfaces import (
30
HasInnerState,
31
IsAttentionFree,
@@ -37,7 +36,7 @@ from vllm.sequence import IntermediateTensors
36
37
from .utils import (
38
AutoWeightsLoader,
40
- is_pp_missing_parameter,
39
+ WeightsMapper,
40
make_empty_intermediate_tensors_factory,
41
make_layers,
42
maybe_prefix,
@@ -170,28 +169,12 @@ class MambaModel(nn.Module):
169
170
return hidden_states
171
173
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
174
- params_dict = dict(self.named_parameters())
175
- loaded_params: set[str] = set()
176
- for name, loaded_weight in weights:
177
- if "A_log" in name:
178
- name = name.replace("A_log", "A")
179
- # Skip loading extra bias for GPTQ models.
180
- if name.endswith(".bias") and name not in params_dict:
181
- continue
182
- if is_pp_missing_parameter(name, self):
183
- continue
184
-
185
- param = params_dict[name]
186
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
187
- weight_loader(param, loaded_weight)
188
- loaded_params.add(name)
189
- return loaded_params
190
-
172
173
class MambaForCausalLM(
174
nn.Module, HasInnerState, IsAttentionFree, SupportsPP, SupportsMambaPrefixCaching
175
):
176
+ hf_to_vllm_mapper = WeightsMapper(orig_to_new_substr={".A_log": ".A"})
177
+
178
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
179
config = vllm_config.model_config.hf_config
180
@@ -279,4 +262,4 @@ class MambaForCausalLM(
262
263
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
264
loader = AutoWeightsLoader(self)
282
- return loader.load_weights(weights)
265
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/mamba2.py
+4
-22
@@ -25,7 +25,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
25
ParallelLMHead,
26
VocabParallelEmbedding,
27
)
28
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
28
from vllm.model_executor.models.interfaces import (
29
HasInnerState,
30
IsAttentionFree,
@@ -35,7 +34,7 @@ from vllm.sequence import IntermediateTensors
34
35
from .utils import (
36
AutoWeightsLoader,
38
- is_pp_missing_parameter,
37
+ WeightsMapper,
38
make_empty_intermediate_tensors_factory,
39
make_layers,
40
maybe_prefix,
@@ -167,29 +166,12 @@ class Mamba2Model(nn.Module):
166
167
return hidden_states
168
170
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
171
- params_dict = dict(self.named_parameters())
172
- loaded_params: set[str] = set()
173
- for name, loaded_weight in weights:
174
- if "A_log" in name:
175
- name = name.replace("A_log", "A")
176
-
177
- # Skip loading extra bias for GPTQ models.
178
- if name.endswith(".bias") and name not in params_dict:
179
- continue
180
- if is_pp_missing_parameter(name, self):
181
- continue
182
-
183
- param = params_dict[name]
184
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
185
- weight_loader(param, loaded_weight)
186
- loaded_params.add(name)
187
- return loaded_params
188
-
169
170
class Mamba2ForCausalLM(
171
nn.Module, HasInnerState, IsAttentionFree, SupportsMambaPrefixCaching
172
):
173
+ hf_to_vllm_mapper = WeightsMapper(orig_to_new_substr={".A_log": ".A"})
174
+
175
@classmethod
176
def get_mamba_state_dtype_from_config(
177
cls,
@@ -292,4 +274,4 @@ class Mamba2ForCausalLM(
274
275
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
276
loader = AutoWeightsLoader(self)
295
- return loader.load_weights(weights)
277
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/mimo.py
+8
-49
@@ -38,14 +38,10 @@ from vllm.distributed import get_pp_group
38
from vllm.logger import init_logger
39
from vllm.model_executor.layers.logits_processor import LogitsProcessor
40
from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
41
-from vllm.model_executor.model_loader.weight_utils import (
42
- default_weight_loader,
43
- maybe_remap_kv_scale_name,
44
-)
41
from vllm.model_executor.models.qwen2 import Qwen2ForCausalLM, Qwen2Model
42
from vllm.sequence import IntermediateTensors
43
48
-from .utils import PPMissingLayer, is_pp_missing_parameter, maybe_prefix
44
+from .utils import AutoWeightsLoader, PPMissingLayer, maybe_prefix
45
46
logger = init_logger(__name__)
47
@@ -89,50 +85,6 @@ class MiMoModel(Qwen2Model):
85
hidden_states = hidden_states + residual
86
return hidden_states
87
92
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
93
- stacked_params_mapping = [
94
- ("qkv_proj", "q_proj", "q"),
95
- ("qkv_proj", "k_proj", "k"),
96
- ("qkv_proj", "v_proj", "v"),
97
- ("gate_up_proj", "gate_proj", 0),
98
- ("gate_up_proj", "up_proj", 1),
99
- ]
100
- params_dict = dict(self.named_parameters(remove_duplicate=False))
101
- loaded_params: set[str] = set()
102
- for name, loaded_weight in weights:
103
- if "mtp_layers" in name:
104
- continue
105
- if "rotary_emb.inv_freq" in name:
106
- continue
107
- for param_name, weight_name, shard_id in stacked_params_mapping:
108
- if weight_name not in name:
109
- continue
110
- name = name.replace(weight_name, param_name)
111
- # Skip loading extra bias for GPTQ models.
112
- if name.endswith(".bias") and name not in params_dict:
113
- continue
114
- if is_pp_missing_parameter(name, self):
115
- continue
116
- param = params_dict[name]
117
- weight_loader = param.weight_loader
118
- weight_loader(param, loaded_weight, shard_id)
119
- break
120
- else:
121
- # Skip loading extra bias for GPTQ models.
122
- if name.endswith(".bias") and name not in params_dict:
123
- continue
124
- # Remapping the name of FP8 kv-scale.
125
- name = maybe_remap_kv_scale_name(name, params_dict)
126
- if name is None:
127
- continue
128
- if is_pp_missing_parameter(name, self):
129
- continue
130
- param = params_dict[name]
131
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
132
- weight_loader(param, loaded_weight)
133
- loaded_params.add(name)
134
- return loaded_params
135
-
88
89
class MiMoForCausalLM(Qwen2ForCausalLM, nn.Module):
90
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -167,6 +119,13 @@ class MiMoForCausalLM(Qwen2ForCausalLM, nn.Module):
119
self.model.make_empty_intermediate_tensors
120
)
121
122
+ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
123
+ skip_prefixes = ["lm_head."] if self.config.tie_word_embeddings else []
124
+ # MTP layers are loaded by the draft model, not the main model.
125
+ skip_prefixes.append("model.mtp_layers.")
126
+ loader = AutoWeightsLoader(self, skip_prefixes=skip_prefixes)
127
+ return loader.load_weights(weights)
128
+
129
def compute_logits(
130
self,
131
hidden_states: torch.Tensor,
vllm/model_executor/models/mistral_eagle.py
+5
-5
@@ -108,11 +108,6 @@ class EagleMistralModel(MistralModel):
108
hidden_states, _ = self.norm(hidden_states, residual)
109
return hidden_states, hidden_states
110
111
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
112
- # Pretend embed_tokens is loaded; the actual weight is shared
113
- # from the target model at runtime by `load_eagle_model`.
114
- return super().load_weights(weights) | {"embed_tokens.weight"}
115
-
111
112
class EagleMistralForCausalLM(MistralForCausalLM):
113
mistral_mapping = MistralForCausalLM.mistral_mapping | {
@@ -166,3 +161,8 @@ class EagleMistralForCausalLM(MistralForCausalLM):
161
multimodal_embeddings=multimodal_embeddings,
162
is_multimodal=is_multimodal,
163
)
164
+
165
+ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
166
+ # Pretend embed_tokens is loaded; the actual weight is shared
167
+ # from the target model at runtime by `load_eagle_model`.
168
+ return super().load_weights(weights) | {"model.embed_tokens.weight"}
vllm/model_executor/models/mpt.py
-17
@@ -27,13 +27,11 @@ from vllm.model_executor.layers.linear import (
27
from vllm.model_executor.layers.logits_processor import LogitsProcessor
28
from vllm.model_executor.layers.quantization import QuantizationConfig
29
from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
30
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
30
from vllm.sequence import IntermediateTensors
31
32
from .interfaces import SupportsPP
33
from .utils import (
34
AutoWeightsLoader,
36
- is_pp_missing_parameter,
35
make_empty_intermediate_tensors_factory,
36
make_layers,
37
maybe_prefix,
@@ -274,21 +272,6 @@ class MPTModel(nn.Module):
272
hidden_states = self.norm_f(hidden_states)
273
return hidden_states
274
277
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
278
- params_dict = dict(self.named_parameters(remove_duplicate=False))
279
- loaded_params: set[str] = set()
280
- for name, loaded_weight in weights:
281
- # Skip loading extra bias for GPTQ models.
282
- if name.endswith(".bias") and name not in params_dict:
283
- continue
284
- if is_pp_missing_parameter(name, self):
285
- continue
286
- param = params_dict[name]
287
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
288
- weight_loader(param, loaded_weight)
289
- loaded_params.add(name)
290
- return loaded_params
291
-
275
276
class MPTForCausalLM(nn.Module, SupportsPP):
277
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
vllm/model_executor/models/nemotron.py
+11
-55
@@ -47,10 +47,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
47
ParallelLMHead,
48
VocabParallelEmbedding,
49
)
50
-from vllm.model_executor.model_loader.weight_utils import (
51
- default_weight_loader,
52
- maybe_remap_kv_scale_name,
53
-)
50
from vllm.sequence import IntermediateTensors
51
from vllm.transformers_utils.configs.nemotron import NemotronConfig
52
@@ -58,7 +54,7 @@ from .interfaces import SupportsLoRA, SupportsPP
54
from .utils import (
55
AutoWeightsLoader,
56
PPMissingLayer,
61
- is_pp_missing_parameter,
57
+ WeightsMapper,
58
make_empty_intermediate_tensors_factory,
59
make_layers,
60
maybe_prefix,
@@ -366,58 +362,18 @@ class NemotronModel(nn.Module):
362
hidden_states, _ = self.norm(hidden_states, residual)
363
return hidden_states
364
369
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
370
- stacked_params_mapping = [
371
- # (param_name, shard_name, shard_id)
372
- (".qkv_proj", ".q_proj", "q"),
373
- (".qkv_proj", ".k_proj", "k"),
374
- (".qkv_proj", ".v_proj", "v"),
375
- ]
376
- params_dict = dict(self.named_parameters())
377
- loaded_params: set[str] = set()
378
- for name, loaded_weight in weights:
379
- for param_name, weight_name, shard_id in stacked_params_mapping:
380
- if weight_name not in name:
381
- continue
382
- name = name.replace(weight_name, param_name)
383
- # Skip loading extra bias for GPTQ models.
384
- if name.endswith(".bias") and name not in params_dict:
385
- continue
386
-
387
- if is_pp_missing_parameter(name, self):
388
- continue
389
-
390
- param = params_dict[name]
391
- weight_loader = param.weight_loader
392
- weight_loader(param, loaded_weight, shard_id)
393
-
394
- break
395
- else:
396
- # Skip loading extra bias for GPTQ models.
397
- if name.endswith(".bias") and name not in params_dict:
398
- continue
399
- # Remapping the name of FP8 kv-scale.
400
- name = maybe_remap_kv_scale_name(name, params_dict)
401
- if name is None:
402
- continue
403
-
404
- if is_pp_missing_parameter(name, self):
405
- continue
406
-
407
- param = params_dict[name]
408
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
409
- weight_loader(param, loaded_weight)
410
- loaded_params.add(name)
411
- return loaded_params
412
-
365
366
class NemotronForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
367
+ hf_to_vllm_mapper = WeightsMapper(
368
+ orig_to_new_stacked={
369
+ # weight_name: (param_name, shard_id)
370
+ ".q_proj": (".qkv_proj", "q"),
371
+ ".k_proj": (".qkv_proj", "k"),
372
+ ".v_proj": (".qkv_proj", "v"),
373
+ }
374
+ )
375
packed_modules_mapping = {
416
- "qkv_proj": [
417
- "q_proj",
418
- "k_proj",
419
- "v_proj",
420
- ],
376
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
377
}
378
379
# LoRA specific attributes
@@ -485,4 +441,4 @@ class NemotronForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
441
442
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
443
loader = AutoWeightsLoader(self)
488
- return loader.load_weights(weights)
444
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/nemotron_nas.py
+12
-58
@@ -42,10 +42,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
42
ParallelLMHead,
43
VocabParallelEmbedding,
44
)
45
-from vllm.model_executor.model_loader.weight_utils import (
46
- default_weight_loader,
47
- maybe_remap_kv_scale_name,
48
-)
45
from vllm.model_executor.models.llama import LlamaAttention, LlamaMLP
46
from vllm.sequence import IntermediateTensors
47
from vllm.v1.attention.backend import AttentionType
@@ -54,7 +50,7 @@ from .interfaces import HasNoOps, SupportsLoRA, SupportsPP
50
from .utils import (
51
AutoWeightsLoader,
52
PPMissingLayer,
57
- is_pp_missing_parameter,
53
+ WeightsMapper,
54
make_empty_intermediate_tensors_factory,
55
make_layers,
56
maybe_prefix,
@@ -315,60 +311,18 @@ class DeciModel(nn.Module):
311
hidden_states, _ = self.norm(hidden_states, residual)
312
return hidden_states
313
318
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
319
- stacked_params_mapping = [
320
- # (param_name, shard_name, shard_id)
321
- (".qkv_proj", ".q_proj", "q"),
322
- (".qkv_proj", ".k_proj", "k"),
323
- (".qkv_proj", ".v_proj", "v"),
324
- (".gate_up_proj", ".gate_proj", 0),
325
- (".gate_up_proj", ".up_proj", 1),
326
- ]
327
- params_dict = dict(self.named_parameters())
328
- loaded_params: set[str] = set()
329
- for name, loaded_weight in weights:
330
- if "rotary_emb.inv_freq" in name:
331
- continue
332
- if "rotary_emb.cos_cached" in name or "rotary_emb.sin_cached" in name:
333
- # Models trained using ColossalAI may include these tensors in
334
- # the checkpoint. Skip them.
335
- continue
336
- if "scale" in name or "zero_point" in name:
337
- # Remapping the name of FP8 kv-scale.
338
- name = maybe_remap_kv_scale_name(name, params_dict)
339
- if name is None:
340
- continue
341
- for param_name, weight_name, shard_id in stacked_params_mapping:
342
- if weight_name not in name:
343
- continue
344
- name = name.replace(weight_name, param_name)
345
- # Skip loading extra bias for GPTQ models.
346
- if name.endswith(".bias") and name not in params_dict:
347
- continue
348
-
349
- if is_pp_missing_parameter(name, self):
350
- continue
351
-
352
- param = params_dict[name]
353
- weight_loader = param.weight_loader
354
- weight_loader(param, loaded_weight, shard_id)
355
- break
356
- else:
357
- # Skip loading extra bias for GPTQ models.
358
- if name.endswith(".bias") and name not in params_dict:
359
- continue
360
-
361
- if is_pp_missing_parameter(name, self):
362
- continue
363
-
364
- param = params_dict[name]
365
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
366
- weight_loader(param, loaded_weight)
367
- loaded_params.add(name)
368
- return loaded_params
369
-
314
315
class DeciLMForCausalLM(nn.Module, SupportsLoRA, SupportsPP, HasNoOps):
316
+ hf_to_vllm_mapper = WeightsMapper(
317
+ orig_to_new_stacked={
318
+ # weight_name: (param_name, shard_id)
319
+ ".q_proj": (".qkv_proj", "q"),
320
+ ".k_proj": (".qkv_proj", "k"),
321
+ ".v_proj": (".qkv_proj", "v"),
322
+ ".gate_proj": (".gate_up_proj", 0),
323
+ ".up_proj": (".gate_up_proj", 1),
324
+ }
325
+ )
326
packed_modules_mapping = {
327
"qkv_proj": ["q_proj", "k_proj", "v_proj"],
328
"gate_up_proj": ["gate_proj", "up_proj"],
@@ -462,4 +416,4 @@ class DeciLMForCausalLM(nn.Module, SupportsLoRA, SupportsPP, HasNoOps):
416
self,
417
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
418
)
465
- return loader.load_weights(weights)
419
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/olmo.py
+14
-49
@@ -48,13 +48,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
48
ParallelLMHead,
49
VocabParallelEmbedding,
50
)
51
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
51
from vllm.sequence import IntermediateTensors
52
53
from .interfaces import SupportsLoRA, SupportsPP
54
from .utils import (
55
AutoWeightsLoader,
57
- is_pp_missing_parameter,
56
+ WeightsMapper,
57
make_empty_intermediate_tensors_factory,
58
make_layers,
59
maybe_prefix,
@@ -301,59 +300,25 @@ class OlmoModel(nn.Module):
300
hidden_states = self.norm(hidden_states)
301
return hidden_states
302
304
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
305
- stacked_params_mapping = [
306
- # (param_name, shard_name, shard_id)
307
- ("qkv_proj", "q_proj", "q"),
308
- ("qkv_proj", "k_proj", "k"),
309
- ("qkv_proj", "v_proj", "v"),
310
- ("gate_up_proj", "gate_proj", 0),
311
- ("gate_up_proj", "up_proj", 1),
312
- ]
313
- params_dict = dict(self.named_parameters(remove_duplicate=False))
314
- loaded_params: set[str] = set()
315
- for name, loaded_weight in weights:
316
- for param_name, weight_name, shard_id in stacked_params_mapping:
317
- if weight_name not in name:
318
- continue
319
- name = name.replace(weight_name, param_name)
320
- # Skip loading extra bias for GPTQ models.
321
- if name.endswith(".bias") and name not in params_dict:
322
- continue
323
- if is_pp_missing_parameter(name, self):
324
- continue
325
- param = params_dict[name]
326
- weight_loader = param.weight_loader
327
- weight_loader(param, loaded_weight, shard_id)
328
- break
329
- else:
330
- # Skip loading extra bias for GPTQ models.
331
- if name.endswith(".bias") and name not in params_dict:
332
- continue
333
- if is_pp_missing_parameter(name, self):
334
- continue
335
- param = params_dict[name]
336
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
337
- weight_loader(param, loaded_weight)
338
- loaded_params.add(name)
339
- return loaded_params
340
-
303
304
class OlmoForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
305
"""
306
Extremely barebones HF model wrapper.
307
"""
308
309
+ hf_to_vllm_mapper = WeightsMapper(
310
+ orig_to_new_stacked={
311
+ # weight_name: (param_name, shard_id)
312
+ ".q_proj": (".qkv_proj", "q"),
313
+ ".k_proj": (".qkv_proj", "k"),
314
+ ".v_proj": (".qkv_proj", "v"),
315
+ ".gate_proj": (".gate_up_proj", 0),
316
+ ".up_proj": (".gate_up_proj", 1),
317
+ }
318
+ )
319
packed_modules_mapping = {
348
- "qkv_proj": [
349
- "q_proj",
350
- "k_proj",
351
- "v_proj",
352
- ],
353
- "gate_up_proj": [
354
- "gate_proj",
355
- "up_proj",
356
- ],
320
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
321
+ "gate_up_proj": ["gate_proj", "up_proj"],
322
}
323
324
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -410,4 +375,4 @@ class OlmoForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
375
["lm_head.weight"] if self.config.tie_word_embeddings else None
376
),
377
)
413
- return loader.load_weights(weights)
378
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/olmo2.py
+14
-48
@@ -52,12 +52,11 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
52
ParallelLMHead,
53
VocabParallelEmbedding,
54
)
55
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
55
from vllm.model_executor.models.interfaces import SupportsLoRA, SupportsPP
56
from vllm.model_executor.models.utils import (
57
AutoWeightsLoader,
58
+ WeightsMapper,
59
extract_layer_index,
60
- is_pp_missing_parameter,
60
make_empty_intermediate_tensors_factory,
61
make_layers,
62
maybe_prefix,
@@ -343,58 +342,25 @@ class Olmo2Model(nn.Module):
342
hidden_states = self.norm(hidden_states)
343
return hidden_states
344
346
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
347
- stacked_params_mapping = [
348
- # (param_name, shard_name, shard_id)
349
- ("qkv_proj", "q_proj", "q"),
350
- ("qkv_proj", "k_proj", "k"),
351
- ("qkv_proj", "v_proj", "v"),
352
- ("gate_up_proj", "gate_proj", 0),
353
- ("gate_up_proj", "up_proj", 1),
354
- ]
355
-
356
- params_dict = dict(self.named_parameters(remove_duplicate=False))
357
- loaded_params: set[str] = set()
358
- for name, loaded_weight in weights:
359
- if is_pp_missing_parameter(name, self):
360
- continue
361
- for param_name, weight_name, shard_id in stacked_params_mapping:
362
- if weight_name not in name:
363
- continue
364
- name = name.replace(weight_name, param_name)
365
- # Skip loading extra bias for GPTQ models.
366
- if name.endswith(".bias") and name not in params_dict:
367
- continue
368
- param = params_dict[name]
369
- weight_loader = param.weight_loader # type: ignore
370
- weight_loader(param, loaded_weight, shard_id)
371
- break
372
- else:
373
- # Skip loading extra bias for GPTQ models.
374
- if name.endswith(".bias") and name not in params_dict:
375
- continue
376
- param = params_dict[name]
377
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
378
- weight_loader(param, loaded_weight)
379
- loaded_params.add(name)
380
- return loaded_params
381
-
345
346
class Olmo2ForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
347
"""
348
Extremely barebones HF model wrapper.
349
"""
350
351
+ hf_to_vllm_mapper = WeightsMapper(
352
+ orig_to_new_stacked={
353
+ # weight_name: (param_name, shard_id)
354
+ ".q_proj": (".qkv_proj", "q"),
355
+ ".k_proj": (".qkv_proj", "k"),
356
+ ".v_proj": (".qkv_proj", "v"),
357
+ ".gate_proj": (".gate_up_proj", 0),
358
+ ".up_proj": (".gate_up_proj", 1),
359
+ }
360
+ )
361
packed_modules_mapping = {
389
- "qkv_proj": [
390
- "q_proj",
391
- "k_proj",
392
- "v_proj",
393
- ],
394
- "gate_up_proj": [
395
- "gate_proj",
396
- "up_proj",
397
- ],
362
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
363
+ "gate_up_proj": ["gate_proj", "up_proj"],
364
}
365
366
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -451,4 +417,4 @@ class Olmo2ForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
417
["lm_head.weight"] if self.config.tie_word_embeddings else None
418
),
419
)
454
- return loader.load_weights(weights)
420
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/opt.py
+10
-42
@@ -44,14 +44,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
44
ParallelLMHead,
45
VocabParallelEmbedding,
46
)
47
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
47
from vllm.sequence import IntermediateTensors
48
49
from .interfaces import SupportsLoRA, SupportsPP
50
from .utils import (
51
AutoWeightsLoader,
52
WeightsMapper,
54
- is_pp_missing_parameter,
53
make_empty_intermediate_tensors_factory,
54
make_layers,
55
maybe_prefix,
@@ -325,52 +323,22 @@ class OPTModel(nn.Module):
323
input_ids, positions, intermediate_tensors, inputs_embeds=inputs_embeds
324
)
325
328
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
329
- stacked_params_mapping = [
330
- # (param_name, shard_name, shard_id)
331
- ("qkv_proj", "q_proj", "q"),
332
- ("qkv_proj", "k_proj", "k"),
333
- ("qkv_proj", "v_proj", "v"),
334
- ]
335
- params_dict = dict(self.named_parameters(remove_duplicate=False))
336
- loaded_params: set[str] = set()
337
- for name, loaded_weight in weights:
338
- for param_name, weight_name, shard_id in stacked_params_mapping:
339
- if weight_name not in name:
340
- continue
341
- name = name.replace(weight_name, param_name)
342
- # Skip loading extra bias for GPTQ models.
343
- if name.endswith(".bias") and name not in params_dict:
344
- continue
345
- if is_pp_missing_parameter(name, self):
346
- continue
347
- param = params_dict[name]
348
- weight_loader = param.weight_loader
349
- weight_loader(param, loaded_weight, shard_id)
350
- break
351
- else:
352
- # Skip loading extra bias for GPTQ models.
353
- if name.endswith(".bias") and name not in params_dict:
354
- continue
355
- if is_pp_missing_parameter(name, self):
356
- continue
357
- param = params_dict[name]
358
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
359
- weight_loader(param, loaded_weight)
360
- loaded_params.add(name)
361
- return loaded_params
362
-
326
327
class OPTForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
365
- packed_modules_mapping = {
366
- "qkv_proj": ["q_proj", "k_proj", "v_proj"],
367
- }
368
-
328
hf_to_vllm_mapper = WeightsMapper(
329
+ orig_to_new_stacked={
330
+ # weight_name: (param_name, shard_id)
331
+ ".q_proj": (".qkv_proj", "q"),
332
+ ".k_proj": (".qkv_proj", "k"),
333
+ ".v_proj": (".qkv_proj", "v"),
334
+ },
335
orig_to_new_prefix={
336
"decoder.": "model.decoder.",
372
- }
337
+ },
338
)
339
+ packed_modules_mapping = {
340
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
341
+ }
342
343
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
344
super().__init__()
vllm/model_executor/models/orion.py
+13
-40
@@ -32,13 +32,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
32
ParallelLMHead,
33
VocabParallelEmbedding,
34
)
35
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
35
from vllm.sequence import IntermediateTensors
36
37
from .interfaces import SupportsPP
38
from .utils import (
39
AutoWeightsLoader,
41
- is_pp_missing_parameter,
40
+ WeightsMapper,
41
make_empty_intermediate_tensors_factory,
42
make_layers,
43
maybe_prefix,
@@ -277,45 +276,19 @@ class OrionModel(nn.Module):
276
hidden_states = self.norm(hidden_states)
277
return hidden_states
278
280
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
281
- stacked_params_mapping = [
282
- # (param_name, shard_name, shard_id)
283
- ("qkv_proj", "q_proj", "q"),
284
- ("qkv_proj", "k_proj", "k"),
285
- ("qkv_proj", "v_proj", "v"),
286
- ("gate_up_proj", "gate_proj", 0),
287
- ("gate_up_proj", "up_proj", 1),
288
- ]
289
- params_dict = dict(self.named_parameters())
290
- loaded_params: set[str] = set()
291
- for name, loaded_weight in weights:
292
- for param_name, weight_name, shard_id in stacked_params_mapping:
293
- if weight_name not in name:
294
- continue
295
- name = name.replace(weight_name, param_name)
296
- # Skip loading extra bias for GPTQ models.
297
- if name.endswith(".bias") and name not in params_dict:
298
- continue
299
- if is_pp_missing_parameter(name, self):
300
- continue
301
- param = params_dict[name]
302
- weight_loader = param.weight_loader
303
- weight_loader(param, loaded_weight, shard_id)
304
- break
305
- else:
306
- # Skip loading extra bias for GPTQ models.
307
- if name.endswith(".bias") and name not in params_dict:
308
- continue
309
- if is_pp_missing_parameter(name, self):
310
- continue
311
- param = params_dict[name]
312
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
313
- weight_loader(param, loaded_weight)
314
- loaded_params.add(name)
315
- return loaded_params
316
-
279
280
class OrionForCausalLM(nn.Module, SupportsPP):
281
+ hf_to_vllm_mapper = WeightsMapper(
282
+ orig_to_new_stacked={
283
+ # weight_name: (param_name, shard_id)
284
+ ".q_proj": (".qkv_proj", "q"),
285
+ ".k_proj": (".qkv_proj", "k"),
286
+ ".v_proj": (".qkv_proj", "v"),
287
+ ".gate_proj": (".gate_up_proj", 0),
288
+ ".up_proj": (".gate_up_proj", 1),
289
+ }
290
+ )
291
+
292
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
293
super().__init__()
294
config = vllm_config.model_config.hf_config
@@ -362,4 +335,4 @@ class OrionForCausalLM(nn.Module, SupportsPP):
335
336
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
337
loader = AutoWeightsLoader(self)
365
- return loader.load_weights(weights)
338
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/ouro.py
+14
-61
@@ -51,16 +51,13 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
51
ParallelLMHead,
52
VocabParallelEmbedding,
53
)
54
-from vllm.model_executor.model_loader.weight_utils import (
55
- default_weight_loader,
56
- maybe_remap_kv_scale_name,
57
-)
54
from vllm.sequence import IntermediateTensors
55
from vllm.v1.attention.backend import AttentionType
56
57
from .interfaces import SupportsLoRA
58
from .utils import (
59
AutoWeightsLoader,
60
+ WeightsMapper,
61
extract_layer_index,
62
make_empty_intermediate_tensors_factory,
63
make_layers,
@@ -376,65 +373,21 @@ class OuroModel(nn.Module):
373
hidden_states, _ = self.norm(hidden_states, residual)
374
return hidden_states
375
379
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
380
- stacked_params_mapping = [
381
- # (param_name, shard_name, shard_id)
382
- ("qkv_proj", "q_proj", "q"),
383
- ("qkv_proj", "k_proj", "k"),
384
- ("qkv_proj", "v_proj", "v"),
385
- ("gate_up_proj", "gate_proj", 0),
386
- ("gate_up_proj", "up_proj", 1),
387
- ]
388
- params_dict = dict(self.named_parameters(remove_duplicate=False))
389
- loaded_params: set[str] = set()
390
- for name, loaded_weight in weights:
391
- if "rotary_emb.inv_freq" in name:
392
- continue
393
- for param_name, weight_name, shard_id in stacked_params_mapping:
394
- if weight_name not in name:
395
- continue
396
- name = name.replace(weight_name, param_name)
397
- # Skip loading extra bias for GPTQ models.
398
- if name.endswith(".bias") and name not in params_dict:
399
- continue
400
- if name.endswith("scale"):
401
- # Remapping the name of FP8 kv-scale.
402
- name = maybe_remap_kv_scale_name(name, params_dict)
403
- if name is None:
404
- continue
405
- param = params_dict[name]
406
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
407
- if weight_loader == default_weight_loader:
408
- weight_loader(param, loaded_weight)
409
- else:
410
- weight_loader(param, loaded_weight, shard_id)
411
- break
412
- else:
413
- # Skip loading extra bias for GPTQ models.
414
- if name.endswith(".bias") and name not in params_dict:
415
- continue
416
- # Remapping the name of FP8 kv-scale.
417
- name = maybe_remap_kv_scale_name(name, params_dict)
418
- if name is None:
419
- continue
420
- param = params_dict[name]
421
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
422
- weight_loader(param, loaded_weight)
423
- loaded_params.add(name)
424
- return loaded_params
425
-
376
377
class OuroForCausalLM(nn.Module, SupportsLoRA):
378
+ hf_to_vllm_mapper = WeightsMapper(
379
+ orig_to_new_stacked={
380
+ # weight_name: (param_name, shard_id)
381
+ ".q_proj": (".qkv_proj", "q"),
382
+ ".k_proj": (".qkv_proj", "k"),
383
+ ".v_proj": (".qkv_proj", "v"),
384
+ ".gate_proj": (".gate_up_proj", 0),
385
+ ".up_proj": (".gate_up_proj", 1),
386
+ }
387
+ )
388
packed_modules_mapping = {
429
- "qkv_proj": [
430
- "q_proj",
431
- "k_proj",
432
- "v_proj",
433
- ],
434
- "gate_up_proj": [
435
- "gate_proj",
436
- "up_proj",
437
- ],
389
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
390
+ "gate_up_proj": ["gate_proj", "up_proj"],
391
}
392
393
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -492,4 +445,4 @@ class OuroForCausalLM(nn.Module, SupportsLoRA):
445
self,
446
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
447
)
495
- return loader.load_weights(weights)
448
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/phi.py
+11
-49
@@ -62,13 +62,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
62
ParallelLMHead,
63
VocabParallelEmbedding,
64
)
65
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
65
from vllm.sequence import IntermediateTensors
66
67
from .interfaces import SupportsLoRA, SupportsPP
68
from .utils import (
69
AutoWeightsLoader,
71
- is_pp_missing_parameter,
70
+ WeightsMapper,
71
make_empty_intermediate_tensors_factory,
72
make_layers,
73
maybe_prefix,
@@ -257,55 +256,18 @@ class PhiModel(nn.Module):
256
257
return hidden_states
258
260
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
261
- stacked_params_mapping = [
262
- # (param_name, shard_name, shard_id)
263
- ("qkv_proj", "q_proj", "q"),
264
- ("qkv_proj", "k_proj", "k"),
265
- ("qkv_proj", "v_proj", "v"),
266
- ]
267
- params_dict = dict(self.named_parameters())
268
- loaded_params: set[str] = set()
269
-
270
- for name, loaded_weight in weights:
271
- if "rotary_emb.inv_freq" in name:
272
- continue
273
-
274
- for param_name, weight_name, shard_id in stacked_params_mapping:
275
- if weight_name not in name:
276
- continue
277
- name = name.replace(weight_name, param_name)
278
- # Skip loading extra bias for GPTQ models.
279
- if name.endswith(".bias") and name not in params_dict:
280
- continue
281
- if is_pp_missing_parameter(name, self):
282
- continue
283
- param = params_dict[name]
284
- weight_loader = param.weight_loader
285
- weight_loader(param, loaded_weight, shard_id)
286
- break
287
- else:
288
- # Skip loading extra bias for GPTQ models.
289
- if name.endswith(".bias") and name not in params_dict:
290
- continue
291
- # pylint: disable=E1136
292
-
293
- if is_pp_missing_parameter(name, self):
294
- continue
295
- param = params_dict[name]
296
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
297
- weight_loader(param, loaded_weight)
298
- loaded_params.add(name)
299
- return loaded_params
300
-
259
260
class PhiForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
261
+ hf_to_vllm_mapper = WeightsMapper(
262
+ orig_to_new_stacked={
263
+ # weight_name: (param_name, shard_id)
264
+ ".q_proj": (".qkv_proj", "q"),
265
+ ".k_proj": (".qkv_proj", "k"),
266
+ ".v_proj": (".qkv_proj", "v"),
267
+ }
268
+ )
269
packed_modules_mapping = {
304
- "qkv_proj": [
305
- "q_proj",
306
- "k_proj",
307
- "v_proj",
308
- ]
270
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
271
}
272
273
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -360,4 +322,4 @@ class PhiForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
322
323
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
324
loader = AutoWeightsLoader(self)
363
- return loader.load_weights(weights)
325
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/qwen2.py
+19
-66
@@ -54,10 +54,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
54
ParallelLMHead,
55
VocabParallelEmbedding,
56
)
57
-from vllm.model_executor.model_loader.weight_utils import (
58
- default_weight_loader,
59
- maybe_remap_kv_scale_name,
60
-)
57
from vllm.sequence import IntermediateTensors
58
from vllm.transformers_utils.config import is_interleaved, set_default_rope_theta
59
from vllm.v1.attention.backend import AttentionType
@@ -68,12 +64,13 @@ from .interfaces import (
64
SupportsEagle3,
65
SupportsLoRA,
66
SupportsPP,
67
+ SupportsQuant,
68
)
69
from .utils import (
70
AutoWeightsLoader,
71
PPMissingLayer,
72
+ WeightsMapper,
73
extract_layer_index,
76
- is_pp_missing_parameter,
74
make_empty_intermediate_tensors_factory,
75
make_layers,
76
maybe_prefix,
@@ -323,6 +320,17 @@ class Qwen2DecoderLayer(nn.Module):
320
}
321
)
322
class Qwen2Model(nn.Module, EagleModelMixin):
323
+ hf_to_vllm_mapper = WeightsMapper(
324
+ orig_to_new_stacked={
325
+ # weight_name: (param_name, shard_id)
326
+ ".q_proj": (".qkv_proj", "q"),
327
+ ".k_proj": (".qkv_proj", "k"),
328
+ ".v_proj": (".qkv_proj", "v"),
329
+ ".gate_proj": (".gate_up_proj", 0),
330
+ ".up_proj": (".gate_up_proj", 1),
331
+ }
332
+ )
333
+
334
def __init__(
335
self,
336
*,
@@ -426,72 +434,17 @@ class Qwen2Model(nn.Module, EagleModelMixin):
434
return hidden_states
435
436
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
429
- stacked_params_mapping = [
430
- # (param_name, shard_name, shard_id)
431
- ("qkv_proj", "q_proj", "q"),
432
- ("qkv_proj", "k_proj", "k"),
433
- ("qkv_proj", "v_proj", "v"),
434
- ("gate_up_proj", "gate_proj", 0),
435
- ("gate_up_proj", "up_proj", 1),
436
- ]
437
- params_dict = dict(self.named_parameters(remove_duplicate=False))
438
- loaded_params: set[str] = set()
439
- for name, loaded_weight in weights:
440
- if "rotary_emb.inv_freq" in name:
441
- continue
442
- for param_name, weight_name, shard_id in stacked_params_mapping:
443
- if weight_name not in name:
444
- continue
445
- name = name.replace(weight_name, param_name)
446
- # Skip loading extra bias for GPTQ models.
447
- if name.endswith(".bias") and name not in params_dict:
448
- continue
449
- if is_pp_missing_parameter(name, self):
450
- continue
451
- if name.endswith("scale"):
452
- # Remapping the name of FP8 kv-scale.
453
- name = maybe_remap_kv_scale_name(name, params_dict)
454
- if name is None:
455
- continue
456
- param = params_dict[name]
457
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
458
- if weight_loader == default_weight_loader:
459
- weight_loader(param, loaded_weight)
460
- else:
461
- weight_loader(param, loaded_weight, shard_id)
462
- break
463
- else:
464
- # Skip loading extra bias for GPTQ models.
465
- if name.endswith(".bias") and name not in params_dict:
466
- continue
467
- # Remapping the name of FP8 kv-scale.
468
- name = maybe_remap_kv_scale_name(name, params_dict)
469
- if name is None:
470
- continue
471
- if is_pp_missing_parameter(name, self):
472
- continue
473
- if name not in params_dict:
474
- continue
475
- param = params_dict[name]
476
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
477
- weight_loader(param, loaded_weight)
478
- loaded_params.add(name)
479
- return loaded_params
437
+ loader = AutoWeightsLoader(self)
438
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
439
440
441
class Qwen2ForCausalLM(
483
- nn.Module, SupportsLoRA, SupportsPP, SupportsEagle, SupportsEagle3
442
+ nn.Module, SupportsLoRA, SupportsPP, SupportsEagle, SupportsEagle3, SupportsQuant
443
):
444
+ hf_to_vllm_mapper = Qwen2Model.hf_to_vllm_mapper
445
packed_modules_mapping = {
486
- "qkv_proj": [
487
- "q_proj",
488
- "k_proj",
489
- "v_proj",
490
- ],
491
- "gate_up_proj": [
492
- "gate_proj",
493
- "up_proj",
494
- ],
446
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
447
+ "gate_up_proj": ["gate_proj", "up_proj"],
448
}
449
450
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
vllm/model_executor/models/qwen2_rm.py
+3
-9
@@ -28,16 +28,10 @@ class Qwen2RewardBaseModel(nn.Module, SupportsLoRA, SupportsPP):
28
is_pooling_model = True
29
pooler: Pooler
30
31
+ hf_to_vllm_mapper = Qwen2Model.hf_to_vllm_mapper
32
packed_modules_mapping = {
32
- "qkv_proj": [
33
- "q_proj",
34
- "k_proj",
35
- "v_proj",
36
- ],
37
- "gate_up_proj": [
38
- "gate_proj",
39
- "up_proj",
40
- ],
33
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
34
+ "gate_up_proj": ["gate_proj", "up_proj"],
35
}
36
37
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
vllm/model_executor/models/qwen3.py
+3
-10
@@ -267,18 +267,11 @@ class Qwen3Model(Qwen2Model):
267
class Qwen3ForCausalLM(
268
LocalArgmaxMixin, nn.Module, SupportsLoRA, SupportsPP, SupportsEagle, SupportsEagle3
269
):
270
+ hf_to_vllm_mapper = Qwen3Model.hf_to_vllm_mapper
271
packed_modules_mapping = {
271
- "qkv_proj": [
272
- "q_proj",
273
- "k_proj",
274
- "v_proj",
275
- ],
276
- "gate_up_proj": [
277
- "gate_proj",
278
- "up_proj",
279
- ],
272
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
273
+ "gate_up_proj": ["gate_proj", "up_proj"],
274
}
281
-
275
embedding_modules = {
276
"embed_tokens": "input_embeddings",
277
"lm_head": "output_embeddings",
vllm/model_executor/models/rnj1.py
+14
-72
@@ -30,18 +30,14 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
30
ParallelLMHead,
31
VocabParallelEmbedding,
32
)
33
-from vllm.model_executor.model_loader.weight_utils import (
34
- default_weight_loader,
35
- maybe_remap_kv_scale_name,
36
-)
33
from vllm.sequence import IntermediateTensors
34
from vllm.v1.attention.backend import AttentionType
35
36
from .interfaces import SupportsLoRA, SupportsPP
37
from .utils import (
38
AutoWeightsLoader,
39
+ WeightsMapper,
40
extract_layer_index,
44
- is_pp_missing_parameter,
41
make_empty_intermediate_tensors_factory,
42
make_layers,
43
maybe_prefix,
@@ -331,75 +327,21 @@ class Rnj1Model(nn.Module):
327
hidden_states, _ = self.norm(hidden_states, residual)
328
return hidden_states
329
334
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
335
- stacked_params_mapping = [
336
- # (param_name, shard_name, shard_id)
337
- ("qkv_proj", "q_proj", "q"),
338
- ("qkv_proj", "k_proj", "k"),
339
- ("qkv_proj", "v_proj", "v"),
340
- ("gate_up_proj", "gate_proj", 0),
341
- ("gate_up_proj", "up_proj", 1),
342
- ]
343
- params_dict = dict(self.named_parameters())
344
- loaded_params: set[str] = set()
345
- for name, loaded_weight in weights:
346
- if (
347
- self.quant_config
348
- and self.quant_config.get_name() == "gguf"
349
- and name.endswith("norm.weight")
350
- ):
351
- loaded_weight -= 1
352
-
353
- if name.endswith((".k_scale", ".v_scale", ".q_scale", ".prob_scale")):
354
- remapped_name = maybe_remap_kv_scale_name(name, params_dict)
355
- if remapped_name is not None and remapped_name in params_dict:
356
- param = params_dict[remapped_name]
357
- weight_loader = getattr(
358
- param, "weight_loader", default_weight_loader
359
- )
360
- weight_loader(param, loaded_weight)
361
- loaded_params.add(remapped_name)
362
- continue
363
-
364
- for param_name, shard_name, shard_id in stacked_params_mapping:
365
- if shard_name not in name:
366
- continue
367
- name = name.replace(shard_name, param_name)
368
- if name.endswith(".bias") and name not in params_dict:
369
- continue
370
- if is_pp_missing_parameter(name, self):
371
- continue
372
- param = params_dict[name]
373
- weight_loader = param.weight_loader
374
- weight_loader(param, loaded_weight, shard_id)
375
- break
376
- else:
377
- if name.endswith(".bias") and name not in params_dict:
378
- continue
379
- name = maybe_remap_kv_scale_name(name, params_dict)
380
- if name is None:
381
- continue
382
- if is_pp_missing_parameter(name, self):
383
- continue
384
- param = params_dict[name]
385
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
386
- weight_loader(param, loaded_weight)
387
- loaded_params.add(name)
388
-
389
- return loaded_params
390
-
330
331
class Rnj1ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
332
+ hf_to_vllm_mapper = WeightsMapper(
333
+ orig_to_new_stacked={
334
+ # weight_name: (param_name, shard_id)
335
+ ".q_proj": (".qkv_proj", "q"),
336
+ ".k_proj": (".qkv_proj", "k"),
337
+ ".v_proj": (".qkv_proj", "v"),
338
+ ".gate_proj": (".gate_up_proj", 0),
339
+ ".up_proj": (".gate_up_proj", 1),
340
+ }
341
+ )
342
packed_modules_mapping = {
394
- "qkv_proj": [
395
- "q_proj",
396
- "k_proj",
397
- "v_proj",
398
- ],
399
- "gate_up_proj": [
400
- "gate_proj",
401
- "up_proj",
402
- ],
343
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
344
+ "gate_up_proj": ["gate_proj", "up_proj"],
345
}
346
347
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -457,4 +399,4 @@ class Rnj1ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
399
self,
400
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
401
)
460
- return loader.load_weights(weights)
402
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/seed_oss.py
+14
-58
@@ -49,10 +49,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
49
ParallelLMHead,
50
VocabParallelEmbedding,
51
)
52
-from vllm.model_executor.model_loader.weight_utils import (
53
- default_weight_loader,
54
- maybe_remap_kv_scale_name,
55
-)
52
from vllm.sequence import IntermediateTensors
53
from vllm.transformers_utils.config import set_default_rope_theta
54
from vllm.v1.attention.backend import AttentionType
@@ -61,7 +57,7 @@ from .interfaces import SupportsLoRA, SupportsPP
57
from .utils import (
58
AutoWeightsLoader,
59
PPMissingLayer,
64
- is_pp_missing_parameter,
60
+ WeightsMapper,
61
make_empty_intermediate_tensors_factory,
62
make_layers,
63
maybe_prefix,
@@ -362,61 +358,21 @@ class SeedOssModel(nn.Module):
358
hidden_states, _ = self.norm(hidden_states, residual)
359
return hidden_states
360
365
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
366
- stacked_params_mapping = [
367
- # (param_name, shard_name, shard_id)
368
- ("qkv_proj", "q_proj", "q"),
369
- ("qkv_proj", "k_proj", "k"),
370
- ("qkv_proj", "v_proj", "v"),
371
- ("gate_up_proj", "gate_proj", 0),
372
- ("gate_up_proj", "up_proj", 1),
373
- ]
374
- params_dict = dict(self.named_parameters(remove_duplicate=False))
375
- loaded_params: set[str] = set()
376
- for name, loaded_weight in weights:
377
- if "rotary_emb.inv_freq" in name:
378
- continue
379
- for param_name, weight_name, shard_id in stacked_params_mapping:
380
- if weight_name not in name:
381
- continue
382
- name = name.replace(weight_name, param_name)
383
- # Skip loading extra bias for GPTQ models.
384
- if name.endswith(".bias") and name not in params_dict:
385
- continue
386
- if is_pp_missing_parameter(name, self):
387
- continue
388
- param = params_dict[name]
389
- weight_loader = param.weight_loader
390
- weight_loader(param, loaded_weight, shard_id)
391
- break
392
- else:
393
- # Skip loading extra bias for GPTQ models.
394
- if name.endswith(".bias") and name not in params_dict:
395
- continue
396
- # Remapping the name of FP8 kv-scale.
397
- name = maybe_remap_kv_scale_name(name, params_dict)
398
- if name is None:
399
- continue
400
- if is_pp_missing_parameter(name, self):
401
- continue
402
- param = params_dict[name]
403
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
404
- weight_loader(param, loaded_weight)
405
- loaded_params.add(name)
406
- return loaded_params
407
-
361
362
class SeedOssForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
363
+ hf_to_vllm_mapper = WeightsMapper(
364
+ orig_to_new_stacked={
365
+ # weight_name: (param_name, shard_id)
366
+ ".q_proj": (".qkv_proj", "q"),
367
+ ".k_proj": (".qkv_proj", "k"),
368
+ ".v_proj": (".qkv_proj", "v"),
369
+ ".gate_proj": (".gate_up_proj", 0),
370
+ ".up_proj": (".gate_up_proj", 1),
371
+ }
372
+ )
373
packed_modules_mapping = {
411
- "qkv_proj": [
412
- "q_proj",
413
- "k_proj",
414
- "v_proj",
415
- ],
416
- "gate_up_proj": [
417
- "gate_proj",
418
- "up_proj",
419
- ],
374
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
375
+ "gate_up_proj": ["gate_proj", "up_proj"],
376
}
377
378
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -477,4 +433,4 @@ class SeedOssForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
433
self,
434
skip_prefixes=(["lm_head."] if self.config.tie_word_embeddings else None),
435
)
480
- return loader.load_weights(weights)
436
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/solar.py
+14
-62
@@ -48,17 +48,13 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
48
ParallelLMHead,
49
VocabParallelEmbedding,
50
)
51
-from vllm.model_executor.model_loader.weight_utils import (
52
- default_weight_loader,
53
- maybe_remap_kv_scale_name,
54
-)
51
from vllm.sequence import IntermediateTensors
52
53
from .interfaces import SupportsLoRA, SupportsPP
54
from .utils import (
55
AutoWeightsLoader,
56
PPMissingLayer,
61
- is_pp_missing_parameter,
57
+ WeightsMapper,
58
make_empty_intermediate_tensors_factory,
59
make_layers,
60
maybe_prefix,
@@ -347,66 +343,22 @@ class SolarModel(nn.Module):
343
hidden_states, _ = self.norm(hidden_states, residual)
344
return hidden_states
345
350
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
351
- stacked_params_mapping = [
352
- # (param_name, shard_name, shard_id)
353
- (".qkv_proj", ".q_proj", "q"),
354
- (".qkv_proj", ".k_proj", "k"),
355
- (".qkv_proj", ".v_proj", "v"),
356
- (".gate_up_proj", ".gate_proj", 0),
357
- (".gate_up_proj", ".up_proj", 1),
358
- ]
359
- params_dict = dict(self.named_parameters())
360
- loaded_params: set[str] = set()
361
- for name, loaded_weight in weights:
362
- for param_name, weight_name, shard_id in stacked_params_mapping:
363
- if weight_name not in name:
364
- continue
365
- name = name.replace(weight_name, param_name)
366
- # Skip loading extra bias for GPTQ models.
367
- if name.endswith(".bias") and name not in params_dict:
368
- continue
369
-
370
- if is_pp_missing_parameter(name, self):
371
- continue
372
-
373
- param = params_dict[name]
374
- weight_loader = param.weight_loader
375
- weight_loader(param, loaded_weight, shard_id)
376
-
377
- break
378
- else:
379
- # Skip loading extra bias for GPTQ models.
380
- if name.endswith(".bias") and name not in params_dict:
381
- continue
382
- # Remapping the name of FP8 kv-scale.
383
- name = maybe_remap_kv_scale_name(name, params_dict)
384
- if name is None:
385
- continue
386
-
387
- if is_pp_missing_parameter(name, self):
388
- continue
389
-
390
- param = params_dict[name]
391
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
392
- weight_loader(param, loaded_weight)
393
- loaded_params.add(name)
394
- return loaded_params
395
-
346
347
class SolarForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
348
+ hf_to_vllm_mapper = WeightsMapper(
349
+ orig_to_new_stacked={
350
+ # weight_name: (param_name, shard_id)
351
+ ".q_proj": (".qkv_proj", "q"),
352
+ ".k_proj": (".qkv_proj", "k"),
353
+ ".v_proj": (".qkv_proj", "v"),
354
+ ".gate_proj": (".gate_up_proj", 0),
355
+ ".up_proj": (".gate_up_proj", 1),
356
+ }
357
+ )
358
packed_modules_mapping = {
399
- "qkv_proj": [
400
- "q_proj",
401
- "k_proj",
402
- "v_proj",
403
- ],
404
- "gate_up_proj": [
405
- "gate_proj",
406
- "up_proj",
407
- ],
359
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
360
+ "gate_up_proj": ["gate_proj", "up_proj"],
361
}
409
-
362
# LoRA specific attributes
363
embedding_modules = {
364
"embed_tokens": "input_embeddings",
@@ -468,4 +420,4 @@ class SolarForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
420
421
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
422
loader = AutoWeightsLoader(self)
471
- return loader.load_weights(weights)
423
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/stablelm.py
+13
-40
@@ -45,13 +45,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
45
ParallelLMHead,
46
VocabParallelEmbedding,
47
)
48
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
48
from vllm.sequence import IntermediateTensors
49
50
from .interfaces import SupportsPP
51
from .utils import (
52
AutoWeightsLoader,
54
- is_pp_missing_parameter,
53
+ WeightsMapper,
54
make_empty_intermediate_tensors_factory,
55
make_layers,
56
maybe_prefix,
@@ -266,45 +265,19 @@ class StableLMEpochModel(nn.Module):
265
hidden_states = self.norm(hidden_states)
266
return hidden_states
267
269
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
270
- stacked_params_mapping = [
271
- # (param_name, shard_name, shard_id)
272
- ("qkv_proj", "q_proj", "q"),
273
- ("qkv_proj", "k_proj", "k"),
274
- ("qkv_proj", "v_proj", "v"),
275
- ("gate_up_proj", "gate_proj", 0),
276
- ("gate_up_proj", "up_proj", 1),
277
- ]
278
- params_dict = dict(self.named_parameters())
279
- loaded_params: set[str] = set()
280
- for name, loaded_weight in weights:
281
- for param_name, weight_name, shard_id in stacked_params_mapping:
282
- if weight_name not in name:
283
- continue
284
- name = name.replace(weight_name, param_name)
285
- # Skip loading extra bias for GPTQ models.
286
- if name.endswith(".bias") and name not in params_dict:
287
- continue
288
- if is_pp_missing_parameter(name, self):
289
- continue
290
- param = params_dict[name]
291
- weight_loader = param.weight_loader
292
- weight_loader(param, loaded_weight, shard_id)
293
- break
294
- else:
295
- # Skip loading extra bias for GPTQ models.
296
- if name.endswith(".bias") and name not in params_dict:
297
- continue
298
- if is_pp_missing_parameter(name, self):
299
- continue
300
- param = params_dict[name]
301
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
302
- weight_loader(param, loaded_weight)
303
- loaded_params.add(name)
304
- return loaded_params
305
-
268
269
class StablelmForCausalLM(nn.Module, SupportsPP):
270
+ hf_to_vllm_mapper = WeightsMapper(
271
+ orig_to_new_stacked={
272
+ # weight_name: (param_name, shard_id)
273
+ ".q_proj": (".qkv_proj", "q"),
274
+ ".k_proj": (".qkv_proj", "k"),
275
+ ".v_proj": (".qkv_proj", "v"),
276
+ ".gate_proj": (".gate_up_proj", 0),
277
+ ".up_proj": (".gate_up_proj", 1),
278
+ }
279
+ )
280
+
281
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
282
super().__init__()
283
config = vllm_config.model_config.hf_config
@@ -351,4 +324,4 @@ class StablelmForCausalLM(nn.Module, SupportsPP):
324
325
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
326
loader = AutoWeightsLoader(self)
354
- return loader.load_weights(weights)
327
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/starcoder2.py
+11
-39
@@ -45,16 +45,12 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
45
ParallelLMHead,
46
VocabParallelEmbedding,
47
)
48
-from vllm.model_executor.model_loader.weight_utils import (
49
- default_weight_loader,
50
- maybe_remap_kv_scale_name,
51
-)
48
from vllm.sequence import IntermediateTensors
49
50
from .interfaces import SupportsPP
51
from .utils import (
52
AutoWeightsLoader,
57
- is_pp_missing_parameter,
53
+ WeightsMapper,
54
make_empty_intermediate_tensors_factory,
55
make_layers,
56
maybe_prefix,
@@ -272,41 +268,17 @@ class Starcoder2Model(nn.Module):
268
hidden_states = self.norm(hidden_states)
269
return hidden_states
270
275
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
276
- stacked_params_mapping = [
277
- # (param_name, shard_name, shard_id)
278
- ("qkv_proj", "q_proj", "q"),
279
- ("qkv_proj", "k_proj", "k"),
280
- ("qkv_proj", "v_proj", "v"),
281
- ]
282
-
283
- params_dict = dict(self.named_parameters(remove_duplicate=False))
284
- loaded_params: set[str] = set()
285
- for name, loaded_weight in weights:
286
- for param_name, weight_name, shard_id in stacked_params_mapping:
287
- if weight_name not in name:
288
- continue
289
- name = name.replace(weight_name, param_name)
290
- if is_pp_missing_parameter(name, self):
291
- continue
292
- param = params_dict[name]
293
- weight_loader = param.weight_loader
294
- weight_loader(param, loaded_weight, shard_id)
295
- break
296
- else:
297
- name = maybe_remap_kv_scale_name(name, params_dict)
298
- if name is None:
299
- continue
300
- if is_pp_missing_parameter(name, self):
301
- continue
302
- param = params_dict[name]
303
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
304
- weight_loader(param, loaded_weight)
305
- loaded_params.add(name)
306
- return loaded_params
307
-
271
272
class Starcoder2ForCausalLM(nn.Module, SupportsPP):
273
+ hf_to_vllm_mapper = WeightsMapper(
274
+ orig_to_new_stacked={
275
+ # weight_name: (param_name, shard_id)
276
+ ".q_proj": (".qkv_proj", "q"),
277
+ ".k_proj": (".qkv_proj", "k"),
278
+ ".v_proj": (".qkv_proj", "v"),
279
+ }
280
+ )
281
+
282
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
283
super().__init__()
284
config = vllm_config.model_config.hf_config
@@ -362,4 +334,4 @@ class Starcoder2ForCausalLM(nn.Module, SupportsPP):
334
["lm_head.weight"] if self.config.tie_word_embeddings else None
335
),
336
)
365
- return loader.load_weights(weights)
337
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/step1.py
+16
-45
@@ -30,7 +30,6 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
30
ParallelLMHead,
31
VocabParallelEmbedding,
32
)
33
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
33
from vllm.model_executor.models.interfaces import (
34
EagleModelMixin,
35
SupportsEagle,
@@ -40,7 +39,7 @@ from vllm.model_executor.models.interfaces import (
39
from vllm.model_executor.models.utils import (
40
AutoWeightsLoader,
41
PPMissingLayer,
43
- is_pp_missing_parameter,
42
+ WeightsMapper,
43
make_empty_intermediate_tensors_factory,
44
make_layers,
45
maybe_prefix,
@@ -48,11 +47,6 @@ from vllm.model_executor.models.utils import (
47
from vllm.sequence import IntermediateTensors
48
from vllm.v1.attention.backend import AttentionType
49
51
-STEP_PACKED_MODULES_MAPPING = {
52
- "qkv_proj": ["q_proj", "k_proj", "v_proj"],
53
- "gate_up_proj": ["gate_proj", "up_proj"],
54
-}
55
-
50
51
def _get_step_alibi_slopes(total_num_heads: int) -> torch.Tensor:
52
"""Reference ALiBi slopes used by Step models."""
@@ -242,42 +236,6 @@ class StepDecoderLayer(nn.Module):
236
hidden_states = self.mlp(hidden_states)
237
return hidden_states, residual
238
245
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
246
- stacked_params_mapping = [
247
- (".qkv_proj", ".q_proj", "q"),
248
- (".qkv_proj", ".k_proj", "k"),
249
- (".qkv_proj", ".v_proj", "v"),
250
- (".gate_up_proj", ".gate_proj", 0),
251
- (".gate_up_proj", ".up_proj", 1),
252
- ]
253
- params_dict = dict(self.named_parameters())
254
- loaded_params: set[str] = set()
255
- for name, loaded_weight in weights:
256
- for param_name, weight_name, shard_id in stacked_params_mapping:
257
- if weight_name not in name:
258
- continue
259
- name = name.replace(weight_name, param_name)
260
- # Skip loading extra bias for GPTQ models.
261
- if name.endswith(".bias") and name not in params_dict:
262
- continue
263
- if is_pp_missing_parameter(name, self):
264
- continue
265
- param = params_dict[name]
266
- weight_loader = param.weight_loader
267
- weight_loader(param, loaded_weight, shard_id)
268
- break
269
- else:
270
- # Skip loading extra bias for GPTQ models.
271
- if name.endswith(".bias") and name not in params_dict:
272
- continue
273
- if is_pp_missing_parameter(name, self):
274
- continue
275
- param = params_dict[name]
276
- weight_loader = getattr(param, "weight_loader", default_weight_loader) # type: ignore[name-defined]
277
- weight_loader(param, loaded_weight)
278
- loaded_params.add(name)
279
- return loaded_params
280
-
239
240
class StepDecoderModel(nn.Module, EagleModelMixin):
241
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
@@ -354,7 +312,20 @@ class StepDecoderModel(nn.Module, EagleModelMixin):
312
313
314
class Step1ForCausalLM(nn.Module, SupportsPP, SupportsEagle, SupportsEagle3):
357
- packed_modules_mapping = STEP_PACKED_MODULES_MAPPING
315
+ hf_to_vllm_mapper = WeightsMapper(
316
+ orig_to_new_stacked={
317
+ # weight_name: (param_name, shard_id)
318
+ ".q_proj": (".qkv_proj", "q"),
319
+ ".k_proj": (".qkv_proj", "k"),
320
+ ".v_proj": (".qkv_proj", "v"),
321
+ ".gate_proj": (".gate_up_proj", 0),
322
+ ".up_proj": (".gate_up_proj", 1),
323
+ }
324
+ )
325
+ packed_modules_mapping = {
326
+ "qkv_proj": ["q_proj", "k_proj", "v_proj"],
327
+ "gate_up_proj": ["gate_proj", "up_proj"],
328
+ }
329
330
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
331
super().__init__()
@@ -413,4 +384,4 @@ class Step1ForCausalLM(nn.Module, SupportsPP, SupportsEagle, SupportsEagle3):
384
385
def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
386
loader = AutoWeightsLoader(self)
416
- return loader.load_weights(weights)
387
+ return loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
vllm/model_executor/models/transformers/base.py
-3
@@ -158,9 +158,6 @@ class Base(
158
"Transformers modeling backend does "
159
"not support MXFP4 quantization yet."
160
)
161
- # Skip loading extra bias for GPTQ models.
162
- if "gptq" in quant_method_name:
163
- self.ignore_unexpected_suffixes.append(".bias")
161
162
self._patch_config()
163
from_config_kwargs = dict(
vllm/model_executor/models/utils.py
+67
-24
@@ -4,8 +4,8 @@
4
import itertools
5
from collections.abc import Callable, Iterable, Mapping
6
from contextlib import contextmanager
7
-from dataclasses import dataclass, field
8
-from typing import Any, Literal, Protocol, overload
7
+from dataclasses import dataclass, field, replace
8
+from typing import TYPE_CHECKING, Any, Literal, Protocol, TypeAlias, overload
9
10
import regex as re
11
import torch
@@ -19,9 +19,6 @@ from vllm.distributed import (
19
get_tensor_model_parallel_world_size,
20
)
21
from vllm.logger import init_logger
22
-from vllm.model_executor.layers.quantization.base_config import (
23
- QuantizationConfig,
24
-)
22
from vllm.model_executor.model_loader.reload import (
23
support_quantized_model_reload_from_hp_weights,
24
)
@@ -35,8 +32,13 @@ from vllm.utils.torch_utils import (
32
direct_register_custom_op,
33
)
34
35
+if TYPE_CHECKING:
36
+ from vllm.model_executor.layers.quantization import QuantizationConfig
37
+
38
logger = init_logger(__name__)
39
40
+ShardId: TypeAlias = str | int | tuple[int, ...]
41
+
42
43
@dataclass
44
class WeightsMapper:
@@ -47,6 +49,7 @@ class WeightsMapper:
49
orig_to_new_renamings: list[Any] = field(default_factory=list)
50
orig_to_new_regex: Mapping[re.Pattern, str | None] = field(default_factory=dict)
51
orig_to_new_substr: Mapping[str, str | None] = field(default_factory=dict)
52
+ orig_to_new_stacked: Mapping[str, tuple[str, ShardId]] = field(default_factory=dict)
53
orig_to_new_prefix: Mapping[str, str | None] = field(default_factory=dict)
54
orig_to_new_suffix: Mapping[str, str | None] = field(default_factory=dict)
55
@@ -59,11 +62,36 @@ class WeightsMapper:
62
],
63
orig_to_new_regex={**self.orig_to_new_regex, **other.orig_to_new_regex},
64
orig_to_new_substr={**self.orig_to_new_substr, **other.orig_to_new_substr},
65
+ orig_to_new_stacked={
66
+ **self.orig_to_new_stacked,
67
+ **other.orig_to_new_stacked,
68
+ },
69
orig_to_new_prefix={**self.orig_to_new_prefix, **other.orig_to_new_prefix},
70
orig_to_new_suffix={**self.orig_to_new_suffix, **other.orig_to_new_suffix},
71
)
72
73
def _map_name(self, key: str) -> str | None:
74
+ """Map a weight name (backward-compatible wrapper that discards shard_id)."""
75
+ result = self._map_name_with_shard(key)
76
+ return result[0] if result is not None else None
77
+
78
+ def _map_name_with_shard(self, key: str) -> tuple[str, ShardId | None] | None:
79
+ """Map a weight name and extract any shard_id metadata.
80
+
81
+ Returns:
82
+ (mapped_name, shard_id) if the name should be kept.
83
+ None if the name should be dropped.
84
+ """
85
+ # Deprecation warnings
86
+ if key.endswith(".kv_scale"):
87
+ logger.warning_once(
88
+ "DEPRECATED. Found kv_scale in the checkpoint. "
89
+ "This format is deprecated in favor of separate k_scale and "
90
+ "v_scale tensors and will be removed in a future release. "
91
+ "Functionally, we will remap kv_scale to k_scale and duplicate "
92
+ "k_scale to v_scale"
93
+ )
94
+
95
for renaming in self.orig_to_new_renamings:
96
key, _ = renaming.rename_source_key(key)
97
@@ -81,6 +109,12 @@ class WeightsMapper:
109
110
key = key.replace(substr, new_key, 1)
111
112
+ shard_id: ShardId | None = None
113
+ for substr, (new_key, new_shard_id) in self.orig_to_new_stacked.items():
114
+ if substr in key:
115
+ key = key.replace(substr, new_key, 1)
116
+ shard_id = new_shard_id
117
+
118
for prefix, new_key in self.orig_to_new_prefix.items():
119
if key.startswith(prefix):
120
if new_key is None:
@@ -95,16 +129,19 @@ class WeightsMapper:
129
130
key = new_key.join(key.rsplit(suffix, 1))
131
98
- return key
132
+ return key, shard_id
133
134
def apply(
135
self, weights: Iterable[tuple[str, torch.Tensor]]
136
) -> Iterable[tuple[str, torch.Tensor]]:
103
- return (
104
- (out_name, data)
105
- for name, data in weights
106
- if (out_name := self._map_name(name)) is not None
107
- )
137
+ for name, data in weights:
138
+ result = self._map_name_with_shard(name)
139
+ if result is None:
140
+ continue
141
+ out_name, shard_id = result
142
+ if shard_id is not None:
143
+ data.shard_id = shard_id
144
+ yield out_name, data
145
146
def apply_list(self, values: list[str]) -> list[str]:
147
return [
@@ -120,6 +157,15 @@ class WeightsMapper:
157
if (out_name := self._map_name(name)) is not None
158
}
159
160
+ def get_unstacked_mapper(self) -> "WeightsMapper":
161
+ """Mapper variant that drops stacked maps, keeping all genuine renames/prefixes.
162
+
163
+ Consumers that reference the checkpoint's *unstacked* module names (LoRA name
164
+ parsing and the quantization config's layer lists) need the constituent names
165
+ (e.g. `q_proj`) to survive rather than being rewritten to the stacked vLLM name
166
+ (`qkv_proj`)."""
167
+ return replace(self, orig_to_new_stacked={})
168
+
169
170
class AutoWeightsLoader:
171
"""
@@ -352,20 +398,19 @@ class AutoWeightsLoader:
398
*,
399
mapper: WeightsMapper | None = None,
400
) -> set[str]:
401
+ # Ignore unexpected biases (typically from GPTQ models)
402
+ self.ignore_unexpected_suffixes.append(".bias")
403
+
404
# Many models store quant_config in the base model instead of the causal model.
405
# We look at the causal model's direct children for this reason.
406
modules = (self.module, *self.module.children())
407
iterator = (m.quant_config for m in modules if hasattr(m, "quant_config"))
359
- quant_config = next(iterator, None)
360
- cache_scale_mapper = (
361
- quant_config.get_cache_scale_mapper() if quant_config is not None else None
362
- )
363
- if cache_scale_mapper is not None:
364
- mapper = (
365
- mapper | cache_scale_mapper
366
- if mapper is not None
367
- else cache_scale_mapper
368
- )
408
+ if quant_config := next(iterator, None):
409
+ # Get mappings and ignore prefixes for KV cache quantization scales
410
+ mapper = mapper or WeightsMapper()
411
+ mapper |= quant_config.get_cache_scale_mapper()
412
+ ignore_unexpected_suffixes = quant_config._ignore_unexpected_suffixes
413
+ self.ignore_unexpected_suffixes.extend(ignore_unexpected_suffixes)
414
if mapper is not None:
415
weights = mapper.apply(weights)
416
# filter out weights with first-prefix/substr to skip in name
@@ -734,9 +779,7 @@ def maybe_prefix(prefix: str, name: str) -> str:
779
return name if not prefix else f"{prefix}.{name}"
780
781
737
-def get_draft_quant_config(
738
- vllm_config: VllmConfig,
739
-) -> QuantizationConfig | None:
782
+def get_draft_quant_config(vllm_config: VllmConfig) -> "QuantizationConfig | None":
783
"""Get quantization config for Draft models.
784
785
Draft models should use their own quantization config instead of the verifier/target
vllm/model_executor/models/whisper.py
+9
-38
@@ -44,7 +44,6 @@ from vllm.model_executor.layers.linear import (
44
from vllm.model_executor.layers.logits_processor import LogitsProcessor
45
from vllm.model_executor.layers.quantization import QuantizationConfig
46
from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
47
-from vllm.model_executor.model_loader.weight_utils import default_weight_loader
47
from vllm.model_executor.models.whisper_utils import (
48
ISO639_1_SUPPORTED_LANGS,
49
)
@@ -617,42 +616,6 @@ class WhisperModel(nn.Module):
616
return None
617
return self.encoder(input_features)
618
620
- def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
621
- stacked_params_mapping = [
622
- # (param_name, shard_name, shard_id)
623
- (".self_attn.qkv_proj", ".self_attn.q_proj", "q"),
624
- (".self_attn.qkv_proj", ".self_attn.k_proj", "k"),
625
- (".self_attn.qkv_proj", ".self_attn.v_proj", "v"),
626
- # MergedColumnParallelLinear uses integer indices (0, 1)
627
- (".encoder_attn.kv_proj", ".encoder_attn.k_proj", 0),
628
- (".encoder_attn.kv_proj", ".encoder_attn.v_proj", 1),
629
- ]
630
- params_dict = dict(self.named_parameters())
631
- loaded_params: set[str] = set()
632
- for name, loaded_weight in weights:
633
- for param_name, weight_name, shard_id in stacked_params_mapping:
634
- if weight_name not in name:
635
- continue
636
- name = name.replace(weight_name, param_name)
637
- # Skip loading extra bias for GPTQ models.
638
- if name.endswith(".bias") and name not in params_dict:
639
- continue
640
-
641
- param = params_dict[name]
642
- weight_loader = param.weight_loader
643
- weight_loader(param, loaded_weight, shard_id)
644
- break
645
- else:
646
- # Skip loading extra bias for GPTQ models.
647
- if name.endswith(".bias") and name not in params_dict:
648
- continue
649
-
650
- param = params_dict[name]
651
- weight_loader = getattr(param, "weight_loader", default_weight_loader)
652
- weight_loader(param, loaded_weight)
653
- loaded_params.add(name)
654
- return loaded_params
655
-
619
620
class WhisperProcessingInfo(BaseProcessingInfo):
621
def get_hf_config(self) -> WhisperConfig:
@@ -808,7 +771,15 @@ class WhisperForConditionalGeneration(
771
}
772
773
hf_to_vllm_mapper = WeightsMapper(
811
- orig_to_new_substr={".fc1.": ".mlp.fc1.", ".fc2.": ".mlp.fc2."}
774
+ orig_to_new_substr={".fc1.": ".mlp.fc1.", ".fc2.": ".mlp.fc2."},
775
+ orig_to_new_stacked={
776
+ # weight_name: (param_name, shard_id)
777
+ ".self_attn.q_proj": (".self_attn.qkv_proj", "q"),
778
+ ".self_attn.k_proj": (".self_attn.qkv_proj", "k"),
779
+ ".self_attn.v_proj": (".self_attn.qkv_proj", "v"),
780
+ ".encoder_attn.k_proj": (".encoder_attn.kv_proj", 0),
781
+ ".encoder_attn.v_proj": (".encoder_attn.kv_proj", 1),
782
+ },
783
)
784
785
# Whisper only supports audio-conditioned generation.