大模型微调部署全流程实战:垂直领域 SFT → DPO 对齐 → 量化上线(附源码资源包)
大模型微调部署全流程实战:垂直领域 SFT → DPO 对齐 → 量化上线(附源码资源包)
摘要:本文手把手带你把一个开源大模型微调成"懂自家业务"的垂直模型并部署上线。配套完整可运行源码资源包(数据处理、LoRA/QLoRA 微调、DPO/RLHF 对齐、垂直评估、AWQ/GPTQ/GGUF 量化、vLLM/llama.cpp 部署),含真实客服领域数据与评估集。文末附资源包清单与获取方式,建议收藏。
适用人群:算法工程师 / MLOps / 后端开发 / 云架构师
技术栈:Qwen3 · LLaMA-Factory · transformers · peft · trl · vLLM · llama.cpp
目录
一、为什么做这个项目
企业落地大模型的真实痛点:通用大模型"什么都能聊,但聊不对自家的事"——售后政策记错、产品参数编造、回复风格不统一。解决思路不是换更大的模型,而是走完整的 post-training 管线:
通用模型 → SFT(教业务) → DPO/RLHF(教规矩) → 评估(验收) → 量化部署(上线)
本项目的目标,就是把这套管线做成可复制、可运行的源码工程,业务方拿过去换数据就能用。
二、技术选型与整体架构
| 环节 | 选型 | 一句话理由 |
|---|---|---|
| 基座模型 | Qwen3-7B / Qwen3-1.8B | 中文生态最成熟,1.8B 可低显存验证 |
| 训练框架 | LLaMA-Factory + 原生 transformers/peft/trl | 一键跑通 + 看懂原理,两条路线都给 |
| 微调方法 | LoRA / QLoRA(4bit) | 7B 微调成本最优解 |
| 偏好对齐 | DPO 主推,RLHF(PPO) 进阶 | DPO 省训练奖励模型的成本 |
| 量化部署 | AWQ4bit+vLLM(生产)/ GGUF+llama.cpp(边缘) | OpenAI 兼容 API,生态无缝 |
架构分层(源码对应关系):
data/ 数据层:清洗→去重→格式转换→切分(01_prepare_data.py)
scripts/ 训练层:SFT(02) → DPO(03) → 评估(04) → 量化(05) → 部署(07)
src/ 原理层:原生 SFT / DPO / 推理 / LoRA合并(懂原理路线)
configs/ 配置层:sft/dpo/ppo 三份 yaml(省事路线)
三、源码资源包目录结构
llm-finetune-project/
├── README.md # 项目总览 + 快速开始
├── requirements.txt # 依赖清单(含安装方式说明)
├── data/
│ ├── sft_data.jsonl # SFT 训练数据(12 条企业客服问答)
│ ├── dpo_data.jsonl # DPO 偏好数据(8 对 chosen/rejected)
│ └── eval_tasks.jsonl # 垂直评估集(8 道选择题+生成题)
├── scripts/
│ ├── 01_prepare_data.py # 数据管线:清洗/去重/切分/三格式输出
│ ├── 02_train_sft.sh # LLaMA-Factory SFT 一键脚本
│ ├── 03_train_dpo.sh # LLaMA-Factory DPO 一键脚本
│ ├── 04_evaluate.py # 垂直任务评估 + base 对照报告
│ ├── 05_quantize.py # AWQ / GPTQ 量化(带自动校准)
│ ├── 06_export_gguf.sh # GGUF 导出 + Q4_K_M 量化 + llama-server
│ └── 07_deploy_vllm.sh # vLLM 部署 + 冒烟 + 压测
├── configs/
│ ├── sft.yaml # SFT 训练配置(LoRA 超参齐全)
│ ├── dpo.yaml # DPO 配置(beta/lr 已按经验标好)
│ └── ppo.yaml # RLHF/PPO 进阶配置
└── src/
├── train_sft.py # 原生 transformers+peft LoRA/QLoRA
├── train_dpo.py # 原生 trl DPOTrainer
├── merge_lora.py # LoRA 合并成全量模型
└── infer.py # 推理封装(transformers / vLLM 双后端)
四、核心源码逐模块解读
4.1 数据管线 01_prepare_data.py
关键点:统一输出三种格式(alpaca / sharegpt / dpo),一套代码同时喂 LLaMA-Factory 和原生脚本:
# 内容哈希去重,保证同一知识点不会同时进训练集和验证集
def dedup(items, key_fn):
seen, out = set(), []
for it in items:
h = hashlib.md5(key_fn(it).encode("utf-8")).hexdigest()
if h not in seen:
seen.add(h); out.append(it)
return out
4.2 原生 SFT src/train_sft.py
最值得讲的两个细节:
① loss 屏蔽——只学答案,不学问题:
# prompt 部分 label 置 -100,模型只对 assistant 输出计算损失
lab.append([-100] * len(p) + o)
② QLoRA 一行开关:
bnb_cfg = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16)
model = AutoModelForCausalLM.from_pretrained(args.model, quantization_config=bnb_cfg, ...)
4.3 原生 DPO src/train_dpo.py
DPO 的精髓在超参:beta 控制"贴偏好数据的程度",lr 必须比 SFT 低一个量级:
config = DPOConfig(
output_dir=args.output_dir,
beta=args.beta, # 0.1:越大越贴近偏好数据,过大会损失通用能力
learning_rate=args.lr, # 1e-5:DPO 是微调之上的微调,步子要小
max_length=args.max_len,
...
)
trainer = DPOTrainer(model=model, ref_model=model_ref, args=config, ...)
4.4 评估 scripts/04_evaluate.py
评估设计是防幻觉的关键——选择题卡政策正确性,生成题卡回答质量:
# 选择题:要求只输出 A/B/C/D,正则提取选项字母判对错
m = re.search(r"\b([A-D])\b", answer.upper())
# 生成题:ROUGE-L 与 BLEU 取较优值衡量与参考答案的相似度
rouge = scorer.score(ref, ans)["rougeL"].fmeasure
bleu = sentence_bleu(ans, [ref]).score / 100
4.5 量化与部署 scripts/05_quantize.py / 07_deploy_vllm.sh
AWQ 量化用 eval 集自动校准,无需额外准备校准数据;部署脚本会自动识别 awq/gptq 目录并带 --quantization 启动:
# 量化
python scripts/05_quantize.py --model outputs/merged --quant awq --outdir outputs/awq
# 部署(自动加 --quantization awq)
bash scripts/07_deploy_vllm.sh outputs/awq 8000
# 冒烟
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" \
-d '{"model":"local","messages":[{"role":"user","content":"7 天内手机坏了能退吗?"}]}'
五、真实数据与评估集设计
以**企业智能客服(售后政策)**为垂直领域,三份数据互相咬合,形成闭环:
sft_data.jsonl:12 条售后问答,覆盖退货、保修、价保、退款、发票、积分等 8 个政策点;dpo_data.jsonl:8 对偏好数据,rejected 特意设计成"貌似合理但违规/敷衍"——这正是 DPO 要学走的坏习惯;eval_tasks.jsonl:8 道评估题,5 道选择题 + 3 道生成题,用于上线前验收。
数据设计心法:chosen 和 rejected 都要"看着像话",rejected 写得太离谱模型学不到东西——DPO 学的就是"两个都不错时选更优"。
六、一条命令跑通全流程
# 数据(本地)→ 训练(GPU)→ 评估(GPU)→ 量化部署(GPU/CPU)
python scripts/01_prepare_data.py --input data/raw/*.jsonl --out-dir data
bash scripts/02_train_sft.sh # ① SFT:教会业务
bash scripts/03_train_dpo.sh # ② DPO:立规矩
python src/merge_lora.py --base Qwen/Qwen3-7B --adapter outputs/dpo_lora --output outputs/merged
python scripts/04_evaluate.py --base-model Qwen/Qwen3-7B --adapter outputs/dpo_lora # ③ 验收
python scripts/05_quantize.py --model outputs/merged --quant awq --outdir outputs/awq # ④ 瘦身
bash scripts/07_deploy_vllm.sh outputs/awq 8000 # ⑤ 上线
显存不够?
configs/sft.yaml打开quantization_bit: 4即 QLoRA;或换Qwen/Qwen3-1.8B全流程跑通再上 7B。
七、实战踩坑总结(含解决方案)
| 坑 | 现象 | 解决方案 |
|---|---|---|
| loss 降不下来 | 训练 loss 一直 2+ | 检查数据格式与 chat template 是否一致 |
| DPO 学不到东西 | 对齐后输出没变化 | rejected 写得太假;或 beta/lr 过小 |
| 量化后效果崩 | 选择题准确率骤降 | AWQ 校准集过少(≥3 条);上线前必回归 |
| vLLM 启动异常 | 报 quantization 相关错误 | AWQ 模型必须带 --quantization awq 启动 |
| 模板错乱 | 生成格式不对 | 训练/推理/部署三端 apply_chat_template 保持一致 |
| 评估虚高 | 验证集分数好看但线上拉胯 | 按知识点去重切分,同一政策点不进验证集 |
八、资源包清单
资源包文件名:大模型微调部署实战-源码资源包.zip(约几十 KB,源码+数据+文档,模型权重需自行下载)
| 资源 | 数量 | 说明 |
|---|---|---|
| 可执行脚本 | 7 个 | 数据准备 / SFT / DPO / 评估 / 量化 / GGUF / vLLM 部署 |
| 原生训练源码 | 4 个 | SFT、DPO、LoRA 合并、推理封装(懂原理路线) |
| 配置文件 | 3 个 | sft / dpo / ppo(RLHF 进阶)yaml |
| 业务数据 | 3 份 | SFT 12 条、DPO 8 对、评估集 8 题(客服领域) |
| 文档 | 2 份 | README 快速开始 + 本篇全流程实战教程 |
获取方式:源码随本仓库提供(llm-finetune-project/ 目录),压缩包与本文同目录存放,解压后按 README 从第 1 步执行即可。模型权重到 HuggingFace 下载(Qwen/Qwen3-7B 或 Qwen/Qwen3-1.8B)。
九、结语
这套管线跑通的意义在于:垂直大模型不再是"调个 API",而是一条可评审、可回归、可交付的工程链路。数据决定上限、对齐决定下限、评估守住上线门槛——希望这份源码资源包帮你少踩 80% 的坑。
资源链接:点击下载《大模型微调部署实战-源码资源包》
标签:#大模型微调 #DPO #LoRA #Qwen #vLLM #LLaMA-Factory #量化部署 #AI实战 #MLOps
如果本文对你有帮助,欢迎点赞收藏。下一篇预告:模型版本管理与上线 A/B 灰度(Git 大文件治理 + 多版本并行推理)。
更多推荐

所有评论(0)