Llama优化技术
date
Feb 11, 2025
slug
Llama-infer
status
Published
tags
AI-Infra
summary
type
Post
Transformer结构优化点

- Attention
- Scaled Product Attention
- Positional Encoding
- RoPE
- Norm
- pre-normalization
- RMSNorm
- Activation function/FFN
- SwiGLU
- Inference Speedup
- KV Cache
- GQA
- Flash Attention
KV Cache
为什么LLM在输出长序列时,到后面感觉变慢,按算法原理
- 因为每一个新出的字都要与前面所有的字计算相关性
- 前面的字还要和更前面的字计算相关性
越到后面需要计算的历史越多,计算开销

KV Cache通俗理解:
- Cache缓存的原理
- 为何只对KV进行Cache:因为只有KV要重复利用,Q不需要重复使用
- 为什么是针对推理阶段的优化技术:推理阶段是一个字一个字出的

对KV Cache总结:
- 以空间换时间
- 只在推理使用
- 只在Decoder结构中使用
- Encoder中self-attention是并行计算的
- Decoder中的cross-attention计算,其Key和Value是Encoder输出的结果
- LLM都是Decoder-only结构,不涉及上面两种Attention
- KVCache占用空间大的解决办法:GQA优化技术
GQA

GQA总结:
- 与原始实现兼容,仅仅复制一下,就可以与原来实现兼容
- 正常训练好的模型,可以方便的变成MQA与GQA模型
- GQA介于MHA和MQA之间
RMSNorm
归一化Norm目的:加速训练、提升模型性能并增强稳定性
- 加速训练
- 缓解内部协变量偏倚(各层输入分布在训练中改变)
- 允许更高的学习率
- 提升模型性能
- 防止梯度爆炸/消失
- 正则化效果(引入噪音,放置过拟合)
- 增强模型稳定性
- 减少对初始化的依赖
- 适应不同的网络结构
数据分布标准化:均值为0,方差为1
BatchNorm VS. LayerNorm

BatchNorm是把同一batch中,不同实例中相同位置的数据一起计算均值方差来做归一化,在图像任务中常用;LayerNorm只关注输入文本(每一行)自身进行计算,在文本任务中常用。
RMSNorm
沿用LayerNorm的思想,相对于LayerNorm减少计算开销(不需要计算均值)
给定输入向量 ,RMSNorm 的计算公式如下:
SwiGLU
常见的激活函数
Sigmoid | ㅤ | |
ReLU | ㅤ | |
Swish/SiLU | ||
GLU:Gated Linear Units | ㅤ | |
SwiGLU: Swish+GLU |
SwiGLU
是一种结合了Swish激活函数与GLU机制的激活函数其中 和 分别是输入 的两个线性变换矩阵
该公式可以理解为:
- 对输入x进行两次线性变换
- 将其中一个结果通过Swish激活函数
- 将两个结果逐元素相乘,形成最终输出

SwiGLU激活函数需要进行三次矩阵乘法运算,相比于ReLU等传统激活函数计算复杂度更高,然而SwiGLU带来的性能提升显著
- 更好的泛化性能:SwiGLU在处理复杂的文本数据是表现出更好的泛化性能
- 稳定的梯度流:Swish激活函数平滑的曲线特性有助于稳定梯度
RoPE
动机(模型的外推性)
苏神称位置编码的意义是破坏Transformer结构的完全对称性。可以这样理解,假设做一个文本分类任务,输入经过Transformer得到输出embedding,然后global pooling再去分类。如果没有Position Embedding,打乱原来句子的顺序会得到同样的结果,这显然是不对的。
Google第一版本位置编码形式的初衷:“通过绝对位置编码来表达相对位置信息“,并第一次给出了Rotary Position Embedding的形式,形式上其和Google第一版本Position Embedding最大的差别是将“加性位置编码”改为“乘性位置编码”,使得 计算的结果中蕴含 和 的相对位置信息。

可以看到,苏神是将原始向量相邻的两两为一组,而palm则是将前1/2和后1/2分为两组,但这样的分组方式并不会改变RoPE的初衷,依然可以保证计算结果中蕴含有相对位置信息。
训练时最长只见过100个词的句子,而推理时生成1000个词的句子,模型泛化性能变差,纵观Transoformer-Decoder结构,与输出长度相关的只有两个模块:
- Attention计算,生成的句子越长,Attention计算过程很慢
- 位置编码,绝对的位置编码导致有很多训练时没见过的位置信息。
Attention计算两个向量内积时,只关心两个向量的相对位置,相对位置不受绝对位置的影响,能够使模型具有更好的泛化性能、外推性更好

RoPE位置编码的要点:
- 先做多Head的投影,再加上旋转位置编码
- 用的仍然是正弦和余弦函数操作,当两个向量计算内积时,直接转换成包含相对位置的信息
- 只对Q,K做旋转位置编码,V不变
- d为embedding的维度,m为绝对位置
旋转位置编码中所谓旋转的含义:两个向量的相对位置变化就是旋转的角度
SentencePiece VS. Titoken
SentencePiece
SentencePiece 在大模型领域主要用于文本的 分词 和 编码。
- 分词 是将文本分割成一个个独立的词语或符号。传统的中文分词方法,例如 BMM 分词、HMM 分词,都是基于规则的,需要人工制定分词规则。而 SentencePiece 则是基于 无监督学习 的,它可以自动学习文本的语义和结构,并根据学习结果进行分词。
- 编码 是将分词后的词语或符号转换为数字形式,以便计算机能够处理。SentencePiece 使用了一种称为 字节对编码 的方法,它可以将每个词语或符号编码成一个或多个字节。字节对编码的优点是能够有效地利用空间,并且可以将词语或符号之间的关系编码到编码中。
SentencePiece 在大模型领域具有以下优势:
- 分词效果好,能够准确地识别词语和符号的边界。
- 编码效率高,能够节省空间。
- 能够将词语或符号之间的关系编码到编码中,有利于模型学习。
SentencePiece 自监督训练原理
SentencePiece 的自监督训练模型原理是通过 无监督学习 的方式,学习文本的语义和结构,并根据学习结果进行分词和编码。
具体来说,SentencePiece 的训练过程可以分为以下几个步骤:
- 数据准备:首先需要准备一个文本语料库,语料库中的文本可以是任何类型,例如新闻文章、书籍、代码等。
- 模型训练:使用无监督学习算法训练 SentencePiece 模型,模型的输入是文本语料库,输出是分词后的文本。
- 模型评估:使用评估指标评估模型的性能,例如分词准确率、召回率等。
SentencePiece 使用的无监督学习算法是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号。通过这种方式,模型可以学习文本的语义和结构。
在 SentencePiece 中,MLM 的具体实现如下:
- 随机选择文本中的部分词语或符号进行遮蔽。
- 将被遮蔽的词语或符号替换为一个特殊符号,例如
[MASK]
。
- 将处理后的文本输入模型,让模型预测被遮蔽的词语或符号。
通过这种方式,模型可以学习到被遮蔽词语或符号与周围词语或符号之间的关系,从而提高分词和编码的准确性。
SentencePiece 的自监督训练模型具有以下优势:
- 不需要人工制定分词规则,能够自动学习文本的语义和结构。
- 分词效果好,能够准确地识别词语和符号的边界。
- 编码效率高,能够节省空间。
工具 | 分词方法 | 编码方式 | 优势 | 劣势 |
SentencePiece | 无监督学习 | 字节对编码 | 分词效果好、编码效率高 | 需要训练模型 |
Jieba | 最大似然法 | 哈希编码 | 分词效果好、速度快 | 需要人工制定分词规则 |
Hmmseg | 隐马尔科夫模型 | 哈希编码 | 分词效果好、支持多种语言 | 需要训练模型 |
Stanford CoreNLP | 基于规则 | 哈希编码 | 分词效果好、支持多种语言 | 速度较慢 |
使用建议:
- 如果需要对中文文本进行分词,并且对分词效果要求较高,可以选择
SentencePiece
、Jieba
或Hmmseg
。
- 如果需要对多种语言文本进行分词,可以选择
Stanford CoreNLP
。
- 如果需要对文本进行分词和编码,并且对速度要求较高,可以选择
Jieba
。
- 如果需要对文本进行分词和编码,并且对分词效果要求较高,可以选择
SentencePiece
或Hmmseg
。
ToToken简介
Tiktoken 的功能与 SentencePiece 类似,都是用于文本的 分词 和 编码。
Tiktoken 是一个基于 BPE 算法的 快速分词器,它专门针对 GPT-4 和 ChatGPT 等大模型进行了优化。Tiktoken 的主要特点如下:
- 速度快:Tiktoken 的分词速度比 SentencePiece
快
很多,可以满足大模型训练和推理的需求。
- 效果好:Tiktoken 的分词效果与 SentencePiece
相当
,能够准确地识别词语和符号的边界。
- 易用性:Tiktoken 提供了
简单
的 API 接口,方便使用。
Tiktoken 与 SentencePiece 的主要区别 如下:
- 分词算法:Tiktoken 使用 BPE 算法
- 进行分词,而 SentencePiece 使用的是无监督学习算法。
- 速度:Tiktoken 的分词速度比 SentencePiece 快很多。
- 模型:Tiktoken 专门针对 GPT-4 和 ChatGPT 等大模型进行了优化,而 SentencePiece 则是通用的。
工具 | 分词算法 | 编码方式 | 速度 | 使用场景 |
Tiktoken | BPE | 字节对编码 | 快 | GPT-4、LLAMA3 |
SentencePiece | 无监督学习 | 字节对编码 | 慢 | 通用 |
具体使用建议:
- 如果需要对文本进行快速分词,并且对分词效果要求较高,可以选择 Tiktoken。
- 如果需要对文本进行分词和编码,并且需要支持多种语言,可以选择 SentencePiece。
- 如果需要对 GPT-4 或 ChatGPT 等大模型进行训练或推理,可以选择 Tiktoken。
BPE 算法原理
BPE 算法,全称 Byte Pair Encoding 算法,是一种用于文本分词和编码的算法。TikToken 使用了 BPE 算法进行分词,因此也称为 BPE 分词器。
BPE 算法的核心思想是:将文本中的 频繁出现的字节对 替换为一个新的 字节。通过不断迭代这个过程,最终将文本编码成一系列的字节。
BPE 算法的具体步骤如下:
- 统计文本中所有字节对出现的频率。
- 找到出现频率最高的字节对。
- 将该字节对替换为一个新的字节。
- 重复步骤 1-3,直到满足终止条件。
终止条件 可以是:
- 文本中所有字节对的出现频率都低于某个阈值。
- 文本的编码长度达到某个要求。
BPE 算法具有以下优势:
- 分词效果好,能够准确地识别词语和符号的边界。
- 编码效率高,能够节省空间。
- 能够将词语或符号之间的关系编码到编码中,有利于模型学习。