面试篇-大模型微调

382 阅读9分钟

显存相关问题

1. 如果想要在某个模型基础上做全参数微调,究竟需要多少 显存

  一般 nB 的模型,最低需要 16 - 20nG 的显存。以 vicuna - 7B 为例,官方样例配置为 4A100 40G,测试能占满显存。训练时可用 FSDP、梯度累积、梯度检查点等方式来降低显存占用。

2. 微调模型需要多大 显存

不同模型版本所需显存如下:

模型版本7B13B33B65B
原模型大小 (FP16)13GB24GB60GB120GB
量化后大小 (8 - bit)7.8GB14.9GB--
量化后大小 (4 - bit)3.9GB7.8GB19.5GB-

SFT 相关问题

  1. 为什么 SFT 之后感觉 LLM 傻了?

指令微调是为了增强(或解锁)大语言模型的能力,使其能展现出泛化到未见过任务的卓越能力,即使在多语言场景下也有不错表现。

  1. SFT ****指令 微调数据如何构建?

要选择多个有代表性的任务;每个任务实例数量不宜过多,防止过拟合;应平衡不同任务的数据量占比,并限制整个数据集的容量,通常几千或几万,避免大样本量数据集影响整体分布。

  1. 进行 SFT 操作的时候,基座模型选用 Chat 还是 Base?

资源有限时,在 Chat 模型基础上训练;资源充足时,在 Base 模型上训练。资源包括数据和显卡,若数据小于 10k,建议用 Chat 模型微调;数据达 100k,建议在 Base 模型上微调。

  1. 领域模型 微调 指令 & 数据输入格式要求?

在 Chat 模型上进行 SFT 时,一定要遵循 Chat 模型原有的系统指令 & 数据输入格式,建议不采用全量参数训练,否则模型原始能力会遗忘较多。

  1. 大模型 ****LLM 进行 SFT 操作的时候在学习什么?

预训练是在大量无监督数据上得到基础模型,SFT 在有监督的数据集上进一步优化模型,将 SFT 训练后的模型作为 RLHF 的起点。

  1. 预训练和 SFT 操作有什么不同?

举例来说,预训练会把 “描述计算机主板的功能” 这句话连接起来,用前面的词预测后面的词,问句中的损失也会被计算。而 SFT 操作则构建特定训练语料,输入为 “[BOS] 计算机主板是计算机中的主要电路板。它是系统的支撑 [EOS]”,标签对应,在计算损失时只算答句的损失。

领域模型相关问题

  1. 领域模型 Continue PreTrain 数据选取?

技术标准文档或领域相关数据是关键,因为领域相关的网站和资讯的重要性或知识密度不如书籍和技术标准。

  1. 领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?

动机是仅用领域数据集训练易出现灾难性遗忘,解决方法是在领域训练中加入通用数据集。当领域数据量不多时,领域数据与通用数据的比例在 1:5 到 1:10 之间较合适。

  1. 领域模型 Continue PreTrain ,如何让模型在预训练过程中就学习到更多的知识?

可以同步加入 SFT 数据,即 MIP(Multi - Task Instruction PreTraining),让模型在预训练时就学习到更多知识。

  1. 领域模型词表扩增是不是有必要的?

增加词表可解决解码效率问题,对模型效果提升可能不大。

  1. 领域模型微调领域评测集构建?

建议有两份评测集,一份选择题形式自动评测,用于初筛;一份开放形式人工评测,用于精筛,且任务形式更贴近真实场景。

模型训练与优化相关问题

  1. 如何训练自己的大模型?

以做 sota 的中文 GPT 大模型为例,分两步:基于中文文本数据在 LLaMA - 65B 上二次预训练;加 CoT 和 instruction 数据,用 FT + LoRA SFT。一般分为两个阶段训练,第一阶段扩充领域词表,在海量领域文档数据上二次预训练 LLaMA 模型;第二阶段构造指令微调数据集,在第一阶段的预训练模型基础上做指令精调。也可用低成本方案,即用 LoRA 训练。

  1. 训练中文大模型有啥经验?

链家技术报告显示,扩充中文词表能提升模型对中文的理解能力;数据质量越高越好,且数据集质量提升可改善模型效果;加中文的数据语言分布比不加好;数据规模越大且质量越高,效果越好。此外,后续 RLHF 也很重要。

  1. 指令微调的好处?

能对齐人类意图,使模型能理解自然语言对话;经过微调的定制版模型在不同应用中提升明显,如准确度、错误率等方面;可直接在大模型上微调,不用重头训练自己的 AI 模型。

  1. 预训练和微调哪个阶段注入知识的?

预训练阶段注入知识,微调是在特定任务训练,使预训练模型的通用知识与特定任务要求结合,提升模型在特定任务上的表现。

  1. 想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?

可采用预训练和微调相结合的方式,先用篇章数据预训练获取广泛知识,再用问答对数据微调学习特定领域知识。若样本集小,且与预训练模型分布差别不大,只进行微调也能注入知识。

  1. 多轮对话任务如何微调模型?

以 ChatGLM - 6B 为例,其把上一轮对话扔进下一轮的 input 里,但存在爆显问题。解决方法包括对历史对话做文本摘要、生成 embedding、传递用户意图和槽位等。

  1. 微调后的模型出现能力劣化,灾难性遗忘是怎么回事?

灾难性遗忘即学习新知识后遗忘之前内容。微调 ChatGLM - 6B 模型时,如引入特定任务数据集微调后,可能导致原始任务能力下降。这可能是微调训练参数调整不当导致的,微调初始学习率不要设置太高,可避免此问题。

  1. 样本量规模增大,训练出现 OOM 错?

解决方案是对数据并行处理,均分完整数据集到所有进程,每个 epoch 训练时整体数据分片 shuffle,每个进程同一时间只加载单个分段大小数据集,重新训练时可直接加载向量化后的数据。

  1. 大模型 LLM 进行 SFT 如何对样本进行优化?

对输入历史对话数据进行左截断,保留最新对话记录;去掉样本中明显语气词和不合适内容;扩充用户特征标签。

  1. 模型参数迭代实验?

验证历史对话轮次是否越长越好。训练两个模型,控制变量 max_source_length、max_target_length,从 Loss、Bleu 指标、离线人工评估等角度对比分析。结论是历史对话长度 1024 比 512 长度好,后续训练可扩大到 1024 长度。

  1. 微调大模型的一些建议?

模型结构方面:采用 Causal Decoder + LM 结构,使用 Pre RMS Norm,激活函数用 GeGLU 或 SwiGLU,embedding 层后不添加 layer normalization,位置编码使用 ROPE 或 ALiBi,去除 dense 层和 layer norm 的偏置项。

训练配置方面:选用较大 batch size,学习率调度先 warmup 再衰减,梯度裁剪通常为 1.0,权重衰减采用 AdamW 优化器且系数设为 0.1,采用 bfloat16 混合精度训练。若训练崩溃,要选择好的断点进行断点重训。

  1. 微调大模型时,如果 batch size 设置太小会出现什么问题?

更新方向的方差会很高,导致梯度更新主要是噪声,个别更新可能不太有用,但总体上会推动模型朝着正确方向前进。

  1. 微调大模型时,如果 batch size 设置太大会出现什么问题?

从训练数据抽样的两组数据会非常相似,增加 batch size 几乎不会改善性能,反而因需处理更多数据,总体训练时间没改善,还增加了总体的 FLOPS。且当 batch size 达到临界值时,模型性能会随 batch size 增加而降低。

  1. 微调大模型时,batch size 如何设置问题?

存在一个关于数据并行程度的临界点,找到这个临界点可平衡训练效率和模型最终效果。OpenAI 发现最优步长与噪声尺度等有关,学习率调整良好是前提。

  1. 微调大模型时,优化器如何?

除了 Adam 和 AdamW,其他优化器如 Sophia 也值得研究,它使用梯度曲率而非方差进行归一化,可能提高训练效率和模型性能。

  1. 哪些因素会影响内存使用?

内存使用受模型大小、批量大小、LoRA 参数数量以及数据集特性等因素影响,如使用较短的训练序列可节省内存。

  1. 进行领域大模型预训练应用哪些数据集比较好?

开源大模型预训练常加入书籍、论文等高质量、领域相关性强、知识覆盖率大的数据,领域相关的网站内容、新闻内容也很重要。

  1. 用于大模型微调的数据集如何构建?

选取干净且具代表性的训练数据;构建多样化的 prompt 提高模型鲁棒性;多任务训练时平衡各任务的数据量。

  1. 大模型训练 loss 突刺原因和解决办法?

loss 突刺是什么 :指大模型预训练过程中 loss 突然暴涨,可能导致模型长时间无法恢复或无法再收敛。

为什么会出现 loss 突刺 :与 Adam 优化器有关,其更新参数的变化趋势、梯度更新幅度、e 大小、batch 大小等因素密切相关。训练中可能出现浅层梯度变化和模型深层参数状态形成连锁反应,导致模型进入非稳态。

如何解决 :可更换 batch 样本;减小 learning rate;减小 e 大小或直接设为 0;也可采用智谱华章的 Embedding Layer Gradient Shrink (EGS) 方法,即把浅层梯度直接乘以缩放系数 a 来减小浅层梯度更新值。