From d2fda4ef640b67bd4c4ca2ef80686fc0c42554d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B4=89=EB=AF=BC?= <102722487+bongmiin@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:39:01 +0900 Subject: [PATCH 1/2] Fix Fix Qwen3.5/3.6 load_weights stacked-mapping name mutation The stacked_params_mapping loop in qwen3_5.py and qwen3_5_mtp.py mutates name in place via name.replace(weight_name, param_name), then continues the loop when the mapped name is not in params_dict. Because the mutated name is not restored, a later mapping entry can re-apply .replace() to an already-mapped name (e.g. up_proj is a substring of gate_up_proj), producing invalid names such as gate_gate_up_proj and qkqkv_proj, so weights are not loaded and FP8 post-processing fails. Use a local name_mapped candidate and only assign it back to name after a successful params_dict lookup, matching the safe pattern already used in the expert branch. Refs #474 --- vllm/patches/vllm_for_multi_arc.patch | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/vllm/patches/vllm_for_multi_arc.patch b/vllm/patches/vllm_for_multi_arc.patch index 9e305f1b..1f204fa5 100644 --- a/vllm/patches/vllm_for_multi_arc.patch +++ b/vllm/patches/vllm_for_multi_arc.patch @@ -11851,16 +11851,17 @@ index 000000000..b01b55f70 + if "mlp.experts" in name: + continue + -+ name = name.replace(weight_name, param_name) ++ name_mapped = name.replace(weight_name, param_name + # Skip loading extra bias for GPTQ models. -+ if name.endswith(".bias") and name not in params_dict: ++ if name_mapped.endswith(".bias") and name_mapped not in params_dict: + continue + # Skip layers on other devices. + if is_pp_missing_parameter(name, self): + continue + # name = apply_attn_prefix(name, params_dict) -+ if name not in params_dict: ++ if name_mapped not in params_dict: + continue ++ name = name_mapped + param = params_dict[name] + + # Use weight_loader_v2 for tuple shard_id (GDN projections). @@ -12604,15 +12605,16 @@ index 000000000..547c1885a + if "mlp.experts" in name: + continue + -+ name = name.replace(weight_name, param_name) ++ name_mapped = name.replace(weight_name, param_name) + # Skip loading extra bias for GPTQ models. -+ if name.endswith(".bias") and name not in params_dict: ++ if name_mapped.endswith(".bias") and name_mapped not in params_dict: + continue + # Skip layers on other devices. -+ if is_pp_missing_parameter(name, self): ++ if is_pp_missing_parameter(name_mapped, self): + continue + if name not in params_dict: + continue ++ name = name_mapped + param = params_dict[name] + weight_loader = param.weight_loader + weight_loader(param, loaded_weight, shard_id) From cd4bd8e8eff056492bf3c84cd1689f7da72b73a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B4=89=EB=AF=BC?= <102722487+bongmiin@users.noreply.github.com> Date: Fri, 12 Jun 2026 16:48:26 +0900 Subject: [PATCH 2/2] Fix indentation and correct name mapping logic --- vllm/patches/vllm_for_multi_arc.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vllm/patches/vllm_for_multi_arc.patch b/vllm/patches/vllm_for_multi_arc.patch index 1f204fa5..89976a90 100644 --- a/vllm/patches/vllm_for_multi_arc.patch +++ b/vllm/patches/vllm_for_multi_arc.patch @@ -11851,7 +11851,7 @@ index 000000000..b01b55f70 + if "mlp.experts" in name: + continue + -+ name_mapped = name.replace(weight_name, param_name ++ name_mapped = name.replace(weight_name, param_name) + # Skip loading extra bias for GPTQ models. + if name_mapped.endswith(".bias") and name_mapped not in params_dict: + continue