本页章节
实战四 / 在完整训练里检验局部优化
完整训练 step:时间与保存量到底花在哪里?
在自然语言项目的同一组权重与输入上,比较完整输出层和精确分块输出层。先验证目标与更新,再拆开计量整个训练 step。
两个方案算的是同一个训练目标
加载自然语言项目 seed 11 的最终权重,两个副本都转换为 CPU float64,并从相同的新 AdamW 状态开始。固定每批 4 个最多 96-token 窗口、相同的 batch 序列、全局有效 label 均值、裁剪阈值和更新次数。分块方案使用位置块 64、词表块 128,保留全部梯度贡献。
这份测量有 3 次预热和 12 次实测;每轮交替两个方案的先后顺序。计时期间不开启 profiler、保存张量 hooks 或逐事件分配审计。整个 step 允许分块浮点求和与 dense 存在舍入差;loss 和连续 15 次更新后的参数差先通过冻结门槛,随后才解释性能。
查看同一次 step 的组成与原始样本
做优化决策之前,核对四个口径
局部与整体
输出投影和 CE 只是完整 step 的一部分。Attention、MLP、整条反向和 AdamW 仍然执行;分块额外的 Python 循环和小矩阵调用也有成本。本轮整体时间增加是当前实现与形状的测量结果。
监督 token 与原始 token
这里吞吐的分子是实际参与 loss 的非 padding label 数。预分词样本已经在内存,整理 batch 与清空梯度计入 step;从磁盘加载与 tokenizer 执行没有计入,不能把它称为端到端数据流水线吞吐。
保存引用与物理峰值
另开一轮 hooks,按反向图仍引用的唯一底层 storage 计字节,视图别名只计一次。未保存的临时 tile、梯度缓冲、分配器峰值与 RSS 不在这个数中,不据此宣称实际显存下降了同样比例。
时钟与硬件
这是单线程 CPU double 计算,用墙钟按边界记录。评估与写文件另测;写入时间没有承诺 fsync 持久化。桌面后台任务仍可能干扰,不推导 GPU、CUDA kernel 或正式 float32 训练吞吐。
原始样本用于观察波动。逐阶段中位数来自不同次序位置,不能先相加再当作完整 step 中位数;切换到同一次样本时,各阶段之和应与该次总耗时一致。
把数值依据和计时证据一起交付
完整报告保留所有阶段的 12 次样本、两种方法的连续更新误差、单独保存量测量,以及 3 次完整验证与 checkpoint 写入时间。下载包中的 profile/raw-step-times.json 可逐次核对阶段相加关系。
适用范围与一手资料
约 30 万参数真实文本 decoder、CPU float64、同权重和 batch 序列,3 次预热与 12 次交替测量。计时不插 hooks;保存引用另测。先核对 loss 与连续更新,再解释整步时间;不包含 GPU 性能、磁盘读入或在线分词。
公式与机制的原始依据 · 4 项
- PyTorch 2.9 · ProfilerCPU activity、形状、内存事件和 trace 导出;2026-10-28 核对
- PyTorch 2.9 · Autograd mechanics本项目框架对照固定 PyTorch 2.9.0;冻结、计算图与 no-grad 的语义,2026-10-27 核对
- Apple · Cut Cross-Entropy author README保存的作者 README 于 2026-10-28 读取:动机、接口、bias 与实现表;cce_exact 取消 classifier/embedding 两侧过滤,cce_kahan_full_c 只取消 classifier 过滤;教学 CPU 实现独立核验
- NVIDIA · Matrix Multiplication Background User's GuideGEMM FLOPs、算术强度、带宽/算力与 tile 影响