Packing Analysis:LLM 样本 Padding 与 Packing 的对比
一、背景
我们之前已经分享过几篇关于 Sample Packing 相关的文章,也提到了其中的性能优化问题。最近今天又看到一篇新的论文,这里进行简单介绍。
对应的论文为:[2410.08081] Packing Analysis: Packing Is More Appropriate for Large Models or Datasets in Supervised Fine-tuning
相关工作可以参考我们之前的文章:
- Sample Packing:长序列 LLM 训练的 Attention 问题及优化
- Sample Packing 综述:LLM 效果与效率的 Tradeoff
- Binary Block Masking:加快稀疏 Attention 的一种新方法
二、摘要
Sample Packing 技术最初应用于大模型预训练阶段,旨在通过合并不同的训练样本来适应模型的最大输入长度,从而最大化硬件利用率。尽管在预训练中已展示了有效性,但对监督微调(SFT)阶段还缺乏全面分析:
- Packing 能否在保持性能的同时有效提升训练效率。
- 适合采用 Packing 技术进行微调的模型和数据集的规模。
- Packing 无关或者相关的训练样本是否可能导致模型过度忽略或依赖上下文。
本文中,作者对使用 Padding 和 Packing 的 SFT 方案进行了对比,涵盖从 69K 到 1.2M 的 SFT 数据集,以及 8B 和 70B 规模的模型。作者首次提供了关于 Padding 和 Packing 优缺点的全面分析,以及在各种训练场景中实施 Packing 的考量。作者的分析涉及多个基准,包括知识、推理和编码,以及基于 GPT 的评估、训练效率等。此外,作者还开源了相应微调和评估代码,并提供了在不同规模数据集上微调的 Checkpoint,旨在推动未来 Packing 技术的研究。
PS:个人感觉这篇文章还有很多可以改善的地方,比如说:
- 没有考虑 Document Level Mask 的问题。
- 没有考虑长序列场景。
- 可以提供更多的实验证明其观点:“特殊 Token [EOS] 可以有效地帮助模型区分两个相邻的训练样本”。
三、方法
3.1 方法概述
如下图 Figure 1 所示为对应的 Padding 和 Packing 方案,其中 SFT 数据集包含单轮对话(一个样本只包含一个输入和对应的一个输出)和多轮对话(包含多个输入-输出对)。
- Padding:
每个序列中只包含一个样本,如果不超过 Max Sequence Length 则补充[PAD] 占位 Token,到满足 Max Sequence Length。
如果是多轮对话,每个输入-输出对之后也要添加[EOS] 结束 Token。
- Greedy Packing:
- 首先,将多轮对话的多个输入-输出对合并成单个样本,用 [EOS] 间隔。
- 然后,将所有的数据按照长度排序。
- 最后,从最长的样本开始 Packing,将连续的几个样本打包,如果加上某个样本后总长度超过 Max Sequence Length,则放弃这个样本,补充 [PAD] Token 并开始一个新的序列。
- Random Packing:
- 首先,将所有训练样本拼接为一个单一的序列,同样会使用 [EOS] Token 间隔。
- 然后,按照 Max Sequence Length 将序列截断。
3.2 优劣
Padding 方案的优势和劣势:
- 优势:
实现简单,任何框架都比较容易实现。
简单的 Padding 和截断可以避免变长序列引申出的各种计算错误或性能问题。
- 劣势:
- 如果 Padding 太多,会导致计算量明显增加,并且对训练没有任何帮助。(PS:其实很多框架都支持变长计算,比如 FlashAttention,识别出 Padding 的 Token 可以不参与计算)
Random Packing 方案的优势和劣势:
- 优势:
可以最大限度减少未使用的空间(Token),从而提升计算效率。
可以提供更广泛的上下文组合,从而提供更多元化的场景,有可能帮助提升模型的泛化能力。(也就是说不会使用 Document Level 的 Mask?)
- 劣势:
- 可能导致两个不同或相似的样本串联,可能导致模型过度忽略或依赖上下文。不过作者提到这并不会导致模型过度关注 Packing 的上下文,主要是两个原因:
Random Packing 导致两个相似训练样本打包在一起的概率非常低。
特殊 Token [EOS] 可以有效地帮助模型区分两个相邻的训练样本。(PS:是否可以通过验证 Attention Score 来判断是否真的如此?)
- 这种方法也可能导致单个对话中的不同轮次被划分到了不同的子序列中,比如 Figure 1 中的 (Instruction 1 + Answer 1) 和 (Instruction 2 + Answer 2) 被划分到不同序列中
Greedy Packing 方案的优势和劣势:
- 优势:
可以降低将一个多轮对话样本划分到不同序列的风险。
- 劣势:
- 需要对整个样本排序,会打乱样本分布的随机性,也会影响一个 Batch 中样本的多样性。
PS:上述 Greedy Packing 方案也有可以改进的地方,作者的 Packing 方法中会优先使用当前更长的序列来拼接,如果超过 Max Sequence Length 就直接结束,这也就导致更多的短上下文样本无法利用这一部分空间。比如说,Max Sequence Length 为 2048,当前已拼接的序列长度为 1800,需要 Padding 248 个 Token,假设下一个样本的长度为 300,则会直接结束;然而,当前还有大量长度小于 248 的 Token 可以被拼接。
四、实验
4.1 实验配置
包含 4 个 SFT 数据集:
- WildChat(GPT-4):WildChat 是用户访问 ChatGPT 或者 GPT-4 生成的数据。这里作者只选择了 GPT-4 相关数据,包含 69K 个真实世界的数据。
- TULU:包含 326K 个对话数据集,也是来自真实世界。
- WildChat(Full):来自 WildChat 的全量 652K 数据。
- Open-Source 1M:总共包含 1.2M 对话数据,来自多个数据源。如下图 Table 1 所示。
训练配置如下图 Table 2 所示,主要是基于 LLaMA-3-8B 和 LLaMA-3-70B 微调,训练是在 4 台机器,每台集群 8 个 A800 GPU:
4.2 实验结果
如下图 Table 3 和 Table 4 所示,作者使用各种模型和数据集验证,Packing 的平均性能会比 Padding 的更好。比如 LLaMA-3-70B 上微调 WildChat(GPT-4)数据集,Padding 对应平均性能为 61.96,而 Packing 对应为 65.97(Random Packing)。
PS:上述的结论有点奇怪,智谱 AI 在 [2401.18058] LongAlign: A Recipe for Long Context Alignment of Large Language Models 中的实验表明,短序列任务上的差异并不明显,而在长序列上甚至 Packing 会导致指标下降。当然,LongAlign 使用了 Document Level 的 Mask,实际上 Meta LLaMA 等论文也建议在微调时使用 Document Level Mask。
如下图 Table 5 所示,使用 Packing 的方案确实可以有效提升训练速度,可以实现 3x 左右的加速,主要是 Packing 后 Padding 少了很多,训练的 Step 数少了很多:
上述结论也与智谱 AI 在 [2401.18058] LongAlign: A Recipe for Long Context Alignment of Large Language Models 中的结论类似,如下图 Figure 5 所示:
五、参考链接
- https://arxiv.org/abs/2410.08081
- https://arxiv.org/abs/2401.18058
本文转载自 AI闲谈,作者: AI闲谈