外观
大语言模型推理优化与部署实践
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
1. 为什么大模型推理时显存涨那么多还一直占着?
两个主要原因:
| 原因 | 说明 |
|---|---|
| 序列太长 | 每条序列产生大量 Q/K/V 矩阵 |
| KV Cache | 逐个预测 Next Token,每次需缓存 K/V 加速解码,且不会被释放 |
2. 大模型在 GPU 和 CPU 上的推理速度
| 环境 | 推理速度(7B 级别) |
|---|---|
| CPU | 约 10 token/s |
| 单卡 A6000 + 8 核 AMD | 约 100 token/s |
| GPU:CPU 速度比 | 约 10:1 |
3. INT8 和 FP16 推理速度对比
根据 HuggingFace 的实现,INT8 模式一般推理会明显变慢。INT8 对显存友好但对速度有一定影响。
4. 大模型有推理能力吗?
有,体现在以下方面:
| 能力 | 说明 |
|---|---|
| In-Context Correction | 说错了给矫正,模型能理解错在哪并修正,比 In-Context Learning 更难 |
| 未知内容推理 | 能对互联网上不存在的内容给出较好答案 |
| 规则理解 | 能理解全新的游戏规则并参与互动 |
越详细的描述,在预训练文本中越难匹配到,但 ChatGPT 反而能更好地回答——证明了真正的推理能力。
5. 大模型生成时参数怎么设置?
推荐默认值
python
top_p = 0.9 # 适度提高候选 Token 数量,增加多样性
temperature = 1.0 # 避免概率分布极端极化(过低会退化为贪婪解码)
do_sample = True # 启用随机采样解码(与 Beam Search 不同;Beam 通常 do_sample=False 且 num_beams>1)
no_repeat_ngram_size = 6 # 禁止 6-gram 重复
repetition_penalty = 1.8 # 降低已出现词的再生成概率调参经验
| 问题 | 建议 |
|---|---|
| 生成重复 | 调高 repetition_penalty |
| 输出过于单一、呆板 | 适当调高 temperature / top_p |
| 任务需要稳定、可复现 | 调低 temperature(如 0.01~0.3) |
| 需要更多样性 | 调高 top_p 和 temperature |
以上是经验参数,具体需根据任务调整。
6. 省内存的 LLM 训练/微调/推理方法
6.1 估算模型所需 RAM
精度对内存的影响
| 精度 | 每参数占用 |
|---|---|
| FP32 | 4 bytes |
| FP16 | 2 bytes |
| INT8 | 1 byte |
模型 RAM 三部分
| 部分 | 计算公式 | LLaMA-7B INT8 示例 |
|---|---|---|
| 模型参数 | 参数量 × 每参数字节 | 6B × 1 byte = 6 GB |
| 梯度 | 同上 | 6B × 1 byte = 6 GB |
| 优化器参数 | AdamW 需要 2× 参数 | 6B × 2 bytes = 12 GB |
| CUDA Kernel | 固定开销 | ~1.3 GB |
| 总计 | 约 25.3 GB |
中间变量内存
对于 LLaMA(hidden_size=4096, intermediate_size=11008, layers=32, ctx=2048):
结论
一张 A100(80GB) 可在 INT8 精度、Batch Size = 50 下进行全参数训练。
6.2 FP16 混合精度训练
在 Forward Pass 和 Gradient Computation 时使用 FP16 加速,更新参数时使用 FP32 保证精度:
python
# Torch 推理
model.eval()
model.half()
# HuggingFace TrainingArguments
TrainingArguments(fp16=True)6.3 INT8 + BitsAndBytes
INT8 只能表示 -128 到 127 的数字,完全没有精度。BitsAndBytes 使用两种方法降低误差:
| 方法 | 说明 |
|---|---|
| Vector-wise Quantization | 按向量维度分别量化 |
| Mixed Precision Decomposition | 混合精度分解(LLM.int8() 将 Outlier 单独处理) |
6.4 LoRA
微调 LLM 时,更新矩阵(Update Matrix ΔW)往往特别稀疏。LoRA 将 ΔW 重参数化为两个低秩矩阵的积:
A + B 的参数量远小于原始 W。
6.5 Gradient Checkpointing
前向传播不存储中间激活值,反向传播时重新计算。以时间换空间。
python
# HuggingFace
model.gradient_checkpointing_enable()6.6 Torch FSDP + CPU Offload
Fully Sharded Data Parallel(FSDP)将模型参数、梯度和优化器状态分布至多个 GPU,而非每个 GPU 保留完整副本。CPU Offload 允许将参数在 GPU 和 CPU 之间动态转移。
python
# Torch FSDP
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP
model = FSDP(model)7. 如何让大模型输出合规化?
对于严肃场景,大模型输出不可控。处理方法:
用户输入 → 大模型生成 → 内容向量化 → 查询话术向量库 → 相似度判断
↓ 相似度 < 阈值 / 无结果
走兜底策略(根据对话阶段或万能兜底话术)核心思路:将大模型输出作为中间产物,通过向量检索匹配预设话术库,确保最终输出安全可控。
8. 应用模式变更:AI + 大模型混合模式
| 模式 | 阶段 | 问题 |
|---|---|---|
| 纯大模型 AI | 全流程大模型直接对话 | 用户太发散,大模型不好收敛 |
| AI + 大模型 AI(推荐) | 前置小模型(意图/话术策略)引导 + 后置大模型深度交互 | 任务引导更明确,大模型聚焦有意向用户 |
9. 模型输出分布稀疏怎么处理?
| 方法 | 原理 |
|---|---|
| Temperature 调节 | Softmax 的温度参数使输出分布更平滑 |
| Top-p / Top-k 采样 | 限制候选 Token 范围,避免长尾分布 |
| Dropout 正则化 | 减少模型对特定类别的过度依赖 |
| Label Smoothing | 在训练阶段平滑标签分布 |