腾讯混元大模型开发面试
混元大模型的预训练并行策略¶
在大规模稠密模型训练中,多种并行策略必须组合使用,以平衡计算、通信和显存。
- 数据并行:
- 原理:每张 GPU 持有完整的模型副本,但处理不同的数据批次(mini-batch)。前向传播各自独立计算,反向传播后,通过 All-Reduce 操作同步所有 GPU 上的梯度,确保模型参数更新一致。
-
特点:通信量是固定的(梯度大小),与模型大小成正比。当模型参数过大,单卡无法容纳时,数据并行就无法单独使用。
-
张量并行:
- 原理:将模型内部的单个层(如注意力层、FFN 层)的参数矩阵切分到多张 GPU 上,每张卡负责一部分计算。例如,把
W_Q矩阵按列切分,每张卡算出部分 Q,然后通过 All-Reduce 或 All-Gather 聚合结果。 -
特点:通信量极大,且非常频繁(每层计算都需要通信),因此要求 GPU 之间有极高的通信带宽(如 NVLink)。通常只在单机内部使用。
-
流水线并行:
- 原理:将模型按层切分到多张 GPU 上,例如 GPU 0 放 1-10 层,GPU 1 放 11-20 层。数据像流水线一样依次经过各 GPU。为了减少 GPU 空闲等待时间(气泡),通常会将 mini-batch 再细分为多个 micro-batch。
-
特点:通信量较小,只在层间传递激活值和梯度,因此对带宽要求不高,可以跨机连接。缺点是会产生气泡。
-
序列并行:
- 原理:当输入序列极长(如 128K)时,单张 GPU 的显存无法容纳整个序列的激活值。序列并行将输入序列在长度维度上切分到多张 GPU,每张卡负责计算一部分 token,在需要全局交互的注意力层通过 All-Gather 或 Reduce-Scatter 进行通信。
- 特点:它与张量并行互补,一个解决模型太大(权重放不下)的问题,一个解决激活太大(长序列放不下)的问题。
组合策略:在数千张 GPU 上训练一个稠密模型,典型的组合策略是 3D 并行:
-
张量并行:在单机 8 张 GPU 内部,使用张量并行来解决单卡放不下巨型矩阵乘法的问题。这是高性能的基石,其高频通信由机内的高速 NVLink 承载。
-
流水线并行:将不同层分配到不同的节点上,节点间通过 InfiniBand 网络连接,传递激活和梯度。这是扩展模型深度的主要方式。
-
数据并行:在上述基础上,将整个流水线复制多份(例如,几十个流水线组),每组处理不同的数据,组间通过 All-Reduce 同步梯度。这是扩展到数千张 GPU 的根本。
-
序列并行:如果支持超长上下文训练,在张量并行的基础上,进一步引入序列并行,将单卡上的长序列激活切分,分摊显存压力,保证长文本训练的可行性。
这种组合既利用了机内高速互联解决高频大通信量的问题,又通过跨机流水线扩展了模型规模,最后通过数据并行实现了算力的横向扩展。
MoE 架构的核心思想与挑战,及降低推理成本的设计¶
-
MoE 的核心思想: MoE 将单一的巨型 FFN 层替换为多个并行的、结构相同的“专家” FFN 模块,并引入一个可学习的门控网络。对于每个输入 token,门控网络选择 Top-K 个专家进行计算。模型的总参数量成倍增加(更大的容量),但每个 token 的计算量只增加 K 倍,实现了 “容量”与“计算量”的解耦。
-
MoE 引入的新挑战:
- 负载均衡:门控网络可能趋向于只把 token 发给少数几个“热门专家”,导致大部分专家闲置(专家坍塌),浪费模型容量。需要辅助损失来鼓励均匀分配。
- 通信开销:token 需要从当前 GPU 路由到它选中的专家所在的 GPU,这引入了 All-to-All 通信,在大规模跨节点训练时成为严重瓶颈。
-
显存碎片与管理:每个专家的输入 token 数不固定,导致显存的分配和释放非常动态,容易产生大量碎片,降低显存利用率。
-
为混元设计一个降低推理成本的 MoE 变体: 推理成本主要在于显存(需要加载所有专家权重)和访存(需要读取专家权重)。我会设计一个 “共享专家 + 细粒度专家 + 动态路由” 的方案。
- 专家数量:设置一个小的共享专家(1-2个),总是激活,用于捕获通用知识;同时设置大量(如 64 或 128 个)细粒度专家(每个专家的 FFN 维度可以缩小)。
- 路由策略:通常每个 token 路由到共享专家 + 少量细粒度专家(如 Top-1 或 Top-2)。关键是在推理时,可以预先将几乎所有细粒度专家卸载到 CPU 内存,仅将共享专家和门控网络保留在 GPU 显存上。当一批请求到来时,门控网络计算路由决策,预判出下一步需要激活的细粒度专家,并异步地将它们从 CPU 加载到 GPU。这种“预取”机制可以极大降低推理时的常驻显存,让总参数量巨大的 MoE 模型也能在成本可控的硬件上运行。
预训练数据清洗与去重 Pipeline 设计¶
这是一套典型的大规模数据清洗 Pipeline,重点解决中文互联网文本和多轮对话数据的质量问题。
-
格式与基础过滤:去除 HTML 标签、乱码、重复空格;基于规则和分类器,过滤掉包含涉黄、涉暴等明显不安全的文本。
-
质量筛选:训练一个轻量级文本质量分类器(基于 BERT/RoBERTa),对文本进行打分,去除低俗、广告、无意义灌水等低质量内容。
-
文档级去重:
- MinHash:将文档分词后,用一个或多个哈希函数对词进行哈希,取最小值作为该文档的签名。两个文档的 MinHash 签名相似的概率,等于它们集合的 Jaccard 相似度。这是一种高效估算文档相似度的算法。
-
LSH:为了在海量文档中快速找到相似对,使用 LSH 将 MinHash 签名分桶。LSH 的原理是,将文档的 MinHash 签名切分成多个波段,只有两个文档在同一个波段内的签名完全相同,它们才会被哈希到同一个桶里。所有被分到同一个桶里的文档对,就是候选的相似(或近似重复)文档,然后对这些候选对进行更精确的相似度计算和去重。
-
行级/段落级去重:去除在整个语料库中反复出现的固定话术、模板文本、广告用语等。
-
专项数据处理:
- 中文网络文本:特别过滤掉标题党、震惊部、蹭热点但内容空洞的文本。基于规则和统计特征进行识别。
- 多轮对话数据:采用会话级去重。将整个多轮对话视为一个整体,计算其 MinHash。如果两个会话整体相似度极高,则视为重复。对于拼接数据,增加一条规则:同一会话必须来自同一用户、同一主题,且时间上是连续的。
长上下文扩展与训练优化¶
- 位置编码扩展原理:
- NTK-aware RoPE 缩放:RoPE 的频率设计使得不同维度捕捉不同尺度的位置信息(高频对应局部,低频对应长程)。NTK-aware 缩放的核心是“保护高频,拉伸低频”。通过调整基频,将低频分量的周期拉长,使其能区分更远距离的位置,同时保持高频分量几乎不变,以保留局部细节的敏锐度。
-
YaRN:在 NTK-aware 基础上,YaRN 发现长序列上注意力矩阵的分布会变得过于平滑,导致模型无法聚焦。因此,它额外引入一个 “温度”参数作用于 softmax,锐化注意力分布,使得模型在长距离上也能做出果断的注意力选择。YaRN = NTK 缩放 + 注意力温度调节。
-
长序列训练的显存爆炸应对:
- FlashAttention-2:通过 IO 感知的 Tiling 和重计算,将标准注意力的 O(n²) 显存复杂度降低到 O(n)。这是处理长序列的基础,但并不改变计算量。
- 稀疏注意力/窗口注意力:进一步降低计算量。让每个 token 只关注其附近一个窗口内的 token,或少数预定义的全局 token,将计算复杂度从 O(n²) 降低到 O(n)。
- 序列并行 + 选择性激活重计算:将长序列切分到多卡,分头计算。在反向传播时,不保存前向产生的所有中间激活,而是在需要时重计算(以时间换空间),并配合 FlashAttention 大幅降低激活显存。
RLHF 中的 PPO vs DPO 及偏好数据构建¶
- PPO 与 DPO 的优缺点比较:
- PPO:在线策略强化学习,需要同时维护策略模型、参考模型、奖励模型和 Critic 模型。优点是能够进行探索,与真实环境(奖励模型)交互,可能突破现有策略的上限。缺点是训练极不稳定、超参敏感、计算资源开销巨大。
-
DPO:离线直接偏好优化。它将 RLHF 中的奖励模型训练和策略优化合并为一个分类任务。优点是极其简单稳定、计算成本低。缺点是无法进行在线探索,性能受限于给定的偏好数据。
-
构建高质量偏好数据集:
- 从真实用户请求中采样一个 prompt。
- 使用当前模型(或一组不同特性模型)生成多个回复。
-
标注员根据预先定义好的、细粒度的规则,对两个回复进行比较并写出理由,形成
(prompt, chosen, rejected, reason)四元组。关键是要深入挖掘“好在哪里,差在哪里”。 -
定义多维奖励模型: 不训练单一的奖励模型,而是分别训练多个维度(有用性、安全性、角色人设)的奖励模型,然后进行加权组合。这样可以更精细、更可解释地控制模型的平衡倾向。
推理部署优化:Continuous Batching, PagedAttention 与量化¶
-
Continuous Batching:传统静态批处理必须等一个 batch 内所有请求都生成完才释放,GPU 利用率极低。Continuous Batching 允许在一个请求完成生成后,立即将一个处于等待队列中的新请求动态插入到当前 batch 的空闲槽位中。这实现了计算核心的“不停歇”运转,极大提升了吞吐量。
-
PagedAttention:借鉴操作系统的分页思想,将 KV Cache 切分成固定大小的内存块,可以非连续地存储。这解决了静态分配导致的大量显存碎片问题,实现了“零浪费”的显存管理。结合 FlashAttention 内核,它可以高效地对非连续的块进行注意力计算。
-
量化与 KV Cache 管理:
- INT4/INT8 权重量化:将模型权重量化到低比特,减小模型体积和显存占用。
- 注意事项:1) 需要精细的逐层或逐张量校准(Post-Training Quantization),以最小化精度损失。2) KV Cache 量化:对长序列推理,KV Cache 本身占用巨大显存。将它也量化到 INT8/INT4,是继续扩展上下文长度的必要手段。3) GQA:大模型应标配 GQA,从源头减少 KV Cache 的头数,是最高效的节省显存手段。
LoRA/QLoRA 原理及多租户微调管理¶
- LoRA 与 QLoRA 原理:
- LoRA:基于“模型微调时,权重更新是低秩的”这一假设。它在原始权重矩阵旁添加一个低秩支路
BA,只训练A和B。训练完成后可合并回原权重。 -
QLoRA:在 LoRA 的基础上,将原始模型量化为 4-bit (NF4) 格式,进一步降低显存占用,使得在单张消费级显卡上微调 70B 模型成为可能。
-
多租户 LoRA 管理:
- 高效存储:在 GPU 显存中加载一个共享的基座模型,以及一个高速的 LoRA 适配器缓存池。每个租户的请求到来时,通过调度器动态选择对应的 LoRA。
- 高效推理:关键在于 “预合并”和 “热插拔”。可以将高频使用的 LoRA 预先合并进基座模型(生成一个临时副本),其他请求使用未合并的基础模型。利用 S-LoRA 等框架,在一次前向传播中,通过为不同 token/request 动态选择不同的 LoRA 矩阵块,实现高效批处理。延迟和吞吐的额外开销极小,且通常成亚线性增长。
什么是大模型“幻觉”及在腾讯混元助手中系统性降低幻觉率的方案¶
大模型“幻觉” 是指模型生成的内容虽然流畅且看似合理,但与客观事实或提供的上下文不符,是一种“看似正确的虚假信息”。
在腾讯混元助手业务中,系统性降低幻觉的方案如下:
- 数据层:
- 预训练数据清洗:通过事实一致性校验等过滤,降低有毒、错误和矛盾信息的比例。
-
SFT 数据构造:刻意构造“诚实”数据集,包含大量模型承认不知道或不确定的优质回复,从源头上教会模型说“不”。
-
训练层:
- 事实性强化学习:在 DPO 偏好对数据中,明确地将高事实性的回答作为 chosen,将幻觉回答作为 rejected,让模型通过偏好对齐内化“诚实”的价值观。
-
知识编辑/遗忘:对模型已知的错误知识进行定向编辑或遗忘,修正已固化的错误认知。
-
推理层:
- 检索增强生成(RAG):这是目前最核心、最有效的工程化方案。在模型回答前,先从可信知识源(如搜狗搜索、腾讯新闻、企业知识库)中检索相关证据,拼入 Prompt 作为“参考资料”,要求模型严格依据资料作答。这能将生成任务从“闭卷默写”转化为“开卷阅读理解”。
-
约束解码:对于需要精确输出的场景(如调用 API),采用约束解码技术,强制模型生成符合特定 Schema 或只能从给定白名单中选择词汇,从根本上杜绝格式或实体上的幻觉。
-
系统层(产品化):
- 逐句溯源:强制模型为其生成的关键事实提供引用来源,用户可一键跳转验证。这种可验证性会给模型带来隐式约束,促使其更忠实于来源。
- 多模型验证:对同一个问题,生成多个答案或使用不同模型回答,进行交叉验证,选出最一致、最可靠的答案。
- 人在回路(Human-in-the-Loop):对于医疗、法律等高风险场景,建立人工审核流程,由专家对模型的关键输出进行把关。