大模型微调与部署面经
大模型工程化
1. 微调方法对比
| 方法 | 参数量 | 显存需求 | 效果 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 全量 | 极高(需多卡) | 最好 | 资源充足 |
| LoRA | 极少(0.1-1%) | 低 | 较好 | 最常用 |
| QLoRA | 极少 | 极低(量化基座) | 接近 LoRA | 消费级 GPU |
| Prefix Tuning | 少 | 低 | 一般 | 特定任务 |
| Prompt Tuning | 极少 | 极低 | 较差 | 资源极少 |
LoRA 原理
原始权重 W(冻结)
低秩矩阵 ΔW = B × A(可训练,rank << d)
实际前向:h = Wx + BAx
- rank 通常取 4-64,越大效果越好但参数越多
- 推理时可将 BA 合并回 W,无额外推理开销
2. 训练数据准备
数据格式(Instruction Tuning)
{
"instruction": "将以下英文翻译成中文",
"input": "Hello, world!",
"output": "你好,世界!"
}
数据质量胜过数量
- 1000 条高质量 > 10000 条低质量
- 去重(MinHash)、过滤(困惑度/规则)、多样性保证
- Alpaca / ShareGPT / LIMA 格式是常见开源数据集格式
RLHF 流程
1. SFT(监督微调):在高质量数据上微调
2. Reward Model 训练:让人类对输出排序,训练奖励模型
3. PPO 强化学习:用奖励模型优化策略,对齐人类偏好
DPO(Direct Preference Optimization):绕过 RM 直接从偏好数据优化,更简单稳定
3. 模型量化
| 量化方式 | 精度损失 | 速度提升 | 内存节省 |
|---|---|---|---|
| FP16 / BF16 | 极小 | 2x | 2x |
| INT8(LLM.int8) | 小 | 1.5-2x | 4x |
| INT4(GPTQ/AWQ) | 中 | 2-4x | 8x |
| GGUF(llama.cpp) | 可选 | CPU 可用 | 8-16x |
- GPTQ:后训练量化,逐层校准,精度好
- AWQ:激活感知量化,保留重要权重精度
- GGUF:llama.cpp 格式,支持 CPU 推理和混合量化
4. 推理优化
KV Cache
- 缓存已计算的 Key/Value,避免重复计算历史 token
- 内存瓶颈:长上下文时 KV Cache 可达数十 GB
- 优化:PagedAttention(vLLM)、滑动窗口、GQA(分组查询注意力)
推理框架
| 框架 | 特点 |
|---|---|
| vLLM | PagedAttention,高吞吐,连续批处理 |
| TGI(HuggingFace) | 生产就绪,流式输出 |
| Ollama | 本地部署,易用 |
| llama.cpp | CPU 推理,量化支持好 |
| TensorRT-LLM | NVIDIA 优化,极致性能 |
5. 部署架构
用户请求
↓
API Gateway(认证/限流)
↓
Load Balancer
↓
推理服务集群(vLLM / TGI)
↓
GPU 实例(A100 / H100 / L40S)
+ Prompt Cache 层(Redis)
+ 模型版本管理(MLflow)
+ 监控(Prometheus + Grafana)
6. 高频面试题
- LoRA 的 rank 怎么选? 从小到大实验,数据少 rank 小(4-8),数据多任务复杂 rank 大(32-64)
- 微调后模型为什么会遗忘原有能力? 灾难性遗忘,解决:混合原始数据、降低学习率、使用 LoRA
- 如何估算微调所需显存? 模型参数 × 精度(FP16=2字节)× 3(模型+梯度+优化器状态)+ 激活值
- vLLM 为什么快? PagedAttention 消除 KV Cache 碎片化 + 连续批处理(Continuous Batching)提高 GPU 利用率
- 如何做模型 A/B 测试? 流量分配 + 统一评估指标 + 足够样本量保证统计显著性