{"record":{"id":"f1ab2f78fbb5469b","repo":"huggingface/candle","slug":"layer-types-length-does-not-match-num-hidden-la","errorCode":null,"errorMessage":"layer_types length {} does not match num_hidden_layers {}","messagePattern":"layer_types length (.+?) does not match num_hidden_layers (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"candle-transformers/src/models/granitemoehybrid.rs","lineNumber":537,"sourceCode":"        let x = x.i((.., seq_len - 1, ..))?.contiguous()?;\n        // Project to vocabulary size\n        let logits = x.matmul(&self.word_token_embedding.embeddings().t()?)?;\n        let logits = logits.to_dtype(DType::F32)?;\n        // Scale the logits if needed (that's also different from Granite 1)\n        let scaled_logits = if (self.logits_scale - 1.0).abs() < f32::EPSILON {\n            logits\n        } else {\n            logits.affine(self.logits_scale as f64, 0.)?\n        };\n\n        Ok(scaled_logits)\n    }\n\n    pub fn load(vb: VarBuilder, cfg: &GraniteMoeHybridInternalConfig) -> Result<Self> {\n        let wte = embedding(cfg.vocab_size, cfg.hidden_size, vb.pp(\"model.embed_tokens\"))?;\n        let ln_f = RmsNorm::new(cfg.hidden_size, cfg.rms_norm_eps, vb.pp(\"model.norm\"))?;\n        if cfg.layer_types.len() != cfg.num_hidden_layers {\n            candle::bail!(\n                \"layer_types length {} does not match num_hidden_layers {}\",\n                cfg.layer_types.len(),\n                cfg.num_hidden_layers\n            );\n        }\n        let blocks = cfg\n            .layer_types\n            .iter()\n            .enumerate()\n            .map(|(idx, layer_ty)| match layer_ty {\n                GraniteMoeHybridLayerType::Attention => {\n                    Block::load(vb.pp(format!(\"model.layers.{idx}\")), cfg)\n                }\n                GraniteMoeHybridLayerType::Mamba => {\n                    // TODO: Not supprting Mamba layers (blocks) for now,\n                    // so we only iterate over attention layers.\n                    candle::bail!(\n                        \"mamba layers are not yet supported in GraniteMoeHybrid inference\"","sourceCodeStart":519,"sourceCodeEnd":555,"githubUrl":"https://github.com/huggingface/candle/blob/d5fee525bfde3273eb7c9b75fd2bc4937be867ca/candle-transformers/src/models/granitemoehybrid.rs#L519-L555","documentation":"GraniteMoeHybrid model load validates that cfg.layer_types (per-layer Attention/Mamba designation) has exactly num_hidden_layers entries before building the block list. A mismatch means the config is internally inconsistent and would index layer types incorrectly.","triggerScenarios":"Constructing GraniteMoeHybridInternalConfig with layer_types shorter/longer than num_hidden_layers — e.g. copying layer_types from a smaller checkpoint or forgetting to extend it when changing depth.","commonSituations":"Hand-building configs in code; deserializing a partial config.json where layer_types defaults to an empty vec; mixing configs across GraniteMoeHybrid model sizes.","solutions":["Make layer_types contain exactly num_hidden_layers entries","Derive layer_types programmatically: vec![layer_type; num_hidden_layers] or read all entries from config.json","Fix serde defaults so a missing layer_types doesn't silently produce an empty vec"],"exampleFix":"// before\nlet cfg = GraniteMoeHybridInternalConfig { num_hidden_layers: 40, layer_types: vec![], .. };\n// after\nlet layer_types = vec![GraniteMoeHybridLayerType::Attention; cfg.num_hidden_layers];\nlet cfg = GraniteMoeHybridInternalConfig { num_hidden_layers: 40, layer_types, .. };","handlingStrategy":"validation","validationCode":"if cfg.layer_types.len() != cfg.num_hidden_layers {\n    return Err(format!(\"layer_types len {} != num_hidden_layers {}\", cfg.layer_types.len(), cfg.num_hidden_layers));\n}","typeGuard":"fn layer_types_consistent(c: &granitemoehybrid::GraniteMoeHybridInternalConfig) -> bool {\n    c.layer_types.len() == c.num_hidden_layers\n}","tryCatchPattern":"match granitemoehybrid::Model::new(&vb, &cfg) {\n    Err(e) if e.to_string().contains(\"layer_types length\") =>\n        Err(anyhow!(\"fix layer_types in config to match num_hidden_layers\")),\n    r => r.map_err(Into::into),\n}","preventionTips":["Copy layer_types from the checkpoint's config.json, never synthesize by hand","Add a pre-load assertion comparing lengths","When changing num_hidden_layers programmatically, rebuild layer_types to match"],"tags":["config","granitemoe","validation"],"backgroundTag":"config-length-mismatch","analyzedSha":"d5fee525bfde3273eb7c9b75fd2bc4937be867ca","analyzedAt":"2026-09-02T00:15:47.023Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}