AI基本概念
AI基础概念
大模型是什么?
2021年,斯坦福大学的研究员团队发表了一篇论文,提出了Foundational Models(基础模型,即大模型)的概念。简单来说,它是一类具有大量参数(通常在十亿以上),能在极为广泛的数据上进行训练,并适用于多种任务和应用的预训练深度学习模型。
训练步骤
大模型的训练整体上分为三个阶段:预训练、SFT(监督微调)以及RLHF(基于人类反馈的强化学习)。
预训练(Pre-training): 预训练的过程类似于从婴儿成长为中学生的阶段,在这个阶段我们会学习各种各样的知识,我们的语言习惯、知识体系等重要部分都会形成;对于大模型来说,在这个阶段它会学习各种不同种类的语料,学习到语言的统计规律和一般知识。但是大模型在这个阶段只是学会了补全句子,却没有学会怎么样去领会人类的意图,假设我们向预训练的模型提问:“埃菲尔铁塔在哪个国家?”模型有可能不会回答“法国”,而是根据它看到过的语料进行输出:“东方明珠在哪个城市?”这显然不是一个好的答案,因此我们需要让它能够去遵循人类的指示进行回答,这个步骤就是SFT(监督微调)。
监督微调(SFT,Supervised Fine Tuning): SFT的过程类似于从中学生成长为大学生的阶段,在这个阶段我们会学习到专业知识,比如金融、法律等领域,我们的头脑会更专注于特定领域。对于大模型来说,在这个阶段它可以学习各种人类的对话语料,甚至是非常专业的垂直领域知识,在监督微调过程之后,它可以按照人类的意图去回答专业领域的问题。这时候我们向经过SFT的模型提问:“埃菲尔铁塔在哪个国家?”模型大概率会回答“法国”,而不是去补全后边的句子。这时候的模型已经可以按照人类的意图去完成基本的对话功能了,但是模型的回答有时候可能并不符合人类的偏好,它可能会输出一些涉黄、涉政、涉暴或者种族歧视等言论,这时候我们就需要对模型进行RLHF(基于人类反馈的强化学习)。
基于人类反馈的强化学习(RLHF,Reinforcement Learning from Human Feedback): RLHF的过程类似于从大学生步入职场的阶段,在这个阶段我们会开始进行工作,但是我们的工作可能会受到领导和客户的表扬,也有可能会受到批评,我们会根据反馈调整自己的工作方法,争取在职场获得更多的正面反馈。对于大模型来说,在这个阶段它会针对同一问题进行多次回答,人类会对这些回答打分,大模型会在此阶段学习到如何输出分数最高的回答,使得回答更符合人类的偏好。
分词化(Tokenization)与词表映射
分词化(Tokenization)是自然语言处理(NLP)中的重要概念,它是将段落和句子分割成更小的分词(token)的过程。举一个实际的例子,以下是一个英文句子:
I want to study AI.
为了让机器理解这个句子,对字符串执行分词化,将其分解为独立的单元。使用分词化,我们会得到这样的结果:
[‘I’ ,’want’ ,’to’ ,’study’ ,’AI’ ,’.’]
将一个句子分解成更小的、独立的部分可以帮助计算机理解句子的各个部分,以及它们在上下文中的作用,这对于进行大量上下文的分析尤其重要。分词化有不同的粒度分类:
‒ 词粒度(Word-Level Tokenization)分词化,如上文中例子所示,适用于大多数西方语言,如英语。
‒ 字符粒度(Character-Level)分词化是中文最直接的分词方法,它是以单个汉字为单位进行分词化。
‒ 子词粒度(Subword-Level)分词化,它将单词分解成更小的单位,比如词根、词缀等。这种方法对于处理新词(比如专有名词、网络用语等)特别有效,因为即使是新词,它的组成部分(子词)很可能已经存在于词表中了。
每一个token都会通过预先设置好的词表,映射为一个 token id,这是token 的“身份证”,一句话最终会被表示为一个元素为token id的列表,供计算机进行下一步处理。
1. Prompt ⼯程简介
Prompt (提示词) 是⼀个指令、问题或者语句,能被⽤来引导或指示⼀个语⾔模型⽣成特定的⽂本输出。Prompt 是⽤户与语⾔模型交互的起始点,它告诉模型⽤户的意图,并且期望模型能以有意义且相关的⽅式回应。通过精⼼设计的prompt,我们可以引导⼤语⾔模型(LLM)更好地理解⽤户的意图,并⽣成更准确、有⽤的回答。
Prompt⼯程涉及开发、优化和测试迭代prompt,以帮助⽤户有效地与语⾔模型进⾏交互。
2. Prompt 设计
2.1. 准备阶段:确定⽬的
在设计prompt之前,⾸先要明确你的⽬的是什么。你是在寻找特定的信息、⽣成创造性的内容,还是尝试解决⼀个复杂的问题?例如,如果你想要了解特定主题的深度信息,你可能需要构建⼀个开放式的提问,⽽不是预设⼀个简单的是或否问题。
2.2 Prompt 编写
2.2.1. Prompt 主要构成要素
LLM的prompt主要包含以下要素:
- 引导语或指示语:告诉模型你希望它执⾏哪种类型的任务,⽐如回答问题、提出建议、创作⽂本等。
- 上下⽂信息:提供⾜够的背景信息,以便模型能够更好地理解和处理请求。上下⽂信息可能包括具体情景、相关数据、历史对话信息等内容。
- 任务描述:明确地描述你期望模型执⾏的任务。它可以是⼀个问题、⼀个命令性语句或者是⼀个场景描述。
- 输出格式指示:如果你对输出结果有特定的格式要求,应在prompt中说明。⽐如,你可以指定输出应该是列表形式、⼀段连贯的⽂本还是⼀系列步骤等。
- 限制条件:设置⼀些约束条件,指导模型避免某些类型的回答或者引导模型产⽣特定⻛格的内容。例如,可以限制回答的字数、要求避免使⽤专业术语等。
- 样例输出:提供⼀个或多个例⼦可以帮助LLM理解所期望的输出类型和质量。
- 结束语:如果有必要,可以使⽤结束语来表示prompt的结束,尤其是在连续的对话或者交互中。
这些要素并不是每个prompt都必须包含的,但根据特定的需求和上下⽂,合适地结合这些要素可以提⾼LLM⽣成的⽂本质量和相关性。
图1 展示了⼀个包含上下⽂信息,任务描述,输出格式指示,限制条件,样例输出这⼏个要素的prompt例⼦。
2.2.2. Prompt 设计⽅法
明确的任务指示
- Prompt应该清晰地定义你希望LLM完成的任务, 内容要尽可能清晰、具体,避免出现歧义。
| 任务指示不明确的prompt | 指示明确的prompt |
|---|---|
| 我想了解关于⽓候变化的影响。 | 列出五个由于⽓候变化⽽导致的全球性环境问题,并简要解释每个问题的具体影响。 |
| 帮我写点关于健康的东⻄。 | 请列出五种健康⽣活⽅式,并解释每种⽅式如何改善个⼈健康。 |
- 指定完成任务的步骤:如果有明确的步骤,通过指定完成任务需要的步骤,可以帮助LLM遵循正确的操作流程,从⽽更
精确地⽣成回应
| ⽆任务完成步骤的prompt | 有任务完成步骤的prompt |
|---|---|
| 写⼀篇关于⽓候变化的⽂章。 | 为了写⼀篇关于⽓候变化的⽂章,请遵循以下步骤:1. 定义⽓候变化并解释其原因。2. 描述⽓候变化对环境的影响。3. 讨论社会和经济对⽓候变化的反应。4. 提出解决⽓候变化问题的策略。 |
| 我需要计划⼀场家庭聚会,你能提供⼀些建议吗? | 为了计划⼀场家庭聚会,请按照以下步骤提供帮助:1. 确定聚会的⽇期和时间。2. 列出可能的聚会地点选项。3. 建议⼀份适合各年龄段的娱乐活动清单。4. 提供⼀份简单的餐饮菜单建议。5. 给出⼀个预算计划,包括场地、⻝物和娱乐的预估费⽤。请根据这些步骤提供详细的计划指南。 |
提供充分的上下⽂信息
- 提供背景信息或具体情境,帮助LLM更好地理解任务
在⾼年级物理课程中,学⽣们正在探索微观世界的⾏为规律。现在,请详细解释⼀下量⼦物理这⼀理论是如何描述和理解原⼦、分⼦等微观粒⼦的运动状态以及相互作⽤,并给出⼀个或两个著名的量⼦⼒学现象作为例⼦来帮助他们深⼊理解这⼀概念。
⼀家科技公司正在开发新的智能助⼿软件,他们想要让⾃⼰的员⼯了解⼈⼯智能的基础知识。请解释⼈⼯智能是什么,包括它的主要组成部分是什么,以及这些组成部分如何协同⼯作来完成复杂任务。
- ⻆⾊指定: 指定模型应扮演的⻆⾊,这有助于设定LLM回答的特定的语⽓和⻛格。
作为⽣物教师,向初中⽣详细解释植物进⾏光合作⽤的步骤和其重要性。
扮演⼀个历史学家,讲述第⼆次世界⼤战的起因、过程和结果,并说明其对现代世界的影响。
- 提供⼀些参考信息:对于⼀些涉及到专业知识的问题,在prompt⾥提供相关的专业参考资料能够增强模型对于该问题背景和上下⽂的理解,有助于减少错误或不准确信息(即“幻觉”)的⽣成,提⾼回答的质量和准确性。这种参考内容可能包括专业术语解析、⾏业标准、理论依据、实际案例或研究数据等。
请根据《中华⼈⺠共和国⺠法典》中关于合同法的相关规定,解释合同解除的条件。
参考内容如下:
法律条⽂:[提供《中华⼈⺠共和国⺠法典》中关于
合同解除的具体法律条⽂]
请根据ISO 9001质量管理体系标准,描述企业如何建⽴和维护⼀个有效的质量控制流程。
参考标准⽂档中的关键章节如下:ISO 9001关键章节:[提供ISO 9001标准中关于建⽴
和维护质量控制流程的关键章节内容]
利⽤分隔符
分隔符的应⽤能有效地划分输⼊prompt的多个段落,这样做可以显著提升LLM对每⼀部分的识别和理解能⼒。
例如使用”```”作为分割符:
1 | ~~~ # 实际上是这个按键但是不按Shift 也就是``` |
1 | 请对提供的⽂本内容进⾏以下分析:- ⽂本摘要:提供该段落的简短摘要。 |
使⽤固定格式
如果你需要LLM⽣成或处理⼀系列相似的信息,提供⼀个明确的格式可以增加效率和⼀致性。例如:
1 | "针对以下三个国家:美国,中国,印度,提供各自在可再生能源上的最新投资情况。格式如下:国家 - 投资额 - 主 |
提供示例
- 给出输出示例:给出⼀个示例将有助于LLM理解期望的结果。特别是在有特定的输出格式要求时,给出示例有助于LLM遵循输出要求。
- 给出任务相关样例:
该⽅法也称为⼩样本学习(few-shot learning),是指在训练模型时仅使⽤极少量的样本数据进⾏学习和推理的任务。给出任务相关样例可以带来如下优势:
a. 直观展示:样例提供了⼀个直观的输出模板,帮助模型理解任务的具体要求。
b. 减少误解:通过样例,模型可以更准确地把握⽤户的意图,减少对指令的误解。
c. 提⾼⼀致性:样例确保了输出的⼀致性,使得模型⽣成的回答遵循相同的格式和⻛格。d. 简化指令:有时候,⼀个简单的样例⽐复杂的指令更容易被模型理解和执⾏。
让模型进⾏思考再回答
⼜名思维链(Chain-of-thought)prompting, ⽬的是引导LLM逐步展示其解决问题或推理的逻辑步骤,⽽不仅仅是直接给出最终答案。通常的⽅法是:在提出问题后,在prompt 的最开始或者结尾部分加上类似“让我们⼀步⼀步思考”或“逐步分析” (“Let’s think step by step.”)的语句来引导模型先给出思考过程,再给出答案。
以解决数学题为例: ⼀个正⽅形和⼀个等边三⻆形的周⻓相等。如果正⽅形的边⻓是4厘⽶,求等边三⻆形的边⻓。
3. ⾼阶Prompting技巧
Few-shot Prompting
Few-shot prompting 是⼀种技术,它允许⼤型语⾔模型(LLMs)在只有少量示例(few-shot)的情况下执⾏特定任务。这种⽅法的核⼼在于通过精⼼设计的提示(prompts)来引导模型,使其能够在有限的数据基础上进⾏有效的推理和学习。
1 | Suggest three names for an animal that is a superhero. |
Zero-shot COT Prompting
这个技巧使⽤起来⾮常简单,只需要在问题的结尾⾥放⼀句 Let‘s think step by step (让我们⼀步步地思考),模型输出的答案会更加准确。
Few-shot COT Prompting
通过向⼤语⾔模型展示⼀些少量的样例,并在样例中解释推理过程,⼤语⾔模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。
Adaptive few-shot Prompt

指令部分描述任务,样例库是该任务的具体实例。
根据输⼊的问题的不同,动态地调整填⼊样例部分的内容。
可以结合RAG实现。
ReAct Prompting
核⼼思想是通过交替⽣成推理轨迹和特定任务的⾏动,从⽽在两者之间实现更⼤的协同效应。具体来说,推理轨迹帮助模型引导、跟踪和更新⾏动计划,处理异常情况;⽽⾏动则使模型能够与外部资源(如知识库或环境)进⾏交互,以获取额外信息。
常⻅应⽤场景:适⽤于任何需要结合推理和⾏动的任务, 例如⼯具调⽤,func call, 交互式决策制定, 智能助⼿等ReAct prompting的结构通常包括以下⼏个部分:
● 思考(Thought):这些是⼈类书写的⽂本,⽤于表达解决问题的思考过程,例如分解任务⽬标、提取重要信息、进⾏常识推理等。
● ⾏动(Action):这些是模型根据当前上下⽂和思考结果采取的⾏动,例如搜索、选择、购买等。观察(Observation):这是环境对⾏动的反馈,例如搜索结果、产品选项等。
● 观察(Observation):这是环境对⾏动的反馈,例如搜索结果、产品选项等。
具体步骤:
Step 1: LLM generate Thought + Act
Step 2: 环境执⾏Act, 并返回observation
Step 3: 将 step 2 observation 拼⼊prompt
Step 4: repeat step 1-3 till LLM output the stop sign (i.e., the Act is Finish)
Self-consistency
参考: SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS
常⽤场景:常⻅于推理场景,
核⼼想法:通过少样本 CoT 采样多个不同的推理路径,并使⽤⽣成结果选择最⼀致的答案。这有助于提⾼ CoT 提示在涉及算术和常识推理的任务中的性能。
4. 词汇概念
Embedding: Token变向量。
在数学中,Embedding,即嵌入,意为把高维离散向量变换到低维连续向量。通常指的是将数据映射到一个低维度的向量空间的过程。它是从高维转换低维空间。是一种预训练模型,专门把文字映射到新的数学空间。
嵌入是数据在嵌入空间中的向量表示。一般来说,模型通过将初始数据向量的高维空间投影到一个低维空间中,来找到潜在的嵌入表示。
Embedding模型(向量模型)
普通的LLM通常也包含Embedding层。而使用知识库需要专门的Embedding模型(向量模型)以及Rerank模型(重排序)来实现检索增强生成(RAG)。向量模型用于知识库文本嵌入检索,重排序模型专门用于文本嵌入和排名任务。
Embedding(嵌入)在LLM中的作用
- 文本表示:Embedding将离散的文本(如单词、句子)转换为连续的向量,便于模型处理和理解。
- 语义捕捉:通过训练,Embedding向量能够捕捉词语的语义和上下文关系,提升模型的语言理解能力。
- 模型输入:Embedding层通常位于LLM的输入层,将文本转换为向量后,再输入到模型的后续层进行处理。
向量模型(Embedding)与LLM中嵌入(Embedding)的关系:
功能相似:两者都用于将文本映射到向量空间,保留语义信息。
训练方式不同:
- LLM中的Embedding:通常在模型训练过程中与整个模型一起优化,适应特定任务。
- 专门的Embedding模型:如Word2Vec、GloVe、BERT等,独立训练,可应用于多种任务。
应用场景不同: - LLM中的Embedding(嵌入):主要用于模型的输入表示,支持文本生成、对话等任务。
- 专门的向量模型(Embedding):常用于信息检索、文本匹配等,特别是在知识库应用中,用于计算文本相似度,提高检索效率。
总结:
普通的LLM模型通常包含Embedding层,用于将文本转换为向量表示。
专门的Embedding模型与LLM中的Embedding功能相似,但训练方式和应用场景有所不同。
两者相辅相成,共同提升模型在自然语言处理任务中的性能。
高维到低维的投影:
初始数据通常以高维形式存在。例如,文本数据可能被表示为词袋模型(Bag of Words)或独热编码(One-Hot Encoding),这些表示方式维度很高且稀疏。
模型通过某种算法(如主成分分析PCA、t-SNE、或者深度学习中的神经网络)将这些高维数据映射到一个低维空间。低维空间的好处在于它更紧凑,更容易处理,同时保留了数据的重要特征。
潜在嵌入的意义:
在低维空间中,嵌入向量能够捕捉数据之间的潜在关系。例如,在词嵌入中,语义相似的词会在嵌入空间中彼此靠近。
这种潜在表示可以帮助机器学习模型更好地理解数据的结构和模式,从而提高任务性能(如分类、聚类或生成任务)。
例如:GPT会把对话中的650个字,转换成大概1300个Token,然后再把1300个Token变成1300个Embedding向量,每个向量12288维。
带有Attention机制的Transformer Encoder & Decoder
Transformer模型的基本构建单元是缩放点积注意力(scaled dot-product attention)单元。当一个句子被传递到一个Transformer模型中时,可以同时计算所有标记互相之间的注意力权重。注意力单元为上下文中的每个标记生成嵌入,其中包含有关标记本身的信息以及由注意力权重加权得到的其他相关标记的信息。对于每个注意力单元,Transformer模型学习三个权重矩阵,分别为查询(query)权重Q、键(key)权重K,以及值权重V。
对所有标记的注意力计算可以表示为使用softmax函数的一个大型矩阵计算,由于可以对矩阵运算速度进行优化,这十分利于训练速度的提升。矩阵Q、K和V可分别定义为第Qi行是向量、Ki和Vi的矩阵。
多头自注意力机制允许每个位置的词向量都能注意到输入序列中所有位置的信息,从而捕捉长距离依赖关系。
上图中,左边黄色框住的是Encoder(编码器),右边绿色框住的是Decoder(解码器)。
将1个12288维向量,映射成96个不同的128维向量,是为了捕捉不同的特征表示。以防止单一的Embedding表示方式,太过突出或太过弱化某些信息。
96种映射方式,全部采用神经网络结构,让机器想办法找到合适的映射方式。
一组(Q,K,V)矩阵称为一个注意力头(attention head),Transformer模型中每一层都包含多个注意力头。每个注意力头都表示不同标记相互之间的注意力,而多个注意力头则可以针对不同的“相关性”计算不同的注意力权重。许多注意力头编码的相关性信息是人类可以理解的,例如某个注意力头可能主要关注下一个单词,而另一个注意力头则可能主要关注动词与其直接宾语之间的关系。每个注意力头的计算可以并行执行,这使得处理速度得以加快。注意力层的输出被连接起来传递到前馈神经网络层。
我们还有Encoder Only和Decoder Only模型,这是为了更快速更节省的方式实现特定需求。
Encoder Only
Encoder Only 模型通常用于需要理解输入序列的任务中,比如文本分类、命名实体识别(NER)、语义相似度计算等。这类任务不需要生成新的文本,而是对给定的文本进行分析和理解。典型的Encoder Only模型例子是BERT(Bidirectional Encoder Representations from Transformers)。在这些模型中:
- 输入文本通过一系列的Transformer编码器层进行处理。
- 编码器利用自注意力机制捕捉输入序列中的长距离依赖关系。
- 由于只需要理解输入,因此不涉及输出序列的生成过程。
Decoder Only
Decoder Only 模型则更适用于那些需要生成序列的任务,例如文本生成、机器翻译、摘要生成等。与传统的Transformer架构不同,某些现代模型如GPT系列采用了仅包含解码器的设计。在这种设置下:
- 输入以自回归的方式被处理,即每次预测都基于前面已经生成的所有词。
- 解码器同样使用了自注意力机制,但是它还加入了掩码(masking),确保在生成每个词时不会看到未来的信息。
- 这种模型能够根据给定的前缀或上下文生成连贯的后续文本。
简单来说,Encoder Only模型擅长于理解任务,它们通过深层网络捕捉输入数据的复杂特征;而Decoder Only模型则专注于生成任务,它们能够基于已有的信息逐字地构造出完整的句子或段落。这两种模型根据不同的需求,在各自的应用场景中发挥着重要作用。
5. 模型训练与微调
可参考百炼-模型调优和本博客另一篇文章模型微调-教师模型235B训练学生模型0.6B
必读
模型调优作为重要的模型效果优化方式,可以:
- 提升模型在特定行业/业务表现
- 降低模型输出延迟
- 抑制模型幻觉
- 对齐人类的价值观或偏好
使用调优后的轻量级模型替代规模更大的模型
模型在调优过程中,会学习训练数据中的知识、语气、表达习惯、自我认知等业务/场景特征。也由于已经在训练过程中学习到了大量特定行业/场景的样例,训练后模型 One-Shot 或者 Zero-Shot 的 Prompt 效果会比训练前 Few-Shot 效果更好,这样可以节省大量输入 token,从而降低模型输出延迟。
文本生成模型调优虽然能在特定业务/场景取得非常好的效果,但有以下限制:
耗时较长,包括:拥有一个大规模(至少1000万 token)CPT 数据集、构建一个有效(1000+)SFT 数据集、收集足够的(100+)Bad Case 构建有效 DPO 数据集、模型优化迭代速度慢等。
费用较高,调优后的模型部署后才能使用,部署费用较高。
推荐在考虑使用文本生成模型调优前先尝试使用提示词工程(Prompt Engineering)或插件调用(Function Calling)定制化您的应用,模型调优也通常作为改进模型表现“最后的手段”。因为:
a. 在许多任务中,模型最初可能表现不佳,但通过应用正确的 Prompt 技巧可以改进结果,不一定需要使用模型调优。
b. 迭代优化 Prompt、插件,比模型调优的迭代更敏捷、成本更低,因为模型调优的迭代可能需要重新收集数据、清洗优化数据、收集 bad case、发起客户调研等。
c. 即使最后一定要进行模型调优,最初的 Prompt 工程、插件迭代优化相关工作也不会浪费。您的这些前期工作可以充分地在构建调优数据集时复用(用于构建数据集的输入)。
模型调优方式
CPT(继续预训练,Continual Pre-Training)目的是通过海量的无标记训练数据,提升模型在特定行业的表现。
SFT-有监督-模型微调(Supervised Fine-Tuning)目的是通过针对性的数据集和训练,提升模型在特定业务的表现。
DPO-有监督-直接偏好优化(Direct Preference Optimization)训练数据集数据同时提供正负样本,通过引入负反馈,降低幻觉,对bad case进行针对性优化。
一般训练方式是以先 CPT(可选),后 SFT,最后 DPO 的顺序使用模型调优:
先收集海量(至少1000万Token)的特定领域的无标签样本,进行CPT训练,将模型训练成特定行业/领域的专家。
在应用上线前,使用足够多(1000+)的特定场景/业务的正样本,即收集场景/业务输入+模型期望输出,进行SFT 训练。
您的应用试运行/上线后,收集足够多(100+)的用户反馈(如:点赞、点踩、反馈)或者 bad case,将这些数据制作成 DPO 训练集,进行 DPO 训练。
CPT 纯文本格式训练数据,一行训练数据展开后结构如下:
1 | {"text":"文本内容"} |
SFT ChatML(Chat Markup Language)格式训练数据,支持多轮对话和多种角色设置,一行训练数据展开后结构如下:
1 | {"messages": [ |
DPO ChatML 格式训练数据,一行训练数据展开后结构如下:
1 | {"messages":[ |
6. 模型训练 - 分布式训练
一个装不进任何单张显卡的大模型,怎么训练?
一个千亿参数(100B)的模型,训练时显存中需要同时存放:模型权重、梯度、Adam 优化器的两个状态(一阶/二阶动量)。按混合精度训练估算,每个参数约需 15~20 字节,总量约 1.5TB。
而单张 H800 只有 80GB 显存,1.5TB ÷ 80GB ≈ 需要 20 张卡才仅仅”装得下”,这还没算激活值和临时缓冲区。
所以必须把模型和数据”切开”,分散到多台服务器上协同训练——这就是分布式并行。
6.1 张量并行(Tensor Parallelism,TP)
把每一层”横着切”
一张 GPU 连一层的完整权重都装不下时,就把单个层内部的矩阵运算拆开:
比如一个 Transformer 层里有 12 个注意力头,8 张 GPU 每张只算其中 1.5 个头;MLP 的矩阵也可以按列/行切成 8 份。
每张 GPU 保存每一层的 1/8,而不是某些完整的层。
麻烦在于:每算完一层,各 GPU 的部分结果必须立刻合并(AllReduce 通信),才能进入下一层。所以每层都要通信一次。
为什么强调”卡间通信、约 600G/节点”?
因为每层一次的通信频率极高,必须走节点内部 NVLink 这种超高速互联(A100/H100 一代节点内带宽约 600GB/s)。一旦跨节点走以太网/IB,延迟和带宽都扛不住,训练会慢到不可用。所以 TP 的范围基本被限制在一台服务器的 8 张卡之内——这就是图中左侧”张量并行”箭头只覆盖单台服务器内部高度的原因。
代表:NVIDIA 的 Megatron-LM。
6.2 流水线并行(Pipeline Parallelism,PP)
把层”纵着切”
如果一个模型有 60 层,4 台服务器,那就按层切:服务器 1 放第 1-15 层,服务器 2 放第 16-30 层,每台只负责模型的一段”管道”。
数据像流水线一样:服务器 1 算完前 15 层,把中间激活值传给服务器 2,依次往后传。
通信量很小(只传层间激活,不碰权重),所以可以跨机房(机间通信)。
缺点:流水线气泡(bubble)。服务器 2 必须等服务器 1 的第一批数据算完才能开工,整网会出现空闲间隙。缓解办法是把 batch 切成多个 micro-batch,让不同阶段交叠执行——这也正是图中”不同子模型之间同时处理多个训练任务”想表达的意思。
1F1B(one-forward-one-backward)调度就是经典的减气泡策略。
6.3 数据并行(Data Parallelism,DP)
模型复制,数据切分
每台服务器都存放一份完整模型,但把训练数据集切成 N 份,各组独立计算梯度,每步结束后做一次全局梯度同步(AllReduce),保证所有副本的权重更新一致。
通信内容:全部梯度,通信量 = 模型大小,每步都要做,所以也是机间通信。
图中上下两排服务器之间的”数据并行通信”横条,就代表这种跨副本的梯度同步。
进阶优化 ZeRO(DeepSpeed 提出):把优化器状态、梯度、甚至权重也切分存放(ZeRO-1/2/3),让每个副本只存 1/N,从而大幅降低单卡显存——本质上是”数据并行 + 参数切片”的混合体。
代表:微软的 DeepSpeed。
6.4 三者的关系:3D 混合并行
现实中训练 GPT 这类大模型,是把三种方式按通信成本分层组合:
| 并行方式 | 切什么 | 通信内容 | 通信频率 | 部署位置 |
|---|---|---|---|---|
| 张量并行(TP) | 每层内部的矩阵 | 层内部分结果 | 每层一次 | 节点内(NVLink) |
| 流水线并行(PP) | 按层切分阶段 | 层间激活值 | 每个 micro-batch | 节点间(IB/以太网) |
| 数据并行(DP) | 按数据切分 batch | 全部梯度 | 每个 step | 节点间 |
原则很直觉:通信越频繁的切法,越要放在越快的互联上。
- TP 通信最频繁 → 锁在单机 8 卡内;
- PP 次之 → 跨机部署;
- DP 通信量大,但可用 Ring AllReduce 高效压缩,且能靠 ZeRO 省显存 → 放在最外层。
一句话总结:TP 解决「一层太大」,PP 解决「层数太多」,DP 解决「数据太多」,三者按通信代价分层组合,让千亿模型在普通 GPU 集群上可训。
7. 模型推理与部署
训练好的模型最终要跑起来对外服务。如果说第 6 节解决的是”怎么练”,这一节解决的就是”怎么跑”。推理和训练看似是同一件事的两个阶段,但它们的硬件瓶颈、显存构成和并行策略都截然不同。
7.1 推理与训练的本质区别
训练是”看图写话”:整个 batch 的所有 token 一次性并行送入模型,算出损失再反向传播。计算密集,每张卡都在满负荷做矩阵乘法。
推理(生成文本)是”接龙”:自回归地一个 token 一个 token 往外蹦。每生成一个新 token,都要把模型的全部权重从显存读一遍。模型越大,每生成一个 token 需要搬运的数据越多,而每个 token 的计算量却是固定的——这就导致推理,尤其是逐 token 生成的阶段,是访存密集型(Memory-Bandwidth Bound)的。
具体来说,推理分为两个阶段:
- Prefill(预填充):处理用户输入的整个 prompt,可以像训练一样并行计算。prompt 越长,这个阶段越慢,主要吃算力。
- Decode(解码):基于已生成的内容逐 token 输出,每个 token 都要完整读一遍权重,主要吃显存带宽。
这就是为什么同样的模型,训练时我们关心 TFLOPS(算力),推理时却常常关心显存带宽。可以用一个直观对比记住:
| 训练 | 推理 Prefill | 推理 Decode | |
|---|---|---|---|
| 计算方式 | 整批并行 | prompt 并行 | 逐 token 串行 |
| 瓶颈 | 算力 | 算力 | 显存带宽 |
| 显存大头 | 权重+梯度+优化器状态(约15~20字节/参数) | 权重+KV Cache | 权重+KV Cache |

图 7-1 训练与推理(Prefill / Decode)的计算方式与硬件瓶颈对比(参考 Pope et al., 2022, arXiv:2211.05102)
> 一个千亿模型训练要 1.5TB 显存,但推理只需要权重本身:bf16 精度下约 200GB,加上 KV Cache 也不过 250~300GB——4 张 H800 用张量并行就能跑起来。训练和推理的显存需求差了一个数量级。
7.2 KV Cache
Decode 阶段每生成一个 token,注意力机制都要回顾之前所有 token 的 Key 和 Value。如果每生成一个 token 就重算一遍所有历史 K、V,开销会随长度平方增长,完全不可接受。
KV Cache 的做法很直接:把历史 token 的 K、V 向量缓存下来,每步只算新 token 的 K、V 并追加进去。代价是显存——KV Cache 的大小为:
1 | 每 token 的 KV Cache = 2 × 层数 × KV头数 × 头维度 × 字节数 |
以 LLaMA-2-7B 为例(32 层、32 个 KV 头、bf16):每 token 约 0.5MB。看起来不多,但如果同时服务 64 个请求、每个请求 2048 token:
1 | 0.5MB × 64 × 2048 ≈ 64GB |
比 14GB 的模型权重本身还大好几倍。高并发长文本场景下,KV Cache 才是显存的第一大户——这正是推理框架和量化技术重点优化的对象。
还有一个承接第 4 节多头注意力的知识点:MQA / GQA(多查询 / 分组查询注意力)。既然 KV Cache 太大,那就让多个注意力头共享 K、V——GQA 把 KV 头数从 96 降到 8 甚至 1,KV Cache 直接缩小 12~96 倍,代价是略微的损失精度。LLaMA-3、Qwen 等新模型普遍采用 GQA,这是架构设计对推理成本妥协的典型例子。

图 7-2 KV Cache:缓存历史 token 的 K/V 并逐步追加;右侧为 MHA / MQA / GQA 的 KV 头共享对比(参考 Orca, OSDI’22 Fig.1c;Ainslie et al., GQA, Figure 1 in arXiv:2305.13245)
7.3 采样参数
模型输出的其实是一个概率分布,采样参数决定怎么从这个分布里挑 token。它们不改变模型本身的能力,只改变输出的”风格”:
- Temperature(温度):对概率分布做平滑处理。T→0 时退化为贪心解码(永远选概率最高的 token),输出确定但容易死板重复;T 越大分布越平,输出越发散。T=1 是模型原始的分布。
- Top-k:只在概率最高的 k 个 token 中采样,剪掉长尾。
- Top-p(核采样):只在累积概率达到 p 的最小候选集中采样,比 top-k 更自适应。
经验值:
| 场景 | temperature | 说明 |
|---|---|---|
| 代码生成、数学推理、事实问答 | 0 ~ 0.3 | 追求确定性和准确率 |
| 一般对话、总结 | 0.3 ~ 0.7 | 平衡 |
| 创意写作、头脑风暴 | 0.7 ~ 1.0 | 追求多样性 |
> 一个常见误解:调低 temperature 不能”治幻觉”。幻觉源于模型参数里的知识缺陷或检索失败,采样参数只是让模型更保守地选择它”本来就更想说”的内容。
7.4 量化(Quantization)
量化就是用更少的 bit 表示权重。模型默认用 bf16(16 bit)存储,量化把它压到 INT8 甚至 INT4:
| 精度 | 每参数字节 | 千亿模型权重体积 |
|---|---|---|
| FP32 | 4 | 400GB |
| BF16 | 2 | 200GB |
| INT8 | 1 | 100GB |
| INT4 | 0.5 | 50GB |
对访存密集型的 Decode 阶段来说,权重体积减半意味着每 token 的显存读取量减半,延迟直接下降——所以量化不仅省显存,还能提速。
常用方案:
- GPTQ:训练后量化,逐层用校准数据估计权重的重要性(Hessian 矩阵),对重要的权重分配更精细的刻度。
- AWQ:激活感知量化,发现”对激活值大的通道更敏感”,量化时刻意保护这部分权重,用更小的精度损失换取同等的压缩率。
- KV Cache 量化:权重只占显存一部分,把 KV Cache 也量化到 INT8/FP8,收益同样可观。
代价是精度:量化后模型在困惑度(perplexity)和 benchmark 上会有轻微下降,INT4 比 INT8 更明显,所以小模型或精度敏感任务要慎用。
> 量化和微调还能结合:QLoRA 把基座模型量化到 4bit,在其上训练低秩适配层(LoRA),让单张消费级显卡微调大模型成为可能。这也是”模型调优”一节中 SFT 的低成本替代路线。
7.5 推理框架
直接用 HuggingFace Transformers 的 model.generate() 做服务,吞吐量会很差,原因有两个:
- 静态批处理:一个 batch 必须等所有请求都生成完才能释放,短请求要等长请求,GPU 大量时间空转。
- KV Cache 显存碎片:每个请求的 KV Cache 长度动态变化,预先分配固定显存会浪费,动态分配又会碎片化。
vLLM 用两个技术解决了它们:
- Continuous Batching(连续批处理,又称 in-flight batching):由 Orca(OSDI 2022)提出,以 iteration 为单位调度,每生成一个 token 就检查一次:谁生成了 EOS 就立刻退出、谁的新请求到了就立刻插入。GPU 永远满负荷运转。
- PagedAttention(分页注意力):vLLM 的核心技术,借鉴操作系统虚拟内存的思想,把 KV Cache 切成固定大小的 block 按需分配、用后回收,彻底解决碎片问题。

图 7-3 静态批处理 vs 连续批处理(Continuous Batching)调度对比(参考 Orca, OSDI’22 Fig.2;广泛流传的重绘版见 Anyscale, 2023)
效果是服务吞吐(每秒处理的 token 总数)相比 naive 实现提升数倍到数十倍,尤其在请求长度差异大、并发高时差距悬殊。同类框架还有 NVIDIA 的 TensorRT-LLM、SGLang、以及面向 CPU/边缘设备的 llama.cpp。
评估推理服务时记住三个指标:
- TTFT(Time To First Token):首 token 延迟,决定用户感知到的”响应快不快”,主要受 prefill 影响;
- TPOT(Time Per Output Token):每 token 延迟,决定”流式输出顺不顺”;
- Throughput(吞吐量):整体服务能力,决定”成本高不高”。
还有一个值得了解的进阶技术——投机采样(Speculative Decoding):用小模型快速”草拟”若干 token,再让大模型一次性并行验证,猜对了就一次输出多个 token。在完全不改变输出分布的前提下,获得 2~3 倍的解码加速。
7.6 推理时的并行策略
回到第 6 节的三种并行,它们在推理中的地位和训练时很不一样:
- 数据并行(DP)在推理中”退化”了:没有梯度同步的概念,所谓 DP 只是部署多份独立副本,前面挂一个负载均衡路由器分流请求。它不解决”模型装不下”的问题。
- ZeRO 全部失效:ZeRO 切的是梯度、优化器状态、权重副本——推理时这些根本不存在。
- 张量并行(TP)成为主力:推理的显存需求 = 权重 + KV Cache,TP 把两者同时摊薄到多卡上。而且由于 decode 是访存密集型,TP 还能叠加显存带宽收益。一台 8 卡节点内做 TP,是推理部署的默认姿势。
- 流水线并行(PP)不受欢迎:PP 的 stage 间是严格串行的,推理时一个请求的每 token 要依次穿过所有 stage,延迟被直接放大,只在”TP 到 8 卡仍装不下”的超大模型上配合 TP 使用。
所以一个常见的推理部署公式是:
1 | 所需卡数 ≈ ceil( (权重显存 + KV Cache 显存) / 单卡显存 ),且 TP 优先绑定在单机内 |
一句话总结:训练是算力问题,推理是带宽问题;KV Cache 是推理显存的大户,量化是省显存的杠杆,连续批处理是提吞吐的关键,TP 单机内、PP 尽量避免是推理并行的铁律。
附录:样例提示词
1 | 角色:你是杭州市浙江大学医学院附属第一医院余杭院区的分诊台分诊助手,你的职责是询问每一个来医院看病的病人哪里不舒服,并且从病人的回复中判断病人应该去哪一个科室。 |
- 标题: AI基本概念
- 作者: 暗香疏影
- 创建于 : 2025-03-05 22:00:00
- 更新于 : 2026-09-19 21:08:00
- 链接: https://blog.pptcar.com/2025/03/05/2025-03-05-ai-basic-study/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
