【面试题】大模型微调
1. 如果想要在某个模型基础上做全参数微调,究竟需要多少显存?
答:
全参数微调(Full Fine-tuning)需要的显存 ≈ 模型参数量 × 每参数所需字节数 × 优化器状态倍数
- 以FP16(2字节)为例:
- 模型参数:N 亿 → N × 10⁸ 参数
- 显存 ≈ N × 10⁸ × 2字节 = 2N GB(仅参数)
- 但实际训练需要:
- 梯度:+1倍参数量 → +2N GB
- 优化器状态(如Adam):+2倍参数量 → +4N GB(FP32存储)
- 总计 ≈ 8N GB
👉 举例:
- 7B 模型 → 8 × 7 = 56GB 显存
- 13B 模型 → 8 × 13 = 104GB 显存
✅ 解决方案:
- 使用 ZeRO-Stage 3 + Offload(DeepSpeed)
- 或改用 LoRA / QLoRA(推荐):显存需求可降至原1/10以下
2. 为什么SFT之后感觉LLM傻了?
答:
“SFT后变傻”通常指模型在通用任务(如常识、数学、逻辑)上表现下降,原因包括:
- 数据偏差:SFT数据质量差、多样性不足、指令不清晰
- 过拟合:在小规模/单一领域数据上训练过久
- 灾难性遗忘:微调覆盖了预训练阶段学到的通用知识
- 评估错位:用通用Benchmark评估领域微调模型,自然表现差
✅ 缓解方法:
- 混合通用数据 + 领域数据训练(如 9:1)
- 使用 L2正则 / Dropout / 早停
- 采用 Adapter / LoRA 等轻量微调,保留原始参数
- 微调后做 通用能力评测 + 领域能力评测
3. SFT 指令微调数据如何构建?
答:
高质量SFT数据 = 清晰指令 + 合理输入 + 优质输出
✅ 构建原则:
- 指令多样化:问答、摘要、改写、推理、代码等
- 输入真实:来自真实用户query或业务场景
- 输出规范:结构清晰、无幻觉、符合人类偏好
- 格式统一:如 Alpaca 格式:
{ "instruction": "解释量子纠缠", "input": "", "output": "量子纠缠是指..." }
✅ 数据来源:
- 人工标注(高质量但贵)
- 模型生成 + 人工筛选(Self-Instruct)
- 开源数据集(如 Alpaca, Dolly, OpenAssistant)
- 业务日志脱敏 + 清洗
✅ 数据量建议:
- 小模型(<7B):5k–50k 条
- 大模型(>13B):100k–1M+ 条
4. 领域模型Continue PreTrain 数据选取?
答:
Continue PreTraining(CPT)是在Base模型上继续预训练,注入领域知识。
✅ 数据选取原则:
- 高质量:语法正确、无噪声、无偏见
- 高相关性:与目标领域强相关(如医疗、法律、金融)
- 多样性:覆盖领域内多个子方向
- 去重 & 清洗:移除低质、重复、敏感内容
✅ 数据来源:
- 领域论文、教材、百科、技术文档
- 行业报告、白皮书、专利
- 高质量论坛/社区(如Stack Overflow、知乎专业板块)
- 企业内部脱敏文档(需合规)
✅ 数据量:
- 10GB–100GB+ 纯文本(token数约 1B–10B)
5. 领域数据训练后,通用能力往往有所下降,如何缓解模型遗忘通用能力?
答:
这是“灾难性遗忘”(Catastrophic Forgetting)问题。
✅ 缓解策略:
| 方法 | 说明 |
|---|---|
| 混合训练 | 领域数据 + 通用数据(如C4、Wikipedia)按比例混合(如 1:1 或 3:1) |
| 正则化 | L2正则、EWC(弹性权重固化)、知识蒸馏(用原模型做teacher) |
| 参数隔离 | LoRA / Adapter 只更新部分参数,保留原始能力 |
| 多任务学习 | 同时训练通用任务 + 领域任务(共享主干) |
| 渐进式训练 | 先CPT → 再SFT,或分阶段注入领域知识 |
6. 领域模型Continue PreTrain,如何让模型在预训练过程中就学习到更多的知识?
答:
关键:数据质量 + 训练策略 + 评估反馈
✅ 优化方向:
-
数据增强:
- 实体替换、句子重组、问答对生成
- 利用LLM自动生成高质量领域QA对
-
课程学习(Curriculum Learning):
- 从简单→复杂文本逐步训练
- 从通用→专业领域渐进注入
-
知识注入技巧:
- 在文本中显式标注关键概念(如
<医学术语>) - 构建“定义-示例-应用”结构化段落
- 在文本中显式标注关键概念(如
-
动态采样:
- 根据loss或困惑度动态调整数据采样权重
-
评估驱动:
- 训练中定期在领域+通用Benchmark上评估,调整数据分布
7. 进行SFT操作的时候,基座模型选用Chat还是Base?
答:
取决于你的目标:
| 场景 | 推荐基座 | 理由 |
|---|---|---|
| 做对话/助手型应用 | Chat 模型(如 Llama2-Chat, Qwen-Chat) | 已对齐人类偏好,指令遵循能力强,对话流畅 |
| 做领域专家/工具型模型 | Base 模型(如 Llama2-Base, Qwen-Base) | 无对话偏见,更“干净”,适合注入专业能力 |
| 资源有限 + 快速验证 | Chat 模型 | 微调少量数据即可获得较好交互体验 |
| 追求最大可控性 + 避免偏见 | Base 模型 | 可从零构建符合业务的响应风格 |
⚠️ 注意:Chat模型已RLHF过,再SFT可能“矫枉过正”,需谨慎调参。
8. 领域模型微调指令&数据输入格式要求?
答:
格式需与基座模型训练时一致,否则效果打折。
✅ 通用格式(推荐 Alpaca / ChatML):
{
"instruction": "根据病历判断患者是否患有糖尿病",
"input": "患者,男,58岁,空腹血糖8.9mmol/L,HbA1c 7.2%...",
"output": "根据ADA标准,该患者符合糖尿病诊断..."
}
✅ 对话格式(适合Chat模型):
[
{"role": "user", "content": "解释量子纠缠"},
{"role": "assistant", "content": "量子纠缠是指..."}
]
✅ 关键点:
- 不要随意加前缀/后缀(除非基座模型训练时有)
- 保持与tokenizer训练一致的特殊token(如
<|im_start|>) - 长度统一截断/填充,避免OOM
9. 领域模型微调 领域评测集构建?
答:
评测集 = 代表性样本 + 明确评分标准 + 多维度指标
✅ 构建步骤:
- 收集真实场景query(100–1000条)
- 人工撰写标准答案(或多个专家标注)
- 设计评分维度:
- 准确性(核心)
- 完整性
- 安全性
- 专业术语使用
- 逻辑连贯性
- 自动化+人工结合评估:
- 自动:BLEU, ROUGE, BertScore
- 人工:5分制打分(至少3人)
✅ 示例(医疗):
- Query: “二甲双胍的禁忌症有哪些?”
- Gold Answer: “肾功能不全(eGFR<30)、严重感染、酸中毒、酗酒者禁用…”
📌 建议保留一部分“对抗样本”或“边缘case”用于压力测试。
10. 领域模型词表扩增是不是有必要的?
答:
通常不必要,且风险大于收益。
✅ 为什么?
- 词表扩增会破坏原有embedding空间,导致性能下降
- 需要重新训练embedding层 + LM Head,成本高
- 大多数领域术语可通过subword(如Byte Pair Encoding)拆分表示
✅ 例外情况(可考虑):
- 领域有大量无法拆分的专有名词(如化学式、基因序列)
- 原词表对目标语言支持极差(如小语种)
✅ 替代方案:
- 继续预训练时让tokenizer学习新词(动态BPE)
- 在输入中用描述代替术语(如 “药物A(化学式:C6H12O6)”)
11. 如何训练自己的大模型?
答:
分阶段路线图:
阶段1:准备
- 确定规模(1B? 7B? 70B?)
- 选架构(LLaMA、GPT、Mistral等)
- 准备数据(清洗、去重、分词)
阶段2:预训练(Pretrain)
- 使用Transformer架构
- 训练目标:Next Token Prediction
- 框架:Megatron-LM / DeepSpeed / HuggingFace
- 硬件:A100/H100集群(7B模型约需 256 A100-day)
阶段3:监督微调(SFT)
- 构建指令数据
- 全参微调 or LoRA
- 评估 + 迭代
阶段4(可选):对齐(RLHF/DPO)
- 构建偏好数据
- 训练Reward Model
- PPO 或 DPO 优化
📌 中小团队建议:基于开源Base模型做CPT + SFT,性价比最高。
12. 训练中文大模型有啥经验?
答:
中文LLM训练关键点:
✅ 数据:
- 中文语料需 >30%(通用模型)
- 领域模型需 >70% 中文高质量数据
- 推荐数据源:Wudao, CLUECorpus2020, 知乎, 微博(清洗后), 专业书籍
✅ Tokenizer:
- 使用 SentencePiece BPE,词表大小 50k–100k
- 确保中文字符不被过度拆分(如 “人工智能” → 不要拆成 “人 工 智 能”)
✅ 训练技巧:
- 增大学习率(中文收敛慢)
- 使用 Wudao / WuDao-Init 初始化embedding
- 加入拼音/笔画辅助embedding(可选)
✅ 评测:
- 使用 C-Eval, CMMLU, Gaokao-Bench 等中文Benchmark
- 人工评估口语化、成语、古文理解能力
13. 指令微调的好处?
答:
指令微调(Instruction Fine-tuning)是让LLM“听懂人话”的关键步骤。
✅ 核心好处:
| 好处 | 说明 |
|---|---|
| 提升指令遵循能力 | 让模型准确理解并执行用户指令 |
| 改善输出格式 | 学会按要求输出JSON、列表、代码等 |
| 增强泛化能力 | 通过多任务指令,提升zero-shot表现 |
| 对齐人类偏好 | 输出更安全、有用、无害 |
| 降低prompt工程成本 | 无需复杂prompt也能获得好结果 |
📌 注意:SFT ≠ RLHF。SFT教“怎么做”,RLHF教“怎么做更好”。
14. 预训练和微调哪个阶段注入知识的?
答:
-
预训练阶段:注入通用世界知识 + 语言结构
- 如:事实、语法、常识、逻辑
- 知识存储于模型参数中(隐式记忆)
-
微调阶段:注入任务格式 + 领域知识 + 人类偏好
- 如:如何回答、用什么语气、专业术语用法
- 更多是“引导”模型调用预训练知识,而非新增知识
✅ 类比:
- 预训练 = 上完大学,知识渊博
- 微调 = 职业培训,学会在特定岗位(如医生、客服)怎么说话做事
⚠️ 微调很难“新增”大量新知识,除非做Continue PreTraining。
15. 想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?
答:
取决于 知识类型 和 数据规模:
| 场景 | 推荐方法 |
|---|---|
| 领域知识量大 + 结构化弱(如医学文献、法律条文) | Continue PreTraining(CPT) → 再SFT |
| 领域知识量小 + 任务明确(如客服QA、报表生成) | 直接SFT |
| 需深度理解 + 推理(如金融分析、科研辅助) | CPT + SFT + 可能RLHF |
| 只有少量标注数据(<1k条) | Prompt Engineering + RAG 更划算 |
📌 黄金法则:
知识靠预训练,任务靠微调,少量数据靠RAG。
16. 多轮对话任务如何微调模型?
核心思路: 将对话历史结构化为“角色-内容”对,通过指令微调(Instruction Tuning)或监督微调(SFT)让模型学会上下文感知与角色扮演。
✅ 数据格式设计:
采用类似以下结构(以Alpaca/ChatML格式为例):
{
"conversations": [
{"role": "user", "content": "你好,能帮我查天气吗?"},
{"role": "assistant", "content": "当然可以,请问你想查哪个城市的天气?"},
{"role": "user", "content": "北京"},
{"role": "assistant", "content": "北京今天晴,气温25℃,空气质量良。"}
]
}
✅ 训练方法:
- 全量微调(Full Fine-tuning):适用于资源充足,追求极致性能。
- 参数高效微调(PEFT):如LoRA、QLoRA、Adapter,节省显存,适合消费级GPU。
- 损失函数:仅对assistant的回复计算交叉熵损失,user输入部分mask掉。
✅ 关键技巧:
- 添加特殊token如
<|user|>,<|assistant|>帮助模型区分角色。 - 对长对话做截断或滑动窗口采样,避免超出最大上下文长度。
- 使用对话连贯性奖励或对比学习提升多轮一致性(进阶)。
17. 微调后的模型出现能力劣化,灾难性遗忘是怎么回事?
📌 定义:
灾难性遗忘(Catastrophic Forgetting):模型在微调新任务时,过度拟合新数据,导致在原始预训练任务或通用能力上表现急剧下降。
🧠 原因:
- 微调数据分布与预训练数据差异大(如只微调数学题,忘了常识)。
- 学习率过高或训练步数过多,参数被“洗掉”原有知识。
- 没有保留通用语料混合训练。
✅ 解决方案:
-
混合训练(Multi-task Learning):
- 微调时混入一定比例的通用语料(如C4、Wikipedia)。
- 例如:90%领域数据 + 10%通用数据。
-
正则化约束:
- EWC(Elastic Weight Consolidation):约束重要参数不被大幅修改。
- L2 正则化:限制参数偏离原始值。
-
参数高效微调(PEFT):
- LoRA等方法只更新少量参数,保留原始模型大部分能力。
-
知识蒸馏:
- 用原始大模型作为teacher,微调后模型作为student,通过KL散度保留通用能力。
18. 微调大模型需要多大显存?
显存需求取决于:
- 模型参数量(7B、13B、70B…)
- 精度(FP32、FP16、BF16、INT8、INT4)
- 是否使用PEFT
- Batch Size、序列长度
🧮 估算公式(粗略):
显存 ≈ 模型参数 × 每参数字节数 × (1 + 梯度 + 优化器状态)
- FP16全参微调:约 20B 参数需 80GB 显存(7B模型 ≈ 30GB)
- LoRA微调:仅需原始显存的10%~20%
- QLoRA(4-bit + LoRA):7B模型可在24GB显存(如RTX 4090)上微调
✅ 推荐配置:
| 模型大小 | 方法 | 最低显存需求 | 推荐显卡 |
|---|---|---|---|
| 7B | QLoRA | 12GB | RTX 3060/4080 |
| 7B | LoRA | 24GB | RTX 3090/4090 |
| 13B | QLoRA | 20GB | RTX 4090/A6000 |
| 70B | QLoRA | 48GB+ | A100 80GB × 2 |
💡 工具推荐:HuggingFace PEFT + bitsandbytes + Accelerate
19. 大模型LLM进行SFT操作的时候在学习什么?
SFT = Supervised Fine-Tuning
🎯 学习目标:
模型学习的是:
- 指令遵循能力:理解并执行人类指令(如“写一首诗”、“总结这段话”)。
- 输出格式控制:按指定结构输出(JSON、列表、代码块等)。
- 风格与语气模仿:学习数据中的语气(正式、幽默、客服风等)。
- 领域知识内化:将领域特定知识(法律、医疗、金融)编码进参数。
- 安全与对齐:避免有害、偏见、幻觉输出(依赖数据质量)。
⚙️ 本质:
- 最大似然估计:让模型输出更接近人类标注的“理想回复”。
- 不是学习新知识,而是重新加权已有知识 + 学习表达方式。
20. 预训练和SFT操作有什么不同?
| 维度 | 预训练(Pretraining) | 监督微调(SFT) |
|---|---|---|
| 目标 | 学习语言建模、世界知识、语法结构 | 学习遵循指令、任务执行、输出对齐 |
| 数据 | 无标注海量文本(网页、书籍、代码等) | 有标注指令-回复对(人工或合成) |
| 损失函数 | 自回归语言建模(预测下一个token) | 仅对回复部分计算交叉熵损失 |
| 训练规模 | 千亿~万亿token,多卡多机训练数周 | 百万千万样本,单卡/几卡训练数小时天 |
| 参数更新 | 全参数从零开始训练 | 基于预训练模型,小幅调整参数 |
| 能力侧重 | 通用语言理解与生成 | 任务导向、可控输出、安全对齐 |
🧠 简单比喻:预训练 = 上完“大学通识课”,SFT = “专业实习+岗前培训”。
21. 样本量规模增大,训练出现OOM错误
💥 OOM = Out Of Memory
📌 原因:
- Batch Size 随样本增多未调整,显存爆炸。
- 序列长度未截断,长样本堆积。
- 梯度累积步数设置不当。
- 未启用梯度检查点(Gradient Checkpointing)。
✅ 解决方案:
- 动态调整 Batch Size:样本多时减小 batch_size。
- 梯度累积(Gradient Accumulation):
# 每4步更新一次,等效 batch_size × 4 trainer = Trainer(..., gradient_accumulation_steps=4) - 启用梯度检查点:
→ 显存降30~50%,速度慢20%。model.gradient_checkpointing_enable() - 序列截断/打包(Packing):
- 截断超长样本。
- 多短样本拼接成一个长样本(需mask处理)。
- 使用更高效框架:
- DeepSpeed ZeRO Stage 2/3
- FSDP(Fully Sharded Data Parallel)
22. 大模型进行SFT如何对样本进行优化?
✅ 数据质量 > 数据数量
1. 去重与清洗
- 删除重复样本(语义/字符级)。
- 过滤低质量、含攻击性、错误答案样本。
2. 难度分层采样
- 混合简单、中等、困难样本,避免模型“偏科”。
3. 多样性增强
- 覆盖不同指令类型(问答、创作、推理、改写…)。
- 多领域、多风格、多长度。
4. 对抗样本注入(可选)
- 加入“诱导性提问”并标注正确拒绝回复,提升安全性。
5. 课程学习(Curriculum Learning)
- 先训简单样本,再逐步增加难度。
6. 数据配比控制
- 通用能力 vs 领域能力(如 3:7)
- 安全样本 vs 任务样本(如 1:9)
🧪 工具推荐:
datasketch(去重)、sentence-transformers(语义聚类)、textstat(难度评估)
好的,我们继续深入解答剩余问题(23~32.3),依然从专家视角出发,结合理论、工程实践和调参经验,为你提供可落地的解决方案。
23. 模型参数迭代实验
🎯 目标:
通过控制变量法,系统性探索超参数/结构对模型性能的影响,找到最优配置。
✅ 标准实验设计流程:
-
定义评估指标:
- 任务相关:准确率、BLEU、ROUGE、人工评分
- 通用能力:MMLU、GSM8K、TruthfulQA
- 安全性:ToxiGen、SafeBench
-
控制变量表:
实验组 LoRA Rank LR Batch Size 数据配比 Dropout Exp1 8 1e-4 16 9:1 0.05 Exp2 64 1e-4 16 9:1 0.05 Exp3 8 3e-5 16 9:1 0.05 -
实验工具链:
- 参数管理:Weights & Biases(W&B)、MLflow、TensorBoard
- 自动化调度:Ray Tune、Optuna(贝叶斯优化)
- 版本控制:DVC + Git LFS 管理数据/模型版本
-
关键观察点:
- Loss下降曲线是否平滑?
- 验证集指标是否持续提升?
- 是否出现过拟合(训练loss↓,验证loss↑)?
- 推理速度/显存是否满足部署要求?
💡 专家建议:每次只改1个变量,记录完整日志。优先实验学习率和LoRA Rank。
24. 微调大模型的一些建议
✅ 专家级实战建议(来自工业界+开源社区经验):
-
数据 > 模型 > 算力
- 1000条高质量标注数据 > 10万条噪声数据。
- 人工校验至少10%样本。
-
从QLoRA开始
- 用4-bit量化+LoRA在消费级GPU上快速验证想法。
- 命令示例:
python -m accelerate.commands.launch \ --num_processes=1 \ finetune.py --use_qlora --lora_rank=64
-
混合通用数据防遗忘
- 加入5~10%的Alpaca/OpenAssistant通用指令数据。
-
早停机制(Early Stopping)
- 验证loss连续3个epoch不下降则停止,避免过拟合。
-
多尺寸模型并行实验
- 同时跑7B和13B,评估性价比(13B效果+30%,成本+100%?)
-
评估必须自动化+人工结合
- 自动指标看趋势,人工抽样看“感觉”。
-
保存多个checkpoint
- 不只保存best,保存last、epoch_5、epoch_10,用于对比。
-
安全对齐不可忽视
- 加入“拒绝回答有害问题”的样本,避免模型被滥用。
25. 微调大模型时,如果batch size设置太小会出现什么问题?
⚠️ 问题:
- 梯度噪声大 → 训练不稳定,loss震荡。
- 收敛速度慢 → 需要更多step才能达到相同效果。
- 泛化能力差 → 小batch易过拟合特定样本模式。
- 硬件利用率低 → GPU计算单元闲置,训练效率低下。
📊 理论支持:
- 论文《An Empirical Model of Large-Batch Training》指出:大batch有助于更平滑的loss landscape。
- 小batch(如1~4)仅推荐用于调试或显存极度受限场景。
✅ 解决方案:
- 使用梯度累积模拟大batch效果:
# batch_size=2, accum_steps=8 → 等效 batch_size=16 optimizer.step() 每8次前向才执行一次
26. 微调大模型时,如果batch size设置太大会出现什么问题?
⚠️ 问题:
- 显存溢出(OOM) → 最直接问题。
- 泛化能力下降 → 大batch易收敛到尖锐极小值(sharp minima),泛化差。
- 需要调大学习率 → 否则收敛极慢(参考Linear Scaling Rule)。
- 样本多样性不足 → 单batch内样本相似度高,模型学偏。
📚 理论依据:
- 《On Large-Batch Training for Deep Learning》指出:batch_size > 1024 可能损害泛化。
- 大batch需配合学习率预热(warmup) 和 更长训练step。
✅ 解决方案:
- 启用梯度检查点节省显存。
- 使用分层自适应优化器如Lion、Sophia,对大batch更鲁棒。
- 动态batch调整:前期大batch快速收敛,后期小batch精细调优。
27. 微调大模型时,batch size如何设置问题?
🎯 黄金法则:
在不OOM的前提下,尽可能使用最大有效batch size。
✅ 设置步骤:
-
测试显存上限:
- 从 batch_size=1 开始,逐步×2,直到OOM,取前一个值。
-
参考经验值:
模型大小 推荐 Batch Size(LoRA) 序列长度=512 7B 16~32 13B 8~16 70B 1~4(需多卡) -
使用梯度累积等效扩展:
- 目标等效 batch=64,实际 batch=8 → accum_steps=8
-
动态调整策略:
- Warmup阶段:小batch(如8)稳定训练
- 中期:加大到32~64
- 后期:减小到16,精细收敛
💡 工具推荐:HuggingFace Trainer 自动支持
gradient_accumulation_steps
28. 微调大模型时,优化器如何选择?
🧪 主流优化器对比:
| 优化器 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| AdamW | 稳定、通用、社区支持好 | 显存占用高 | 默认首选 |
| SGD+Momentum | 泛化好、显存低 | 收敛慢、需精细调参 | 小模型/理论研究 |
| Lion | ✅ 显存比AdamW少50% ✅ 有时效果更好 | 新、超参敏感 | 显存紧张/愿调参 |
| Sophia | ✅ 二阶曲率近似,适合大batch ✅ 理论收敛更快 | 实现复杂 | 大batch实验 |
✅ 专家推荐配置:
# AdamW(保守首选)
optimizer = AdamW(model.parameters(), lr=2e-5, weight_decay=0.01)
# Lion(显存敏感时)
optimizer = Lion(model.parameters(), lr=1e-4, weight_decay=0.02)
# 学习率调度:cosine + warmup
scheduler = get_cosine_schedule_with_warmup(
optimizer, num_warmup_steps=100, num_training_steps=total_steps
)
📌 学习率经验:
- LoRA: 1e-4 ~ 3e-5
- Full FT: 1e-5 ~ 5e-6
29. 哪些因素会影响内存使用?
🧠 显存占用 = 模型参数 + 梯度 + 优化器状态 + 激活值 + 临时缓冲区
📊 各部分占比(以FP16 AdamW为例):
| 组成部分 | 占比 | 说明 |
|---|---|---|
| 模型参数 | ~25% | FP16存储 |
| 梯度 | ~25% | 与参数同尺寸 |
| 优化器状态(Adam) | ~50% | 一阶动量+二阶动量(各FP32) |
| 激活值 | 变化大 | 长序列/大batch时可能超参数 |
| KV Cache(推理) | 推理时主导 | 与序列长度平方相关 |
✅ 降低显存方案:
-
精度压缩:
- QLoRA(4-bit参数 + FP16梯度)
- Optimizer:Lion(无二阶动量)→ 显存-50%
-
激活值优化:
- Gradient Checkpointing → 激活值显存-70%
- FlashAttention-2 → 减少中间激活存储
-
并行策略:
- ZeRO Stage 3(参数分片)
- FSDP(完全分片数据并行)
30. 进行领域大模型预训练应用哪些数据集比较好?
🎯 原则:高质量、高相关性、大规模
✅ 推荐数据集(按领域):
| 领域 | 推荐数据集 |
|---|---|
| 通用 | RedPajama(1.2T token)、Dolly-15k、OpenWebText、C4 |
| 代码 | StackOverflow、GitHub Public Repos(CodeSearchNet)、The Stack v1.2 |
| 医疗 | PubMed Abstracts、MIMIC-III、CORD-19、MedicalDialog |
| 金融 | FinText、Reuters News、SEC Filings、FinQA |
| 法律 | CaseLaw(美国判例)、LEXGLUE、LegalBench、中国裁判文书网(需合规处理) |
| 教育 | Khan Academy、OpenStax Textbooks、Exam Questions(如GSM8K、MATH) |
| 科技 | ArXiv Papers、Patents(Google Patents)、Technical Manuals |
✅ 数据构建技巧:
- 去重:MinHash + LSH 聚类去重
- 质量过滤:用小模型打分(如DeBERTa-v3)过滤低质文本
- 领域增强:爬取专业论坛/百科(如医学“丁香园”、法律“无讼”)
⚠️ 注意版权与合规!企业级应用建议使用开源合规数据集或自建数据。
31. 用于大模型微调的数据集如何构建?
✅ 五步构建法:
-
定义任务边界
→ 明确模型要做什么(客服?写作?代码?) -
收集种子数据
- 人工编写(高质量但贵)
- 从产品日志提取(真实但需脱敏)
- 用GPT-4合成(高效但需校验)
-
数据增强与扩展
- 改写/同义替换(nlpaug库)
- 多轮对话扩展(用LLM生成上下文)
- 负样本采样(加入错误答案让模型学会拒绝)
-
质量过滤与标注
- 用规则/模型过滤低质样本(如重复、乱码、矛盾)
- 人工抽检(至少5~10%)
- 标注一致性校验(多人标注计算Kappa系数)
-
格式标准化与划分
- 统一为 Alpaca / ChatML 格式
- 划分 train/dev/test(如 8:1:1)
- 保存为 .jsonl 方便流式读取
🧰 工具推荐:
- 合成数据:
LangChain + GPT-4-Turbo - 过滤:
fastText语言检测、kenlm困惑度过滤 - 标注平台:Label Studio、Prodigy
32. 大模型训练loss突刺原因和解决办法
32.1 大模型训练loss突刺是什么?
→ 训练过程中loss突然飙升(如从2.0→10.0),然后可能回落或持续发散。
32.2 为什么大模型训练会出现loss突刺?
🧨 主要原因:
-
异常样本(Outlier)
- 包含乱码、超长序列、错误标注的样本。
-
数值不稳定
- FP16下梯度溢出(NaN/Inf),尤其在attention softmax。
-
学习率过高
- 参数更新步长过大,跳过最优解。
-
数据加载错误
- 多进程数据加载时样本错位或重复。
-
硬件问题(罕见)
- GPU显存位翻转(bit flip)、PCIe传输错误。
32.3 大模型训练loss突刺如何解决?
✅ 系统性解决方案:
-
数据层面:
- 加入“样本异常检测”前置步骤:
if len(text) > 2048 or "" in text: skip_sample() - 对loss突刺时的batch做日志记录,人工复核。
- 加入“样本异常检测”前置步骤:
-
训练层面:
- 启用
torch.autograd.set_detect_anomaly(True)调试NaN来源。 - 使用 梯度裁剪:
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) - 降低学习率,或使用 warmup + cosine decay。
- 启用
-
精度层面:
- 在关键层(如attention)使用
bfloat16替代float16。 - 启用
AMP(自动混合精度)的损失缩放:scaler = GradScaler() with autocast(): loss = model(input) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update()
- 在关键层(如attention)使用
-
监控层面:
- 记录每个batch的loss,自动跳过loss > 阈值(如mean+3std)的batch。
- 可视化工具实时报警(W&B / TensorBoard)。
💡 专家经验:90%的loss突刺来自数据异常,先查数据!
✅ 至此,全部32个问题已系统解答完毕!
这些内容覆盖了大模型微调的核心技术栈,包括:
- 数据工程(构建、清洗、增强)
- 训练技巧(batch size、优化器、显存管理)
- 问题诊断(灾难性遗忘、loss突刺)
- 实验方法论(参数迭代、评估体系)
如需:
- 某个问题的代码实现(如LoRA微调脚本)
- 某个工具的详细配置(如DeepSpeed ZeRO)
- 针对你具体任务的定制化方案(如医疗问答微调)
欢迎随时告诉我,我可以为你生成可运行的代码、配置文件或完整方案文档!
是否需要我为你整理成 PDF / Markdown 文档?或者生成训练脚手架?
更多推荐



所有评论(0)