Llama优化技术

date
Feb 11, 2025
slug
Llama-infer
status
Published
tags
AI-Infra
summary
type
Post

Transformer结构优化点

notion image
  1. Attention
    1. Scaled Product Attention
  1. Positional Encoding
    1. RoPE
  1. Norm
    1. pre-normalization
    2. RMSNorm
  1. Activation function/FFN
    1. SwiGLU
  1. Inference Speedup
    1. KV Cache
    2. GQA
    3. Flash Attention
 

KV Cache

为什么LLM在输出长序列时,到后面感觉变慢,按算法原理
  1. 因为每一个新出的字都要与前面所有的字计算相关性
  1. 前面的字还要和更前面的字计算相关性
越到后面需要计算的历史越多,计算开销
notion image
KV Cache通俗理解:
  1. Cache缓存的原理
  1. 为何只对KV进行Cache:因为只有KV要重复利用,Q不需要重复使用
  1. 为什么是针对推理阶段的优化技术:推理阶段是一个字一个字出的
notion image
💡
对KV Cache总结:
  • 以空间换时间
  • 只在推理使用
  • 只在Decoder结构中使用
    • Encoder中self-attention是并行计算的
    • Decoder中的cross-attention计算,其Key和Value是Encoder输出的结果
    • LLM都是Decoder-only结构,不涉及上面两种Attention
    • KVCache占用空间大的解决办法:GQA优化技术

GQA

notion image
GQA总结:
  1. 与原始实现兼容,仅仅复制一下,就可以与原来实现兼容
  1. 正常训练好的模型,可以方便的变成MQA与GQA模型
  1. GQA介于MHA和MQA之间

RMSNorm

💡
归一化Norm目的:加速训练、提升模型性能并增强稳定性
  • 加速训练
    • 缓解内部协变量偏倚(各层输入分布在训练中改变)
    • 允许更高的学习率
  • 提升模型性能
    • 防止梯度爆炸/消失
    • 正则化效果(引入噪音,放置过拟合)
  • 增强模型稳定性
    • 减少对初始化的依赖
    • 适应不同的网络结构
数据分布标准化:均值为0,方差为1

BatchNorm VS. LayerNorm

notion image
💡
BatchNorm是把同一batch中,不同实例中相同位置的数据一起计算均值方差来做归一化,在图像任务中常用;LayerNorm只关注输入文本(每一行)自身进行计算,在文本任务中常用。
 

RMSNorm

沿用LayerNorm的思想,相对于LayerNorm减少计算开销(不需要计算均值) 给定输入向量 ,RMSNorm 的计算公式如下:
 

SwiGLU

常见的激活函数

Sigmoid
ReLU
Swish/SiLU
GLU:Gated Linear Units
SwiGLU: Swish+GLU
SwiGLU 是一种结合了Swish激活函数与GLU机制的激活函数
其中 分别是输入 的两个线性变换矩阵
该公式可以理解为:
  1. 对输入x进行两次线性变换
  1. 将其中一个结果通过Swish激活函数
  1. 将两个结果逐元素相乘,形成最终输出
notion image
SwiGLU激活函数需要进行三次矩阵乘法运算,相比于ReLU等传统激活函数计算复杂度更高,然而SwiGLU带来的性能提升显著
  • 更好的泛化性能:SwiGLU在处理复杂的文本数据是表现出更好的泛化性能
  • 稳定的梯度流:Swish激活函数平滑的曲线特性有助于稳定梯度

RoPE

动机(模型的外推性)

苏神称位置编码的意义是破坏Transformer结构的完全对称性。可以这样理解,假设做一个文本分类任务,输入经过Transformer得到输出embedding,然后global pooling再去分类。如果没有Position Embedding,打乱原来句子的顺序会得到同样的结果,这显然是不对的。
Google第一版本位置编码形式的初衷:“通过绝对位置编码来表达相对位置信息“,并第一次给出了Rotary Position Embedding的形式,形式上其和Google第一版本Position Embedding最大的差别是将“加性位置编码”改为“乘性位置编码”,使得 计算的结果中蕴含 的相对位置信息。
notion image
可以看到,苏神是将原始向量相邻的两两为一组,而palm则是将前1/2和后1/2分为两组,但这样的分组方式并不会改变RoPE的初衷,依然可以保证计算结果中蕴含有相对位置信息。
训练时最长只见过100个词的句子,而推理时生成1000个词的句子,模型泛化性能变差,纵观Transoformer-Decoder结构,与输出长度相关的只有两个模块:
  • Attention计算,生成的句子越长,Attention计算过程很慢
  • 位置编码,绝对的位置编码导致有很多训练时没见过的位置信息。
Attention计算两个向量内积时,只关心两个向量的相对位置,相对位置不受绝对位置的影响,能够使模型具有更好的泛化性能、外推性更好
notion image
RoPE位置编码的要点:
  1. 先做多Head的投影,再加上旋转位置编码
  1. 用的仍然是正弦和余弦函数操作,当两个向量计算内积时,直接转换成包含相对位置的信息
  1. 只对Q,K做旋转位置编码,V不变
  1. d为embedding的维度,m为绝对位置
💡
旋转位置编码中所谓旋转的含义:两个向量的相对位置变化就是旋转的角度
 

SentencePiece VS. Titoken

SentencePiece

SentencePiece 在大模型领域主要用于文本的 分词编码
  • 分词 是将文本分割成一个个独立的词语或符号。传统的中文分词方法,例如 BMM 分词、HMM 分词,都是基于规则的,需要人工制定分词规则。而 SentencePiece 则是基于 无监督学习 的,它可以自动学习文本的语义和结构,并根据学习结果进行分词。
  • 编码 是将分词后的词语或符号转换为数字形式,以便计算机能够处理。SentencePiece 使用了一种称为 字节对编码 的方法,它可以将每个词语或符号编码成一个或多个字节。字节对编码的优点是能够有效地利用空间,并且可以将词语或符号之间的关系编码到编码中。
SentencePiece 在大模型领域具有以下优势:
  • 分词效果好,能够准确地识别词语和符号的边界。
  • 编码效率高,能够节省空间。
  • 能够将词语或符号之间的关系编码到编码中,有利于模型学习。

SentencePiece 自监督训练原理

SentencePiece 的自监督训练模型原理是通过 无监督学习 的方式,学习文本的语义和结构,并根据学习结果进行分词和编码。
具体来说,SentencePiece 的训练过程可以分为以下几个步骤:
  1. 数据准备:首先需要准备一个文本语料库,语料库中的文本可以是任何类型,例如新闻文章、书籍、代码等。
  1. 模型训练:使用无监督学习算法训练 SentencePiece 模型,模型的输入是文本语料库,输出是分词后的文本。
  1. 模型评估:使用评估指标评估模型的性能,例如分词准确率、召回率等。
SentencePiece 使用的无监督学习算法是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号。通过这种方式,模型可以学习文本的语义和结构。
 
在 SentencePiece 中,MLM 的具体实现如下:
  1. 随机选择文本中的部分词语或符号进行遮蔽。
  1. 将被遮蔽的词语或符号替换为一个特殊符号,例如 [MASK]
  1. 将处理后的文本输入模型,让模型预测被遮蔽的词语或符号。
通过这种方式,模型可以学习到被遮蔽词语或符号与周围词语或符号之间的关系,从而提高分词和编码的准确性。
 
SentencePiece 的自监督训练模型具有以下优势:
  • 不需要人工制定分词规则,能够自动学习文本的语义和结构。
  • 分词效果好,能够准确地识别词语和符号的边界。
  • 编码效率高,能够节省空间。
 
工具
分词方法
编码方式
优势
劣势
SentencePiece
无监督学习
字节对编码
分词效果好、编码效率高
需要训练模型
Jieba
最大似然法
哈希编码
分词效果好、速度快
需要人工制定分词规则
Hmmseg
隐马尔科夫模型
哈希编码
分词效果好、支持多种语言
需要训练模型
Stanford CoreNLP
基于规则
哈希编码
分词效果好、支持多种语言
速度较慢
使用建议:
  • 如果需要对中文文本进行分词,并且对分词效果要求较高,可以选择 SentencePieceJiebaHmmseg
  • 如果需要对多种语言文本进行分词,可以选择 Stanford CoreNLP
  • 如果需要对文本进行分词和编码,并且对速度要求较高,可以选择 Jieba
  • 如果需要对文本进行分词和编码,并且对分词效果要求较高,可以选择 SentencePieceHmmseg
 

ToToken简介

Tiktoken 的功能与 SentencePiece 类似,都是用于文本的 分词编码
Tiktoken 是一个基于 BPE 算法的 快速分词器,它专门针对 GPT-4ChatGPT 等大模型进行了优化。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. 统计文本中所有字节对出现的频率
  1. 找到出现频率最高的字节对
  1. 将该字节对替换为一个新的字节
  1. 重复步骤 1-3,直到满足终止条件
终止条件 可以是:
  • 文本中所有字节对的出现频率都低于某个阈值。
  • 文本的编码长度达到某个要求。
BPE 算法具有以下优势:
  • 分词效果好,能够准确地识别词语和符号的边界。
  • 编码效率高,能够节省空间。
  • 能够将词语或符号之间的关系编码到编码中,有利于模型学习。

© Morgan Woods 2024 - 2025