12GB 显存 + INT4 4B + vLLM + 双 QLoRA = 最小模型路由器

4 阅读4分钟

说明:本文是引子篇,只讲为什么走这条路、整体怎么串起来;命令级教程与踩坑展开见同系列文章(文末链工作流笔记)。

续篇(12GB 小模型路由器(实战篇):12GB 上 QLoRA 与训练环境)12GB 小模型路由器(实战篇):12GB 上 QLoRA 与训练环境


契机

做一个心理学知识库问答向的应用,想把 RAG / 大模型接入这条链从零走一遍:数据、微调、量化、部署、调用,都在自己环境里摸实。

一开始的计划很朴素:从 Hugging Face 拉底座,只在工作站显卡上跑 QLoRA;Mac 侧负责合并、接进项目里跑对比。

真正把 LoRA merge 进单文件权重、接进业务之后,和同底座的 Q4 量化模型(Mac 上 Ollama 跑)对同一批问题打了一下:

  • 结构化、条目式的回答:merge 后往往更利落、响应体感更快
  • 共情向、需要接用户长段情绪叙述时:容易变短、变平,长上下文续写也不如 Q4 那条线稳。

这不是严谨 benchmark,是个人在项目里反复试出来的体感。它让我不愿意把「合并版」当成唯一部署形态——更希望底座保持一条、能力用 adapter 切换,而不是每次改域就 merge 出一条新静态模型。

翻资料时看到 vLLM 支持多 LoRA、按请求切换(不必为每个域各维护一整份大模型),又能把推理服务收成 OpenAI 兼容接口,和现有后端好接——于是有了后面这场 INT4 底座 + 双 QLoRA 的小显存实验。

再往上抽象一层,这条实验真正想对齐的问题是:在成本可控的前提下,怎么做「多能力路由 + 可扩展并发」——同一底座挂多份能力(adapter),入口侧做路由与观测,先用单卡/单服务把链路跑通,再谈分池、限流和扩容。本系列正文偏实操与踩坑;更完整的架构与演进叙事(网关、Router、vLLM、可观测性、阶段非目标等),有机会再写,和引子、实战篇、推理篇互相照应,这里只点一下,不展开。


用到的配置

  1. QLoRA 训练 + vLLM serve + 双 QLoRA 切换 + INT4(W4A16)量化底座
    Ubuntu + 12GB 显存 RTX 5070(新卡,驱动/环境要自己拧一阵)。

  2. 单 LoRA merge 权重、同底座 Q4、Ollama 跑对照
    Apple Silicon Mac(本机对比与业务联调用;不写具体核数了,避免和「统一内存」表述打架)。


使用的模型

Qwen3-4B-Thinking-2507(全精度训练与导出、量化与 vLLM 侧均以该系为锚)。


为什么 Mac 上还要留一条 Q4

Q4 在 Mac 上跑得动,按当前项目需求跑测试题、对答案、对语气都够用;配合 prompt,主观上能稳定到中上可用。具体怎么打分、对比表长什么样,放到后续篇。(引子里只交代:对照基线来自这条线。)


步骤(路线图级别)

  1. 按业务域准备一份 监督/偏好向 训练样本,大约 30~60 条(够做域适配,又不至于先把数据工程做成主项目)。
  2. 全精度 底座,在 Ubuntu 上配好环境,跑 QLoRA,得到 两个 adapter(例如不同 domain / 不同话术目标)。
  3. Hugging Face 生态里对应的流程把底座压成 INT4(W4A16) 推理权重(具体脚本与命令见系列文,这里不展开)。
  4. 安装 vLLM,挂载 量化底座 + 多个 adapter 路径,起 OpenAI 兼容服务。
  5. 调用侧按场景传参,路由到不同 LoRA(与业务里的「domain-a / domain-b」一类约定对齐即可)。

最终效果

业务里拆成两阶段(两次 vLLM 调用、各挂一个 LoRA):用户提问先走 adapter-a 做门禁/筛选;再换 adapter-b 生成最终回复正文。

ezgif.com-video-to-gif-converter.gif


看似简单,坑很多

  1. 显存:INT4 也不是「整条链只占 4bit」——KV、图捕获、桌面环境都会吃;max_model_len--gpu-memory-utilization 要一起拧,有的模型 config 里上下文拉满会直接 EngineCore 起不来,必须显式压窗口。另:在源码根目录起 vLLM 可能踩到 vllm._C 未编译 的导入坑,换干净工作目录再起。
  2. 新卡:5070 这类较新 GPU,CUDA / 驱动 / 轮子版本要对照官方说明试,「能 import 不等于能起 engine」
  3. 训练:LoRA/QLoRA 对你仍是半黑盒时,务必先 dry run 或小步试跑——工作机上直接全长训练,一步爆显存很常见;别假设 12GB 默认够你第一次就拉满 batch。
  4. 本机桌面:若 Ubuntu 桌面本机同时开浏览器调接口、后台还挂着 vLLM,给 桌面合成 / 浏览器 留一点显存余量,别按「理论满载」去排——细节调度后面单开一篇也行,引子只记别算满
  5. 调参心智:merge 与「多 adapter 在线切」不是同一套取舍;下文系列会按笔记把参数与现象对齐。