跳到主要内容 LLM 基础知识备忘录 | 极客日志
Python AI 算法
LLM 基础知识备忘录 本文档详细梳理了大语言模型(LLM)的基础知识体系,涵盖预训练阶段的超参数调优、位置编码机制(Sinusoidal/ROPE/ALiBi)、Norm 结构差异及 DeepSeek 模型的具体实践。内容深入探讨了 MoE 架构(Mixtral 与 DeepSeekMoE)的原理与负载均衡策略,以及 SFT 和 DPO 对齐技术的数据构建与训练细节。此外,还对比了 DeepSpeed 与 Megatron 的分布式训练差异,并提供了 vLLM 和 SGLang 的部署实战代码示例。文章旨在为开发者提供一份全面的 LLM 技术备忘录,辅助理解模型训练、优化与部署的关键环节。
魔法巫师 发布于 2025/2/6 更新于 2026/4/20 3 浏览
LearningRate 和 BatchSize 之间的关系 在大规模语言模型训练中,学习率(Learning Rate, LR)与批次大小(Batch Size)之间存在密切的权衡关系。假设 batch_size 足够小,等于 1,如果 lr 设得比较大则容易导致 loss 发散;假设 batch_size 足够大,等于全量的数据,如果这个时候 lr 设的小则收敛会很慢。因此,理论上来说,batch_size 和模型参数增大时,较小的 lr 并不是说不收敛,而是可能需要更多的 steps 才能收敛。为了保持训练效率,通常需要根据 batch_size 的变化适当线性或平方根缩放 learning rate,以确保梯度更新的稳定性。
关于位置编码 Transformer 架构本身不具备处理序列顺序的能力,因此需要引入位置编码(Positional Encoding)来注入位置信息。
sinusoidal 位置编码
考虑两个位置 i 和 j,由于正弦和余弦函数的性质,位置编码的差值 PE(i) - PE(j) 将与 i 和 j 之间的差值有关。这意味着通过比较不同位置编码之间的差值,模型可以推断出它们之间的相对位置,从而具备外推能力。
ROPE 相对位置编码
旋转位置编码(Rotary Positional Embeddings)通过将向量进行旋转操作来融合位置信息。它允许模型在处理长序列时更好地捕捉相对距离,且不需要额外的插值即可支持更长的上下文窗口。
ALiBi 位置编码
Attention with Linear Biases (ALiBi) 不直接添加位置嵌入,而是在 Attention Score 上加上一个偏置项,该偏置项与 token 之间的距离成比例。这种方法使得模型能够泛化到比训练时更长的序列长度。
Pre-Norm 和 Post-Norm 的差异和优劣
Pre-Norm :在残差连接之前进行归一化。这种结构有助于梯度的稳定传播,防止深层网络中的梯度消失或爆炸问题,通常训练过程更加稳定。
Post-Norm :在残差连接之后进行归一化。虽然早期研究认为其性能略逊于 Pre-Norm,但在某些特定场景下,Post-Norm 能带来更好的最终收敛效果,尤其是在浅层网络中。目前主流的大模型多采用 Pre-Norm 结构以保证训练稳定性。
DeepSeek 要点 学习率细节 :DeepSeek 采用了复杂的学习率调度策略。warmup 阶段为 2000 个 steps 之后达到最大值,在 80% 的 tokens 之后学习率下降到最大值的 31.6%,90% 的 tokens 之后下降到最大值的 10%。最终模型表现上,multi-step scheduler 和 cosine scheduler 基本保持一致;而 multi-step 的优势是,在保持模型大小固定调整训练规模时,可以重用第一阶段训练的结果,这比较方便后续的继续训练。
梯度的 grad clip 设为 1.0,以防止梯度爆炸。
数据并行、张量并行、序列并行、1F1B 的流水线并行。
使用 flash attention 优化注意力计算。
ZeRO-1 用于根据数据并行排列划分优化器状态,减少显存占用。
模型参数的精度为 bf16,梯度的精度为 fp32,以平衡精度与速度。
模型权重和优化器状态每 5 分钟同步,并且逐步清除之前保存的 ckpt,以节省存储资源。
数据质量越高,越可以将更多的计算预算分配给模型规模 。
随着模型计算量的增大(即模型规模增大),最优的 batch_size 也在增大,最优的 learning_rate 呈现减小的趋势。
Alignment :收集了 150w 中英文 instruction 数据,其中 helpful 数据有 120w,31.2% 是通用语言任务,46.6% 是数学问题,22.2% 是代码问题;安全数据有 300K 条,包含不同的敏感话题。
有监督微调 SFT
7B 模型微调了 4 个 epoch,67B 模型只微调 2 个 epoch,学习率分别是 1e-5 和 5e-6。
微调过程中,除了观察 benchmark 的准确率,还会评估 chat 模型的重复率,收集了 3868 条中英文 prompts,观测生成回复没有终止或者无休止重复一段文本的比例。发现随着数学 SFT 数据的增多 ,重复的概率也倾向于增大;主要原因应该是数学 SFT 数据较少包含相似的推理模式,弱模型较难获取这样的推理模式,导致重复的回复,为此设计了两阶段微调和 DPO,保持 benchmark 恩叔的同时大大降低重复 repetition。
DPO :就 helpfulness 和 harmlessness 两方面构建训练 DPO 的偏好数据。对于 helpfulness 数据,收集多语言 prompts,包含创新写作、问答、指令跟随等,使用 DeepSeek Chat 模型生成回复候选;对于 harmlessness 数据也进行相似的操作。
训练 1 个 epoch、learning_rate=5e-6、batch_size=512,使用 learning rate warmup 和 cosine learning rate scheduler。
我们发现 DPO 能够强化模型开发侧生成技能,而在标准 benchmark 的表现一般。
Staged Fine-Tuning :在数学和代码数据集上,下模型需要更长微调时间,但是会损害模型对话的能力(比如增加重复的概率)。因此本文采用了分阶段微调:
第一阶段采用全量数据进行基础微调。
第二阶段主要关注在对话数据上微调。
多项选择问题 :对齐阶段加入多项选择数据,能够改善在多项选择评估任务上的效果,但是对于其他生成式任务没有明显改善(也没有下降)。因此在预训练和微调阶段,我们移除了 MC 数据 ,因为这些数据容易导致模型过拟合,却不会强化模型的智能性。
预训练中加入指令数据 :在预训练最后 10% 过程加入 500w 条多项选择的指令数据,表明确实能强化 base 模型在 benchmark 上的效果。但是实验发现,其实在 SFT 阶段加入同样的数据结果是一致的。因此,我们认为模型整体的潜力并不会因为在预训练过程加入指令数据而得到强化。不过,如果指令数据规模够大,确实可以考虑在预训练过程中加入。而本文选择预训练过程不加入指令数据。
System Prompt :精心设计的 system prompt 能够有效指导模型生成 helpful 和 respectful 的结果。
当引入 system prompt 时,7B LLM 性能有一点下降,而 67B 的 LLM 性能有比较显著提升。我们认为更大的模型能够更好地理解 system prompt 的意图,从而更好地遵循指令、得到更好的回复。小模型很难充分掌握 system prompt,同时训练和测试的不一致对性能产生了负面影响。
矫正了之前工作中 scaling laws 的问题,提供新的最优的模型 - 数据规模分配策略。
提出了一种新的方法,基于给定的预算 budget 来预测接近最优的 batch size 和 learning rate。
总结了 scaling laws 和数据质量的关系。
关于 MoE
Mixtral 要点 Mixtral 的每一层包含 8 个 FFN 块。对于每一层的每一个 token,router 网络选择两个 experts 处理当前状态,并将他们的输出进行组合。尽管每个 token 只使用了两个 experts,但是每一个 timestamp 选择的 expert 是不同的,因此每一个 token 可以访问 47B 的参数,但是推理时只使用 13B 激活的参数。
对于给定的输入 x,MoE 模块的输出是 expert 网络输出的加权和,这里的权重是由门网络输出,假设有 n 个 expert 网路 {E_0, E_i, ..., E_{n-1}},专家层的输出为:
\sum_{i=0}^{n-1} G(x)_i \cdot E_i(x)
这里门网络 G(x) 有多种实现方式,一种简单且有效的方式就是记忆线性输出的 Top-K 的 logits 进行 softmax。
G(x) := Softmax(TopK(x \cdot W_g))
这里,如果 l_i 存在于 logits 的 topK 位置,则 (TopK(l))_i := l_i,否则 (TopK(l))_i = -\infty。这里的 K 表示每个 token 使用的 experts 的数量,是一个可以自定义的超参数。
如果增加专家的数量 n 同时保持 K 固定,则可以在增加模型参数的同时保持计算开销固定。模型的参数随着专家数 n 的增加而增加,处理一个单独 token 的参数数量随着 K 的增加而增加,最大为 n。
可以通过高性能专门的内核,在单个 GPU 上有效运行,如 Megablocks。
也可以通过 Expert Parallelism(EP)策略分配到多个 GPU 上。当 MoE 层执行时,tokens 通过一个路由到对应 GPU 的专家进行处理,然后专家的输出返回到原始的 token 位置。
在 Transformer 模型中,MoE 层在每一个 token 上单独应用,替换 transformer block 中的 FFN 子块。对于 Mixtral 我们使用相同的 SwiGLU 结构,对应专家函数为 E_i(x) 并设置 K=2。这意味着每一个 token 路由到 2 个不同权重集合的 SwiGLU 子块,因此对于输入 token x 的输出 y 为:
y = \sum_{i=0}^{n-1} Softmax(Top2(x \cdot W_g))_i \cdot SwiGLU(x)
这个公式和 GShard 结构比较相似,只不过我们通过 MoE 层替换了所有 FFN 子块,而 GShard 替换了其他块,而且 GShard 对于每一个 token 的第二个专家采用了更加复杂的门控策略。
DeepSeekMoE 要点
Fine-grained Expert Segmentation:细地将专家划分为 m_N 个,激活其中的 m_K 个,实现激活的专家更灵活的组合。
Shared Expert Isolation:将 K_s 单独看做共享专家,用于捕获常识以及缓解路由专家中的冗余知识。
N 表示专家的数量。
FFN_i(\cdot) 表示第 i 个专家 FFN。
g_{i, t} 表示第 i 个专家的 gate value,s_{i, t} 表示 token-to-expert 亲近度。
Topk(\cdot, K) 表示第 t 个 token 和所有 N 个专家计算得到的 K 个最高的亲近度分数。
e_i^l 表示第 l 层的第 i 个专家中心 centroid。
DeepSeekMoE 的结构
对于传统 MoE 中每一个专家 FFN,将 FFN 中间隐层维度降低到原大小的 1/m,将一个专家划分成 m 个更小的专家。
由于每一个专家变得更小了,相应地我们将激活的专家的数量增大到 m 倍来保持相同的计算开销。
将专家 K_s 看做共享专家独立看待,无论路由模块如何,每一个 token 会确定性地分配到这些共享的专家上。为了保持计算开销一致,其他路由专家的激活数量需要减去 K_s。
Load Balance Consideration:训练时如果模型总是选择部分 experts,其他 experts 就无法得到充分训练;如果专家分布在不同的 devices 上,负载不均衡就会成为计算瓶颈。
Expert-Level Balance Loss:为了缓解路由崩塌的风险,我们采用了 expert-level balance loss。
Device-Level Balance Loss:我们的主要目标是保证不同设备均衡计算,如果我们将所有的路由专家分成 D 组 {E_1, E_2, ..., E_D},将每一组部署到一个单独的 device,那么 device-level 的均衡损失为:
实验设置 :
9 层 Transformer 层,hidden_dim=1280, num_heads=10, head_dim=128。将所有 FFN 层替换为 MoE 层,保证专家参数总数等于标准 FFN 的 16 倍。
保证激活的专家参数,包括共享专家参数和激活的路由专家参数,是标准 FFN 的 2 倍。
这样每个 MoE 模型总参数量为 2B,激活的参数约为 0.3B。
对齐
Reward 模型的损失函数 Reward Model 通常用于 RLHF 流程中,通过对比优选样本和被拒绝样本来优化模型。其损失函数计算如下:
logits = 1 + torch.exp(rejected_reward - chosen_reward)
loss = torch.log(logits).mean()
Reward 模型的输入和输出 Reward Model 的输入通常包含系统提示、用户问题和模型回答,格式如下:
分布式相关
DeepSpeed 和 Megatron 之间的差异 DeepSpeed 和 Megatron-LM 都是用于大规模模型训练的框架,但侧重点有所不同。
DeepSpeed :侧重于优化训练效率和显存管理,提供了 ZeRO 系列优化技术(ZeRO-1/2/3),可以显著减少优化器状态、梯度和参数的显存占用,适合单机多卡及多机训练场景。
Megatron-LM :侧重于模型并行策略,特别是张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism),适合超大规模模型的分布式训练,常与 DeepSpeed 结合使用以获得最佳性能。
分析 Transformer 模型的参数量、计算量、中间激活及 KV Cache 对于选择合适的并行策略至关重要。LLM 并行训练技术介绍涵盖了从数据并行到混合并行的多种方案。
部署相关
常用的部署方式有哪些
vLLM vLLM 是一个高效的大模型推理服务框架,支持 PagedAttention 技术,能够显著提高吞吐量并减少内存碎片。
python -m vllm.entrypoints.openai.api_server --served-model-name Qwen1.5-7B-Chat --model Qwen/Qwen1.5-7B-Chat
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen1.5-7B-Chat",
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Tell me something about large language models."}
]
}'
from openai import OpenAI
openai_api_key = "EMPTY"
openai_api_base = "http://localhost:8000/v1"
client = OpenAI(
api_key=openai_api_key,
base_url=openai_api_base,
)
chat_response = client.chat.completions.create(
model="Qwen1.5-7B-Chat" ,
messages=[
{"role" : "system" , "content" : "You are a helpful assistant." },
{"role" : "user" , "content" : "Tell me something about large language models." },
]
)
print ("Chat response:" , chat_response)
SGLang SGLang 是另一个专注于高性能推理的框架,支持复杂的推理逻辑编排。
python -m sglang.launch_server --model-path Qwen/Qwen1.5-7B-Chat --port 30000
from sglang import function, system, user, assistant, gen, set_default_backend, RuntimeEndpoint
@function
def multi_turn_question (s, question_1, question_2 ):
s += system("You are a helpful assistant." )
s += user(question_1)
s += assistant(gen("answer_1" , max_tokens=256 ))
s += user(question_2)
s += assistant(gen("answer_2" , max_tokens=256 ))
set_default_backend(RuntimeEndpoint("http://localhost:30000" ))
state = multi_turn_question.run(
question_1="What is the capital of China?" ,
question_2="List two local attractions." ,
)
for m in state.messages():
print (m["role" ], ":" , m["content" ])
print (state["answer_1" ])
总结 本文档整理了大语言模型(LLM)的基础知识,涵盖预训练策略、位置编码机制、模型架构(如 MoE)、对齐技术(SFT/DPO)以及分布式训练和部署方案。通过对 DeepSeek 等前沿模型的技术细节分析,帮助开发者理解现代 LLM 的核心原理与工程实践。在实际应用中,建议根据具体业务需求选择合适的并行策略和部署工具,并持续关注 Scaling Law 带来的模型优化方向。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online