vLLM 加载和部署 LoRA 微调后的模型

TwoAdmin 2025-10-27 5 10/27

vLLM 完全支持加载和部署 LoRA 微调后的模型,并且能带来显著的性能提升。

两种部署方式

方式一:直接加载 LoRA 适配器(推荐)

vLLM 原生支持动态加载 LoRA 适配器,无需合并模型,启动时指定即可:

bash
# 启动 vLLM 服务器时指定 LoRA 模块
vllm serve ./models/Qwen3-0.6B \
    --enable-lora \
    --lora-modules human-resources=out/qwen3-0.6B-finetuned-final \
    --port 8001

参数说明

  • --enable-lora:启用 LoRA 支持

  • --lora-modules {name}={path}:指定 LoRA 适配器的名称和路径,自定义名称(给LoRA模块起的别名),你定义的名称就是API调用时 model 参数的值

调用方式(OpenAI 兼容 API):

bash
curl http://localhost:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "human-resources",
    "messages": [{"role": "user", "content": "养老金怎么交?"}]
  }'

方式二:合并后加载(更稳定)

如果希望模型独立、便于分发,可以先合并再部署:

python
# 合并 LoRA 到基础模型
from peft import PeftModel
from transformers import AutoModelForCausalLM

base_model = AutoModelForCausalLM.from_pretrained("./models/Qwen3-0.6B")
merged_model = PeftModel.from_pretrained(base_model, "out/qwen3-0.6B-finetuned-final")
merged_model = merged_model.merge_and_unload()
merged_model.save_pretrained("./models/Qwen3-0.6B-Finetuned")
bash
# 然后直接加载合并后的模型
vllm serve ./models/Qwen3-0.6B-Finetuned --port 8001

性能优势

使用 vLLM 相比你的 FastAPI 实现有显著性能提升:

指标 FastAPI + Transformers vLLM
吞吐量 基线 提升 3-4 倍
首 token 延迟 ~180ms ~99ms
显存占用 基线 降低约 30%

核心原因是 vLLM 的 PagedAttention 技术和连续批处理(Continuous Batching)

注意事项与常见问题

1. LoRA 格式兼容性

vLLM 要求 LoRA 适配器是 PEFT 格式,即目录下必须包含:

  • adapter_config.json

  • adapter_model.safetensors(或 adapter_model.bin

你的微调脚本输出正是这个格式,所以直接可用

2. 移除不支持的权重(可能遇到的问题)

如果启动时报错,可能是 adapter 中包含了 embed_tokens.weight 等非 LoRA 权重。解决方案:

python
import safetensors.torch

src = "out/qwen3-0.6B-finetuned-final/adapter_model.safetensors"
dst = "out/qwen3-0.6B-finetuned-final/adapter_model_filtered.safetensors"

tensors = safetensors.torch.load_file(src)
# 只保留包含 "lora" 的键
non_lora_keys = [k for k in tensors.keys() if "lora" not in k]
for k in non_lora_keys:
    del tensors[k]
safetensors.torch.save_file(tensors, dst)
```[citation:1]

### 3. 设置合理的 max_lora_rank

如果你的 LoRA rank 是 4(微调脚本中的设置),建议:

```bash
vllm serve ... --max-lora-rank 8  # 设置一个略高于实际 rank 的值即可

设置过高会浪费显存

完整部署示例

bash
# 1. 安装 vLLM
pip install vllm

# 2. 启动服务(假设你的基础模型和 LoRA 路径如下)
vllm serve ./models/Qwen3-0.6B \
    --enable-lora \
    --lora-modules hr-lora=out/qwen3-0.6B-finetuned-final \
    --host 0.0.0.0 \
    --port 8001 \
    --gpu-memory-utilization 0.85 \
    --max-model-len 4096

# 3. 测试调用
curl http://localhost:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "hr-lora",
    "messages": [{"role": "user", "content": "社保断缴有什么影响?"}],
    "max_tokens": 300,
    "temperature": 0.7
  }'

总结

特性 你当前的 FastAPI vLLM 方案
吞吐量 一般 高(3-4倍提升)
显存效率 一般 高(PagedAttention)
OpenAI 兼容
LoRA 动态加载 需重启 ✅ 支持热加载
部署复杂度 简单 中等

建议:如果你想在生产环境获得更高的吞吐量和更低的延迟,强烈推荐切换到 vLLM。如果只是本地测试或开发,当前的 FastAPI 方案已经足够。

- THE END -
Tag:

TwoAdmin

5月19日16:45

最后修改:2026年5月19日
0

非特殊说明,本博所有文章均为博主原创。