第三部分:大模型训练流程(预训练)
摘要:本部分将深入大模型工业级开发的核心——预训练。我们将揭开从海量数据清洗到万亿参数模型并行训练的神秘面纱。你将学习如何构建高质量数据集、理解 NVIDIA 硬件架构、掌握 3D 并行策略(数据并行、张量并行、流水线并行),并深入解析微软 DeepSpeed 框架如何让显存利用率最大化。
第7章 大语言模型的预训练机制
7.1 训练目标:Next Token Prediction
大模型预训练的核心任务非常简单且暴力:预测下一个词(Next Token Prediction)。 这是一种自监督学习(Self-Supervised Learning),不需要人工打标签,互联网上的文本本身就是标签。
- 输入:
DeepSeek 是一家中国的 AI - 目标输出:
公司 - 损失函数:交叉熵损失(Cross Entropy Loss)。模型输出的是词表中每个词的概率,我们要最大化正确词的概率。
【实战】手写交叉熵损失函数
在 PyTorch 中,nn.CrossEntropyLoss 已经封装好了,但理解其原理至关重要。
import torch
import torch.nn.functional as F
def manual_cross_entropy(logits, targets):
"""
logits: 模型输出 (Batch_Size, Vocab_Size)
targets: 真实标签 (Batch_Size)
"""
# 1. Softmax 将输出转换为概率分布
probs = F.softmax(logits, dim=-1)
# 2. 选取真实标签对应的概率
# gather用于按索引取值
batch_size = logits.shape[0]
# targets.view(-1, 1) 变成列向量
target_probs = probs.gather(1, targets.view(-1, 1)).squeeze()
# 3. 计算负对数似然 (NLL)
loss = -torch.log(target_probs)
# 4. 求平均
return loss.mean()
# 测试
batch_size, vocab_size = 2, 5
logits = torch.randn(batch_size, vocab_size)
targets = torch.tensor([2, 4]) # 假设真实标签是第2个和第4个词
loss_manual = manual_cross_entropy(logits, targets)
loss_torch = F.cross_entropy(logits, targets)
print(f"手写 Loss: {loss_manual.item():.4f}")
print(f"官方 Loss: {loss_torch.item():.4f}")
7.2 大模型的评估体系
怎么知道模型练好了?看 Loss 下降是不够的,需要多维度评测:
- MMLU:大规模多任务语言理解(综合能力)。
- GSM8K / MATH:小学到竞赛级数学问题(逻辑能力,DeepSeek 强项)。
- HumanEval / MBPP:代码生成能力。
- LongBench:长文本理解(大海捞针测试)。
第8章 数据工程(预训练)
"Garbage In, Garbage Out"(垃圾进,垃圾出)是 AI 铁律。DeepSeek 之所以强大,很大程度上归功于其高质量的数据清洗。
8.1 数据处理流水线 (Data Pipeline)
- 搜集 (Collection):
- 网页数据:CommonCrawl(量大但噪声多)。
- 专业数据:arXiv 论文、GitHub 代码、StackOverflow 问答、维基百科。
- 过滤 (Filtering):
- 启发式过滤:删除过短的句子、乱码比例高的文本。
- 质量模型:用一个在此前高质量数据上训练的小模型(如 BERT)给新数据打分,低于阈值的丢弃。
- 去重 (De-duplication):
- MinHash + LSH:在大规模数据集中快速发现相似文档,防止模型“背书”而非“理解”。
- 去毒与隐私 (Safety):去除暴力、色情内容及PII(个人敏感信息)。
8.2 数据配比 (Data Mixture) & DoReMi
不同领域的数据比例如何分配?
- 代码多了,逻辑推理变强,但文学创作可能变弱。
- DoReMi 算法:通过训练一个小规模代理模型,自动搜索最优的数据混合比例,而不是靠拍脑袋决定。
第9章 解析预训练的硬件体系
训练千亿模型,单卡是不可能的。DeepSeek-V3 使用了数千张 H800 GPU 集群。
9.1 显卡架构基础
- 显存 (VRAM):存放模型权重、梯度、优化器状态。A100/H800 通常是 80GB。
- Tensor Core:专门用于矩阵乘法加速的硬件单元。
- NVLink:显卡与显卡之间的高速互连通道(带宽 600GB/s - 900GB/s),远快于 PCIe。
9.2 通信协议
- NCCL (NVIDIA Collective Communications Library):NVIDIA 专为深度学习优化的集合通信库,支持 All-Reduce, All-Gather 等操作。它是分布式训练的“交通规则”。
第10章 LLM分布式预训练过程
这是本部分的重头戏。当模型大到单卡放不下,必须使用分布式并行技术。
10.1 3D 并行策略
为了把大模型塞进集群,通常混合使用三种策略:
- 数据并行 (Data Parallelism, DP):
- 每张卡都有完整的模型副本。
- 数据切分成不同的小批次(Micro-batch)给不同卡跑。
- 缺点:显存浪费,每张卡都存了一份模型。
- 张量并行 (Tensor Parallelism, TP):
- 把矩阵切开。比如 ,把大矩阵 切成两半 分别放在两张卡上计算,最后再拼起来。
- 这是 Megatron-LM 的核心技术。
- 流水线并行 (Pipeline Parallelism, PP):
- 把模型的层切开。比如前 10 层在 GPU 0,后 10 层在 GPU 1。
- 缺点:会有“气泡”(Bubble),即 GPU 等待数据的时间。
10.2 DeepSpeed 与 ZeRO 优化
微软开发的 DeepSpeed 是目前最主流的训练框架,核心技术是 ZeRO (Zero Redundancy Optimizer)。
核心思想:数据并行中,每张卡都存完整的参数是浪费。ZeRO 把它切分!
- ZeRO-1:切分优化器状态(Optimizer States)。显存节省 4 倍。
- ZeRO-2:切分梯度(Gradients)。显存再省 2 倍。
- ZeRO-3:切分模型参数(Parameters)。显存利用率最大化,每张卡只存 1/N 的参数。
【实战】DeepSpeed 配置文件 (ds_config.json) 这是一个开启了 ZeRO-2 的典型配置,适用于单机多卡微调或中小规模预训练。
{
"train_batch_size": "auto",
"gradient_accumulation_steps": "auto",
"steps_per_print": 100,
"optimizer": {
"type": "AdamW",
"params": {
"lr": 2e-5,
"betas": [0.9, 0.999],
"eps": 1e-8,
"weight_decay": 0.01
}
},
"fp16": {
"enabled": true, "//": "开启混合精度训练,节省显存并加速"
},
"zero_optimization": {
"stage": 2, "//": "开启 ZeRO Stage 2 (切分梯度+优化器状态)"
"allgather_partitions": true,
"allgather_bucket_size": 2e8,
"reduce_scatter": true,
"reduce_bucket_size": 2e8,
"overlap_comm": true,
"contiguous_gradients": true
},
"wall_clock_breakdown": false
}
10.3 显存占用分析公式
训练一个模型到底需要多少显存? 假设模型参数量为 (比如 7B模型,)。 在使用 Adam 优化器和混合精度训练时,每张卡至少需要:
- 模型参数:2 bytes (fp16)
- 梯度:2 bytes (fp16)
- 优化器状态:12 bytes (fp32 的参数副本, momentum, variance)
- 总计: 字节/参数。
对于 7B 模型,仅模型相关显存就需要 GB。单张 A100 (80GB) 放不下! 这就是为什么必须使用 ZeRO 或模型并行。
第三部分总结: 预训练是 AI 的“重工业”。本部分我们深入了数据的采集与清洗,理解了支撑大模型的硬件集群,并掌握了分布式训练的核心算法(3D 并行与 ZeRO)。理解这些,你就能明白为什么 DeepSeek 能在有限算力下训练出高性能模型——依靠的是极致的工程优化和算法创新。
下期预告: 模型预训练完只是个“高智商的婴儿”,它懂很多知识但不懂如何遵循指令。接下来我们将进入 第四部分:大模型后训练与微调。我们将学习 SFT(有监督微调)、RLHF(人类反馈强化学习)以及 LoRA 等高效微调技术,让模型真正变得“听话”且“好用”。