Skip to content

LLM 解码相关

📅 发表于 2025/11/15
🔄 更新于 2025/11/15
👁️ -- 次访问
📝 0 字
0 分钟
llm-decode
#topk
#topp
#Temperature
#算术强度
#预填充
#解码

解码策略

采样方法

采样方法
  • 贪心解码:每次选择概率最高的单词。会导致文本单调和重复。
  • 随机采样:多样性好,但质量差。
  • Beam Search
    • 维护k个大小的序列,每一步选择概率最高的k个单词;从所有选择中,保留概率最高的k个序列。
    • 平衡了质量和多样性。贪心解码是k=1的BeamSearch。

大模型常用的top-k和top-p介于贪心解码和随机采样之间

Top-k

Top-K 策略
  • 策略:每一步从概率最高的k个候选词中随机选一个。
  • 优点:k越大多样性越好,但质量越低。
  • 缺点:
    • top-k只考虑了单词概率,没有考虑语义和语法关系
    • 可能导致生成文本不符合常识和逻辑,比如我喜欢吃,解码为苹果。但可能我并不喜欢吃,而且上下文提到了。
    • k难以确定
  • 通常和top-p一起使用。

Top-p(核采样/Nucleus采样)

Top-P 策略
  • 策略:每一步从累计求和概率高于p的单词中进行随机采样,即只关心核心部分,忽略尾部部分。
    • 如设置p=0.9,只考虑前90%的词

Temperature

温度
  • 策略:和语言模型温度参数T类似,是一个概率缩放参数。温度越高,越趋近于均匀采样,温度越低,越倾向于概率越高的。
  • 计算:使用logits来通过温度进行缩放,然后计算softmax概率。

联合采样

优先级:top-k -> top-p -> Temperature

解码操作

算术强度

算术强度

算术强度

  • 计算操作次数内存访问量的比率,有一个临界值。
  • 每个GPU都有一个临界算术强度

计算密集型

  • 任务的算术强度 > 临界算术强度,计算 > 内存访问。

内存密集型

  • 任务的算术强度 < 临界算术强度,计算 < 内存访问。

预填充和解码

预填充和解码阶段

训练阶段 (计算密集型任务)

  • batch的矩阵乘法和注意力计算,具有很高的算术强度。
  • 属于计算密集型

预填充阶段/Prefilling (计算密集型任务)

  • 核心
    • 输入prompt做前向计算,生成第一个token。

    • 如:输入让总结一篇文章,模型需要一次性处理完这篇文章

  • 特点
    • 计算量大内存访问相对集中计算密集型任务
  • 指标
    • TTFT:Time To First Token,生成第1个token所需时间

解码阶段/Decoding (内存密集型任务)

  • 核心
    • 逐词生成剩余token:模型一个词一个词的生成回答,直到EOS或最大长度。
  • 特点
    • 需回顾之前所有的上下文:prompt + 已生成部分
    • 内存访问量巨大,需反复读取KVCache,是长文本生成的主要瓶颈。
    • 内存密集型
  • 指标
    • TPOT:Time Per Output Token,生成每个token的平均时间

解码提升效率方法

解码提升效率方法

提高效率方法

  • 批处理Batching

    • 大批数据传到GPU,做一次处理,提高GPU利用率。
      • 静态批处理:等一批中最长的生成完成才结束,差异会有问题。
    • 太大了会导致内存溢出,可以考虑KV Cache/LLM内存要求。
  • KV 缓存

    • 生成新token,依赖之前所有token的key/value但这部分不用重新计算,可以缓存在GPU
    • 如llama2-7B模型,fp16精度,b=1,seq长度4096,32层,hsize4096
      • KV缓存大小:1*4096*2*32*4096*2=2GB,其中
    总KV缓存大小=bs2n_layersh_size
  • LLM 内存需求

    • 权重:fp16,2m, 7B,14GB显存
    • KV缓存
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2025