【腾讯二面】深入解析LLM训练中的Packing技术:为什么它如此关键?
本文详细介绍了大模型训练中的Packing技术,通过将多个短样本智能组合成长序列,大幅减少填充token,提升训练效率。文章解释了传统填充方法的问题(计算浪费、内存浪费、数据浪费),阐述了Packing的工作原理、关键细节(注意力掩码、分隔符、标签创建)及实现算法。Packing技术显著降低训练成本和时间,已成为大规模LLM训练项目的标配技术。
简介
本文详细介绍了大模型训练中的Packing技术,通过将多个短样本智能组合成长序列,大幅减少填充token,提升训练效率。文章解释了传统填充方法的问题(计算浪费、内存浪费、数据浪费),阐述了Packing的工作原理、关键细节(注意力掩码、分隔符、标签创建)及实现算法。Packing技术显著降低训练成本和时间,已成为大规模LLM训练项目的标配技术。
一、核心问题
在自然语言处理中,用于训练模型的文本数据长度通常是不固定的。一个样本可能是一句话(几十个 token),也可能是一整篇文章(几千个 token)。
而现代深度学习框架(如 PyTorch、TensorFlow)和硬件(如 GPU/TPU)为了计算效率,通常要求一个训练批次(Batch)内的所有样本具有相同的长度。
这是因为计算是基于张量(Tensor)的,而张量必须是规整的。
二、传统解决方案:填充(Padding)
为了解决长度不一致的问题,最直接的方法是:
- 设定一个固定的序列长度(例如 2048 个 token)。
- 对于短于该长度的样本,在其末尾添加一个特殊的
[PAD]
token,直到达到指定长度。 - 对于长于该长度的样本,进行截断(Truncation),只保留前 2048 个 token。
填充带来的问题:
- 计算浪费:对
[PAD]
token 进行前向传播和反向传播的计算是毫无意义的,浪费了巨大的计算资源和时间。 - 内存浪费:
[PAD]
token 仍然会占用宝贵的 GPU 内存(用于存储激活值、梯度等),降低了有效的批量大小(Batch Size)。 - 数据浪费:截断操作会直接丢弃超出长度限制的信息,导致模型无法从这些信息中学习。
三、Packing 的实现机制
其核心思想是:将多个较短的样本 concatenate(连接)起来,组合成一个长度接近模型最大上下文长度的样本,从而最大限度地减少填充 token 的数量。
四、Packing 是如何工作的?
假设我们模型的固定序列长度(上下文窗口)是max\_length = 2048
。
我们有三个样本:
- * 样本 A:长度 512 tokens
- * 样本 B:长度 1024 tokens
- * 样本 C:长度 256 tokens
(1)传统填充方法
每个样本都必须填充到 2048 tokens。
这意味着:
- * 样本 A 需要添加 1536 个
[PAD]
- * 样本 B 需要添加 1024 个
[PAD]
- * 样本 C 需要添加 1792 个
[PAD]
总共使用了 2048 * 3 = 6144 个 token 位置,其中 [PAD]
占了 (1536+1024+1792)=4352 个,利用率仅为 ~29%。
(2)Packing 处理
我们将 A, B, C 连接起来:[A][B][C]
。
总长度 = 512 + 1024 + 256 = 1792。这个长度小于 2048,所以我们还可以再放一些数据。
假设没有更多样本了,我们只需在末尾填充 2048 - 1792 = 256 个 [PAD]
。
现在,我们只用了 **1 个样本位置**(原来需要 3 个),并且只填充了 256 个 [PAD]
token,利用率高达 ~87%。
(3)关键细节:注意力掩码(Attention Mask)
仅仅连接是不够的。模型在计算注意力时,不应该让样本 A 的 token 去关注样本 B 的 token。
因此,我们需要一个注意力掩码来确保每个样本内的 token 只关注它自己所在的“包”内的其他 token,而忽略来自其他样本的 token。
对于连接后的序列 [A\_tokens][B\_tokens][C\_tokens][PAD\_tokens]
,注意力掩码会是一个矩阵,其中:
- * A 的 token 可以互相关注。
- * B 的 token 可以互相关注。
- * C 的 token 可以互相关注。
- * 所有 token 都不能关注
[PAD]
token。 - * A 的 token 不能关注 B 或 C 的 token,反之亦然。
(4)关键细节:分隔符(Separator Token)
通常,我们会在每个样本之间插入一个特殊的分隔符,如 <|endoftext|>
(GPT 系列)或 </s>
(LLaMA 系列)。
这有两个作用:
- 清晰的边界:为模型提供一个明确的信号,表示一个文档的结束和另一个文档的开始。这在模型生成时尤为重要,因为它学会了在分隔符处停止生成。
- 简化掩码:有时可以辅助注意力掩码的设计。
所以,打包后的序列实际上是:[A\_tokens][SEP][B\_tokens][SEP][C\_tokens][SEP][PAD\_tokens]
(5)关键细节:创建正确的 Labels(损失计算)
光有注意力掩码还不够,我们必须正确设置 labels 来计算损失。
核心是:只在有意义的预测位置计算损失,忽略样本连接处。确保模型只在同一个样本内部学习“根据上文预测下一个词”的任务。必须阻止模型学习到“从一个样本的结尾预测另一个样本的开头”或“预测填充符”这种错误模式。
在标准(未 packing)情况下,对于任何一个样本,其 labels 是 input_ids 向右偏移一位。
模型在位置 i 的任务是预测位置 i+1 的 token, 建示例如下:
- 输入(input_ids):[A0, A1, A2, …, A510, A511]
- 正确标签:[A1, A2, A3, …, A511, -100]
(注:最后一个 tokenA511 之后没有要预测的了,标签常设为 -100)
对于一个 packing 后的序列,其 labels 的构建示例如下:
- 输入(input_ids):[A0, A1, …, A511, B0, B1, …, B1023, C0, …, C255, PAD, …]
- 错误标签:[A1, …, A511, B0, B1, …, B1023, C0, C1, …, C255, PAD, PAD, …]
- 问题:A511 预测 B0,B1023 预测 C0。模型学会了错误的样本连接关系。
- 正确标签:[A1, …, A511, -100, B1, …, B1023, -100, C1, …, C255, -100, -100, …]
- 效果:A511 的预测被忽略,B1023 的预测被忽略。模型只在各样本内部进行有效学习。
正确的 Packing 标签,就是在简单偏移的基础上,将所有样本边界点和填充点的预测目标标记为 -100 以忽略其损失计算。
五、实现 Packing 的算法
如何高效地将成千上万个长度不一的样本打包成尽可能少的、填充最少的“包”,是一个经典的装箱问题(Bin Packing Problem)。
这是一个 NP-hard 问题,但在实践中我们采用一些高效的近似算法。
常见的策略有:
- 按长度排序后打包(Sorted Packing)
先将所有样本按长度从长到短(或从短到长)排序。
然后依次尝试将每个样本放入当前已有的“包”(bin)中,如果能放下就放入,否则就创建一个新包。
优点:实现简单,效果通常比随机打包好很多。
缺点:可能会破坏数据集的原始顺序,如果数据集是按某种有意义的方式排列的(如按时间顺序),这可能会引入偏差。
- 首次适应递减(First-Fit Decreasing,FFD)
算法步骤:
排序(Decreasing):将所有物品按体积从大到小进行排序。
放置(First-Fit):
- 按顺序取出一个物品。
- 从第一个箱子开始,依次遍历所有已打开的箱子
- 将物品放入第一个能容纳它的箱子中。
- 如果所有已打开的箱子都放不下,则新开一个箱子,并将物品放入。
形象比喻:就像你有一排箱子(序列),你拿着一个大件物品,从这排箱子的最左边开始问:“第一个箱子,你能放下吗?不能。第二个箱子,你呢?……哦,第五个箱子你能放下,那就放你这了。”
优点:实现简单,运行速度快。 因为一旦找到能放的箱子就立即放入,不需要检查所有箱子。
缺点:可能不是最优的选择。它可能会把物品放在一个靠前但剩余空间较大的箱子里,导致这个箱子后面难以放入中等大小的物品,从而浪费了空间。而一个靠后的、空间更匹配的箱子本来可以更好地利用空间。
- 最佳适应递减(Best-Fit Decreasing,BFD)
算法步骤:
排序(Decreasing):同样,将所有物品按体积从大到小进行排序。
放置(Best-Fit):
- 按顺序取出一个物品。
- 遍历所有已打开的箱子,找出所有能容纳该物品的箱子。
- 在这些能放下的箱子中,选择剩余空间最小的那个(即“最紧俏”、“最合适”的)。
- 如果没有任何已打开的箱子能放下,则新开一个箱子。
形象比喻:同样是一排箱子,你拿着物品会问:“所有能放下我的箱子们,请起立!好,现在你们谁的家(剩余空间)最小的几乎只够我住?就是你啦!”
优点:通常能产生比 FFD 更优的解(即使用的箱子更少或相当)。它尽可能地减少了箱子中的“碎片空间”,让箱子的填充更加紧凑。
缺点:运行速度比 FFD 慢。 因为它需要检查每一个已打开的箱子,并比较它们的剩余空间,以找到最佳选择。
在 LLM 训练中,这种数据预处理所带来的优势:
- 显著提升训练效率:减少了 FLOPs(浮点运算次数)的浪费,训练速度的提升
- 节省内存:允许使用更大的有效批量大小进行训练。
- 减少数据浪费:避免了因截断而丢失长文本信息。
六、LLM 训练的packing 工程实现流程
数据预处理:从数据集中取出多个短文档,将它们拼接成一个长的、长度固定的序列(例如 2048 个 token)。
如果最后一个文档太长,会将其截断;如果太短,会用下一个文档填充或使用特殊的 token 填充到指定长度。
计算细节:详见 Flash Attention 2 的训练适配:
https://huggingface.co/blog/packing-with-FA2
工程实现参考:packing 的工程化实现:python 实现的库:binpacking。
packing 是 LLM 预训练中一项至关重要的工程优化技术。它通过将多个短样本智能地组合成一个长序列,极大地减少了计算和内存的浪费,从而显著降低了训练成本和时间。
虽然它引入了额外的实现复杂性,但其带来的性能收益使得它成为所有大规模 LLM 训练项目的标配技术。
一直在更新,更多的大模型学习和面试资料已经上传带到CSDN的官方了,有需要的朋友可以扫描下方二维码免费领取【保证100%免费】👇👇
七、如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
01.大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K(数据来源:BOSS直聘报告)
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
02.如何学习大模型 AI ?
🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
更多推荐
所有评论(0)