大语言模型:从训练到推理

引言

2023年,我第一次使用ChatGPT时,就被它的生成能力、精准的上下文理解能力和多任务处理能力惊艳到了。ChatGPT 不仅能自然地回答问题、总结复杂信息,还能写文章、生成代码、分析 Bug,甚至在连续多轮对话中保持上下文一致性。它不像传统意义上的搜索引擎,也不像我过去接触过的任何自然语言处理模型,更像是在和一个真正理解语言的系统交流。

在这之前,我对自然语言处理的理解还停留在经典的任务范式上:分词、机器翻译、情感分类、命名实体识别……这些任务通常目标明确、边界清晰,模型往往针对某一具体任务设计和训练。

尽管我知道 ChatGPT 基于 Transformer 架构,也了解Transformer是一种强大的序列建模方法:通过 Self-Attention 建立 token 之间的依赖关系,从而更好地捕获上下文信息。但我很难把这些对局部的技术理解与 ChatGPT 所展现出的强大能力联系起来。

在看了 Andrej Karpathy 在 Microsoft Build 2023 的分享后,我才对大语言模型的训练有了一个初步的整体认识。

Andrej Karpathy 将 GPT 的训练过程概括为四个关键阶段:

  • Pretraining(预训练)
  • Supervised Finetuning(监督微调)
  • Reward Modeling(奖励建模)
  • Reinforcement Learning(强化学习)

这四个阶段都需要不同规模的数据集及不同类型的算法,会产出不同类型的模型,所需要的资源也有非常大的差别。其中,后两个阶段(Reward Modeling 和 Reinforcement Learning)在后来被统称为 RLHF(基于人类反馈的强化学习,Reinforcement Learning from Human Feedback):先通过人类偏好数据训练奖励模型,再利用强化学习优化模型生成行为,使其输出更加符合人类预期。

image-RSNR.png

不过,构建一个可用的大语言模型产品,细细来讲的话,不止这四个阶段。

从工程落地的角度来看,它通常还包括大规模文本数据的收集与清洗(数据准备)、模型架构的设计、在海量数据上的预训练、针对具体任务的监督微调、基于人类偏好的对齐训练,以及最终的推理优化与服务部署。每一个环节都涉及复杂的工程权衡与技术细节,共同决定了模型的能力边界。

从海量文本中学习语言规律,到通过人工标注数据学会“听懂指令”,再到借助人类偏好不断调整生成行为——大语言模型的能力,正是在这一系列训练阶段中逐步构建出来的。

而更令人惊讶的是,这一切能力的起点,其实异常朴素:预测下一个 token。

正是这个看似简单的目标,在海量数据、超大规模参数和训练流程的共同作用下,催生了大语言模型。

本文将从以下几个方面,分享我对大语言模型从构建到推理过程的理解:

  1. 数据准备与预处理
  2. 模型架构设计
  3. 模型训练
  4. 模型评估体系
  5. 模型推理与部署

数据准备与预处理

在预训练阶段,大语言模型从海量高质量文本数据中学习广泛的知识,这些知识存储在模型参数当中。高质量的预训练能够为大语言模型的能力奠定坚实的基础,通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,掌握广泛的世界知识,具备解决众多下游任务的性能潜力。因此,预训练语料的规模和质量对于提升大语言模型的能力至关重要。

数据来源

为了构建功能强大的大语言模型,需要从多元化的数据源中收集海量数据来进行训练。现有的大语言模型主要将各种公开的文本数据进行混合,作为预训练语料。语料来源主要包括:网页、书籍、代码、对话文本等。

根据来源的不同,预训练语料主要分为两种类型:

  • 通用文本数据:涵盖了网页、书籍和对话文本。
  • 专用文本数据:如多语言文本数据、科学文本数据和代码语料等。

由于通用文本数据规模较大、多样性强且易于获取,大多数大语言模型都会收集大量的通用文本数据,以增强模型的语言建模能力。此外,为了进一步提升大语言模型在特定专业任务上的表现,预训练语料的范围还扩展至更专业的专用数据集。专用数据集有助于提升大语言模型解决特定下游任务的能力。

数据预处理

在收集了丰富的文本数据之后,为了确保数据的质量和效用,还需要对数据进行预处理,从而消除低质量、冗余、无关甚至可能有害的数据。数据预处理主要包括以下内容:

  • 质量过滤:语种过滤、统计过滤、关键词过滤、分类器过滤
  • 敏感内容过滤:有毒内容、隐私内容
  • 数据去重:句子级别、文档级别、数据集级别
  • 词元化(分词):BPE分词、WordPiece分词、Unigram分词

质量过滤

质量过滤的主要目的是剔除低质量数据,筛选出高质量文本。由于训练语料通常来自互联网,不可避免地包含大量无意义、混乱甚至有害的信息。如果不进行过滤,这些低质量数据会损害模型的性能。作为数据预处理流程的一部分,质量过滤对于提升大语言模型训练阶段的训练质量和减少模型偏见有关键作用。

具体来说,质量过滤的主要目的包括:

  • 提高数据可用性: 去除无意义的符号、乱码或结构混乱的文本。
  • 减少模型偏见: 过滤掉包含歧视性、攻击性或非主流价值观的内容,使模型输出更符合社会伦理。
  • 保障训练稳定性: 避免模型学习到错误的语法模式或逻辑混乱的表达。

目前主要有以下两种质量过滤方法:

(1)基于启发式规则的方法

这种方法通过设计一系列规则或策略来识别和删除低质量的数据,这些规则或策略基于对数据特性的理解和分析,可以提高数据的质量和可用性,例如:

  • 语种过滤:根据目标模型的语言需求过滤无关语言,但通常会保留高质量的英文数据以辅助其他语种的训练。
  • 统计过滤:根据标点符号分布、符号与单词比率、句子长度等特征判断文本质量。
  • 关键词过滤:利用黑名单关键词库进行扫描剔除。

基于启发式规则的方法简单直接,计算成本低,规则透明,但有时可能过于僵化,不够灵活,不能处理复杂的语言现象。

(2)基于分类器的方法

基于分类器的方法从语料库种选取部分代表性的数据进行质量标注,训练出一个文本质量分类器(如FastText、BERT、RoBERTa等)。在构建样本时,高质量数据作为正样本,含有不良内容或低质量数据作为负样本。利用这个分类器可以精准地识别和过滤低质量数据,提升语料库的质量。但基于分类器的方法也存在一定的局限性,分类器可能会过滤掉方言、口语和社会文本中的高质量信息。

敏感内容过滤

为了防止模型生成有害输出或泄露隐私,必须在训练前对有毒内容和隐私信息进行处理。

除了去除低质量内容,收集到的数据可能还包括有毒内容或隐私内容,需要进一步进行更为细致的过滤和处理。

(1)过滤有毒内容与偏见内容

有毒内容与偏见的过滤主要依赖毒性文本分类器(如Jigsaw评论数据集训练的模型),识别暴力、歧视性言论、仇恨表达等内容。

Jigsaw评论数据集提供了用于训练毒性分类器的数据。这个数据集种收集了近160K条评论数据,标注类别包括“有毒”、“严重有毒”、“有威胁”、“侮辱性”、“暴力”以及“身份仇恨”等。利用Jigsaw进行训练,可以构建出高效的毒性分类器。通过合理设置阈值,训练好的分类器能够有效识别并过滤含有有毒内容的文本。

(2)隐私内容脱敏处理

预训练文本数据大多来自于互联网,其中可能包括用户生成的敏感信息或可识别的个人信息(Personally Identifiable Information,PII),如姓名、地址和电话号码等。如果这些信息不加处理,可能会有隐私泄露风险。在预处理阶段,需要对这些可识别的个人信息进行处理,例如使用特定的占位符(如 [EMAIL_ADDRESS] 进行替换。

数据去重

由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据种的重复模式,可能导致对于这些模式的过度学习。论文 Scaling Laws and Interpretability of Learning from Repeated Data 的研究发现,预训练语料种出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据,进而影响模型的性能。此外,这些数据也可能导致训练过程的不稳定(如训练损失震荡),可能导致训练过程崩溃。此外,为了避免数据集污染问题,还需要从预训练数据集中删除在测试集种可能出现的重复或相关文本,从而防止训练集和测试集之间的重叠。去重可以在句子级别、文档级别和数据集级别等多种粒度上进行:

  • 文档级去重:检测并删除高度相似或完全一致的文档。对于完全相同的文本,可使用哈希(Hash)精确匹配;对于轻微改写或模板生成的近似文本,广泛采用MinHash、SimHash等局部敏感哈希(LSH)算法计算Jaccard相似度。
  • 句子/片段级去重:消除包含重复单词、短语或长公共子串的句子,降低模板句和重复段落的干扰。
  • 评测集去污染:确保训练集中不包含基准测试(Benchmark)的题目、答案或其近似改写,否则会导致模型评估分数虚高。这需要通过精确匹配、N-gram重叠或Embedding相似度等手段,在train/val/test集之间进行严格的隔离去重。

数据对训练效果的影响

在训练大语言模型时,预训练数据的质量对模型能力的影响至关重要。已有的研究表明,基于含有噪音、有毒和重复数据的低质量语料库进行预训练,会严重损害模型性能。

(1)数据规模的影响(Scaling Law)

数据规模对大语言模型的影响可以参考下面两篇论文提出的两种扩展法则:

根据 Chinchilla Scaling Law,在计算资源一定的情况下,模型的性能会随着参数量和数据量的增加而呈幂律提升。研究表明,为了达到计算最优的训练策略,全量预训练的 token 数应约为模型参数的20倍左右。如果数量远小于此比例,模型可能处于“欠训练”状态,其中庞大的参数容量无法倍充分激活,潜力未被充分挖掘。

人类语言极其复杂,包含丰富的语法、语义和文化背景。大规模的数据集为模型提供了海量的示例,使其能够通过统计规律学习到从简单语法到复杂逻辑推理的各种模式。随着数据规模的扩大,模型不再仅仅依赖记忆特定的训练样本,而是能将学到的模式泛化到全新的、未见过的任务中,从而展现出卓越的上下文学习和少样本学习能力。

(2)数据质量的影响

数据质量决定模型的可靠性与稳定性,高质量数据不仅是模型准确性的保障,更是减少训练成本的关键。

清晰、结构化且标注精准的数据能为模型提供清晰的优化信号。相比之下,混乱或充满噪声的数据会引入梯度噪声,导致模型在学习过程中产生冲突的信号,表现为训练损失曲线剧烈震荡或难以收敛。使用高质量数据进行训练,可以带来更平滑的损失曲线和更快的收敛速度,显著降低生产环境中的错误率。

大模型极易放大数据集中的缺陷。如果训练数据中包含错误事实、偏见或刻板印象,模型会将其内化并在生成内容时重现这些谬误,引发严重的“大模型幻觉”。此外,若数据未能及时反映现实世界的演变,模型就会出现“数据漂移”,导致响应过时或不可靠。通过严格的质量控制过滤无效样本并增强代表性,可以有效减少这些问题,提升模型在不同场景下的公平性和鲁棒性。

在模型扩展阶段,低质量数据会成为巨大的瓶颈。随着模型参数增多,它们会敏锐地捕捉到早期实验中看似无害的小错误,导致准确率大幅下降,团队不得不浪费大量昂贵的算力去克服数据缺陷带来的负面影响。因此,“几百条高质量数据往往胜过几万条脏数据”。高质量的数据集能够确保模型平稳扩展,避免不必要的重复训练周期,大幅降低试错成本。

词元化

词元化(Tokenization)是数据预处理过程种的一个关键步骤,目的是将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。

在传统的自然语言处理中,通常以单词为基本处理单元,模型依赖于预先设定的词表 ​\mathbb{V} ,在对输入词序列编码时,这些词表示模型只能处理词表种存在的词。在使用时如果遇到不在词表中的未登录词(Out-of-Vocabulary,OOV)模型无法为其生成对应的表示,只能给予这些未登录词一个默认的通用表示。除此之外,早期的统计语言模型(n-gram)还面临着维度灾难,随着词表的增大,模型需要存储的参数呈指数级增长。同时,传统的 One-hot 编码或静态词嵌入(如Word2Vec、GloVe)还存在语义盲区,它们无法识别同义词,难以区分多义词在不同语境下的含义(如“苹果”是指水果还是苹果公司),也无法捕捉词语之间的反义或概念关联关系。

在基于深度学习的词表示模型中,会预先在词表中加入一个默认的 [UNK] 标识,表示未知词,并在训练时将 [UNK] 作为词表示矩阵的一部份一起训练,通过引入某些相应机制来更新 [UNK] 向量的参数。使用时,对全部未登录词使用 [UNK] 向量作为表示向量。不过这种使用固定词表的词表示模型对词表大小选择比较敏感,词表过小,未登录词比例较高,影响模型性能;词表过大,大量低频词出现在词表中,这些低频词的词向量很难得到充分学习。

为了缓解未登录词问题,一些工作通过利用亚词级别的信息(字词分词)构造词表示向量。一种直接的解决思路是为输入建立字符级别表示,并通过字符向量的组合获得每个单词的表示,以解决数据稀疏问题。不过,单词中的词根、词缀等构词模式往往跨越多个字符,基于字符表示的方法很难学习跨度较大的模式。为了充分学习这些构词模式,研究人员提出了子词词元化(Subword Tokenization)方法。

词元表示模型会维护一个词元表,其中既存在完整的单词,也存在形如 “c”、“re”、“ing”等单词的部分信息,称为子词(Subword)。词元表示模型将每个词拆成词表内的词元。例如将单词“reborn”拆分成“re”和“born”。模型随后查询每个词元的表示,将输入重新组成词元表示序列。当下游模型需要计算一个单词或词组的表示时,可以将对应范围内的词元表示合成需要的表示。因此词元表示模型能够较好的解决自然语言处理系统中未登录词的问题。词元化(Tokenization)就是将原始文本分割成词元序列的过程。词元切分也是数据预处理中关键的步骤。

常见的词元化方法有:

  • 字节对编码(Byte Pair Encoding,BPE)最早作为数据压缩算法出现,后被引入 NLP。BPE 采用自底向上的合并策略:从字符级别开始,反复统计语料中相邻符号对的出现频率,并将频率最高的符号对合并为一个新符号,直到词元表大小达到预设值。BPE 简单高效,GPT 系列模型早期版本采用此方法。
  • 字节级别BPE(Byte-level BPE),是 BPE 的一种拓展,词元分割粒度更细。是 GPT-2、GPT-3、GPT-4 等模型实际使用的方式。它与 BPE 的核心区别在于初始词元表:不再假设输入是字符序列,而是直接使用 UTF-8 编码中的字节(0–255)作为原子单元。这样可以保证任何文本(包括所有语言、emoji、特殊符号)都能被无损、无 OOV 地表示,同时词元粒度更细,对噪声文本的鲁棒性更强。
  • WordPiece,谷歌内部非公开的分词算法,BERT就采用了这个分词算法。
  • Unigram Language Model:与 BPE/WordPiece 的“自底向上合并”相反,Unigram 采用自顶向下的剪枝策略。它首先从一个非常大的候选子词集合(包括所有字符和常见子串)出发,然后反复评估:删除哪个子词会使得整个语料的似然损失最小?就删除那个子词。最终保留的子词集即为词元表。该方法在理论上更优雅,能够为同一字符串输出多个带概率的切分方案。T5、XLM 等模型采用此方法。
  • SentencePiece:一种与语言无关的分词工具,直接在原始的Unicode文本上进行操作,无需预先进行空格分词等预处理,适合中文、日文等没有天然空格边界的语言。SentencePiece 并非一种独立的算法,而是一个与语言无关的词元化工具库。

模型架构设计

在Transformer被提出钱,语言模型主要基于RNN(LSTM/GRU)或CNN。RNN的串行计算使得模型训练慢,且难以捕捉长距离依赖,CNN虽可并行,但感受野有限。2017年提出的Transformer凭借注意力机制和高度并行化在NLP领域取得了绝对优势。今天,几乎所有的大语言模型都是基于Transformer开发 decoder-only 变体。

当前,绝大多数大语言模型都采用类似GPT的架构,使用基于Transformer结构构建的仅由解码器组成的网络结构,采用自回归的方式构建语言模型,但是在位置编码、层归一化位置、激活函数等细节上各有不同。

近年来的所有大语言模型几乎都基于Transformer,其主要可以分为:

  • Encoder-Decoder:以 T5、BART 为代表。Encoder 负责双向理解输入,Decoder 负责单向自回归生成。虽然在翻译、文本摘要等特定任务上表现优异,但由于结构相对复杂,在超大规模参数下的训练效率和零样本(Zero-shot)泛化能力不及纯 Decoder 架构。
  • Encoder-Only:以 BERT、RoBERTa 为代表。其核心是掩码语言模型(MLM),擅长文本理解、分类和抽取任务,但由于缺乏自回归生成能力,无法胜任目前主流的对话与创作交互
  • Decoder-Only:以 GPT 系列、Llama、Qwen 为代表。目前大语言模型绝对的主流范式。

Decoder-Only是当前大语言模型中的绝对主流。Decoder-Only架构在多任务上下文学习(In-Context Learning)和零样本泛化上展现出了更强的涌现能力,并且能够在一定程度上简化KV Cache的管理复杂度,使得模型在大规模并发推理时能够获得更高的吞吐量。

Transformer的核心组件

归一化方法

大语言模型训练过程中经常会出现不稳定的问题。为了应对这一问题,深度学习方法通常采用归一化策略来加强神经网络训练过程的稳定性。归一化技术可以有效的缓解模型训练过程中潜在的不稳定、收敛速度慢等问题。原始的Transformer 使用的是层归一化(Layer Normalization,LN),随着研究的不断深入,后续又出现了其他归一化方法,如均方根层归一化(Root Mean Square Layer Normalization,RMSNorm)、DeepNorm等。

(1)LayerNorm

在早起的深度学习模型中,广泛采用的是批次归一化(Batch Normalization,BN),然而,BN难以处理可变长度的序列数据和小批次数据。因此,相关研究提出了层归一化这一技术,针对数据进行逐层归一化。具体而言,层归一化会计算每一层中所有激活值的均值 ​\mathbf{\mu} 和方差 ​\mathbf{\sigma},从而重新调整激活值的中心和缩放比例:

\begin{aligned} \text{LayerNorm}(\mathbf{x}) &= \frac{\mathbf{x-\mu}}{\mathbf{\sigma}}\cdot \mathbf{\gamma} +\mathbf{\beta} \\ \mathbf{\mu} &= \frac{1}{H}\sum_{i=1}^{H}x_i \\ \mathbf{\sigma} &= \sqrt{\frac{1}{H}\sum_{i=1}^H(x_i-\mu)^2} \end{aligned}

其中,​H 代表特征的维度,​x_i 代表该层中第 ​i 个特征的数值。

(2)RMSNorm

为了提高层归一化的训练速度,RMSNorm进利用激活值总和的均方根 ​\text{RMS}(\mathbf{x}) 对激活值进行重新缩放。使用RMSNorm 的Transformer 模型相较于之前LayerNorm训练的模型在训练速度和性能上具有一定优势。其计算公式如下:

\begin{aligned} \text{RMSNorm}(\mathbf{x}) &= \frac{\mathbf{x}}{\text{RMS}(\mathbf{x})}\cdot \gamma \\ \text{RMS}(\mathbf{x}) &= \sqrt{\frac{1}{H}\sum_{i=1}^{H}x_i^2} \end{aligned}

(3)DeepNorm

DeepNorm由微软提出,旨在稳定深层Transformer的训练。具体而言,DeepNorm在LayerNorm的基础上,在残差连接中对之前的激活值 ​\mathbf{x} 按照一定比例 ​\alpha 进行放缩。通过这一简单操作,Transformer的层数可以被成功地扩展至1000层,进而有效提升了模型性能与训练稳定性。其计算公式如下:

\text{DeepNorm}(\mathbf{x}) = \text{LayerNorm}(\mathbf{\alpha\cdot x}+\text{Sublayer}(\mathbf{x}))

其中,Sublayer 表示 Transformer 层中前馈神经网络或自注意力模块。

归一化模块位置

为了加强大语言模型训练过程的稳定性,除了归一化方法外,归一化模块的位置也具有重要的影响。归一化模块的位置通常有三种选择:

  • 层后归一化(Post-Layer Normalization,Post-Norm)
  • 层前归一化(Pre-Layer Normalization,Pre-Norm)
  • 夹心归一化(Sandwich-Layer Normalization,Sandwich-Norm)

LayerNorm.svg

(1)Post-Norm

Post-Norm 是在原始Transformer 中使用的一种归一化方法,归一化模块放置于残差计算之后

\text{Post-Norm}(\mathbf{x}) = \text{Norm}(\mathbf{x}+\text{Sublayer}(\mathbf{x}))

在能够顺利收敛的前提下,Post-Norm 的模型最终性能通常比 Pre-Norm 稍微好一点点。但它的缺点是训练难度大,在深层网络中容易导致梯度消失或爆炸,因此必须依赖精心设计的学习率预热等技巧才能正常训练。

(2)Pre-Norm

Pre-Norm 将归一化模块放在每个子层之前

\text{Pre-Norm}(\mathbf{x}) = \mathbf{x} + \text{Sublayer}(\text{Norm}(\mathbf{x}))

Pre-Norm 在模型初始化时就能带来更稳定的梯度,即使不使用复杂的学习率预热(learning rate warm-up)策略,模型通常也能正常训练。梯度可以通过归一化后的激活值更直接地反向传播。

(3)Sandwich-Norm

在Pre-Norm 的基础上,Sandwich-Norm 在残差连接之前增加了额外的 LayerNorm,避免Transformer层的输出出现数值爆炸的情况。

\text{Sandwich-Norm}(\mathbf{x}) = \mathbf{x} +\text{Norm}(\text{Sublayer}(\text{Norm}(\mathbf{x})))

本质上,Sandwich-Norm 可以看作是 Pre-Norm 和 Post-Norm 两种方法的组合。

激活函数

激活函数主要是为神经网络引入非线性变化,从而提升神经网络的模型能力。在大语言模型中,常用的激活函数有:

  • ReLU
  • GeLU
  • Swish
  • SwiGLU
  • GeGLU

其数学形式分别为:

\begin{aligned} \text{ReLU}(\mathbf{x}) &= \max(\mathbf{x,0})\\ \text{GeLU}(\mathbf{x}) &= 0.5\mathbf{x} \otimes \left[1 + \text{erf}\left(\frac{\mathbf{x}}{\sqrt{2}}\right)\right], \quad \text{erf}(x) = \frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-t^2} dt \\ \text{Swish}(\mathbf{x}) &= \mathbf{x} \otimes \text{sigmoid}(\mathbf{x}) \\ \text{SwiGLU}(\mathbf{x}) &= \text{Swish}(\mathbf{x}_1) \otimes \mathbf{x}_2 \\ \text{GeGLU}(\mathbf{x}) &= \text{GeLU}(\mathbf{x}_1) \otimes \mathbf{x}_2 \\ \end{aligned}

其中,​\otimes 表示逐元素乘法,​\text{erf} 表示误差函数

注意力机制

注意力机制是Transformer 的核心技术,它能够针对序列中的词元对构建交互关系,聚合来自不同位置的语义信息。常见的注意力机制有以下几种:

  • 自注意力机制(Self-Attention):在原始Transformer 中使用的注意力机制。
  • 稀疏注意力机制,如滑动窗口注意力机制(Sliding Window Attention,SWA)。自注意力机制具有较强的建模能力,但是它的计算复杂度较高​O(n^2),在处理长序列时有较大的计算和存储开销。
  • 多查询(MQA)/分组查询(GQA)注意力:为了提升注意力机制的效率,多查询注意力提出针对不同的头共享相同的键和值变换矩阵。这种方法减少了访存量,提高了计算强度,能够实现更快的解码速度。

位置编码

参考:

Attention 机制本身对顺序不敏感,具有置换不变性,仅使用注意力机制无法捕捉序列中的顺序关系,因此需要引入位置编码以显式告诉模型 token 的位置信息。

常用的位置编码方式有:

  • 绝对位置编码(Absolute Positional Encoding):正弦/余弦函数(原始Transformer)或可学习的嵌入(GPT-2/3)。外推性较差,无法处理超出训练长度的文本。
  • 相对位置编码(Relative Positional Encoding):Transformer-XL、T5 使用偏置项表示相对距离,外推性较好。
  • 旋转位置编码(Rotary Position Positional Encoding,RoPE):LLaMA、Qwen、PaLM等模型采用的位置编码,通过对query 和 key 的向量施加旋转矩阵来编码相对位置,兼具绝对位置索引和相对位置距离,具备可外推性。
  • 基于注意力偏置的位置编码(Attention With Linear Biases,ALiBi):不添加位置嵌入,而是在注意力分数中加上与距离成线性关系的负偏置,外推效果好。

高级架构优化与扩展

混合专家模型

随着稠密模型(Dense Model)遭遇模型容量瓶颈,混合专家模型(Mixture Of Experts,MoE)在当前顶尖大模型中占据了主导地位。

MoE是一种采用多专家协同架构的大语言模型技术。该架构旨在通过模块化的设计,在显著降低训练与推理成本的同时,实现更大的模型参数规模与更高效的推理速度。目前,包括 GPT-4、DeepSeek 系列以及通义千问在内的多个主流大语言模型均采用了 MoE 架构。

MoE 的核心思想源于“分而治之”(Divide and Conquer)策略,通过将复杂任务分解为多个子任务,由不同的“专家”模块并行处理。其架构主要包含以下三个核心组件与机制:

  1. 专家网络(Experts):MoE 将传统 Transformer 中单一的、计算密集的前馈神经网络(FFN)层替换为多个并行的 FFN 网络(即“专家”)。每个专家网络在训练过程中会针对特定类型的数据或任务进行专业化建模,从而提升模型在特定领域的准确性与表达能力。
  2. 门控网络/路由器(Gating Network / Router):这是一个负责动态决策的轻量级网络。当输入向量(Token)进入 MoE 层时,门控网络会根据输入特征计算每个专家的匹配权重(路由分数),从而决定将当前的 Token 分配给哪些专家进行处理。
  3. 稀疏激活与 Top-K 路由(Sparse Activation & Top-K Routing):这是 MoE 架构实现计算效率质变的关键。门控网络并非激活所有专家,而是通过 Top-K 机制,仅筛选出得分最高的 K 个专家(通常 K 取值为 1 或 2)参与当前的前向传播计算。这意味着,尽管模型的总参数量(所有专家参数之和)极其庞大,但每次推理实际激活的计算量(FLOPs)仅占极小比例。

长上下文扩展技术

为了使预训练模型支持更长的序列,有以下几种长上下文扩展技术:

  • 位置编码插值
    • 线性插值:直接缩放位置索引
    • NTK-aware插值:高频维度少插值,低频维度多插值,保持相对距离。
    • YaRN:结合NTK和注意力分布缩放
  • 长上下文窗口外推:AliBi、RoPE的 RoPE 缩放或注意力logit 缩放。

模型训练

预训练

预训练(Pretraining)阶段需要利用海量的训练数据(数据来自互联网网页、维基百科、书籍、GitHub、论文、问答网站等),构建包含数千亿甚至数万亿单词的具有多样性的内容。利用由数千块高性能GPU和高速网络组成的超级计算机,花费数十天完成神经网络参数训练,构建基础模型(Base Model)。基础模型对长文本进行建模,使模型具有语言生成能力,根据输入的提示词,模型可以生成文本补全句子。

预训练任务

在进行模型的大规模预训练时,往往需要设计合适的自监督预训练任务,使得模型能够从海量无标注数据中学习到广泛的语义知识与世界知识。目前,常用的预训练任务主要分为三类:

  • 语言建模(Language Modeling,LM)
  • 去噪自编 码(Denoising Autoencoding,DAE)
  • 混合去噪器(Mixture-of-Denoisers,MoD)

语言建模

语言建模任务是目前绝大部分大语言模型广泛采用的预训练任务。该任务的核心在于“预测下一个词元”,并且经常被应用于训练 Decoder-only 的大语言模型。给定一个词元序列 ​\mathbf{u} =\{u_1,\cdots,u_T\},语言建模任务的目标定义为词元的预测任务:基于序列中当前位置之前的词元序列 ​\mathbf{u}_{<t} ,采用自回归的方式对于目标词元​u_t进行预测。在训练过程中,模型通常根据以下的损失函数进行优化:

\mathcal{L}_{LM}(\mathbf{u}) = \sum_{t=1}^{T}\log P(u_t |\mathbf{u}_{<t})

尽管这种对下一个词元的预测看似简单,但当于训练数据足够庞大和丰富时,大语言模型便能够学习到自然语言的生成规律与表达模式。

去噪自编码

去噪自编码任务被广泛应用于预训练语言模型,如BERT、T5等。在去噪自编码任务中,输入文本经过一系列随机替换或删除操作,形成损坏的文本​\mathbf{u}/\tilde{\mathbf{u}}。模型的目标是根据这些损坏的文本恢复出被替换或删除的词元片段​\tilde{\mathbf{u}},去噪自编码的损失函数可以用以下数学公式表示:

\mathcal{L}_{DAE}(\mathbf{u}) = \log P(\tilde{\mathbf{u}}|\mathbf{u}/\tilde{\mathbf{u}})

与语言建模相比,去噪自编码任务的实现更为复杂,需要设定额外的优化策略,如词元替换策略、替换片段长度、替换词元比例等。这些策略的选择会直接影响模型的训练效果。

混合去噪器

混合去噪器(Mixture-of-Denoisers, MoD),也被称为 UL2 损失(UL2 loss),是大语言模型预训练中一种先进的统一预训练目标。它的核心思想是将传统的“语言建模”和“去噪自编码”这两大类预训练任务,统一视为不同类型的去噪任务,从而让模型在一次预训练中学习到更全面的能力。

混合去噪器主要定义了三种不同的“去噪器”,让模型在预训练时随机切换学习:

  • S-去噪器(S-Denoising/顺序去噪):其目标与前缀语言建模一致,要求模型根据给定的前缀文本,自回归地生成后续合理的后缀文本。主要训练模型预测下一个词的生成能力。
  • R-去噪器(R-Denoising/常规去噪):类似于标准的去噪自编码任务,它会随机屏蔽输入序列中的词元,且每个被屏蔽的词元片段较短。模型需要利用双向上下文来还原这些被损坏的短跨度信息。
  • X-去噪器(X-Denoising/极端去噪):是一种难度更高的去噪自编码任务,它采用更长的屏蔽词元片段或更高的文本损坏比例。这种高强度的文本数据损坏迫使模型必须学习更深层、更全面的文本表示才能精准还原原始信息。

混合去噪器的一个巧妙设计是引入了“模式切换”的概念。在预训练时,输入文本前会加上特定的哨兵令牌(如 [S][R][X])来告诉模型当前使用的是哪种去噪器。
经过预训练后,模型能够根据下游任务的需求,自适应地在 R、S 和 X 去噪模式之间动态切换,从而在面对不同类型的任务(如文本生成、文本理解、完形填空等)时都能表现出色。

监督微调

如果把大语言模型的预训练比做让模型读万卷书,使其拥有了海量的世界知识和语言基础能力,那么监督微调(Supervised Fine Tuning,SFT),也称为指令微调,就是教它“怎么说话”和“怎么做事”。

在预训练阶段,模型的核心优化目标是“预测下一个词元”,因此当你向一个纯预训练基础模型(Base Model)提问时,它可能会顺着你的话继续向下续写或编造,而不是回答问题。例如,你对Base Model 提问“北京的天气怎么样”时,它很可能不是在回答你,而是在推测“天气怎么样”这句话之后最可能出现的文本——比如“天气怎么样是很多人关心的话题”或者继续编造一段天气预报。

SFT 的核心目标,就是通过高质量的“指令-回答”数据对,让模型学会遵循人类指令: 当用户输入一段文本时,判断这是一个需要回答的问题还是一个需要执行的任务,然后给出有用、准确的回答。

SFT 的核心流程

SFT流程通常包括以下四个核心步骤:

  1. 基座模型选择:选取一个充分预训练的模型作为训练起点。
  2. 数据收集与格式化:收集特定领域或通用的高质量问答数据,并将其整理成模型能理解的格式。常见的格式有:
    • Alpaca格式:包含 instruction(指令)、input(可选的输入文本)和 output(期望的回答)
    • 对话格式(ChatML):包含多轮对话的角色(如 systemuserassistant)和对应内容,贴近真实聊天场景。
  3. 监督微调训练:将格式化后的数据输入模型进行训练。在计算训练损失时,通常只对模型生成的回答部分计算损失,而不计算用户的指令部分,以此引导模型精准输出期望的回答。
  4. 评估与优化:使用验证集评估模型在特定任务上的表现,并根据结果调整超参数。

监督微调利用少量的高质量数据集,通过有监督训练使模型具备问题回答、翻译、写作等能力。监督微调的数据包含用户输入的提示词和对应的理想输出结果。用户输入包括问题、闲聊对话、任务指令等多种形式和任务。

例如:

提示词:Java 的基本数据类型有哪几种?
理想输出:Java 有 8 种基本数据类型,分为 4 大类:整数类型( byte、short、int、long);浮点类型(float、double);字符类型(char)和布尔类型(boolean)。这些类型直接存储值而非对象引用,占用固定内存空间且取值范围明确,是 Java 作为强类型语言的核心基础。

利用这些有监督数据,使用与预训练阶段相同的语言模型训练算法,在基础模型的基础上进行训练,得到监督微调模型(SFT 模型)。SFT模型具备初步的指令理解能力和上下文理解能力,能够完成开放领域问答、阅读理解、翻译、生成代码等任务,也具备了一定的对未知任务的泛化能力。

由于监督微调阶段所需的训练数据量较少,其计算资源消耗也相对较低。根据模型的规模和训练数据量,通常只需要数十块GPU,花费数天时间可完成训练。SFT 模型具备了初步的任务完成能力,可以开放给用户使用。

当前的一些研究表明,监督微调阶段的数据选择对SFT模型效果有非常大的影响,因此构造少量且高质量的训练数据是监督微调阶段的研究重点。

主流微调方法

(1)全参数微调(Full Fine-Tuning)

全参数微调会更新模型的所有参数,这种方法的效果通常最好,但对显存和算力要求较高。

(2)参数高效微调(Parameter Efficient Fine-Tuning,PEFT)

PEFT冻结模型的大部分参数,只训练极少量的新增参数。常见的PEFT方法有LoRA、QLoRA、AdaLoRA、Adapter Tuning、Prefix Tuning、Prompt Tuning。

目前,基于LoRA的方法应用最为广泛,因为LoRA不会显著增加模型的推理延迟。

image-HrEa.png

人类偏好对齐与安全优化

经过预训练(Pretraining)和监督微调(SFT),大语言模型虽然已经具备了强大的通用任务解决能力和指令遵循能力,但这仅仅是让模型学会了“听懂指令”并规范输出。本质上,这两个阶段的训练目标始终是基于上下文预测下一个词元,模型并未真正理解人类的价值观或偏好。因此,它极有可能从海量数据中继承甚至放大不符合人类期望的生成模式,例如生成带有偏见、冒犯性甚至事实错误的文本内容。

这些潜在的有害行为一旦在下游应用中被恶意利用,将产生严重的安全风险与社会危害。为了规避这些风险,研究人员提出了“人类对齐(Human Alignment)”这一关键概念。其核心目的,就是确保模型的行为与人类的真实意图、社会伦理及价值观保持高度一致,即遵循 HHH原则:回答要有用(Helpful)、诚实(Honest)且无害(Harmless)。

目前,人类偏好对齐主要有两个技术范式

  • 基于人类反馈的偏好对齐(Reinforcement Learning from Human Feedback,RLHF)
  • 直接偏好对齐(Direct Preference Optimization,DPO)

RLHF

为了加强大语言模型与人类价值观的一致性,基于人类反馈的强化学习旨在利用收集到的人类反馈数据指导大语言模型进行微调,从而使得大语言模型在多个标准(例如有用性、诚实性和无害性)上实现与人类的对齐。

RLHF 的标准流程通常包含三个严密的阶段:

  1. 监督微调(SFT):首先,使用高质量的“指令-回答”数据对预训练模型进行微调,让模型初步具备遵循指令、听懂人话的能力。
  2. 训练奖励模型(Reward Model, RM):针对同一个问题(Prompt),让 SFT 模型生成多个不同的回答。由人类标注员对这些回答进行排序或打分(比如回答 A 优于回答 B)。利用这些“谁好谁坏”的偏好数据,训练一个独立的奖励模型(RM)。这个 RM 就像一个阅卷老师,它的任务是学会人类的品味,给任意回答打出一个标量分数。
  3. 强化学习微调(通常使用 PPO、GRPO等算法):将 SFT 模型作为“策略网络(Actor)”,把刚刚训练好的 RM 作为“环境/裁判”。模型生成回答后,RM 给出分数。通过 PPO、GRPO等强化学习算法,根据分数来更新模型的参数,鼓励它生成更高分的回答。

RLHF的优缺点:

  • 优点:效果极其强大且稳定,能够精细地控制模型的行为和价值观,是目前工业界的黄金标准。
  • 缺点:工程极其复杂。需要同时加载 Actor、Critic、Reward、Reference 4 个模型,显存占用极大;且 PPO 算法的超参数非常难调,训练过程不稳定且计算资源消耗巨大。

DPO

由于 RLHF 太过复杂,学术界和工业界开始寻找更高效的替代方案,其中 DPO(Direct Preference Optimization) 是目前最成功的简化范式。

DPO 的核心突破在于:它通过精妙的数学推导,绕过了“训练奖励模型”和“复杂的强化学习(PPO)”这两个繁琐的步骤。

  • 核心原理:DPO 证明了最优的语言模型策略与奖励函数之间存在精确的数学映射关系。因此,我们不再需要一个独立的奖励模型来打分,而是直接利用“好回答(chosen)”和“坏回答(rejected)”的成对数据,通过一个简单的分类损失函数来更新模型参数。
  • 训练流程:DPO 的训练流程和普通的监督微调(SFT)几乎一样。它只需要维护两个模型:正在训练的 Actor 和冻结的 Reference(参考模型,即 SFT 模型)。训练时,模型会直接对比好回答和坏回答的概率差异,让模型生成好回答的概率变大,生成坏回答的概率变小。

DPO 的优缺点:

  • 优点:训练极其稳定,计算开销小(和普通的 SFT 差不多,只需 2 个模型),不需要调 PPO 那些复杂的超参数,复现门槛低,性价比极高。
  • 缺点:由于跳过了显式的奖励模型和在线探索,它对偏好数据的质量要求极高。如果数据中有噪声,会直接写入模型策略中;且在面对极其复杂的推理任务时,能力上限通常不如 RLHF(PPO/GRPO)。

模型评估体系

经过预训练、监督微调和人类偏好对齐等一系列训练和优化,就得到了一个具备多种能力的大语言模型。但客观衡量模型的真实能力这需要一套系统的评估方法。大语言模型的评估涉及多个维度:通用语言理解能力、外推能力、代码能力、知识掌握程度,以及安全性和伦理合规性等方面。

通用能力评估

通用能力评测是大语言模型评估中的最基础的部分,通常采用一系列标准化的基准测试来衡量模型在不同任务中的表现。这些基准测试覆盖语言理解、代码生成、知识问答等多个维度,每个基准通常会给出一组标准化的测试样本,模型需要在这些样本上给出可量化的评测指标。  

语言理解与知识评估

MMLU(Massive Multitask Language Understanding)是目前最广泛使用的综合评测基准之一。它包含57个学科领域的多项选择题,涵盖人文、社科、理工和 STEM 等领域,测试模型在广泛知识面上的深度和广度。MMLU 的评测方式类似于人类参加标准化考试:每道题给出四个选项,模型需要选择正确答案。这种简单直接的评测方式使得 MMLU 成为比较不同模型通用能力的重要参考指标。

C-Eval 和 CMMLU 是两个针对中文能力评测的重要基准。C-Eval 包含52个学科领域的中文选择题,CMMLU 则覆盖了67个学科,它们填补了中文评测领域的空白,是评估大语言模型中文能力的重要工具。

推理能力评估

数学推理能力是大语言模型逻辑推理能力的重要体现。GSM8K(Grade School Math 8K)是 OpenAI 发布的数学推理基准,包含约8500道小学数学应用题。这些问题对人类来说相对简单,但对语言模型而言需要多步推理才能得出正确答案。GSM8K 的难点在于模型需要理解题目语义、拆解问题步骤,并进行正确的数值计算。MATH 基准则收录了更具挑战性的数学竞赛题,涵盖代数、几何、数论、概率等领域,对模型的数学推理能力提出了更高的要求。

常识推理评测则关注模型是否具备基本的因果推理和世界知识。ARC(AI2 Reasoning Challenge)包含小学和初中水平的科学选择题,要求模型运用科学常识进行推理。HellaSwag 考察模型对日常事件因果关系的理解能力,给定一个场景描述,模型需要判断后续事件中最合理的一个。WinoGrande 则通过代词消歧任务测试模型的社会常识推理能力。

代码能力评估

代码生成能力是衡量大语言模型在工程实践中实用价值的重要指标。HumanEval 是 OpenAI 发布的代码生成基准,包含164个 Python 编程问题,每个问题提供了函数签名、文档字符串和单元测试用例。模型需要根据给定的函数签名和描述生成正确的函数实现,并通过单元测试来验证正确性,最终使用 pass@k 指标来衡量性能。MBPP(Mostly Basic Python Problems)是另一个常用的代码基准,包含约1000道 Python 编程题,题目覆盖范围更广。由于 HumanEval 的规模较小且可能已被部分模型"记忆",MBPP 等更大规模的代码基准在一定程度上能提供更可靠的评估。

评估方式

评测方式的选择会直接影响评测结果的解读。常见的评测方式包括:零样本评测(Zero-shot),直接将问题输入模型,不提供任何示例;少样本评测(Few-shot),在输入中提供若干示例作为上下文引导;思维链评测(Chain-of-Thought,CoT),引导模型在回答前先输出推理过程。思维链评测往往能在复杂推理任务上显著提升模型表现,因为逐步推理能帮助模型更准确地组织思路。

目前,比较知名的评测框架有 EleutherAI 开发的 lm-evaluation-harness 和上海人工智能实验室推出的 OpenCompass,它们整合了大量评测基准,提供了标准化的评测流程和结果汇总,方便研究者对不同模型进行横向比较。

安全与伦理评估

随着大语言模型在实际应用中的广泛部署,模型的安全性和伦理合规性成为评估体系中不可缺少的一环。

偏见检测

大语言模型在预训练阶段从海量互联网数据中学习,不可避免地会吸收并放大数据中存在的各种社会偏见。偏见检测通常通过特定的探测数据集来评估模型在不同维度(如性别、种族、宗教、年龄等)上的输出差异。例如,对比模型对不同性别主语的描述是否存在刻板印象,或者在生成职业相关文本时是否存在明显的性别倾向。CrowS-Pairs 和 StereoSet 是两个常用的偏见评测数据集,它们设计了大量涉及社会刻板印象的句子对,用于量化模型在各类偏见维度上的表现。

红队测试

红队测试(Red Teaming)是一种主动攻击式的安全评估方法。测试人员扮演攻击者的角色,构造各种恶意指令或对抗性输入,测试模型的安全防御能力。核心目标是检验模型在面对不当请求时是否能正确拒绝,例如拒绝生成涉及暴力、违法或隐私泄露的内容。红队测试既包括人工红队测试,也包括基于自动化的方法。自动化红队测试通常利用一个攻击模型来自动生成对抗性 prompt,并检测目标模型是否输出了不当内容。Anthropic 和 DeepMind 等机构都在自动化红队测试方面开展了大量研究。

隐私泄露风险

由于预训练数据中可能包含个人身份信息(如姓名、电话号码、住址等),大语言模型存在记忆并在生成时泄露这些信息的风险。研究表明,通过特定的提示词,攻击者有可能诱导模型输出训练数据中的隐私信息。隐私泄露评估通常通过成员推断攻击(Membership Inference Attack)等方法来检测模型是否过度记忆了训练数据中的特定样本。

幻觉问题

大语言模型在生成内容时,有时会输出看似合理但实际上不正确或毫无根据的信息,这种现象被称为"幻觉"(Hallucination)。幻觉问题在需要高准确性的场景(如医疗、法律、金融等)中可能带来严重后果。评估模型幻觉问题的基准包括 TruthfulQA 等,它们通过设计容易诱导错误回答的问题来测试模型的真实性。减少幻觉是当前大语言模型研究中的重要方向之一。

评估的挑战

大语言模型的评估体系本身也面临一些挑战。基准污染(Benchmark Contamination)是最突出的问题之一:如果模型在训练过程中"见过"测试集中的数据,那么评测分数就无法真实反映模型的能力。随着训练数据规模扩大到数万亿 token,训练集与公开测试集之间的重叠风险也在增加。一些研究尝试通过动态生成测试集或使用全新未公开的基准来缓解这一问题。

此外,模型在静态基准上的高分并不总能代表其在实际应用场景中的表现。基准测试通常覆盖的是相对固定的任务类型,而真实场景中的用户需求更加多样和开放。这也促使业界不断探索更全面、更贴近实际使用场景的评测方法。

推理与部署

模型训练完成后,下一步是将它部署为可用的在线服务。这一步面临的挑战与训练阶段截然不同:训练可以在离线环境中花费数天甚至数周完成,而推理服务需要在毫秒级延迟内对用户请求做出响应。大语言模型的参数量通常在数十亿到数千亿之间,一个70B参数的模型在 FP16 精度下就需要约140GB的显存空间,这对推理系统的计算资源和内存管理都提出了很高的要求。

模型压缩技术

为了将大语言模型部署到实际生产环境中,模型压缩是常用的手段。主要的压缩方法包括量化、剪枝和知识蒸馏。

量化

量化(Quantization)是将模型参数从高精度浮点数(如 FP32、FP16)转换为低精度整数或浮点数(如 INT8、INT4)表示的技术。通过降低每个参数的存储位数,可以大幅减少模型的显存占用和计算开销。例如,将 FP16 模型量化为 INT4,理论上可以将显存需求降低约75%。

量化方法按时机可分为两类:训练后量化(Post-Training Quantization,PTQ)直接在训练完成的模型上进行参数精度转换,无需重新训练,操作简单但可能带来一定的精度损失;量化感知训练(Quantization-Aware Training,QAT)则在训练过程中模拟低精度计算的影响,让模型在训练阶段就适应量化后的精度约束,通常能获得更好的量化效果。

GPTQ 是目前大语言模型量化领域最具代表性的算法之一。它采用逐层量化策略,利用少量校准数据对每一层的权重进行最优量化,在4-bit精度下仍能将模型性能损失控制在较小范围内。AWQ(Activation-aware Weight Quantization)则从另一个角度出发,通过识别对模型输出影响较大的关键权重并保留更高精度,在4-bit量化下实现了比 GPTQ 更好的性能表现。

剪枝

剪枝(Pruning)通过移除模型中不重要的参数或结构来减小模型规模。根据剪枝粒度的不同,主要分为两种方法:

(1)结构化剪枝

结构化剪枝以模型的宏观结构为单位进行裁剪,例如移除整个注意力头、整个前馈网络层或整个Transformer层。由于移除的是完整的结构单元,剪枝后的模型可以直接在标准硬件上运行,能够获得实际的速度提升。

(2)非结构化剪枝

非结构化剪枝以单个参数为单位,将接近零的权重直接置为零。这种方法的理论压缩率很高,但产生的稀疏矩阵需要专用的稀疏计算硬件或软件支持才能获得实际的推理加速。在通用硬件上,非结构化剪枝的加速效果往往不如结构化剪枝明显。

知识蒸馏

知识蒸馏(Knowledge Distillation)的核心思路是利用一个大型的"教师模型"(Teacher Model)来指导训练一个小型的"学生模型"(Student Model)。学生模型通过学习教师模型的输出分布或中间特征表示,在参数量大幅减少的情况下尽可能保留教师模型的能力。在大语言模型领域,Alpaca、Vicuna 等模型都借鉴了知识蒸馏的思路,利用 GPT-3.5 或 GPT-4 的输出数据来训练更小的开源模型。知识蒸馏的优势在于,学生模型可以在推理速度上远快于教师模型,同时在很多任务上仍能保持不错的性能。

推理引擎与服务化

即使经过模型压缩,大语言模型在实际服务时仍然面临计算和内存管理的挑战。推理引擎的设计目标就是在有限硬件资源下,最大化推理吞吐量并最小化响应延迟。

KV Cache 与 PagedAttention

在大语言模型的自回归生成过程中,每生成一个新的 token 都需要用到之前所有 token 的注意力键值对(Key-Value,KV)。为了避免重复计算,这些键值对会被缓存下来,称为 KV Cache。随着序列长度增加,KV Cache 占用的显存会线性增长。对于一个处理数千 token 长文本的70B模型,KV Cache 可能占据数十 GB 的显存。

传统的 KV Cache 管理方式为每个请求预分配一块连续的显存空间,大小按最大序列长度计算。这会导致严重的内存浪费和碎片化:很多请求的实际生成长度远小于最大长度,但预分配的显存无法被其他请求使用。

PagedAttention 是 vLLM 框架引入的一种 KV Cache 管理方法。它借鉴了操作系统中虚拟内存分页的思想,将 KV Cache 划分为固定大小的"页"(Block),按需动态分配和释放,而不是预先分配一整块连续空间。这种方式大幅减少了内存浪费和碎片化。基于 PagedAttention,vLLM 在相同硬件上可以实现数倍于传统方案的推理吞吐量。

连续批处理与流式输出

在在线推理服务中,如何高效处理大量并发请求是一个关键问题。传统的静态批处理(Static Batching)方式会将一批请求凑齐后统一处理,等整个批次全部完成后再处理下一批。这意味着一个较短的请求需要等待批次中最长的请求完成,GPU 的利用率被拉低。

连续批处理(Continuous Batching,也叫 In-flight Batching)允许在一个请求完成生成后立即插入新的请求,无需等待整个批次完成。这种方式可以显著提高 GPU 的利用率和服务吞吐量,是目前主流推理框架的标配功能。

流式输出(Streaming)则是从用户体验角度出发的优化。传统方式需要等模型生成完所有 token 后一次性返回结果,用户面对长时间的空白等待。流式输出在模型每生成一个或若干个 token 后就立即返回给用户,用户可以看到文字逐步呈现,这在对话和长文本生成场景中能显著改善体验。

投机解码

投机解码(Speculative Decoding)的核心思路是用一个小而快的草稿模型(Draft Model)先生成一串候选 token,然后由大模型(目标模型)一次性验证这些候选 token 是否正确。如果验证通过,就相当于在一次大模型前向传播中完成了多步生成。这种方法在不改变生成结果分布的前提下,通常能实现2到3倍的推理加速。

主流推理框架

目前,大语言模型推理领域有几个主流的开源和商用框架:

vLLM 是基于 PagedAttention 技术构建的高吞吐推理框架,在大并发场景下表现优异,是目前社区中最受欢迎的开源推理框架之一。TensorRT-LLM 是 NVIDIA 推出的推理优化方案,针对 NVIDIA GPU 做了深度优化,在推理延迟和吞吐量方面都有不错的表现。llama.cpp 以 CPU 推理为主,支持 GGUF 等多种量化格式,适合在消费级硬件和边缘设备上部署。TGI(Text Generation Inference)由 Hugging Face 开发,与 Transformers 生态集成紧密,部署流程相对简洁。

选择推理框架时,通常需要根据并发量、延迟要求、硬件条件和模型规模等因素综合考量。如果需要低延迟高吞吐的在线服务,vLLM 配合 GPU 是较为合适的选择;如果需要在资源受限的设备上运行,llama.cpp 的量化方案是一个可行的方向;而在 NVIDIA GPU 的企业级部署中,TensorRT-LLM 通常能提供最优的硬件利用率。

对于超大模型或多模型部署场景,还需要考虑模型并行策略。张量并行(Tensor Parallelism)将模型的每一层计算分布到多个 GPU 上,适合单层计算量大但层数不多的模型;流水线并行(Pipeline Parallelism)将模型按层分配到不同 GPU 上,各 GPU 依次处理,适合层数较多的深度模型。在实际部署中,通常会将两种并行策略结合使用。

参考资料:

LLM中的各类型位置编码概述 2026-03-16
闪光灯同步方式:前帘同步和后帘同步 2026-01-06