0. 系列闭环

本篇位置 上游 本篇产出 下游
第 10/10 篇 训练 + 验证 生产可调用 HTTP API 业务 App / 小程序 / 语音网关

本系列采用 方式 B:动态挂载 LoRA,不写 merge_lora.py 合并流程。基座 ~8.7 GB 与 adapter ~41 MB 分离,换 LoRA 只替换小目录。


1. 要解决的实际问题

verify_lora.py 是单进程、单用户、串行 generate。上线需要:

  • 并发请求
  • 稳定延迟
  • OpenAI 兼容接口(现有客户端/SDK 可复用)
  • GPU 显存高效复用(PagedAttention)

vLLM 在本项目的定位:Linux + NVIDIA 上 serve Qwen3.5-4B + elderly LoRA


2. 实现位置与架构

1
2
3
4
5
6
7
8
flowchart LR
BM[models/Qwen3.5-4B]
AD[output/.../final_lora]
VV[vllm serve]
API["POST /v1/chat/completions"]
BM --> VV
AD --> VV
VV --> API
路径 说明
LoRA_Demo/models/Qwen3.5-4B/ 基座
LoRA_Demo/output/lora_elderly_single/final_lora/ adapter
LoRA_Demo/README.md curl / Python 示例
adapter_config.json r=8,对齐 --max-lora-rank

3. 环境要求

1
pip install "vllm>=0.19.0"
要求
OS Linux(不支持 Mac
GPU V100-32GB / 4090 / A10-24GB 等
磁盘 基座 + vLLM 缓存,建议 ≥15 GB 可用
前置 第 08 篇验证通过

4. 启动命令(动态 LoRA)

1
2
3
4
5
6
7
8
9
10
11
cd LoRA_Demo

vllm serve ./models/Qwen3.5-4B \
--host 0.0.0.0 \
--port 8000 \
--enable-lora \
--max-lora-rank 8 \
--max-loras 1 \
--lora-modules elderly=./output/lora_elderly_single/final_lora \
--max-model-len 2048 \
--gpu-memory-utilization 0.90

参数与训练配置对齐

vLLM 参数 训练对应 不一致后果
--max-lora-rank 8 LORA_R=8 启动失败或 LoRA 未加载
--lora-modules elderly=... final_lora/ 路径 404 / 默认基座回复
--max-model-len 2048 训练 MAX_SEQ_LEN=512 推理可更长;占显存

elderlyAPI 请求里的 model 名,不是磁盘目录名。

为什么不写 merge

merge_lora.py 将 LoRA bake 进基座(~8GB 新目录)。优点:兼容性好。缺点:占磁盘、换 adapter 要重新合并。
教学系列优先 动态 LoRA;若 vLLM 版本与 Qwen3.5 不兼容再考虑合并(另文)。


5. HTTP 调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "elderly",
"messages": [
{
"role": "system",
"content": "你是一位温柔、耐心、善解人意的老年情感陪伴助手,说话慢一点、软一点,多共情、多倾听、多肯定,不说教、不反驳、不催促。"
},
{
"role": "user",
"content": "晚上睡不着,心里乱糟糟的。"
}
],
"max_tokens": 200,
"temperature": 0.7,
"chat_template_kwargs": {"enable_thinking": false}
}'

必须项

  1. model: "elderly" — 与 --lora-modules elderly=... 一致
  2. system 与 JSONL 逐字一致 — 见 verify_lora.py 第 33–36 行
  3. enable_thinking: false — 第 09 篇

期望回复方向

中文、共情、短句、含陪伴语——与 Mac 验证「晚上睡不着」样例同类,而非建议清单。


6. Python 客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")

resp = client.chat.completions.create(
model="elderly",
messages=[
{
"role": "system",
"content": (
"你是一位温柔、耐心、善解人意的老年情感陪伴助手,"
"说话慢一点、软一点,多共情、多倾听、多肯定,"
"不说教、不反驳、不催促。"
),
},
{"role": "user", "content": "孩子们都不来看我"},
],
max_tokens=200,
temperature=0.7,
extra_body={"chat_template_kwargs": {"enable_thinking": False}},
)
print(resp.choices[0].message.content)

api_key="EMPTY" — vLLM 本地默认不校验 key。公网暴露需加反向代理鉴权(下文安全)。


7. 与 verify_lora.py 的参数对齐

verify_lora.py vLLM
temperature 0.7 0.7(可调)
top_p 0.9 可在 extra 传
max_new_tokens 200 max_tokens: 200
system SYSTEM_PROMPT messages[0]
thinking enable_thinking=False chat_template_kwargs

线上 temperature 略降(0.6)可减少随机胡话,需 A/B。


8. 生产 checklist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
功能
□ curl 返回 200,content 为中文陪伴式
□ model=elderly 时明显不同于无 LoRA(可临时去掉 --enable-lora 对比)
□ thinking 关闭无英文链

资源
□ nvidia-smi 显存占用稳定
□ --gpu-memory-utilization 0.85~0.92 不调过高防 OOM

安全
□ 公网:防火墙只开 8000 或经 Nginx
□ 加 API Key / mTLS,勿裸奔 0.0.0.0
□ 日志不落用户隐私原文(合规)

运维
□ 更新 LoRA:替换 final_lora → 重启 vLLM
□ 基座升级与 adapter r/target 不变时可复用 adapter

9. 踩坑

坑 1:model 名写错
Qwen3.5-4B--lora-modules 注册的是 elderly,可能走到无 LoRA 基座。

坑 2:system 省略或改写
线上 system 变短,风格退回通用助手 — 与「微调无效」假象相同。

坑 3:vLLM 版本过旧
Qwen3.5 需较新 vLLM(README 建议 ≥0.19)。启动报 architecture 错先升级。

坑 4:max-model-len 过大 + 高并发 OOM
2048 对陪伴足够;聊天历史很长时需客户端截断 messages。

坑 5:在 Mac 上部署 vLLM
不可行。训练/验证可 Mac,serve 必须 Linux GPU


10. 全系列链路回顾

阶段 脚本/命令 实测参考
数据 elderly_chat.jsonl 1000 条
训练 python train_lora_single.py V100 41min
指标 all_logs.log loss 2.81→0.13
验证 python verify_lora.py Mac MPS 通过
部署 vllm serve ... --enable-lora Linux GPU

未纳入本系列: train_lora_multi.py(多卡)、merge_lora.py(合并)。


11. 小结

  1. --lora-modules elderly=final_lora 动态挂载,无需合并。
  2. API model 名、system、enable_thinking 三处必须与训练/验证一致。
  3. --max-lora-rank 8 对齐 adapter_config.json
  4. 生产用 OpenAI SDK 即可对接。
  5. 公网部署补鉴权与隐私策略。

附录:README 部署架构原文

1
基座模型 Qwen3.5-4B  +  LoRA 适配器  →  vLLM 服务  →  OpenAI 兼容 API

路径:LoRA_Demo/README.md 第 146–148 行。


系列导航

篇目 链接
上一篇 09 · Qwen3.5 踩坑
索引 README

系列完。 扩展阅读:多卡 DDP、合并部署、验证集定量评估 — 待补实验后另开专题。


← 返回 LoRA 老年陪伴专题