前言

在开源训练/推理框架中,一个稳定的共识是:训练阶段倾向右填充(right padding),推理阶段倾向左填充(left padding)。

这并非“习惯问题”,而是工程实现、数值稳定与吞吐效率共同作用的结果。

简单总结一下:

  • 训练:优先右填充。原因是标签移位(label shift)与注意力/损失掩码更直观一致,position_ids 构造简单稳健,能减少边界错误与数值不稳定。
  • 推理:优先左填充。原因是批量增量解码需要对齐“最后一个真实 token”,以简化步进与 KV 缓存对齐,并与高效内核更好协同。
  • 原则:在哪个阶段选择能最小化 mask、position_ids、索引与缓存管理复杂度的填充方式,就用哪种。

01

为什么要填充(padding)?

填充是为对齐不同长度序列、实现同批并行的常规做法,decoder-only 模型同样需要。

无论左填充还是右填充,都必须用注意力掩码屏蔽 pad 位,并在损失中忽略 pad 位(loss mask 或 ignore_index)。

02

自回归训练为何偏好右填充?

自回归训练目标是最大化对下一个 token 的条件似然:

右填充时,有效 token 从左到右连续排列;labels 与 loss_mask 的切片在 batch 维度上统一,逻辑简洁、出错率低。

对位置编码(含 RoPE),右填充可直接用 attention_mask.cumsum 得到0…len-1 的连续 position_ids,实现稳定且与主流训练 pipeline 自然契合。

右填充还避免把短序列的有效 token“推到”很大的绝对位置,减少与预训练分布偏移导致的不稳定。

右填充:position_ids 与标签移位(PyTorch/HF 风格)

# 输入说明:`input_ids` 形状为 [B, L];`attention_mask` 形状为 [B, L]。
# 右填充(right-padded)约定:真实 token 对应 1,pad 位置对应 0。
# `position_ids` 目标:对每个样本的有效 token 生成连续的 0..len_i-1。
# 由于 pad 位会在注意力中被完全屏蔽,其对应的 position_ids 数值并不参与计算。
position_ids = (attention_mask.cumsum(dim=1) - 1).clamp(min=0)
# 标签与损失:使用 `ignore_index` 忽略 pad 位,使其不计入交叉熵损失;
# 训练是“下一个 token 预测”,需要与模型输出在时间维度上右移对齐(shift-right)。
ignore_index = -100
labels = input_ids.clone()
labels[attention_mask == 0] = ignore_index  # 在损失中忽略 pad 位置,避免对梯度产生干扰
# Teacher Forcing:标准的下一词预测设置。
# 很多实现内部会完成对齐;若需要手工对齐,可将 labels 右移 1 列,
# 使 logits[:, :-1] 与 labels[:, 1:] 在时间维度上对齐。
shifted_labels = labels.clone()
shifted_labels[:, :-1] = labels[:, 1:]
shifted_labels[:, -1] = ignore_index
# 注意力掩码:因果掩码(上三角)禁止看到未来信息;与 `attention_mask` 逐元素结合,
# 同时屏蔽 pad 位,确保注意力只在“历史且为非 pad”的位置上计算。
L = attention_mask.shape[1]
causal = torch.triu(torch.ones(1, 1, L, L, dtype=torch.bool), diagonal=1)
attn_mask = (~causal) & (attention_mask[:, None, None, :].bool())

03

推理为何偏好左填充?

批量增量解码每步只对“当前最后一个真实 token”前向一次,并将 K/V 写入缓存(KV cache),下一步复用历史以降算。

左填充让所有样本的“最后一个真实 token”在同一列对齐,步进统一、索引一致,能避免从 pad 继续生成;右填充则最后真实列各不相同,需要复杂的 gather/scatter 才能对齐。

在连续批处理(continuous batching)或流式/高吞吐部署中,左填充更容易与高效注意力内核协同,显著降低工程复杂度与失败模式。

左填充:position_ids 需 per-sample 偏移

# 输入说明:`input_ids` [B, L],`attention_mask` [B, L]。
# 左填充(left-padded)约定:左边是 0(pad),右边是 1(有效)。
B, L = attention_mask.shape
valid_lens = attention_mask.sum(dim=1)                     # [B],每个样本的有效 token 数
# 思路:先构造每行的“全局列索引”0..L-1,然后减去该样本的前缀 pad 数量,
# 把有效 token 的位置平移到 0..len_i-1;pad 位被 clamp 到 0,仅作占位不会被使用。
arange = torch.arange(L, device=attention_mask.device)     # [L],列索引模板
prefix_pad = (L - valid_lens).unsqueeze(1)                 # [B,1],每个样本的 pad 前缀长度
position_ids = (arange.unsqueeze(0) - prefix_pad).clamp(min=0)  # [B,L],per-sample 连续位置
# 重要:pad 位的 position_ids 数值并不会被注意力读取,务必依赖 attention_mask 在注意力中屏蔽。
# labels/loss_mask:由于每个样本的有效起点不同,labels 的屏蔽与切片必须按行处理,
# 否则会出现对齐错位、越界或 pad 未被忽略等错误。
ignore_index = -100
labels = input_ids.clone()
labels[attention_mask == 0] = ignore_index
shifted_labels = labels.clone()
shifted_labels[:, :-1] = labels[:, 1:]
shifted_labels[:, -1] = ignore_index

批量步齐与 KV 缓存(左填充示意)

# 预填充(pre-fill):将每条样本的有效上下文一次性写入 KV 缓存(可单次前向或按块分多次)。
# 增量解码(decode):每步仅输入上一时刻新生成的最后一个 token(即“当前步待解码 token”)。
# 左填充使得批内“最后一个真实列”对齐,因此所有样本在同一列步进,索引与 KV 读写统一。
for step in range(max_new_tokens):
# `last_tokens`:形状 [B] 或 [B,1],表示本步要解码的最后一个 token;
# `current_mask`:形状 [B, L_cur],对已完成样本通常不会继续增长;
# `use_cache=True`:启用 KV 缓存,`past_key_values=past` 复用历史以降低计算量。
logits = model(input_ids=last_tokens, attention_mask=current_mask, use_cache=True, past_key_values=past)
# 仅取最后时间步的分布作为本步决策依据
next_tokens = sample_from(logits[:, -1, :])
# 按样本更新:`done_mask` 为 True 的样本(遇到 eos 或达到最大长度)不再追加;
# 其余样本在序列右侧追加 `next_tokens`,并相应扩展注意力掩码与 KV。
input_ids = torch.where(done_mask, input_ids, torch.cat([input_ids, next_tokens[:, None]], dim=1))

如果非要用右填充做推理,其实也不是不行:

  • 可先共同解码“最短前缀”,再对较长上下文分批 gather 对齐,或在每步把 pad 位置的输出替换为对应位置的真实 token,以维持队列同步。
  • 代价是索引、mask、scatter/gather 的复杂度与开销显著上升,边界条件(不同长度 prompt、提前遇到 eos)更容易出错,也可能与高效内核不兼容。

最后

为什么要学AI大模型

当下,⼈⼯智能市场迎来了爆发期,并逐渐进⼊以⼈⼯通⽤智能(AGI)为主导的新时代。企业纷纷官宣“ AI+ ”战略,为新兴技术⼈才创造丰富的就业机会,⼈才缺⼝将达 400 万!

DeepSeek问世以来,生成式AI和大模型技术爆发式增长,让很多岗位重新成了炙手可热的新星,岗位薪资远超很多后端岗位,在程序员中稳居前列。

在这里插入图片描述

与此同时AI与各行各业深度融合,飞速发展,成为炙手可热的新风口,企业非常需要了解AI、懂AI、会用AI的员工,纷纷开出高薪招聘AI大模型相关岗位。
在这里插入图片描述
最近很多程序员朋友都已经学习或者准备学习 AI 大模型,后台也经常会有小伙伴咨询学习路线和学习资料,我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频 全系列的学习资料,这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

AI大模型系统学习路线

在面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。

img

但知道是一回事,做又是另一回事,初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性,在这基础上,找到高质量的学习资源,不浪费时间、不走弯路,又是重中之重。

AI大模型入门到实战的视频教程+项目包

看视频学习是一种高效、直观、灵活且富有吸引力的学习方式,可以更直观地展示过程,能有效提升学习兴趣和理解力,是现在获取知识的重要途径

在这里插入图片描述
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

海量AI大模型必读的经典书籍(PDF)

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
在这里插入图片描述

600+AI大模型报告(实时更新)

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

AI大模型面试真题+答案解析

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下
在这里插入图片描述

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Logo

更多推荐