From ca689cbc8792ba69ea1fd5d8b3ae0485c47536ec Mon Sep 17 00:00:00 2001 From: Rock Chen Date: Sat, 15 Aug 2026 00:17:16 +0800 Subject: [PATCH 1/2] convert: fix get block count error for Nemotron Signed-off-by: Rock Chen --- conversion/base.py | 4 +++- conversion/nemotron.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/conversion/base.py b/conversion/base.py index 718d5394495..090db6e8265 100644 --- a/conversion/base.py +++ b/conversion/base.py @@ -1126,6 +1126,8 @@ def from_model_architecture(cls, arch: str, model_type = ModelType.TEXT) -> type except KeyError: raise NotImplementedError(f'Architecture {arch!r} not supported!') from None + def get_block_count(self) -> Any: + return self.find_hparam(["n_layers", "num_hidden_layers", "n_layer", "num_layers"]) class TextModel(ModelBase): model_type = ModelType.TEXT @@ -1142,7 +1144,7 @@ def __init__(self, *args, **kwargs): # move the text_config to the root level self.hparams = {**self.hparams, **self.hparams["text_config"]} - self.block_count = self.find_hparam(["n_layers", "num_hidden_layers", "n_layer", "num_layers"]) + self.block_count = self.get_block_count() self.tensor_map = gguf.get_tensor_name_map(self.model_arch, self.block_count) self.rope_parameters = self.hparams.get("rope_parameters", self.hparams.get("rope_scaling")) or {} diff --git a/conversion/nemotron.py b/conversion/nemotron.py index c46cec14386..5d69cb7c4d7 100644 --- a/conversion/nemotron.py +++ b/conversion/nemotron.py @@ -497,3 +497,11 @@ def prepare_tensors(self): experts = [k for d in self._experts for k in d.keys()] if len(experts) > 0: raise ValueError(f"Unprocessed experts: {experts}") + + def get_block_count(self) -> Any: + types = self.find_hparam(["layers_block_type"], True) + + if types is not None: + return len(types) + + return super().get_block_count() From e37ef814d079a67525ac3a28b4ce2b00fa13d013 Mon Sep 17 00:00:00 2001 From: Rock Chen Date: Sat, 15 Aug 2026 22:36:01 +0800 Subject: [PATCH 2/2] fix this in NemotronHModel.__init__ instead. This reverts commit ca689cbc8792ba69ea1fd5d8b3ae0485c47536ec. --- conversion/base.py | 4 +--- conversion/nemotron.py | 17 +++++++---------- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/conversion/base.py b/conversion/base.py index 090db6e8265..718d5394495 100644 --- a/conversion/base.py +++ b/conversion/base.py @@ -1126,8 +1126,6 @@ def from_model_architecture(cls, arch: str, model_type = ModelType.TEXT) -> type except KeyError: raise NotImplementedError(f'Architecture {arch!r} not supported!') from None - def get_block_count(self) -> Any: - return self.find_hparam(["n_layers", "num_hidden_layers", "n_layer", "num_layers"]) class TextModel(ModelBase): model_type = ModelType.TEXT @@ -1144,7 +1142,7 @@ def __init__(self, *args, **kwargs): # move the text_config to the root level self.hparams = {**self.hparams, **self.hparams["text_config"]} - self.block_count = self.get_block_count() + self.block_count = self.find_hparam(["n_layers", "num_hidden_layers", "n_layer", "num_layers"]) self.tensor_map = gguf.get_tensor_name_map(self.model_arch, self.block_count) self.rope_parameters = self.hparams.get("rope_parameters", self.hparams.get("rope_scaling")) or {} diff --git a/conversion/nemotron.py b/conversion/nemotron.py index 5d69cb7c4d7..63ea71590ac 100644 --- a/conversion/nemotron.py +++ b/conversion/nemotron.py @@ -204,7 +204,9 @@ def __init__(self, *args, **kwargs): # calling the parent __init__. This is because the parent constructor # uses self.model_arch to build the tensor name map, and all MoE-specific # mappings would be missed if it were called with the default non-MoE arch. - hparams = ModelBase.load_hparams(args[0], self.is_mistral_format) + hparams = kwargs.pop("hparams", None) + if hparams is None: + hparams = ModelBase.load_hparams(args[0], self.is_mistral_format) has_moe_params = ( "num_experts_per_tok" in hparams or (isinstance(hparams.get("llm_config"), dict) and "num_experts_per_tok" in hparams["llm_config"]) @@ -212,8 +214,11 @@ def __init__(self, *args, **kwargs): if has_moe_params: self.model_arch = gguf.MODEL_ARCH.NEMOTRON_H_MOE self.is_moe = True + layers_block_type = hparams.get("layers_block_type") + if layers_block_type is not None: + hparams["num_hidden_layers"] = len(layers_block_type) - super().__init__(*args, **kwargs) + super().__init__(*args, hparams=hparams, **kwargs) # Save the top-level head_dim for later self.head_dim = self.hparams.get("head_dim", self.hparams.get("attention_head_dim")) @@ -497,11 +502,3 @@ def prepare_tensors(self): experts = [k for d in self._experts for k in d.keys()] if len(experts) > 0: raise ValueError(f"Unprocessed experts: {experts}") - - def get_block_count(self) -> Any: - types = self.find_hparam(["layers_block_type"], True) - - if types is not None: - return len(types) - - return super().get_block_count()