{"record":{"id":"18a096202f7ab866","repo":"sgl-project/sglang","slug":"dual-transformers-for-model-name-must-expose-cac","errorCode":null,"errorMessage":"Dual transformers for {model_name} must expose cache-dit block attributes {adapter_spec.blocks_attr}. transformer has {transformer_blocks_attr}: {transformer_blocks is not None}, secondary transformer has {transformer_2_blocks_attr}: {transformer_2_blocks is not None}","messagePattern":"Dual transformers for (.+?) must expose cache-dit block attributes (.+?)\\. transformer has (.+?): (.+?), secondary transformer has (.+?): (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py","lineNumber":672,"sourceCode":"            compute_steps,\n            cache_steps,\n            secondary_config.steps_computation_policy,\n        )\n\n    parallelism_config = _build_parallelism_config(sp_group, tp_group)\n    if parallelism_config is not None:\n        _patch_cache_dit_similarity()\n\n    _mark_transformer_parallelized(transformer, parallelism_config, sp_group, tp_group)\n    _mark_transformer_parallelized(\n        transformer_2, parallelism_config, sp_group, tp_group\n    )\n\n    transformer_blocks_attr, transformer_2_blocks_attr = adapter_spec.blocks_attr\n    transformer_blocks = getattr(transformer, transformer_blocks_attr, None)\n    transformer_2_blocks = getattr(transformer_2, transformer_2_blocks_attr, None)\n    if transformer_blocks is None or transformer_2_blocks is None:\n        raise ValueError(\n            f\"Dual transformers for {model_name} must expose cache-dit block \"\n            f\"attributes {adapter_spec.blocks_attr}. \"\n            f\"transformer has {transformer_blocks_attr}: \"\n            f\"{transformer_blocks is not None}, secondary transformer has \"\n            f\"{transformer_2_blocks_attr}: {transformer_2_blocks is not None}\"\n        )\n\n    cache_dit.enable_cache(\n        BlockAdapter(\n            transformer=[transformer, transformer_2],\n            blocks=[transformer_blocks, transformer_2_blocks],\n            blocks_name=adapter_spec.blocks_name,\n            forward_pattern=adapter_spec.forward_pattern,\n            params_modifiers=[primary_modifier, secondary_modifier],\n            check_forward_pattern=adapter_spec.check_forward_pattern,\n            check_num_outputs=adapter_spec.check_num_outputs,\n            has_separate_cfg=adapter_spec.has_separate_cfg,\n        ),","sourceCodeStart":654,"sourceCodeEnd":690,"githubUrl":"https://github.com/sgl-project/sglang/blob/0132848349585cfe6aae51c4941cbae872505f8a/python/sglang/multimodal_gen/runtime/cache/cache_dit_integration.py#L654-L690","documentation":"Raised by enable_cache_on_dual_transformer when the adapter spec for the model expects specific block-list attributes (adapter_spec.blocks_attr, e.g. ('transformer_blocks', 'blocks')) on the primary and secondary transformers, but getattr returns None for at least one of them. cache-dit must wrap the actual nn.ModuleList of blocks to inject caching, so the attribute must exist and be non-None.","triggerScenarios":"Calling enable_cache_on_dual_transformer with transformer or transformer_2 instances whose class does not expose the attribute names declared in the model's DualTransformerBlockAdapterSpec (e.g. an architecture revision renamed blocks to layers, or a wrapper object hides the attribute).","commonSituations":"Upgrading the model implementation so a blocks attribute was renamed, loading a community/quantized variant with a different module layout, passing the wrong module (e.g. the full pipeline instead of the inner transformer) as transformer_2, or a spec/implementation version mismatch in sglang.","solutions":["Verify the attribute names on your transformer objects with hasattr/getattr and confirm they match adapter_spec.blocks_attr","Load model weights/code with a version whose module layout matches the registered adapter spec (pin the matching sglang/model revisions)","If you control the model, add the expected attribute as an alias property pointing at the real block list","If the layout genuinely differs, register an updated blocks_attr spec or disable cache-dit"],"exampleFix":"# before\nenable_cache_on_dual_transformer(t1, t2, model_name)  # ValueError: blocks attr missing\n\n# after\nspec = DUAL_TRANSFORMER_BLOCK_ADAPTER_SPECS[model_name]\nfor mod, attr in zip((t1, t2), spec.blocks_attr):\n    assert getattr(mod, attr, None) is not None, f\"{mod} missing {attr}\"\nenable_cache_on_dual_transformer(t1, t2, model_name)\n\n# or alias in the model class:\n# class MyTransformer: \n#     @property\n#     def transformer_blocks(self): return self.layers","handlingStrategy":"validation","validationCode":"from sglang.multimodal_gen.runtime.cache.cache_dit_integration import DUAL_TRANSFORMER_BLOCK_ADAPTER_SPECS\nspec = DUAL_TRANSFORMER_BLOCK_ADAPTER_SPECS[model_name]\nfor mod, attr in zip((transformer, transformer_2), spec.blocks_attr):\n    if getattr(mod, attr, None) is None:\n        config = CacheDitConfig(enabled=False)  # layout mismatch; skip caching\n        break","typeGuard":"def transformers_expose_blocks(t1, t2, spec) -> bool:\n    return all(getattr(m, a, None) is not None for m, a in zip((t1, t2), spec.blocks_attr))","tryCatchPattern":"try:\n    t1, t2 = enable_cache_on_dual_transformer(t1, t2, model_name, cfg, ...)\nexcept ValueError as e:\n    if \"must expose cache-dit block attributes\" in str(e):\n        cfg = CacheDitConfig(enabled=False); run uncached\n    else:\n        raise","preventionTips":["Smoke-test getattr(transformer, blocks_attr) right after model load","Pin model code revisions together with the sglang version that registered their spec","Avoid passing wrappers/pipeline objects where the inner transformer is expected"],"tags":["cache-dit","dual-transformer","model-introspection","attribute-mismatch"],"backgroundTag":"model-attribute-schema-mismatch","analyzedSha":"0132848349585cfe6aae51c4941cbae872505f8a","analyzedAt":"2026-08-28T05:10:05.995Z","schemaVersion":2},"datasetVersion":"2026-08-28T06:17:29.519Z"}