Skip to content

大语言模型推理优化与部署实践

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

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

两个主要原因:

原因说明
序列太长每条序列产生大量 Q/K/V 矩阵
KV Cache逐个预测 Next Token,每次需缓存 K/V 加速解码,且不会被释放

2. 大模型在 GPU 和 CPU 上的推理速度

环境推理速度(7B 级别)
CPU10 token/s
单卡 A6000 + 8 核 AMD100 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.010.3
需要更多样性调高 top_ptemperature

以上是经验参数,具体需根据任务调整。


6. 省内存的 LLM 训练/微调/推理方法

6.1 估算模型所需 RAM

精度对内存的影响

精度每参数占用
FP324 bytes
FP162 bytes
INT81 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):

每个 Instance(4096+11008)×2048×32×1 byte990 MB

结论

一张 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 重参数化为两个低秩矩阵的积:

ΔW=BA,ARr×d,BRd×r,rd

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在训练阶段平滑标签分布