把可变长文本变成 GPU 可计算的长方形张量,并分清哪些 token 能看、哪些 token 计入 loss、哪些 token 只是占位
| 对象 | 它是什么 | 为什么存在 | 常见误解 |
|---|---|---|---|
| sequence | 一条样本的 token id 序列 | 模型真正处理的是 token id,不是原始字符串 | 把自然语言里的“句子”直接等同于模型输入 |
| batch | 多条样本组成的一次计算单元 | GPU 擅长并行矩阵计算,batch 能提高吞吐 | batch 只是把样本随便放一起 |
| padding | 把短序列补到同一长度的占位 token | 张量需要规则形状,通常形成 [batch, seq_len] | padding token 会像普通 token 一样参与训练 |
| attention mask | 标记哪些位置是真 token,哪些位置是 pad | 避免模型关注或统计无意义占位符 | attention mask 和 causal mask 是同一个东西 |
| loss mask | 标记哪些 label 计入训练 loss | 控制模型到底为哪些 token 负责 | 能被 attention 看到就一定要算 loss |
| packing | 把多条短样本拼进一个固定长度窗口 | 减少 padding 浪费,提高训练 token 利用率 | packing 只是简单拼接,不需要边界 mask |
| Mask / 字段 | 回答的问题 | 典型形状 | 错了会怎样 |
|---|---|---|---|
| attention_mask | 这个位置是不是有效 token | [B, T] | pad 被模型读取,或者真实 token 被误屏蔽 |
| causal_mask | 当前位置能不能看未来 token | [T, T] 或内置三角 mask | 训练泄露未来答案,perplexity 虚高或生成退化 |
| loss_mask / labels=-100 | 哪些位置参与 cross entropy | [B, T] | SFT 把用户问题也训成要预测的回答,或 assistant 答案没被训练 |
| segment / block mask | packed 样本之间能不能互相看见 | [B, T, T] 或 block-sparse 约束 | 不同样本串上下文,模型学到虚假的跨样本依赖 |
| position_ids | 每个 token 的位置编号如何计算 | [B, T] | left padding、packing、KV Cache 场景下位置错乱 |
attention_mask 管“是不是有效输入”,causal_mask 管“能不能看未来”,loss_mask 管“要不要为这个位置付 loss”,segment mask 管“packed 样本之间能不能互相看”。
| 策略 | 做法 | 适合场景 | 风险 |
|---|---|---|---|
| static padding | 全部样本补到固定 max_length | 简单训练脚本、固定形状编译、TPU / 某些导出场景 | 短样本多时大量算力浪费 |
| dynamic padding | 每个 batch 补到该 batch 最长序列 | 通用训练和微调 | batch 内长度差异大时仍浪费 |
| length bucketing | 长度接近的样本放在同一 batch | 大规模训练、长短样本混合 | 打乱随机性,可能改变数据分布 |
| left padding | pad 放在左侧 | 某些生成推理和 batched decode | position_ids 与 RoPE / KV Cache 要处理正确 |
| right padding | pad 放在右侧 | 训练、embedding、常规 batch | 生成时如果结束位置处理不当,可能读到 pad 侧 |
| 场景 | 应该关注 | 检查问题 |
|---|---|---|
| 预训练 | 文档边界、EOS、跨文档 attention、采样权重 | 模型是否被允许从一篇文档看到下一篇文档 |
| SFT | user / assistant role、response-only loss、模板边界 | 是否只对 assistant 应答算 loss |
| 偏好 / DPO | chosen / rejected 对齐、prompt 共享前缀、截断一致性 | 两条回答是否在同一上下文条件下比较 |
| 长上下文训练 | 窗口切片、document packing、位置分布 | 长文是不是被切成不自然的碎片 |
| 评测 | 样本隔离、prompt 边界、生成停止符 | 评测样本之间是否互相泄露答案 |
| 维度 | 训练 Batch | 推理 Batch |
|---|---|---|
| 目标 | 最大化有效训练 token,稳定梯度和吞吐 | 最大化服务吞吐,同时控制首 token 延迟和尾延迟 |
| 主要阶段 | forward、loss、backward、optimizer step | prefill、decode、streaming、KV Cache 管理 |
| 长度问题 | padding / packing / bucketing 决定计算浪费 | 短请求和长请求混跑会拖慢 decode 调度 |
| 状态 | batch 一般在一步训练内结束 | 请求会跨多个 decode step 持续存在 |
| 调度 | DataLoader、gradient accumulation、global batch size | continuous batching、paged KV cache、优先级、超时和取消 |
| 错误后果 | loss 异常、收敛慢、样本泄露、显存浪费 | 延迟抖动、吞吐下降、KV 泄漏、流式输出错位 |
| 问题 | 要看的证据 | 常见症状 |
|---|---|---|
| pad token 是否进入 attention | attention_mask、padding side、模型配置 | 生成出现奇怪重复,训练 loss 噪声大 |
| 未来 token 是否泄露 | causal mask、shift labels、模型 forward 约定 | 离线分数异常好,真实生成很差 |
| loss 是否只算该算的位置 | labels、ignore_index、role mask | SFT 后模型学会复述用户问题 |
| packed 样本是否串上下文 | sample boundary、block mask、EOS 处理 | 回答混入上一条样本的信息 |
| position_ids 是否随 padding 变化 | left / right padding、RoPE、KV Cache | 同一请求单跑正常,batch 后变差 |
| 截断是否切掉关键区段 | max_length、truncation side、chat template | 模型看不到 system prompt 或答案尾部 |
| batch 长度分布是否失衡 | token histogram、bucket 统计、padding ratio | GPU 利用率低,成本突然变高 |
| 训练和推理模板是否一致 | chat template、special tokens、stop tokens | 训练会答,线上格式漂移或停不下来 |
| 证据节点 | 必须记录字段 | 用来排查什么 |
|---|---|---|
| batch_shape | batch_id、batch_size、max_seq_len、padding_side、padding_ratio | 吞吐下降、显存浪费和长短样本混跑问题 |
| sample_boundary | sample_ids、segment_ids、document_boundary、eos_policy、packing_version | sequence packing 是否把不同样本串成伪上下文 |
| mask_integrity | attention_mask_hash、causal_mask_mode、loss_mask_hash、ignore_index | pad、未来 token、用户问题或无效 label 是否被错误训练 |
| position_alignment | position_ids_strategy、truncation_side、chat_template_version、leakage_test_result | padding、截断、模板和位置编号是否共同制造质量退化 |
| 相邻页 | 它回答什么 | 本页补什么 |
|---|---|---|
| Tokenizer / 词表 | 文字怎样变成 token id | token id 怎样被补齐、拼包、加 mask 后进入张量计算 |
| 语言建模目标 | next-token loss 怎样定义 | 哪些 label 应该计入 loss,哪些只是上下文或占位 |
| QKV / 注意力头 | attention score 怎样决定谁看谁 | attention_mask、causal_mask 和 segment mask 怎样限制谁能看谁 |
| 位置编码 / RoPE | 模型怎样理解位置 | padding、packing 和 KV Cache 场景下 position_ids 为什么容易出错 |
| 推理计算 / KV Cache | 推理成本和缓存怎样形成 | prefill / decode batching、continuous batching 和 padding 浪费的来源 |
| 模型服务 / 网关 | 生产推理怎样调度和治理 | 为什么请求长度分布、batch 调度和超时策略会影响 SLO |