是什么
L2 · 主题中枢
训练阶段
训练阶段决定模型最终能力边界与部署可行性
预训练建立基础,SFT 对齐意图,蒸馏压缩体积,量化降低部署门槛,每个阶段解决不同问题
为什么
不同阶段解决不同问题:预训练建立通用能力,SFT 对齐人类意图,蒸馏压缩模型体积,量化降低部署成本。
怎么做
从预训练开始,依次进行指令微调、知识蒸馏和模型量化,每个阶段都有明确的目标和验证标准。
什么时候
需要构建或优化大模型时使用;若只需调用已有模型API,则无需关注训练阶段。
FOCUS
下属主题
FOCUS
先记住这些
为什么需要分阶段训练
单一训练目标难以兼顾通用能力、指令遵循、部署效率,分阶段实现能力递进
各阶段数据要求差异
预训练需要海量无标注数据,SFT 需要高质量指令对,蒸馏需要教师模型输出,量化需要校准数据
训练成本与收益平衡
预训练成本最高但收益最大,SFT 成本适中但针对性强,蒸馏和量化主要优化部署成本
ROUTE
学习路径
掌握自监督学习原理与大规模数据处理方法
学习 SFT 数据构建、损失函数设计与评估方法
理解蒸馏与量化原理,实践模型体积优化
学习数据并行、模型并行与混合并行策略
PROBLEM / POSITION / INTERFACE
先弄清它为什么存在,以及谁在使用
-
01 解决的问题
需要构建或优化大语言模型以满足特定业务需求时
缺乏系统训练流程会导致模型能力不足、对齐困难、部署成本过高
- 成功标准
- 模型在目标场景下达到预期性能指标,且推理成本可控
-
02 AI 生态位
连接基础模型与生产应用的桥梁,决定模型最终能力和部署形态
- 上游
- 依赖预训练模型、高质量训练数据、计算资源
- 下游
- 为推理部署、应用集成、持续优化提供可用模型
-
03 人的生态位
负责训练目标设定、数据准备、参数调优和效果验收
- 适合使用
- 需要定制化模型能力、优化推理成本、提升特定任务表现时
- 不必使用
- 通用模型已满足需求、计算资源有限、缺乏专业训练团队时
-
04 独特价值
通过分阶段训练实现能力递进,避免单一训练目标导致的性能瓶颈
各阶段数据质量要求不同,参数调优需要专业知识,分布式训练增加工程复杂度
- 复杂度判断
- 复杂度不是功能数量,而是控制与验证成本。
INTERFACE FLOW
谁在操作,信息怎样流动
-
WHO OPERATES
HUMAN定义训练目标、准备数据集、选择算法、评估结果
SYSTEM执行训练循环、管理分布式计算、保存检查点
TOOL提供训练框架、监控工具、自动化调参
-
INPUT
预训练权重、指令数据集、蒸馏目标模型、量化校准数据
-
CONTROL
学习率、批次大小、训练轮数、损失函数、量化精度
-
OUTPUT
训练好的模型权重、评估报告、部署配置文件
FLOW
标准训练流程
COMPARE
训练阶段对比
| 阶段 | 目标 | 数据需求 | 计算成本 | 输出产物 |
|---|---|---|---|---|
| 预训练 | 建立通用能力 | 海量无标注文本 | 极高 | 基础模型权重 |
| 指令微调 SFT | 对齐人类意图 | 高质量指令对 | 中等 | 指令遵循模型 |
| 蒸馏 | 模型压缩 | 教师模型输出 | 较低 | 小型化模型 |
| 量化 | 部署优化 | 校准数据集 | 低 | 低精度模型 |
PRACTICE
训练准备清单
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
# 加载预训练模型与分词器
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 加载指令数据集
dataset = load_dataset("json", data_files="sft_data.json")
def tokenize_function(examples):
return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)
tokenized_dataset = dataset.map(tokenize_function, batched=True)
# 配置训练参数
training_args = TrainingArguments(
output_dir="./sft_output",
num_train_epochs=3,
per_device_train_batch_size=4,
learning_rate=2e-5,
save_steps=500,
logging_steps=100
)
# 初始化训练器并执行训练
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset["train"]
)
trainer.train()使用 Transformers 进行指令微调的最简示例
{
"model_path": "./sft_output/checkpoint-1500",
"training_metrics": {
"train_loss": 0.82,
"eval_loss": 0.91,
"epochs_completed": 3,
"steps_completed": 1500
},
"model_config": {
"base_model": "meta-llama/Llama-2-7b-hf",
"training_type": "SFT",
"precision": "FP16",
"max_length": 512
},
"deployment_ready": true
}FAQ
常见问题
01谁在实际负责训练各阶段?+
预训练由研究团队主导,SFT 由算法工程师执行,蒸馏和量化由部署工程师完成。
明确责任边界,避免跨阶段协作混乱。02预训练和 SFT 的核心区别是什么?+
预训练学习语言规律,SFT 学习指令遵循;前者无监督,后者有监督。
避免混淆训练目标,导致数据准备和评估方法错误。03最小可用训练流程是什么?+
预训练 → SFT → 评估,蒸馏和量化为可选优化步骤。
帮助团队快速建立基础能力,避免过度工程化。04训练过程中最常见的失败点在哪里?+
数据质量不足、学习率设置不当、分布式同步失败、评估指标不匹配。
提前识别风险点,建立监控和回退机制。05什么时候不需要完整训练流程?+
当通用模型已满足需求,或只需微调特定任务时,可直接使用预训练模型进行轻量适配。
避免不必要的计算成本和时间投入。