外观
LLM 推理优化
内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。
一、推理显存问题
Q1: 为什么大模型推理时显存涨得那么多还一直占着?
- 序列长度因素:长序列会产生大量的 Q/K/V 矩阵
- KV Cache 机制:因为是逐个预测 next token,每次需要缓存 K/V 以加速解码,这部分显存会持续占用
Q2: 推理速度对比
- CPU 推理速度约 10 token/s
- 单卡 A6000 和 8 核 AMD 的推理速度通常为 10:1
- int8 模式推理一般会明显变慢(HuggingFace 实现下)
二、大模型有推理能力吗?
大模型确实具有推理能力,体现在以下方面:
- In-Context Correction:如果说错了,给出矫正后 ChatGPT 能"听懂"错在哪并修正。In-context correction 远比 in-context learning 困难,因为越详细的描述在预训练文本中越难匹配到
- 知识推理:询问互联网上不存在的内容时仍能给出较好答案
- 意图猜测:ChatGPT 能通过已有信息推测用户意图
- 规则理解:用户可以制定全新的游戏规则,ChatGPT 能够理解并参与
三、生成参数设置
核心参数说明
| 参数 | 建议 | 说明 |
|---|---|---|
| top_p | 0.9 | 核采样概率阈值,适当调高可增加候选 token 数量,提高生成多样性 |
| temperature | 1.0 | 控制随机性;输出过于单一可调高,需要稳定/可复现可调低(如 0.01) |
| do_sample | True | 设为 True 启用随机采样;Beam Search 通常配合 do_sample=False 与 num_beams>1 |
| repetition_penalty | 1.8 | 对已出现过的词降低重复概率;数据生成有重复时适当调高 |
| no_repeat_ngram_size | 6 | 确保连续 6 个 token 的 n-gram 不会重复出现 |
调参建议
- 优先调整
top_p、num_beams、repetition_penalty、temperature、do_sample - 数据生成有重复 → 调高
repetition_penalty - 需要更稳定、更可复现的输出 → 适当调低
temperature;输出过于呆板 → 适当调高 - 以上为经验参数,具体需根据任务调整
四、省内存的 LLM 训练/微调/推理方法
背景:即使 RTX 3090 有 24GB 显存,依然无法以 fp32 精度训练最小的 LLaMA-7B。
4.1 估算模型所需 RAM
精度对内存的影响:
| 精度 | 每参数占用 | LLaMA-7B 模型参数 |
|---|---|---|
| fp32 | 4 bytes | 24 GB |
| fp16 | 2 bytes | 12 GB |
| int8 | 1 byte | 6 GB |
模型 RAM 的三个组成部分:
- 模型参数 = 参数量 × 每参数内存
- 梯度 = 参数量 × 每梯度内存
- 优化器参数:AdamW 需要储存两倍模型参数(一阶和二阶 momentum)
LLaMA-7B int8 精度估算:
- 模型参数:6 GB
- 梯度:6 GB
- AdamW 优化器:12 GB
- CUDA kernel 占用:约 1.3 GB
- 总计约 25.3 GB
LLaMA 中间变量内存估算(hidden_size=4096, intermediate_size=11008, num_layers=32, context_length=2048):
- 每个 instance:
(4096 + 11008) × 2048 × 32 × 1 byte ≈ 990 MB - 一张 A100(80GB)在 int8 精度、batch_size=50 下可进行全参数训练
4.2 Fp16 Mixed Precision
混合精度训练的核心思路:在 forward pass 和 gradient computation 使用 fp16 加速,在参数更新时使用 fp32 保证精度。
PyTorch 实现:
- 训练:使用 CUDA Automatic Mixed Precision
- 推理:
model.half()将模型转为 fp16 - HuggingFace:
TrainingArguments中声明fp16=True
4.3 Int8-bitsandbytes
Int8 只能表示 -128~127 的数字且完全没有精度。bitsandbytes 通过两种方法降低误差:
- Vector-wise Quantization:对向量维度进行量化
- Mixed Precision Decomposition:混合精度分解
4.4 LoRA(Low-Rank Adaptation)
微调 LLM 最常用的省内存方法之一。核心发现:微调时更新矩阵(update matrix)往往是稀疏的低秩矩阵。因此将 update matrix 重参数化为两个低秩矩阵的乘积,大幅降低参数量。
4.5 Gradient Checkpointing
在前向传播中不保存所有中间激活值,在反向传播时重新计算。以计算换内存。
- PyTorch:
torch.utils.checkpoint - HuggingFace Transformers:
model.gradient_checkpointing_enable()
4.6 Torch FSDP + CPU Offload
FSDP(Fully Sharded Data Parallel):与 DeepSpeed 类似,通过 ZeRO 等分布优化算法将模型参数、梯度和优化器状态分布至多个 GPU,而非每个 GPU 保留完整副本。
CPU Offload:允许在反向传播中将参数动态地在 GPU ↔ CPU 之间转移,节省 GPU 内存。
五、输出合规化处理
大模型的输出内容不可控,对于严肃场景需要进行合规处理:
- 模型生成内容后,将内容生成向量
- 在话术向量库中查询最相似的话术
- 若查询结果相似度低于阈值或查询不到 → 走兜底策略
- 兜底策略按照用户所在的对话阶段,使用不同的兜底话术或万能兜底话术
六、应用模式设计
在实际销售场景中的演进:
- 纯大模型 AI 模式:直接由大模型与用户对话全流程 → 用户说得太发散,大模型不好收敛,初始通过率较低
- AI + 大模型 AI 模式:前面由小模型负责意图识别和话术策略(任务引导更明确),大模型负责与有意向用户深度交互 → 更容易引导成单
七、输出分布稀疏的处理
- 使用 Softmax 的温度参数(Temperature) 调节来平滑输出分布
- 引入正则化技术(如 Dropout)减少模型对特定类别的过度依赖