{"record":{"id":"f03e9f38c51ef3de","repo":"hiyouga/LlamaFactory","slug":"module-is-not-found-please-choose-from","errorCode":null,"errorMessage":"Module {} is not found, please choose from {}","messagePattern":"Module (.+?) is not found, please choose from (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/llamafactory/model/adapter.py","lineNumber":108,"sourceCode":"        trainable_layer_ids = range(max(0, num_layers - finetuning_args.freeze_trainable_layers), num_layers)\n    else:  # fine-tuning the first n layers if num_layer_trainable < 0\n        trainable_layer_ids = range(min(-finetuning_args.freeze_trainable_layers, num_layers))\n\n    hidden_modules = set()\n    non_hidden_modules = set()\n    for name, _ in model.named_parameters():\n        if \".0.\" in name:\n            hidden_modules.add(name.split(\".0.\")[-1].split(\".\")[0])\n        elif \".1.\" in name:  # MoD starts from layer 1\n            hidden_modules.add(name.split(\".1.\")[-1].split(\".\")[0])\n\n        if re.search(r\"\\.\\d+\\.\", name) is None:\n            non_hidden_modules.add(name.split(\".\")[-2])  # remove weight/bias\n\n    trainable_layers = []\n    for module_name in finetuning_args.freeze_trainable_modules:\n        if module_name != \"all\" and module_name not in hidden_modules:\n            raise ValueError(\n                \"Module {} is not found, please choose from {}\".format(module_name, \", \".join(hidden_modules))\n            )\n\n        for idx in trainable_layer_ids:\n            trainable_layers.append(\".{:d}.{}\".format(idx, module_name if module_name != \"all\" else \"\"))\n\n    if finetuning_args.freeze_extra_modules:\n        for module_name in finetuning_args.freeze_extra_modules:\n            if module_name not in non_hidden_modules:\n                raise ValueError(\n                    \"Module {} is not found, please choose from {}\".format(module_name, \", \".join(non_hidden_modules))\n                )\n\n            trainable_layers.append(module_name)\n\n    model_type = getattr(model.config, \"model_type\", None)\n    if not finetuning_args.freeze_multi_modal_projector and model_type in COMPOSITE_MODELS:\n        trainable_layers.extend(COMPOSITE_MODELS[model_type].projector_keys)","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/hiyouga/LlamaFactory/blob/f28afaf6355af515454dfb16c97d728307c93897/src/llamafactory/model/adapter.py#L90-L126","documentation":"Raised in _setup_freeze_tuning when an entry of freeze_trainable_modules (other than the literal 'all') does not appear in hidden_modules, the set of module suffixes discovered inside the model's indexed layers (parsed from parameter names around '.0.' / '.1.'). The configured module names must match the model's real inner-module naming.","triggerScenarios":"Setting freeze_trainable_modules: [mlp] on an architecture whose layers do not contain a module literally named mlp (e.g. some models use mlp.c_proj style paths or different names), so the parsed hidden module set never contains it.","commonSituations":"Copying freeze module lists between architectures (e.g. from Llama to Qwen/GLM/custom models); typos in module names; models with fused or differently named submodules.","solutions":["Inspect the error's listed valid choices (it prints the discovered hidden_modules set) and use one of those exact names.","Use freeze_trainable_modules: all to train every module inside the selected layers instead of a specific one.","Print parameter names via model.named_parameters() to confirm the real module naming for your architecture."],"exampleFix":"# before\nfreeze_trainable_modules: mlp\n\n# after\nfreeze_trainable_modules: all","handlingStrategy":"validation","validationCode":"import re\nfrom transformers import AutoModelForCausalLM\nmodel = AutoModelForCausalLM.from_pretrained(model_path)\nhidden = set()\nfor name, _ in model.named_parameters():\n    if \".0.\" in name:\n        hidden.add(name.split(\".0.\")[-1].split(\".\")[0])\n    elif \".1.\" in name:\n        hidden.add(name.split(\".1.\")[-1].split(\".\")[0])\nfor m in freeze_trainable_modules:\n    if m != \"all\":\n        assert m in hidden, f\"{m!r} not in model's layer modules: {sorted(hidden)}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Derive freeze_trainable_modules from the model itself (inspect named_parameters) instead of copying between architectures.","Use 'all' when unsure; it is always valid."],"tags":["freeze-tuning","module-names","architecture","config"],"backgroundTag":null,"analyzedSha":"f28afaf6355af515454dfb16c97d728307c93897","analyzedAt":"2026-08-14T21:57:28.298Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}