Standardise weight tying on `ParallelLMHead.tie_weights` (#52147)
Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Harry Mellor committed
Aug 13, 2026 at 16:10 UTC
80d6d557f307448fdad46995b5e237817b31144e
56 files changed
+191
-214
vllm/model_executor/models/arctic.py
+1
-1
@@ -557,7 +557,7 @@ class ArcticForCausalLM(nn.Module, SupportsPP, SupportsQuant):
557
prefix=maybe_prefix(prefix, "lm_head"),
558
)
559
if self.config.tie_word_embeddings:
560
- self.lm_head.weight = self.model.embed_tokens.weight
560
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
561
self.num_experts = config.num_local_experts
562
self.num_experts_per_tok = config.num_experts_per_tok
563
vllm/model_executor/models/bailing_moe.py
+7
-8
@@ -509,15 +509,14 @@ class BailingMoeForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
509
self.tie_word_embeddings = getattr(config, "tie_word_embeddings", False)
510
511
if get_pp_group().is_last_rank:
512
+ self.lm_head = ParallelLMHead(
513
+ config.vocab_size,
514
+ config.hidden_size,
515
+ quant_config=quant_config,
516
+ prefix=maybe_prefix(prefix, "lm_head"),
517
+ )
518
if self.tie_word_embeddings:
513
- self.lm_head = self.model.word_embeddings
514
- else:
515
- self.lm_head = ParallelLMHead(
516
- config.vocab_size,
517
- config.hidden_size,
518
- quant_config=quant_config,
519
- prefix=maybe_prefix(prefix, "lm_head"),
520
- )
519
+ self.lm_head = self.lm_head.tie_weights(self.model.word_embeddings)
520
self.logits_processor = LogitsProcessor(config.vocab_size)
521
else:
522
self.lm_head = PPMissingLayer()
vllm/model_executor/models/bloom.py
+6
-7
@@ -324,14 +324,13 @@ class BloomForCausalLM(nn.Module, SupportsPP, SupportsQuant):
324
self.transformer = BloomModel(
325
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "transformer")
326
)
327
+ self.lm_head = ParallelLMHead(
328
+ self.config.vocab_size,
329
+ self.config.hidden_size,
330
+ prefix=maybe_prefix(prefix, "lm_head"),
331
+ )
332
if self.config.tie_word_embeddings:
328
- self.lm_head = self.transformer.word_embeddings
329
- else:
330
- self.lm_head = ParallelLMHead(
331
- self.config.vocab_size,
332
- self.config.hidden_size,
333
- prefix=maybe_prefix(prefix, "lm_head"),
334
- )
333
+ self.lm_head = self.lm_head.tie_weights(self.transformer.word_embeddings)
334
335
self.logits_processor = LogitsProcessor(config.vocab_size)
336
self.make_empty_intermediate_tensors = (
vllm/model_executor/models/chameleon.py
+1
-1
@@ -977,7 +977,7 @@ class ChameleonForConditionalGeneration(
977
prefix=maybe_prefix(prefix, "lm_head"),
978
)
979
if config.tie_word_embeddings:
980
- self.lm_head.weight = self.model.embed_tokens.weight
980
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
981
982
logit_scale = getattr(config, "logit_scale", 1.0)
983
self.logits_processor = LogitsProcessor(config.vocab_size, scale=logit_scale)
vllm/model_executor/models/ernie45_moe.py
+1
-1
@@ -543,7 +543,7 @@ class Ernie4_5_MoeForCausalLM(nn.Module, SupportsPP, SupportsLoRA, MixtureOfExpe
543
self.lm_head = PPMissingLayer()
544
545
if self.config.tie_word_embeddings:
546
- self.lm_head.weight = self.model.embed_tokens.weight
546
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
547
self.logits_processor = LogitsProcessor(config.vocab_size)
548
self.make_empty_intermediate_tensors = (
549
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/ernie45_vl_moe.py
+1
-1
@@ -611,7 +611,7 @@ class Ernie4_5_VLMoeForCausalLM(nn.Module, SupportsPP):
611
self.lm_head = PPMissingLayer()
612
613
if self.config.tie_word_embeddings:
614
- self.lm_head.weight = self.model.embed_tokens.weight
614
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
615
self.logits_processor = LogitsProcessor(config.vocab_size)
616
self.make_empty_intermediate_tensors = (
617
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/ernie_mtp.py
+1
-1
@@ -177,7 +177,7 @@ class ErnieMTP(nn.Module):
177
)
178
179
if self.config.tie_word_embeddings:
180
- self.lm_head.weight = self.model.embed_tokens.weight
180
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
181
182
def embed_input_ids(self, input_ids: torch.Tensor) -> torch.Tensor:
183
return self.model.embed_input_ids(input_ids)
vllm/model_executor/models/exaone.py
+1
-1
@@ -410,7 +410,7 @@ class ExaoneForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
410
prefix=maybe_prefix(prefix, "lm_head"),
411
)
412
if config.tie_word_embeddings:
413
- self.lm_head.weight = self.transformer.wte.weight
413
+ self.lm_head = self.lm_head.tie_weights(self.transformer.wte)
414
415
logit_scale = getattr(config, "logit_scale", 1.0)
416
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/exaone4.py
+1
-1
@@ -410,7 +410,7 @@ class Exaone4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
410
prefix=maybe_prefix(prefix, "lm_head"),
411
)
412
if config.tie_word_embeddings:
413
- self.lm_head.weight = self.model.embed_tokens.weight
413
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
414
415
logit_scale = getattr(config, "logit_scale", 1.0)
416
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/exaone4_5_mtp.py
+1
-1
@@ -159,7 +159,7 @@ class Exaone4_5_MTP(ExaoneMoeMTP, SupportsMultiModal):
159
prefix=maybe_prefix(prefix, "lm_head"),
160
)
161
if config.tie_word_embeddings:
162
- self.lm_head.weight = self.model.embed_tokens.weight
162
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
163
self.logits_processor = LogitsProcessor(
164
self.unpadded_vocab_size, config.vocab_size
165
)
vllm/model_executor/models/exaone_moe.py
+1
-1
@@ -522,7 +522,7 @@ class ExaoneMoeForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
522
quant_config=quant_config,
523
)
524
if config.tie_word_embeddings:
525
- self.lm_head.weight = self.model.embed_tokens.weight
525
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
526
527
logit_scale = getattr(config, "logit_scale", 1.0)
528
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/exaone_moe_mtp.py
+1
-1
@@ -159,7 +159,7 @@ class ExaoneMoeMTP(nn.Module):
159
prefix=maybe_prefix(prefix, "lm_head"),
160
)
161
if config.tie_word_embeddings:
162
- self.lm_head.weight = self.model.embed_tokens.weight
162
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
163
self.logits_processor = LogitsProcessor(
164
self.unpadded_vocab_size, config.vocab_size
165
)
vllm/model_executor/models/falcon.py
+7
-8
@@ -499,15 +499,14 @@ class FalconForCausalLM(nn.Module, SupportsPP):
499
if config.tie_word_embeddings is not None
500
else True
501
)
502
+ self.lm_head = ParallelLMHead(
503
+ config.vocab_size,
504
+ config.hidden_size,
505
+ quant_config=quant_config,
506
+ prefix=maybe_prefix(prefix, "lm_head"),
507
+ )
508
if self.tie_word_embeddings:
503
- self.lm_head = self.transformer.word_embeddings
504
- else:
505
- self.lm_head = ParallelLMHead(
506
- config.vocab_size,
507
- config.hidden_size,
508
- quant_config=quant_config,
509
- prefix=maybe_prefix(prefix, "lm_head"),
510
- )
509
+ self.lm_head = self.lm_head.tie_weights(self.transformer.word_embeddings)
510
self.logits_processor = LogitsProcessor(config.vocab_size)
511
self.make_empty_intermediate_tensors = (
512
self.transformer.make_empty_intermediate_tensors
vllm/model_executor/models/funasr.py
+7
-8
@@ -919,15 +919,14 @@ class FunASRForConditionalGeneration(
919
)
920
logit_scale = getattr(config, "logit_scale", 1.0)
921
922
+ self.lm_head = ParallelLMHead(
923
+ config.vocab_size,
924
+ config.hidden_size,
925
+ quant_config=quant_config,
926
+ prefix=maybe_prefix(prefix, "lm_head"),
927
+ )
928
if config.tie_word_embeddings:
923
- self.lm_head = self.model.decoder.embed_tokens
924
- else:
925
- self.lm_head = ParallelLMHead(
926
- config.vocab_size,
927
- config.hidden_size,
928
- quant_config=quant_config,
929
- prefix=maybe_prefix(prefix, "lm_head"),
930
- )
929
+ self.lm_head = self.lm_head.tie_weights(self.model.decoder.embed_tokens)
930
self.logits_processor = LogitsProcessor(config.vocab_size, scale=logit_scale)
931
932
def get_language_model(self) -> torch.nn.Module:
vllm/model_executor/models/gemma4_mtp.py
+1
-1
@@ -489,7 +489,7 @@ class Gemma4MTP(nn.Module):
489
prefix=maybe_prefix(prefix, "lm_head"),
490
)
491
if getattr(config, "tie_word_embeddings", True):
492
- self.lm_head.weight = self.model.embed_tokens.weight
492
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
493
494
self.logits_processor = LogitsProcessor(
495
text_config.vocab_size,
vllm/model_executor/models/glm4.py
+7
-8
@@ -252,15 +252,14 @@ class Glm4ForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
252
)
253
254
if get_pp_group().is_last_rank:
255
+ self.lm_head = ParallelLMHead(
256
+ config.vocab_size,
257
+ config.hidden_size,
258
+ quant_config=quant_config,
259
+ prefix=maybe_prefix(prefix, "lm_head"),
260
+ )
261
if config.tie_word_embeddings:
256
- self.lm_head = self.model.embed_tokens
257
- else:
258
- self.lm_head = ParallelLMHead(
259
- config.vocab_size,
260
- config.hidden_size,
261
- quant_config=quant_config,
262
- prefix=maybe_prefix(prefix, "lm_head"),
263
- )
262
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
263
else:
264
self.lm_head = PPMissingLayer()
265
vllm/model_executor/models/gpt_neox.py
+1
-1
@@ -285,7 +285,7 @@ class GPTNeoXForCausalLM(nn.Module, SupportsPP):
285
prefix=maybe_prefix(prefix, "embed_out"),
286
)
287
if self.config.tie_word_embeddings:
288
- self.embed_out.weight = self.gpt_neox.embed_in.weight
288
+ self.embed_out = self.embed_out.tie_weights(self.gpt_neox.embed_in)
289
self.logits_processor = LogitsProcessor(config.vocab_size)
290
self.make_empty_intermediate_tensors = (
291
self.gpt_neox.make_empty_intermediate_tensors
vllm/model_executor/models/granite.py
+1
-1
@@ -365,7 +365,7 @@ class GraniteForCausalLM(nn.Module, SupportsLoRA, SupportsPP, SupportsQuant):
365
prefix=maybe_prefix(prefix, "lm_head"),
366
)
367
if config.tie_word_embeddings:
368
- self.lm_head.weight = self.model.embed_tokens.weight
368
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
369
370
logit_scale = getattr(config, "logit_scale", 1.0)
371
if hasattr(config, "logits_scaling"):
vllm/model_executor/models/granite4_vision.py
+1
-1
@@ -316,7 +316,7 @@ class Granite4VisionLLMForCausalLM(GraniteForCausalLM):
316
prefix=maybe_prefix(prefix, "lm_head"),
317
)
318
if config.tie_word_embeddings:
319
- self.lm_head.weight = self.model.embed_tokens.weight
319
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
320
logit_scale = getattr(config, "logit_scale", 1.0)
321
if hasattr(config, "logits_scaling"):
322
logit_scale /= config.logits_scaling
vllm/model_executor/models/granitemoe.py
+1
-1
@@ -505,7 +505,7 @@ class GraniteMoeForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
505
prefix=maybe_prefix(prefix, "lm_head"),
506
)
507
if config.tie_word_embeddings:
508
- self.lm_head.weight = self.model.embed_tokens.weight
508
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
509
510
self.logits_processor = LogitsProcessor(
511
config.vocab_size,
vllm/model_executor/models/granitemoehybrid.py
+1
-1
@@ -663,7 +663,7 @@ class GraniteMoeHybridForCausalLM(
663
prefix=maybe_prefix(prefix, "lm_head"),
664
)
665
if config.tie_word_embeddings:
666
- self.lm_head.weight = self.model.embed_tokens.weight
666
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
667
self.logits_processor = LogitsProcessor(
668
config.vocab_size,
669
config.vocab_size,
vllm/model_executor/models/granitemoeshared.py
+1
-1
@@ -281,7 +281,7 @@ class GraniteMoeSharedForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
281
prefix=maybe_prefix(prefix, "lm_head"),
282
)
283
if config.tie_word_embeddings:
284
- self.lm_head.weight = self.model.embed_tokens.weight
284
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
285
286
self.logits_processor = LogitsProcessor(
287
config.vocab_size,
vllm/model_executor/models/hrm_text.py
+7
-8
@@ -487,15 +487,14 @@ class HrmTextForCausalLM(nn.Module):
487
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "model")
488
)
489
490
+ self.lm_head = ParallelLMHead(
491
+ config.vocab_size,
492
+ config.hidden_size,
493
+ quant_config=quant_config,
494
+ prefix=maybe_prefix(prefix, "lm_head"),
495
+ )
496
if config.tie_word_embeddings:
491
- self.lm_head = self.model.embed_tokens
492
- else:
493
- self.lm_head = ParallelLMHead(
494
- config.vocab_size,
495
- config.hidden_size,
496
- quant_config=quant_config,
497
- prefix=maybe_prefix(prefix, "lm_head"),
498
- )
497
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
498
self.logits_processor = LogitsProcessor(config.vocab_size)
499
500
def embed_input_ids(self, input_ids: torch.Tensor) -> torch.Tensor:
vllm/model_executor/models/hunyuan_v1.py
+1
-1
@@ -927,7 +927,7 @@ class HunyuanV1ModelBase(
927
prefix=maybe_prefix(prefix, "lm_head"),
928
)
929
if config.tie_word_embeddings:
930
- self.lm_head.weight = self.model.embed_tokens.weight
930
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
931
932
logit_scale = getattr(config, "logit_scale", 1.0)
933
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/hy_v3.py
+1
-1
@@ -673,7 +673,7 @@ class HYV3ForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
673
prefix=maybe_prefix(prefix, "lm_head"),
674
)
675
if self.config.tie_word_embeddings:
676
- self.lm_head.weight = self.model.embed_tokens.weight
676
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
677
self.logits_processor = LogitsProcessor(config.vocab_size)
678
self.make_empty_intermediate_tensors = (
679
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/idefics3.py
+1
-1
@@ -539,7 +539,7 @@ class Idefics3ForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsLo
539
prefix=maybe_prefix(prefix, "lm_head"),
540
)
541
if self.config.text_config.tie_word_embeddings:
542
- self.lm_head.weight = self.model.text_model.embed_tokens.weight
542
+ self.lm_head = self.lm_head.tie_weights(self.model.text_model.embed_tokens)
543
self.logits_processor = LogitsProcessor(config.text_config.vocab_size)
544
545
def _parse_and_validate_image_input(self, **kwargs: object) -> ImageInputs | None:
vllm/model_executor/models/internlm2.py
+1
-1
@@ -352,7 +352,7 @@ class InternLM2ForCausalLM(nn.Module, SupportsPP, SupportsLoRA, SupportsQuant):
352
prefix=maybe_prefix(prefix, "output"),
353
)
354
if self.config.tie_word_embeddings:
355
- self.output.weight = self.model.tok_embeddings.weight
355
+ self.output = self.output.tie_weights(self.model.tok_embeddings)
356
self.logits_processor = LogitsProcessor(config.vocab_size)
357
self.make_empty_intermediate_tensors = (
358
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/interns1_pro.py
+1
-1
@@ -481,7 +481,7 @@ class InternS1ProMoeLLMForCausalLM(Qwen3MoeForCausalLM):
481
prefix=maybe_prefix(prefix, "lm_head"),
482
)
483
if self.config.tie_word_embeddings:
484
- self.lm_head.weight = self.model.embed_tokens.weight
484
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
485
self.logits_processor = LogitsProcessor(self.config.vocab_size)
486
self.make_empty_intermediate_tensors = (
487
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/interns2_mobius.py
+7
-8
@@ -443,15 +443,14 @@ class InternS2MobiusForCausalLM(Qwen3_5ForCausalLMBase):
443
)
444
445
if get_pp_group().is_last_rank:
446
+ self.lm_head = ParallelLMHead(
447
+ config.vocab_size,
448
+ config.hidden_size,
449
+ quant_config=self.quant_config,
450
+ prefix=maybe_prefix(prefix, "lm_head"),
451
+ )
452
if config.tie_word_embeddings:
447
- self.lm_head = self.model.embed_tokens
448
- else:
449
- self.lm_head = ParallelLMHead(
450
- config.vocab_size,
451
- config.hidden_size,
452
- quant_config=self.quant_config,
453
- prefix=maybe_prefix(prefix, "lm_head"),
454
- )
453
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
454
else:
455
self.lm_head = PPMissingLayer()
456
vllm/model_executor/models/iquest_loopcoder.py
+7
-8
@@ -541,15 +541,14 @@ class IQuestLoopCoderForCausalLM(nn.Module):
541
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "model")
542
)
543
544
+ self.lm_head = ParallelLMHead(
545
+ config.vocab_size,
546
+ config.hidden_size,
547
+ quant_config=quant_config,
548
+ prefix=maybe_prefix(prefix, "lm_head"),
549
+ )
550
if config.tie_word_embeddings:
545
- self.lm_head = self.model.embed_tokens
546
- else:
547
- self.lm_head = ParallelLMHead(
548
- config.vocab_size,
549
- config.hidden_size,
550
- quant_config=quant_config,
551
- prefix=maybe_prefix(prefix, "lm_head"),
552
- )
551
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
552
553
self.logits_processor = LogitsProcessor(config.vocab_size)
554
vllm/model_executor/models/mamba.py
+6
-7
@@ -188,14 +188,13 @@ class MambaForCausalLM(
188
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "backbone")
189
)
190
191
+ self.lm_head = ParallelLMHead(
192
+ config.vocab_size,
193
+ config.hidden_size,
194
+ prefix=maybe_prefix(prefix, "lm_head"),
195
+ )
196
if config.tie_word_embeddings:
192
- self.lm_head = self.backbone.embeddings
193
- else:
194
- self.lm_head = ParallelLMHead(
195
- config.vocab_size,
196
- config.hidden_size,
197
- prefix=maybe_prefix(prefix, "lm_head"),
198
- )
197
+ self.lm_head = self.lm_head.tie_weights(self.backbone.embeddings)
198
199
self.logits_processor = LogitsProcessor(config.vocab_size)
200
vllm/model_executor/models/mellum.py
+1
-1
@@ -221,7 +221,7 @@ class MellumForCausalLM(Qwen3MoeForCausalLM):
221
prefix=maybe_prefix(prefix, "lm_head"),
222
)
223
if self.config.tie_word_embeddings:
224
- self.lm_head.weight = self.model.embed_tokens.weight
224
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
225
self.logits_processor = LogitsProcessor(config.vocab_size)
226
self.make_empty_intermediate_tensors = (
227
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/mimo.py
+7
-8
@@ -101,15 +101,14 @@ class MiMoForCausalLM(Qwen2ForCausalLM, nn.Module):
101
)
102
103
if get_pp_group().is_last_rank:
104
+ self.lm_head = ParallelLMHead(
105
+ config.vocab_size,
106
+ config.hidden_size,
107
+ quant_config=quant_config,
108
+ prefix=maybe_prefix(prefix, "lm_head"),
109
+ )
110
if config.tie_word_embeddings:
105
- self.lm_head = self.model.embed_tokens
106
- else:
107
- self.lm_head = ParallelLMHead(
108
- config.vocab_size,
109
- config.hidden_size,
110
- quant_config=quant_config,
111
- prefix=maybe_prefix(prefix, "lm_head"),
112
- )
111
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
112
else:
113
self.lm_head = PPMissingLayer()
114
vllm/model_executor/models/mixtral.py
+1
-1
@@ -403,7 +403,7 @@ class MixtralForCausalLM(nn.Module, SupportsLoRA, SupportsPP, MixtureOfExperts):
403
prefix=maybe_prefix(prefix, "lm_head"),
404
)
405
if self.config.tie_word_embeddings:
406
- self.lm_head.weight = self.model.embed_tokens.weight
406
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
407
self.logits_processor = LogitsProcessor(config.vocab_size)
408
self.make_empty_intermediate_tensors = (
409
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/molmo.py
+7
-8
@@ -1340,15 +1340,14 @@ class MolmoForCausalLM(
1340
1341
self.img_patch_id = None
1342
1343
+ self.lm_head = ParallelLMHead(
1344
+ config.embedding_size or config.vocab_size,
1345
+ config.hidden_size,
1346
+ quant_config=quant_config,
1347
+ prefix=maybe_prefix(prefix, "lm_head"),
1348
+ )
1349
if self.config.weight_tying:
1344
- self.lm_head = self.model.transformer.wte
1345
- else:
1346
- self.lm_head = ParallelLMHead(
1347
- config.embedding_size or config.vocab_size,
1348
- config.hidden_size,
1349
- quant_config=quant_config,
1350
- prefix=maybe_prefix(prefix, "lm_head"),
1351
- )
1350
+ self.lm_head = self.lm_head.tie_weights(self.model.transformer.wte)
1351
1352
self.logits_processor = LogitsProcessor(
1353
config.embedding_size or config.vocab_size
vllm/model_executor/models/moss_audio.py
+7
-8
@@ -835,15 +835,14 @@ class MossQwen3ForCausalLM(Qwen3ForCausalLM):
835
)
836
837
if get_pp_group().is_last_rank:
838
+ self.lm_head = ParallelLMHead(
839
+ config.vocab_size,
840
+ config.hidden_size,
841
+ quant_config=quant_config,
842
+ prefix=maybe_prefix(prefix, "lm_head"),
843
+ )
844
if config.tie_word_embeddings:
839
- self.lm_head = self.model.embed_tokens
840
- else:
841
- self.lm_head = ParallelLMHead(
842
- config.vocab_size,
843
- config.hidden_size,
844
- quant_config=quant_config,
845
- prefix=maybe_prefix(prefix, "lm_head"),
846
- )
845
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
846
else:
847
from .utils import PPMissingLayer
848
vllm/model_executor/models/nemotron.py
+1
-1
@@ -404,7 +404,7 @@ class NemotronForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
404
prefix=maybe_prefix(prefix, "lm_head"),
405
)
406
if config.tie_word_embeddings:
407
- self.lm_head.weight = self.model.embed_tokens.weight
407
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
408
409
logit_scale = getattr(config, "logit_scale", 1.0)
410
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/olmo3.py
+7
-8
@@ -369,15 +369,14 @@ class Olmo3ForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
369
self.model = Olmo3Model(
370
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "model")
371
)
372
+ self.lm_head = ParallelLMHead(
373
+ config.vocab_size,
374
+ config.hidden_size,
375
+ quant_config=vllm_config.quant_config,
376
+ prefix=maybe_prefix(prefix, "lm_head"),
377
+ )
378
if config.tie_word_embeddings:
373
- self.lm_head = self.model.embed_tokens
374
- else:
375
- self.lm_head = ParallelLMHead(
376
- config.vocab_size,
377
- config.hidden_size,
378
- quant_config=vllm_config.quant_config,
379
- prefix=maybe_prefix(prefix, "lm_head"),
380
- )
379
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
380
self.logits_processor = LogitsProcessor(config.vocab_size)
381
self.make_empty_intermediate_tensors = (
382
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/olmo_hybrid.py
+7
-8
@@ -397,15 +397,14 @@ class OlmoHybridForCausalLM(
397
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "model")
398
)
399
400
+ self.lm_head = ParallelLMHead(
401
+ config.vocab_size,
402
+ config.hidden_size,
403
+ quant_config=vllm_config.quant_config,
404
+ prefix=maybe_prefix(prefix, "lm_head"),
405
+ )
406
if config.tie_word_embeddings:
401
- self.lm_head = self.model.embed_tokens
402
- else:
403
- self.lm_head = ParallelLMHead(
404
- config.vocab_size,
405
- config.hidden_size,
406
- quant_config=vllm_config.quant_config,
407
- prefix=maybe_prefix(prefix, "lm_head"),
408
- )
407
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
408
409
self.logits_processor = LogitsProcessor(config.vocab_size)
410
self.make_empty_intermediate_tensors = (
vllm/model_executor/models/openpangu.py
+1
-1
@@ -1122,7 +1122,7 @@ class OpenPanguModelBase(nn.Module, SupportsPP, SupportsLoRA):
1122
prefix=maybe_prefix(prefix, "lm_head"),
1123
)
1124
if config.tie_word_embeddings:
1125
- self.lm_head.weight = self.model.embed_tokens.weight
1125
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
1126
else:
1127
self.lm_head = PPMissingLayer()
1128
self.logits_processor = LogitsProcessor(config.vocab_size)
vllm/model_executor/models/opt.py
+6
-7
@@ -349,14 +349,13 @@ class OPTForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
349
self.model = OPTModel(
350
vllm_config=vllm_config, prefix=maybe_prefix(prefix, "model")
351
)
352
+ self.lm_head = ParallelLMHead(
353
+ config.vocab_size,
354
+ config.word_embed_proj_dim,
355
+ prefix=maybe_prefix(prefix, "lm_head"),
356
+ )
357
if self.config.tie_word_embeddings:
353
- self.lm_head = self.model.decoder.embed_tokens
354
- else:
355
- self.lm_head = ParallelLMHead(
356
- config.vocab_size,
357
- config.word_embed_proj_dim,
358
- prefix=maybe_prefix(prefix, "lm_head"),
359
- )
358
+ self.lm_head = self.lm_head.tie_weights(self.model.decoder.embed_tokens)
359
self.logits_processor = LogitsProcessor(config.vocab_size)
360
self.make_empty_intermediate_tensors = (
361
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/orion.py
+1
-1
@@ -305,7 +305,7 @@ class OrionForCausalLM(nn.Module, SupportsPP):
305
prefix=maybe_prefix(prefix, "lm_head"),
306
)
307
if self.config.tie_word_embeddings:
308
- self.lm_head.weight = self.model.embed_tokens.weight
308
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
309
self.logits_processor = LogitsProcessor(config.vocab_size)
310
self.make_empty_intermediate_tensors = (
311
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/param2moe.py
+7
-8
@@ -649,15 +649,14 @@ class Param2MoEForCausalLM(
649
650
self.tie_word_embeddings: bool = getattr(config, "tie_word_embeddings", False)
651
if get_pp_group().is_last_rank:
652
+ self.lm_head = ParallelLMHead(
653
+ config.vocab_size,
654
+ config.hidden_size,
655
+ quant_config=quant_config,
656
+ prefix=maybe_prefix(prefix, "lm_head"),
657
+ )
658
if self.tie_word_embeddings:
653
- self.lm_head = self.model.embed_tokens
654
- else:
655
- self.lm_head = ParallelLMHead(
656
- config.vocab_size,
657
- config.hidden_size,
658
- quant_config=quant_config,
659
- prefix=maybe_prefix(prefix, "lm_head"),
660
- )
659
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
660
self.logits_processor = LogitsProcessor(config.vocab_size)
661
else:
662
self.lm_head = PPMissingLayer()
vllm/model_executor/models/qwen2.py
+7
-8
@@ -460,15 +460,14 @@ class Qwen2ForCausalLM(
460
)
461
462
if get_pp_group().is_last_rank:
463
+ self.lm_head = ParallelLMHead(
464
+ config.vocab_size,
465
+ config.hidden_size,
466
+ quant_config=quant_config,
467
+ prefix=maybe_prefix(prefix, "lm_head"),
468
+ )
469
if config.tie_word_embeddings:
464
- self.lm_head = self.model.embed_tokens
465
- else:
466
- self.lm_head = ParallelLMHead(
467
- config.vocab_size,
468
- config.hidden_size,
469
- quant_config=quant_config,
470
- prefix=maybe_prefix(prefix, "lm_head"),
471
- )
470
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
471
else:
472
self.lm_head = PPMissingLayer()
473
vllm/model_executor/models/qwen2_moe.py
+1
-1
@@ -461,7 +461,7 @@ class Qwen2MoeForCausalLM(nn.Module, SupportsPP, SupportsLoRA):
461
prefix=maybe_prefix(prefix, "lm_head"),
462
)
463
if self.config.tie_word_embeddings:
464
- self.lm_head.weight = self.model.embed_tokens.weight
464
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
465
self.logits_processor = LogitsProcessor(config.vocab_size)
466
self.make_empty_intermediate_tensors = (
467
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/qwen3.py
+7
-8
@@ -295,15 +295,14 @@ class Qwen3ForCausalLM(
295
)
296
297
if get_pp_group().is_last_rank:
298
+ self.lm_head = ParallelLMHead(
299
+ config.vocab_size,
300
+ config.hidden_size,
301
+ quant_config=quant_config,
302
+ prefix=maybe_prefix(prefix, "lm_head"),
303
+ )
304
if config.tie_word_embeddings:
299
- self.lm_head = self.model.embed_tokens
300
- else:
301
- self.lm_head = ParallelLMHead(
302
- config.vocab_size,
303
- config.hidden_size,
304
- quant_config=quant_config,
305
- prefix=maybe_prefix(prefix, "lm_head"),
306
- )
305
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
306
else:
307
self.lm_head = PPMissingLayer()
308
vllm/model_executor/models/qwen3_5.py
+7
-8
@@ -334,15 +334,14 @@ class Qwen3_5ForCausalLMBase(
334
)
335
336
if get_pp_group().is_last_rank:
337
+ self.lm_head = ParallelLMHead(
338
+ config.vocab_size,
339
+ config.hidden_size,
340
+ quant_config=self.quant_config,
341
+ prefix=maybe_prefix(prefix, "lm_head"),
342
+ )
343
if config.tie_word_embeddings:
338
- self.lm_head = self.model.embed_tokens
339
- else:
340
- self.lm_head = ParallelLMHead(
341
- config.vocab_size,
342
- config.hidden_size,
343
- quant_config=self.quant_config,
344
- prefix=maybe_prefix(prefix, "lm_head"),
345
- )
344
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
345
else:
346
self.lm_head = PPMissingLayer()
347
vllm/model_executor/models/qwen3_5_mtp.py
+7
-8
@@ -238,15 +238,14 @@ class Qwen3_5MTP(LocalArgmaxMixin, nn.Module, SupportsMultiModal):
238
)
239
240
if get_pp_group().is_last_rank:
241
+ self.lm_head = ParallelLMHead(
242
+ config.vocab_size,
243
+ config.hidden_size,
244
+ quant_config=self.quant_config,
245
+ prefix=maybe_prefix(prefix, "lm_head"),
246
+ )
247
if config.tie_word_embeddings:
242
- self.lm_head = self.model.embed_tokens
243
- else:
244
- self.lm_head = ParallelLMHead(
245
- config.vocab_size,
246
- config.hidden_size,
247
- quant_config=self.quant_config,
248
- prefix=maybe_prefix(prefix, "lm_head"),
249
- )
248
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
249
else:
250
self.lm_head = PPMissingLayer()
251
vllm/model_executor/models/qwen3_moe.py
+1
-1
@@ -575,7 +575,7 @@ class Qwen3MoeForCausalLM(
575
prefix=maybe_prefix(prefix, "lm_head"),
576
)
577
if self.config.tie_word_embeddings:
578
- self.lm_head.weight = self.model.embed_tokens.weight
578
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
579
self.logits_processor = LogitsProcessor(config.vocab_size)
580
self.make_empty_intermediate_tensors = (
581
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/qwen3_omni_moe_thinker.py
+1
-1
@@ -1111,7 +1111,7 @@ class Qwen3MoeLLMForCausalLM(Qwen3MoeForCausalLM):
1111
config.vocab_size, config.hidden_size, quant_config=quant_config
1112
)
1113
if self.config.tie_word_embeddings:
1114
- self.lm_head.weight = self.model.embed_tokens.weight
1114
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
1115
self.logits_processor = LogitsProcessor(config.vocab_size)
1116
self.make_empty_intermediate_tensors = (
1117
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/qwen3_vl.py
+7
-8
@@ -1707,15 +1707,14 @@ class Qwen3LLMForCausalLM(Qwen3ForCausalLM):
1707
)
1708
1709
if get_pp_group().is_last_rank:
1710
+ self.lm_head = ParallelLMHead(
1711
+ config.vocab_size,
1712
+ config.hidden_size,
1713
+ quant_config=quant_config,
1714
+ prefix="lm_head",
1715
+ )
1716
if config.tie_word_embeddings:
1711
- self.lm_head = self.model.embed_tokens
1712
- else:
1713
- self.lm_head = ParallelLMHead(
1714
- config.vocab_size,
1715
- config.hidden_size,
1716
- quant_config=quant_config,
1717
- prefix="lm_head",
1718
- )
1717
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
1718
else:
1719
self.lm_head = PPMissingLayer()
1720
vllm/model_executor/models/qwen3_vl_moe.py
+1
-1
@@ -168,7 +168,7 @@ class Qwen3MoeLLMForCausalLM(Qwen3MoeForCausalLM):
168
prefix=maybe_prefix(prefix, "lm_head"),
169
)
170
if self.config.tie_word_embeddings:
171
- self.lm_head.weight = self.model.embed_tokens.weight
171
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
172
self.logits_processor = LogitsProcessor(self.config.vocab_size)
173
self.make_empty_intermediate_tensors = (
174
self.model.make_empty_intermediate_tensors
vllm/model_executor/models/sarvam.py
+7
-8
@@ -615,15 +615,14 @@ class SarvamMLAForCausalLM(nn.Module, SupportsPP, SupportsLoRA, SarvamMixtureOfE
615
616
self.tie_word_embeddings = getattr(config, "tie_word_embeddings", False)
617
if get_pp_group().is_last_rank:
618
+ self.lm_head = ParallelLMHead(
619
+ config.vocab_size,
620
+ config.hidden_size,
621
+ quant_config=quant_config,
622
+ prefix=maybe_prefix(prefix, "lm_head"),
623
+ )
624
if self.tie_word_embeddings:
619
- self.lm_head = self.model.embed_tokens
620
- else:
621
- self.lm_head = ParallelLMHead(
622
- config.vocab_size,
623
- config.hidden_size,
624
- quant_config=quant_config,
625
- prefix=maybe_prefix(prefix, "lm_head"),
626
- )
625
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
626
self.logits_processor = LogitsProcessor(config.vocab_size)
627
else:
628
self.lm_head = PPMissingLayer()
vllm/model_executor/models/seed_oss.py
+7
-8
@@ -388,15 +388,14 @@ class SeedOssForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
388
)
389
390
if get_pp_group().is_last_rank:
391
+ self.lm_head = ParallelLMHead(
392
+ config.vocab_size,
393
+ config.hidden_size,
394
+ quant_config=quant_config,
395
+ prefix=maybe_prefix(prefix, "lm_head"),
396
+ )
397
if config.tie_word_embeddings:
392
- self.lm_head = self.model.embed_tokens
393
- else:
394
- self.lm_head = ParallelLMHead(
395
- config.vocab_size,
396
- config.hidden_size,
397
- quant_config=quant_config,
398
- prefix=maybe_prefix(prefix, "lm_head"),
399
- )
398
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
399
else:
400
self.lm_head = PPMissingLayer()
401
vllm/model_executor/models/solar.py
+1
-1
@@ -386,7 +386,7 @@ class SolarForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
386
prefix=maybe_prefix(prefix, "lm_head"),
387
)
388
if config.tie_word_embeddings:
389
- self.lm_head.weight = self.model.embed_tokens.weight
389
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
390
391
logit_scale = getattr(config, "logit_scale", 1.0)
392
self.logits_processor = LogitsProcessor(
vllm/model_executor/models/stablelm.py
+1
-1
@@ -294,7 +294,7 @@ class StablelmForCausalLM(nn.Module, SupportsPP):
294
prefix=f"{prefix}.lm_head",
295
)
296
if self.config.tie_word_embeddings:
297
- self.lm_head.weight = self.model.embed_tokens.weight
297
+ self.lm_head = self.lm_head.tie_weights(self.model.embed_tokens)
298
self.logits_processor = LogitsProcessor(config.vocab_size)
299
self.make_empty_intermediate_tensors = (
300
self.model.make_empty_intermediate_tensors