大模型技术详解:架构、分布式训练与参数高效微调
1. 大语言模型的细节
1.0 Transformer 与 LLM
Transformer 架构是大语言模型(LLM)的基石。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全基于注意力机制(Attention Mechanism)。这种架构使得模型能够并行处理序列数据,并有效捕捉长距离依赖关系。
1.1 模型结构
典型的 Transformer 模型由 Encoder 和 Decoder 组成,但在现代 LLM 中,通常采用 Decoder-only 架构。每一层包含多头自注意力机制和前馈神经网络(FFN),并通过残差连接(Residual Connection)和层归一化来稳定训练过程。
class TransformerBlock(nn.Module):
def __init__(self, dim, n_heads):
super().__init__()
self.attn = MultiHeadAttention(dim, n_heads)
self.ffn = FeedForward(dim)
self.norm1 = LayerNorm(dim)
self.norm2 = LayerNorm(dim)
def forward(self, x):
x = self.norm1(x + self.attn(x))
x = self.norm2(x + self.ffn(x))
return x
1.2 训练目标
大模型主要采用自回归(Autoregressive)方式训练,即预测下一个 token。损失函数通常为交叉熵损失(Cross-Entropy Loss),旨在最大化给定上下文的下一个词出现的概率。
1.3 Tokenizer
分词器负责将文本转换为模型可理解的 token ID。常见的策略包括 Byte Pair Encoding (BPE) 和 WordPiece。例如,GPT 系列使用 BPE,而 BERT 使用 WordPiece。选择合适的 tokenizer 对模型性能至关重要。
1.4 位置编码
由于 Transformer 缺乏递归结构,需要显式的位置信息。早期使用正弦余弦位置编码(Sinusoidal Positional Encoding),而现代模型如 LLaMA 则采用旋转位置编码(RoPE),在保持相对位置感知的同时支持更长的上下文窗口。
1.5 层归一化
Layer Normalization 是标准配置,但为了提升训练稳定性,部分模型引入了 RMSNorm(Root Mean Square Layer Normalization),去除了均值计算,减少了计算开销。
1.6 激活函数
ReLU 曾是主流,但 SwiGLU 等变体在现代 LLM 中表现更佳。SwiGLU 结合了 Sigmoid 门控和线性变换,提升了模型的表达能力。
1.7 Multi-query Attention 与 Grouped-query Attention
标准 Multi-Head Attention (MHA) 计算量大。Multi-Query Attention (MQA) 共享 KV 头以减少内存占用;Grouped-Query Attention (GQA) 则在 MHA 和 MQA 之间取得平衡,兼顾推理速度与效果。
1.8 并行 transformer block
为了加速训练,可以采用流水线并行或张量并行将不同的 Transformer Block 分布到不同设备上。
1.9 总结 - 训练稳定性
混合精度训练、梯度裁剪和适当的学习率调度是保证大规模模型训练稳定的关键要素。
2. LLM 的分布式预训练
2.0 点对点通信与集体通信
分布式训练依赖于高效的通信原语。点对点通信(如 send/recv)用于特定节点间的数据交换,而集体通信(如 AllReduce, AllGather)则用于聚合梯度或同步状态,通常通过 NCCL 库实现。
2.1 数据并行
数据并行是最基础的并行策略。每个 GPU 持有完整的模型副本,处理不同的数据子集,并在每一步同步梯度。适用于模型较小但数据量大的场景。
2.2 张量并行
当单卡无法容纳模型权重时,需使用张量并行(Tensor Parallelism)。它将矩阵运算切分到多个 GPU 上,要求极高的通信带宽,通常配合 Ring AllReduce 使用。
2.3 流水线并行
流水线并行将模型的不同层分配到不同设备上,形成流水线。虽然解决了显存限制,但会引入气泡(Bubble)导致算力浪费。改进方案如 GPipe 和 PipeDream 优化了负载均衡。
2.4 3D 并行
结合数据并行、张量并行和流水线并行,形成 3D 并行策略,以支持万亿参数级别的模型训练。
2.5 混合精度训练
利用 FP16 或 BF16 进行计算,减少显存占用并提升速度,同时保留 FP32 主权重以防止数值溢出。
2.6 激活重计算
为节省显存,不保存前向传播的中间激活值,而是在反向传播时重新计算。这以计算换空间,显著降低显存峰值。
2.7 ZeRO,零冗余优化器
ZeRO(Zero Redundancy Optimizer)通过将优化器状态、梯度和参数分片存储在不同设备上,消除了数据并行中的冗余,大幅降低显存需求。
2.8 CPU-offload,ZeRO-offload
当 GPU 显存不足时,可将部分优化器状态卸载到 CPU 内存中,进一步扩展可用资源,尽管会牺牲部分训练速度。
2.9 Flash Attention
Flash Attention 通过 IO 感知算法,减少 HBM 访问次数,显著提升注意力计算的效率和显存利用率。
2.10 vLLM: Paged Attention
Paged Attention 借鉴操作系统的分页管理思想,将 KV Cache 非连续存储,解决了推理阶段显存碎片化问题,大幅提升吞吐量。
3. LLM 的参数高效微调
3.0 为什么进行参数高效微调?
全量微调成本高昂且易导致灾难性遗忘。参数高效微调(PEFT)仅更新少量参数,保留预训练知识的同时适应下游任务。
3.1 Prompt Tuning
在输入端添加可学习的 Soft Prompts,冻结主干网络。方法简单,但受限于提示长度和表达能力。
3.2 Prefix Tuning
类似 Prompt Tuning,但在所有层插入前缀向量,增强了模型对任务的适应能力。
3.3 Adapter
在 Transformer 层中插入小型旁路网络(Adapter),仅训练这些旁路参数。相比 Prompt Tuning,Adapter 保留了更多原始结构信息。
3.4 LLaMA Adapter
针对 LLaMA 架构优化的 Adapter 版本,适配其特定的归一化和注意力机制。
3.5 LoRA
低秩适应(LoRA)假设权重更新具有低秩特性。通过冻结预训练权重,训练两个低秩分解矩阵。这是目前最流行的 PEFT 方法之一,效果优异且易于部署。
3.6 实验比较
在实际应用中,LoRA 通常在效果和效率之间取得了最佳平衡,适合大多数垂直领域微调场景。
4. 参考文献
本文内容参考了多项关于 Transformer 架构、分布式训练系统及参数高效微调技术的学术研究与开源项目文档。

