Skip to content

LLM 推理优化

内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。

一、推理显存问题

Q1: 为什么大模型推理时显存涨得那么多还一直占着?

  1. 序列长度因素:长序列会产生大量的 Q/K/V 矩阵
  2. KV Cache 机制:因为是逐个预测 next token,每次需要缓存 K/V 以加速解码,这部分显存会持续占用

Q2: 推理速度对比

  • CPU 推理速度约 10 token/s
  • 单卡 A6000 和 8 核 AMD 的推理速度通常为 10:1
  • int8 模式推理一般会明显变慢(HuggingFace 实现下)

二、大模型有推理能力吗?

大模型确实具有推理能力,体现在以下方面:

  1. In-Context Correction:如果说错了,给出矫正后 ChatGPT 能"听懂"错在哪并修正。In-context correction 远比 in-context learning 困难,因为越详细的描述在预训练文本中越难匹配到
  2. 知识推理:询问互联网上不存在的内容时仍能给出较好答案
  3. 意图猜测:ChatGPT 能通过已有信息推测用户意图
  4. 规则理解:用户可以制定全新的游戏规则,ChatGPT 能够理解并参与

三、生成参数设置

核心参数说明

参数建议说明
top_p0.9核采样概率阈值,适当调高可增加候选 token 数量,提高生成多样性
temperature1.0控制随机性;输出过于单一可调高,需要稳定/可复现可调低(如 0.01)
do_sampleTrue设为 True 启用随机采样;Beam Search 通常配合 do_sample=Falsenum_beams>1
repetition_penalty1.8对已出现过的词降低重复概率;数据生成有重复时适当调高
no_repeat_ngram_size6确保连续 6 个 token 的 n-gram 不会重复出现

调参建议

  • 优先调整 top_pnum_beamsrepetition_penaltytemperaturedo_sample
  • 数据生成有重复 → 调高 repetition_penalty
  • 需要更稳定、更可复现的输出 → 适当调低 temperature;输出过于呆板 → 适当调高
  • 以上为经验参数,具体需根据任务调整

四、省内存的 LLM 训练/微调/推理方法

背景:即使 RTX 3090 有 24GB 显存,依然无法以 fp32 精度训练最小的 LLaMA-7B。

4.1 估算模型所需 RAM

精度对内存的影响:

精度每参数占用LLaMA-7B 模型参数
fp324 bytes24 GB
fp162 bytes12 GB
int81 byte6 GB

模型 RAM 的三个组成部分:

  1. 模型参数 = 参数量 × 每参数内存
  2. 梯度 = 参数量 × 每梯度内存
  3. 优化器参数: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 通过两种方法降低误差:

  1. Vector-wise Quantization:对向量维度进行量化
  2. 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 内存。


五、输出合规化处理

大模型的输出内容不可控,对于严肃场景需要进行合规处理:

  1. 模型生成内容后,将内容生成向量
  2. 在话术向量库中查询最相似的话术
  3. 若查询结果相似度低于阈值或查询不到 → 走兜底策略
  4. 兜底策略按照用户所在的对话阶段,使用不同的兜底话术或万能兜底话术

六、应用模式设计

在实际销售场景中的演进:

  • 纯大模型 AI 模式:直接由大模型与用户对话全流程 → 用户说得太发散,大模型不好收敛,初始通过率较低
  • AI + 大模型 AI 模式:前面由小模型负责意图识别和话术策略(任务引导更明确),大模型负责与有意向用户深度交互 → 更容易引导成单

七、输出分布稀疏的处理

  1. 使用 Softmax 的温度参数(Temperature) 调节来平滑输出分布
  2. 引入正则化技术(如 Dropout)减少模型对特定类别的过度依赖