LLM的推理过程


在大型语言模型(LLM)的推理过程中,除了 Prefill(预填充)阶段,还包含多个关键阶段,每个阶段对性能和资源消耗有不同的影响。以下是完整的阶段划分及其作用:


1. 完整推理阶段划分

阶段触发时机核心任务计算特点硬件影响
Prefill接收用户输入后首轮计算计算输入prompt的KV缓存高并行,长序列O(N²)GPU计算单元饱和
Decoding生成每个输出token时自回归生成+更新KV缓存串行,内存带宽受限O(N)显存带宽瓶颈
Post-Processing生成结束或达到停止条件结果格式化/采样/安全过滤CPU密集型CPU负载
Prompt Chunking超长输入时(可选)分块处理prompt避免OOM分块并行内存-计算平衡
Cache ManagementKV缓存超过上下文窗口滑动窗口/丢弃旧token缓存压缩显存优化

2. 各阶段详解

(1). Prefill(预填充)阶段
  • 触发时机:收到用户输入(prompt)后的首次计算。
  • 核心任务
    1. 对输入的所有token执行完整的前向计算,生成每个token的Key-Value(KV)矩阵。
    2. 将KV缓存到显存中,供后续生成阶段复用。
  • 计算特点
    • 高并行性:一次性处理整个prompt序列(适合GPU并行计算)。
    • 复杂度:与prompt长度平方相关(O(n²)),长prompt可能成为延迟瓶颈。
  • 优化技术
    • FlashAttention:减少内存访问开销。
    • 分块处理:将长prompt拆分为多个块(如vLLM的PagedAttention)。

示例

# 伪代码:Prefill过程  
prompt = "The weather is"  
tokens = tokenizer.encode(prompt)  # 假设输出 [1, 45, 12]  
k_cache, v_cache = model.prefill(tokens)  # 计算并缓存所有token的KV  

(2). Decoding(自回归解码)阶段
  • 触发时机:生成每个输出token时。

  • 核心任务

    1. 基于KV缓存生成单个token(计算当前token的Query,与缓存的Key做注意力计算)。
    2. 采样下一个token(如贪心搜索、核采样)。
    3. 将新token的KV追加到缓存。
  • 瓶颈

    • 内存带宽限制:每个token需加载整个KV缓存(如7B模型约10GB/Token)。
    • 示例:生成100token时,显存带宽成为主要限制。
  • 加速方法

    • 推测解码:用小模型草案加速(如Medusa)。
    • 连续批处理:合并多个请求(如TGI框架)。
  • 关键操作

    • 计算当前token的 Q 矩阵,与缓存的 K 做注意力计算。
    • 采样下一个token(如贪心搜索、核采样)。
    • 将新token的 K/V 追加到缓存。
      示例
next_token = model.generate_step(k_cache, v_cache)  # 生成一个token  
k_cache, v_cache = update_cache(k_cache, v_cache, next_token)  # 动态扩展缓存  

(3). Post-Processing(后处理)阶段
  • 触发时机:生成结束或达到停止条件(如max_length)。
  • 常见操作
    • 格式化:添加标点、分段、去除重复文本。
    • 采样调整:Temperature/Top-p控制多样性。
    • 安全过滤:移除敏感有害内容(如NVIDIA NeMo Guardrails)。

示例

# 后处理:过滤敏感词  
from transformers import TextGenerationPipeline  
generator = pipeline("text-generation", model="gpt-3")  
output = generator("Explain nuclear energy:", safety_filter=True)  
(4) Prompt Chunking(输入分块)
  • 应用场景:处理超过上下文窗口的长文本(如GPT-4的32K tokens)。
  • 实现方式
    • 物理分块:将输入拆分为多个段,分别Prefill。
    • 逻辑分块:通过稀疏注意力(如Longformer的滑动窗口)减少计算量。
(5). Cache Management(缓存管理,可选)
  • 场景:处理长文本时超出上下文窗口。
  • 策略
    • 滑动窗口:保留最近N个token(如Llama 2的4K窗口)。
    • 动态丢弃:根据注意力权重淘汰低重要性token。

示例

if len(k_cache) > max_ctx_len:  
    k_cache = k_cache[-max_ctx_len:]  # 滑动窗口截断  

3. 阶段间的资源消耗对比

阶段计算强度内存压力典型耗时比例(长文本)
Prefill★★★★★高(显存峰值)60%
Decoding★★☆☆☆持续显存占用35%
Post-Process★☆☆☆☆CPU内存5%

4. 实际框架中的阶段控制

vLLM 推理框架为例:

from vllm import SamplingParams

# 1. Prefill + Decoding 配置
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
outputs = llm.generate("Explain AI in 3 steps:", sampling_params)

# 2. 显式分块处理(长文本)
chunked_outputs = []
for chunk in split_long_text(input_text, chunk_size=512):
    outputs = llm.generate(chunk, sampling_params)
    chunked_outputs.extend(outputs)

# 3. 后处理
final_text = postprocess(chunked_outputs)

5. 优化方向

  • Prefill加速:使用FlashAttention-2或Triton优化矩阵乘。
  • Decoding优化
    • 连续批处理:合并多个请求的生成步骤(如TGI框架)。
    • 推测解码:用小模型草案加速大模型推理(如Medusa)。
  • 缓存压缩
    • 量化:将KV缓存转为FP8/INT4(如AWQ)。
    • 共享缓存:多用户请求复用相似prompt的缓存。

总结

LLM推理是 多阶段协同 的过程:

  • Prefill 决定首次响应速度。
  • Decoding 影响生成吞吐量。
  • 后处理 保障输出质量。

理解这些阶段有助于针对性优化(如降低长prompt的Prefill开销,或提高Decoding的并行度)。

  • 优化延迟:长prompt场景下,Prefill耗时占比高,需针对性加速(如FlashAttention)。
  • 提高吞吐量:Decoding阶段通过批处理提升GPU利用率。
  • 资源管理:合理控制KV缓存内存,避免OOM错误。
### 大语言模型 (LLM) 的推理过程详解 #### 注意力机制的作用 大语言模型的核心之一是其注意力机制,该机制允许模型在处理序列数据时动态分配权重给不同的部分。通过自注意力(Self-Attention)结构,模型能够捕捉输入序列中的长期依赖关系以及上下文信息[^1]。具体来说,在每一层的多头注意力模块中,模型会计算查询向量(Query)、键向量(Key)和值向量(Value)之间的相似度得分,并据此调整各位置的重要性。 #### 参数更新与生成逻辑 当接收到一个新的输入序列时,LLM 首先利用嵌入层将其转换成连续空间表示形式;随后经过一系列堆叠的 Transformer 层逐步提取特征并构建复杂的语义表征。最终,在解码阶段,模型依据当前已有的上下文预测下一个最可能的单词或子词单元。这一过程中不仅考虑了前序词语的影响,还融入了来自多个先前时间步的信息综合判断最佳候选项[^2]。 #### 实际应用中的优化方法 为了应对实际场景下可能出现的知识过时或者特定领域需求等问题,除了传统的重新训练方式外,还可以采用 RAG 方法来补充实时检索得到的相关资料作为额外输入供 LLM 参考决策之用。这种方法有效缓解了因频繁更新而导致高昂算力消耗的同时也提高了回复质量准确性[^3]。 ```python import torch from transformers import GPT2Tokenizer, GPT2Model tokenizer = GPT2Tokenizer.from_pretrained('gpt2') model = GPT2Model.from_pretrained('gpt2') input_text = "Once upon a time" inputs = tokenizer(input_text, return_tensors="pt") outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值