{"record":{"id":"cf405a5ef5b244b0","repo":"hiyouga/LlamaFactory","slug":"vllm-only-accepts-a-single-adapter-merge-them-fir","errorCode":null,"errorMessage":"vLLM only accepts a single adapter. Merge them first.","messagePattern":"vLLM only accepts a single adapter\\. Merge them first\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/llamafactory/hparams/parser.py","lineNumber":687,"sourceCode":"def get_infer_args(args: dict[str, Any] | list[str] | None = None) -> _INFER_CLS:\n    model_args, data_args, finetuning_args, generating_args = _parse_infer_args(args)\n\n    # Setup logging\n    _set_transformers_logging()\n\n    # Check arguments\n    if model_args.infer_backend == \"vllm\":\n        if finetuning_args.stage != \"sft\":\n            raise ValueError(\"vLLM engine only supports auto-regressive models.\")\n\n        if model_args.quantization_bit is not None:\n            raise ValueError(\"vLLM engine does not support bnb quantization (GPTQ and AWQ are supported).\")\n\n        if model_args.rope_scaling is not None:\n            raise ValueError(\"vLLM engine does not support RoPE scaling.\")\n\n        if model_args.adapter_name_or_path is not None and len(model_args.adapter_name_or_path) != 1:\n            raise ValueError(\"vLLM only accepts a single adapter. Merge them first.\")\n\n    _set_env_vars()\n    _verify_model_args(model_args, data_args, finetuning_args)\n    _check_extra_dependencies(model_args, finetuning_args)\n\n    # Post-process model arguments\n    if model_args.export_dir is not None and model_args.export_device == \"cpu\":\n        model_args.device_map = {\"\": torch.device(\"cpu\")}\n        if data_args.cutoff_len != DataArguments().cutoff_len:  # override cutoff_len if it is not default\n            model_args.model_max_length = data_args.cutoff_len\n    else:\n        model_args.device_map = \"auto\"\n\n    model_args.configure_kt_loading(finetuning_args, data_args.cutoff_len)\n\n    return model_args, data_args, finetuning_args, generating_args\n\n","sourceCodeStart":669,"sourceCodeEnd":705,"githubUrl":"https://github.com/hiyouga/LlamaFactory/blob/f28afaf6355af515454dfb16c97d728307c93897/src/llamafactory/hparams/parser.py#L669-L705","documentation":"Raised in get_infer_args when infer_backend is vllm and adapter_name_or_path contains more than one adapter path. The vLLM LoRA integration registers a single LoRA adapter; serving several unmerged adapters at once is not supported, so you must merge them into the base model first.","triggerScenarios":"model_args with infer_backend: vllm and adapter_name_or_path set to a list of two or more paths, e.g. [saves/lora1, saves/lora2].","commonSituations":"Stacking a base LoRA with a continuation or style LoRA; iterating experiments and listing every checkpoint adapter in one config.","solutions":["Keep only one adapter in adapter_name_or_path.","Merge the multiple adapters first with llamafactory-cli export (set adapter_name_or_path to the full list, export_dir to the merged output), then point model_name_or_path at the merged model.","Alternatively merge adapters via peft outside LlamaFactory and serve the merged checkpoint."],"exampleFix":"# before\ninfer_backend: vllm\nadapter_name_or_path:\n  - saves/lora-base\n  - saves/lora-style\n\n# after (after exporting merged model to saves/merged)\ninfer_backend: vllm\nmodel_name_or_path: saves/merged","handlingStrategy":"validation","validationCode":"adapters = cfg[\"model_args\"].get(\"adapter_name_or_path\") or []\nif cfg[\"model_args\"].get(\"infer_backend\") == \"vllm\":\n    assert isinstance(adapters, str) or len(adapters) <= 1, \\\n        \"vLLM accepts one adapter; merge multiples via llamafactory-cli export first\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Adopt a merge-then-serve workflow whenever more than one adapter is involved.","Store merged model paths, not adapter lists, in serving configs."],"tags":["vllm","lora","adapter-merge","export"],"backgroundTag":null,"analyzedSha":"f28afaf6355af515454dfb16c97d728307c93897","analyzedAt":"2026-08-14T21:57:28.298Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}