预训练与微调的本质区别及实践指南
预训练利用大规模无标签数据学习通用特征,微调基于预训练模型在特定任务数据上优化性能。两者在初始化方式、数据规模、计算资源及应用场景上存在显著差异。本文详细解析了预训练与微调的核心流程、代码实现差异以及分布式训练策略,涵盖 Full Fine-Tuning、LoRA、QLoRA 等技术细节,并提供了分布式并行策略(DP/PP/TP)的说明与最佳实践建议。

预训练利用大规模无标签数据学习通用特征,微调基于预训练模型在特定任务数据上优化性能。两者在初始化方式、数据规模、计算资源及应用场景上存在显著差异。本文详细解析了预训练与微调的核心流程、代码实现差异以及分布式训练策略,涵盖 Full Fine-Tuning、LoRA、QLoRA 等技术细节,并提供了分布式并行策略(DP/PP/TP)的说明与最佳实践建议。

在深度学习与大语言模型(LLM)领域,预训练(Pre-Training)和微调(Fine-Tuning)是两个至关重要的阶段。理解它们的本质区别对于构建高效、低成本的 AI 应用至关重要。
预训练是模型学习的初始阶段。其核心目标是通过大规模无监督数据,让模型学习语言的通用结构、语义知识和世界常识。
微调是在预训练模型的基础上,针对特定下游任务进行的优化过程。
| 维度 | 预训练 (Pre-Training) | 微调 (Fine-Tuning) |
|---|---|---|
| 数据性质 | 无标签、大规模、通用 | 有标签、小规模、特定任务 |
| 参数状态 | 从头随机初始化 | 继承预训练权重 |
| 损失函数 | 语言模型交叉熵 (Cross Entropy) | 任务相关损失 (如分类 CE, SFT Loss) |
| 收敛速度 | 慢,需大量迭代 | 快,利用先验知识加速收敛 |
| 显存占用 | 极高,需模型并行策略 | 中等,可配合量化/PEFT 技术 |
以 Hugging Face Transformers 库为例,预训练通常需要自定义训练循环或使用 Trainer API。以下展示 GPT-2 类模型的配置加载逻辑。
from transformers import GPT2LMHeadModel, GPT2Config
import torch
# 配置模型
config = GPT2Config.from_pretrained('gpt2')
model = GPT2LMHeadModel(config)
# 设置设备
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
# 定义优化器
optimizer = torch.optim.AdamW(model.parameters(), lr=5e-5)
在实际的大规模预训练中,通常会结合分布式框架(如 DeepSpeed 或 Megatron-LM)来管理多卡通信和显存分片。由于篇幅限制,此处不展开具体的分布式脚本编写,但需注意 gradient_accumulation_steps 和 micro_batch_size 的调优对显存的影响。
微调主要分为全量微调(Full Fine-Tuning)和参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)。
更新模型所有参数。效果最好,但显存消耗大,容易遗忘预训练知识(灾难性遗忘)。
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
model_name = "your-pretrained-model"
model = AutoModelForCausalLM.from_pretrained(
model_name,
attn_implementation="flash_attention_2", # 视硬件支持情况选择
device_map="auto"
)
# 开启梯度检查点以节省显存
model.gradient_checkpointing_enable()
仅训练少量新增参数,冻结大部分预训练权重。主流方法包括 LoRA 和 QLoRA。
LoRA (Low-Rank Adaptation) 原理是将权重的更新分解为两个低秩矩阵 $A$ 和 $B$,即 $ riangle W = BA$。这大大减少了可训练参数量。
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=8, # 低秩秩数
lora_alpha=32, # 缩放系数
target_modules=["q_proj", "v_proj"], # 目标模块
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
QLoRA (Quantized LoRA) 在 LoRA 基础上引入 4-bit 量化,进一步降低显存需求,使得在消费级显卡上微调大模型成为可能。
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16
)
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto"
)
当模型参数量超过单卡显存容量时,必须采用分布式训练。常见的并行策略包括:
数据并行 (Data Parallelism, DP) 将数据切分到不同设备上,每个设备拥有完整的模型副本。通过 All-Reduce 操作同步梯度。FSDP (Fully Sharded Data Parallel) 是 PyTorch 中更高效的实现,它将模型参数分片存储在不同设备上。
流水线并行 (Pipeline Parallelism, PP) 将模型层按顺序切分到不同设备上,形成流水线。不同设备处理不同的批次数据,减少显存压力,但可能增加通信等待时间。
张量并行 (Tensor Parallelism, TP) 将单个层的计算(如矩阵乘法)拆分到多个设备上同时完成。需要修改模型计算图,通常用于极大规模的模型(如 70B+)。
目前业界常用工具包括 Megatron-LM、DeepSpeed 以及 Hugging Face Accelerate。在使用 Accelerate 进行 FSDP 训练时,可以结合其他并行策略实现更高效的资源利用。
paged_adamw_8bit),配合梯度累积(Gradient Accumulation)扩大有效 Batch Size。预训练构建了模型的'大脑',而微调则赋予了它'专业技能'。合理选择训练策略,能够以最小的成本获得最佳的模型性能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online