[Bugfix] LoRA: extend expert base_layer loading to Qwen3.5 and Step3.x (#37114)

Signed-off-by: Hollow Man <hollowman@opensuse.org>
This commit is contained in:
ℍ𝕠𝕝𝕝𝕠𝕨 𝕄𝕒𝕟
2026-04-21 14:17:03 +00:00
committed by GitHub
parent ec5ef0ac73
commit 908a713488
6 changed files with 34 additions and 16 deletions
+5 -2
View File
@@ -306,9 +306,12 @@ class Qwen3_5Model(Qwen3NextModel):
loaded_params: set[str] = set()
expert_params_mapping = self.get_expert_mapping()
is_fused_expert = False
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
fused_expert_params_mapping = [
("experts.w13_weight", "experts.gate_up_proj", 0, "w1"),
("experts.w2_weight", "experts.down_proj", 0, "w2"),
(f"experts.{base_layer}w13_weight", "experts.gate_up_proj", 0, "w1"),
(f"experts.{base_layer}w2_weight", "experts.down_proj", 0, "w2"),
]
num_experts = (
self.config.num_experts if hasattr(self.config, "num_experts") else 0
+5 -2
View File
@@ -207,9 +207,12 @@ class Qwen3_5MultiTokenPredictor(nn.Module):
params_dict = dict(self.named_parameters())
loaded_params: set[str] = set()
is_fused_expert = False
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
fused_expert_params_mapping = [
("experts.w13_weight", "experts.gate_up_proj", 0, "w1"),
("experts.w2_weight", "experts.down_proj", 0, "w2"),
(f"experts.{base_layer}w13_weight", "experts.gate_up_proj", 0, "w1"),
(f"experts.{base_layer}w2_weight", "experts.down_proj", 0, "w2"),
]
num_experts = (
self.config.num_experts if hasattr(self.config, "num_experts") else 0
+5 -2
View File
@@ -183,9 +183,12 @@ class Qwen3MoeLLMModel(Qwen3MoeModel):
loaded_params: set[str] = set()
expert_params_mapping = self.get_expert_mapping()
is_fused_expert = False
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
fused_expert_params_mapping = [
("experts.w13_weight", "experts.gate_up_proj", 0, "w1"),
("experts.w2_weight", "experts.down_proj", 0, "w2"),
(f"experts.{base_layer}w13_weight", "experts.gate_up_proj", 0, "w1"),
(f"experts.{base_layer}w2_weight", "experts.down_proj", 0, "w2"),
]
num_experts = self.config.num_experts
for name, loaded_weight in weights:
+6 -3
View File
@@ -463,11 +463,14 @@ class Step3TextForCausalLM(nn.Module, SupportsPP):
]
params_dict = dict(self.named_parameters())
loaded_params: set[str] = set()
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
expert_params_mapping = [
(".moe.experts.w13_weight", ".moe.gate_proj.weight", "w1"),
(".moe.experts.w13_weight", ".moe.up_proj.weight", "w3"),
(".moe.experts.w2_weight", ".moe.down_proj.weight", "w2"),
(f".moe.experts.{base_layer}w13_weight", ".moe.gate_proj.weight", "w1"),
(f".moe.experts.{base_layer}w13_weight", ".moe.up_proj.weight", "w3"),
(f".moe.experts.{base_layer}w2_weight", ".moe.down_proj.weight", "w2"),
]
disable_moe_stacked_params = [data[1] for data in expert_params_mapping]
+6 -3
View File
@@ -626,12 +626,15 @@ class Step3p5Model(nn.Module):
params_dict = dict(self.named_parameters())
loaded_params: set[str] = set()
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
# Old packed 3D format: .moe.gate_proj.weight [num_experts, out, in]
expert_params_mapping = [
(".moe.experts.w13_weight", ".moe.gate_proj.weight", "w1"),
(".moe.experts.w13_weight", ".moe.up_proj.weight", "w3"),
(".moe.experts.w2_weight", ".moe.down_proj.weight", "w2"),
(f".moe.experts.{base_layer}w13_weight", ".moe.gate_proj.weight", "w1"),
(f".moe.experts.{base_layer}w13_weight", ".moe.up_proj.weight", "w3"),
(f".moe.experts.{base_layer}w2_weight", ".moe.down_proj.weight", "w2"),
]
# New per-expert format: .moe.experts.E.gate_proj.weight_packed [out, in]
+7 -4
View File
@@ -181,14 +181,17 @@ class Step3p5MTP(nn.Module):
("gate_up_proj", "gate_proj", 0),
("gate_up_proj", "up_proj", 1),
]
params_dict = dict(self.named_parameters())
base_layer = (
"base_layer." if any(".base_layer." in name for name in params_dict) else ""
)
expert_params_mapping = [
(".moe.experts.w13_weight", ".moe.gate_proj.weight", "w1"),
(".moe.experts.w13_weight", ".moe.up_proj.weight", "w3"),
(".moe.experts.w2_weight", ".moe.down_proj.weight", "w2"),
(f".moe.experts.{base_layer}w13_weight", ".moe.gate_proj.weight", "w1"),
(f".moe.experts.{base_layer}w13_weight", ".moe.up_proj.weight", "w3"),
(f".moe.experts.{base_layer}w2_weight", ".moe.down_proj.weight", "w2"),
]
params_dict = dict(self.named_parameters())
loaded_params: set[str] = set()
for name, loaded_weight in weights:
if "rotary_emb.inv_freq" in name: