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 | |
| 路径 | 说明 |
|---|---|
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 | |
| 项 | 要求 |
|---|---|
| OS | Linux(不支持 Mac) |
| GPU | V100-32GB / 4090 / A10-24GB 等 |
| 磁盘 | 基座 + vLLM 缓存,建议 ≥15 GB 可用 |
| 前置 | 第 08 篇验证通过 |
4. 启动命令(动态 LoRA)
1 | |
参数与训练配置对齐
| vLLM 参数 | 训练对应 | 不一致后果 |
|---|---|---|
--max-lora-rank 8 |
LORA_R=8 |
启动失败或 LoRA 未加载 |
--lora-modules elderly=... |
final_lora/ 路径 |
404 / 默认基座回复 |
--max-model-len 2048 |
训练 MAX_SEQ_LEN=512 |
推理可更长;占显存 |
elderly 是 API 请求里的 model 名,不是磁盘目录名。
为什么不写 merge
merge_lora.py 将 LoRA bake 进基座(~8GB 新目录)。优点:兼容性好。缺点:占磁盘、换 adapter 要重新合并。
教学系列优先 动态 LoRA;若 vLLM 版本与 Qwen3.5 不兼容再考虑合并(另文)。
5. HTTP 调用
1 | |
必须项
model:"elderly"— 与--lora-modules elderly=...一致- system 与 JSONL 逐字一致 — 见
verify_lora.py第 33–36 行 enable_thinking: false— 第 09 篇
期望回复方向
中文、共情、短句、含陪伴语——与 Mac 验证「晚上睡不着」样例同类,而非建议清单。
6. Python 客户端
1 | |
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 | |
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. 小结
- 用
--lora-modules elderly=final_lora动态挂载,无需合并。 - API
model名、system、enable_thinking 三处必须与训练/验证一致。 --max-lora-rank 8对齐adapter_config.json。- 生产用 OpenAI SDK 即可对接。
- 公网部署补鉴权与隐私策略。
附录:README 部署架构原文
1 | |
路径:LoRA_Demo/README.md 第 146–148 行。
系列导航
| 篇目 | 链接 |
|---|---|
| 上一篇 | 09 · Qwen3.5 踩坑 |
| 索引 | README |
系列完。 扩展阅读:多卡 DDP、合并部署、验证集定量评估 — 待补实验后另开专题。