大模型微调部署全流程实战:垂直领域 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 大文件治理 + 多版本并行推理)。

更多推荐