diff --git a/conversion/base.py b/conversion/base.py index 3d68d97703..227c4e1622 100644 --- a/conversion/base.py +++ b/conversion/base.py @@ -620,6 +620,9 @@ class ModelBase: def _transform_fp8_scale(self, name: str, scale: Tensor) -> Tensor: return scale + def _map_fp8_weight_names(self, name: str) -> tuple[str, ...]: + return (self.map_tensor_name(name),) + def _prepare_fp8_e4m3_tensors(self): if self._fp8_as_q8: return @@ -686,10 +689,10 @@ class ModelBase: assert isinstance(entries, list) cast(list[tuple[int, float]], entries).append((expert_id, float(input_scale[0]))) else: - new_name = self.map_tensor_name(weight_name) - scale_tensors[new_name.replace(".weight", ".scale")] = scale.numpy() - if input_scale is not None: - input_scale_tensors[new_name.replace(".weight", ".input_scale")] = input_scale.numpy() + for new_name in self._map_fp8_weight_names(weight_name): + scale_tensors[new_name.replace(".weight", ".scale")] = scale.numpy() + if input_scale is not None: + input_scale_tensors[new_name.replace(".weight", ".input_scale")] = input_scale.numpy() for name in consumed: self.model_tensors.pop(name, None) diff --git a/conversion/qwen.py b/conversion/qwen.py index 75e097cd32..9a483904c9 100644 --- a/conversion/qwen.py +++ b/conversion/qwen.py @@ -373,6 +373,16 @@ class _QwenMtpMixin: class Qwen3NextModel(_QwenMtpMixin, Qwen2MoeModel): model_arch = gguf.MODEL_ARCH.QWEN3NEXT + def _map_fp8_weight_names(self, name: str) -> tuple[str, ...]: + if name.endswith(".linear_attn.in_proj_qkvz.weight"): + bid = next(int(part) for part in self.map_tensor_name(name).split(".") if part.isdecimal()) + # Both split projections keep the original per-tensor scales. + return ( + self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_QKV, bid), + self.format_tensor_name(gguf.MODEL_TENSOR.ATTN_GATE, bid), + ) + return super()._map_fp8_weight_names(name) + def set_gguf_parameters(self): super().set_gguf_parameters() self.gguf_writer.add_ssm_conv_kernel(self.hparams["linear_conv_kernel_dim"]) diff --git a/src/models/qwen3next.cpp b/src/models/qwen3next.cpp index 620161ac73..acc427dbb9 100644 --- a/src/models/qwen3next.cpp +++ b/src/models/qwen3next.cpp @@ -324,11 +324,11 @@ std::pair llama_model_qwen3next::graph::build_qkvz if (model.layers[il].wqkv) { // optimized path - ggml_tensor * qkv_mixed = build_lora_mm(model.layers[il].wqkv, input); + ggml_tensor * qkv_mixed = build_lora_mm(model.layers[il].wqkv, input, model.layers[il].wqkv_s); qkv_mixed = ggml_reshape_3d(ctx0, qkv_mixed, qkv_mixed->ne[0], n_seq_tokens, n_seqs); cb(qkv_mixed, "linear_attn_qkv_mixed", il); - ggml_tensor * z = build_lora_mm(model.layers[il].wqkv_gate, input); + ggml_tensor * z = build_lora_mm(model.layers[il].wqkv_gate, input, model.layers[il].wqkv_gate_s); cb(z, "z", il); return { qkv_mixed, z };