跳到主内容
快讯直播
AI智模界
AI 词典

序列打包:别让 GPU 为填充符打工

一句话定义:序列打包(Sequence Packing)是把多条较短的训练样本首尾相接,拼成一条填满的长序列再送进模型,从而减少填充(padding)造成的算力浪费,提升训练吞吐。

为什么需要它

大模型训练时,一个批次里的样本要凑成同样长度才能并行计算。问题是,真实语料长短差异极大:有的是几百字的一条评论,有的是一整篇论文。如果按批次里最长的那条对齐,短样本后面就得补一大堆占位符。这些占位符同样要过一遍前向和反向计算,却什么也学不到——相当于每趟搬家都按最大的那件家具租车,短家具旁边全塞泡沫,车照样跑一趟。

序列打包换了个思路:既然要凑长度,那就把好几条短样本直接接起来,塞满一条长序列。车厢不空着,每一份算力都用在真实 token 上。

关键在掩码,不在拼接

拼接本身很简单,难的是别让样本之间“串门”。Transformer 的自注意力(self-attention)默认是全局的:第 3 条样本的每个 token 都能看到前面第 1、2 条样本的内容。这会制造出根本不存在的依赖关系,模型学到的可能是“上一条评论的结尾”跟“这一条的开头”之间的虚假关联。

所以序列打包必须配一个注意力掩码(attention mask),通常做成块对角形状:每条样本只能注意自己那一段,跨样本位置全部屏蔽。有些实现还会在样本边界处重置位置编码(position encoding),让每条样本的“序号”从头开始。掩码写错,模型看起来也能训,只是悄悄偷看了不该看的内容。

和相邻概念的区别

方案做法算力浪费主要风险
补零对齐每条样本补齐到固定长度
按长度分桶长度相近的凑一批
序列打包多条拼接 + 掩码隔离掩码写错会串门

分桶(bucketing)只是把长短样本分开排队,不解决拼接问题;序列打包则是把碎片真正焊成一根长条。两者常一起用。

对从业者的意义

训练吞吐上去,意味着同样的卡时能喂更多数据,或者同样的数据更快跑完。对做预训练、微调的人来说,这是很直接的成本项。但有两个坑:一是评估时不要把打包过的序列直接当成单条样本算指标,边界和掩码会污染结果;二是训练指标变好不一定代表模型变强,先确认掩码逻辑正确。

对普通职场人,可以这样理解:模型训练越来越像流水线排产,省下的每一步空转,最后都会体现在迭代速度和调用成本上。具体框架的打包实现和掩码接口各不相同,以官方文档为准。

AI 生成本文由 AI 基于公开信息自动生成,仅供参考。