modded-nanogpt Speedrun 151.5s 新纪录:删除首个注意力层、扩展验证窗口与 iteration_extension 调度参数解析
发布时间:2026/10/3 8:31:35 作者:尧图编辑部 阅读量:1,286

人工智能大模型预训练分布式训练模型优化深度学习【免费下载链接】modded-nanogptNanoGPT (124M) in 90 seconds项目地址https://gitcode.com/GitHub_Trending/mo/modded-nanogpt点击查看免费下载本文基于 modded-nanogpt 仓库 speedrun 纪录 2025-09-21_DropAttn/README.md 展开系统讲解这次把 124M 参数 GPT-2 训练时间推进到151.5 秒的纪录是如何达成的删除第一个注意力层、将训练步数从 1645 提升到 1680、把验证期的所有长注意力窗口扩展到 20 个 block并新增iteration_extension参数用于在最终学习率与窗口配置下追加训练步数。读完本文你将理解哪些层可以安全删掉背后的可解释性依据、如何用独立于步数的扩展阶段隔离超参影响以及 Muon 优化器处理 1D 标量参数时的实际行为。一、本次纪录的改动总览该纪录建立在此前所有 speedrun 改进含 PR #130之上核心改动共四项改动内容收益删除首个注意力层Block中 layer 0 不再实例化CausalSelfAttention减少一个[768, 768]注意力矩阵的前向/反向开销增加步数训练步数从 1645 → 1680换取更低损失扩展验证窗口验证时所有长窗口统一扩展到 20 个 block损失约 -0.001约等于 10 步≈1 秒的提升新增iteration_extension参数指定在最终 lr 与 ws 下继续训练的步数损失约 -0.001且大幅简化后续调参从仓库源码看这次删除首个注意力层的拓扑选择已经固化在当时的训练脚本 records/track_1_short/2025-09-21_DropAttn/06350b97-4a98-47da-90c1-3b957af8af6c.txt 的Block定义中class Block(nn.Module): def __init__(self, dim: int, head_dim: int, num_heads: int, layer_idx: int): super().__init__() # skip attention of blocks.7 (the 8th layer) by YouJiacheng self.attn CausalSelfAttention(dim, head_dim, num_heads) if layer_idx ! 7 and layer_idx ! 0 else None # skip MLP blocks for first MLP layer by EmelyanenkoK self.mlp MLP(dim) if layer_idx ! 0 else Nonelayer_idx ! 0表明第一个layer 0注意力层被直接置为None前向时跳过同时 layer 0 的 MLP 也在更早的纪录中被删除layer_idx ! 0从而形成了首个 block 只做残差缩放与注入、不承担任何子层变换的拓扑。二、为什么可以安全删除第一个注意力层文档给出了三个相互支撑的理由这正是删除层这一激进操作的可解释性基础首个注意力层对 induction heads 没有实质贡献通过观察训练完成后的模型权重观察文章见仓库纪录背景发现第一个注意力层没有产生有意义的 induction head 行为属于训练后可用性极低的冗余计算。PR #120 已删除第一个 MLP此前纪录把第一个 MLP 删掉后模型前两个 block 之间出现了两个注意力层之间没有中间变换的结构——注意力层的输出直接喂给下一个注意力层进一步削弱了首层注意力的存在意义。PR #130 的 smear 模块增强了 token 间信息传递smear 模块见 2025-09-18_Smear/README.md以极轻量的方式实现了把前一个 token 的 embedding 掺入当前 token近似token 0.07 * prior_token这恰恰承担了首层注意力中注意前一个 token这类低阶功能使模型不再需要首层注意力做这件事。从源码层面看Block.forward中if self.attn is not None与if self.mlp is not None的条件执行让这种稀疏拓扑非常廉价跳过某层时该 block 只做x lambdas[0] * x lambdas[1] * x0的残差缩放不触发任何 GEMM。同时这一设计也考虑了优化器的形状分桶注释中明确写着2 matrices x 12 layers 24 total, which is divisible by 8 GPU world size即保留 12 个 MLP 槽位、每槽 2 个矩阵共 24 个[768, 2816]矩阵恰好能被 8 卡 world size 整除从而保持 Muon 的 reduce-scatter/all-gather 分片均匀。三、iteration_extension把尾段微调从总步数中解耦3.1 为什么需要它在引入该参数之前lr学习率与ws注意力窗口都与总步数强绑定改动步数会牵动整个后半段训练的行为。文档给出了一个直观例子——如果把步数从 1645 增加到 1655那么第 1000 步处看到的损失就会突然变化导致很难判断损失变化究竟是步数增加造成的还是其它改动造成的。这给隔离变量影响带来了巨大困难。iteration_extension的解法是在主线训练结束后追加一段以最终 lr 与最终 ws 运行的扩展阶段。主线步数的任何改动都不会再波及扩展阶段的行为扩展步数单独可调从而带来约 0.001 的损失提升让针对步数的微调sweep变得容易得多。3.2 在仓库中的现代形态这一机制在仓库演进中保留了下来。当前 track_1_short/config.py 中num_scheduled_iterations: int int(os.environ.get(NUM_SCHEDULED_ITERATIONS, 1122)) num_extension_iterations: int 20而 track_1_short/schedule.py 中self.total_steps self.scheduled_iterations extension_iterations训练阶段表TRAINING_STAGES的最后一项就是扩展阶段其duration为None不占主线比例lr_mul被注释为not usedlr sits at the floor并以较小的 batch8 * 2048 * 8与更长的窗口window_sizes(6, 13)运行——这正是在最终 lr 与最终 ws 下继续训练这一设计意图的延续。可见iteration_extension已经从小步追加演化为独立的扩展阶段概念但其核心思想延长尾段、不触碰主线调度一脉相承。四、验证窗口扩展到 20让最终验证更接近模型真实能力本次改动把验证期的所有长窗口long window统一扩展到 20 个 block每 block 128 token即 2560 token 的注意力视野换来约 -0.001 的验证损失折算约 10 步、1 秒的训练收益。这与仓库此前的 YaRN 验证扩展实验一脉相承。2025-09-10_Yarn/ReadMe.md 曾记录将最终验证窗口从 11 扩展到 13 带来约 0.0015 的损失提升并观察到奇数窗口表现更佳ws_short ws_long // 2的整除行为对不同奇偶窗口不同。本次纪录把验证窗口进一步推到 20配合 YaRN 的频率缩放attn_scale * 0.2 * math.log(new_window / old_window) 1在验证时对更长上下文做无损扩展从而在训练窗口较小、验证窗口较大的配置下更充分地展示模型潜力。在当前的 track_1_short/config.py 中这一机制固化为WS_POST_YARN_EXT 20注释为 The final validation extends the long attention window to this many blocks (record #360)而当前模型 model/gpt.py 的LONG_WINDOW_LAYERS (3, 10)定义哪些层使用长窗口。可以推断本次纪录长窗口层带final_bm ws_final_layer * args.block_size对应bm_sizes中下标 4 与 11 的final_bm槽位正是验证时把长窗口层放大这一做法的早期源头。五、Future OpportunitiesMuon 分片的填充浪费文档还指出了下一步优化方向这需要结合 Muon 的实现来理解。5.1 现状10 个注意力变量 vs 22 个 MLP 变量删除首个注意力层后模型中注意力变量每个[4, 768, 768]即合并的 QKVO 四矩阵总数降到10而 MLP 变量每个[768, 2816]c_fc与c_proj各 12 个为22。在 Muon 中同一形状的参数被分到同一 group并跨 world_size 做 reduce-scatter 后各自计算 Newton-Schulz 正交化再 all-gather 回全量参数见 track_1_short/optim/anvil.py 的分片模式。文档指出attention 梯度计算按 16 槽位分片时10 个真实变量只占 10/16意味着6/16 的计算落在 padding全零填充token 上——这是纯浪费。反观 MLP 侧 22/24浪费只有 2/24。5.2 设想把注意力变量并入 MLP 分片文档提出的设想是若能把 2 个注意力变量移入 MLP 分片使得 MLP 变成 24/24、attention 变成 8/8即各分片均无 padding则两块 GEMM 与 NS 迭代的利用率都能打满。这在当时的拓扑下是一个明确的系统级优化空间——它不改变模型结构只改变优化器按形状分桶的边界属于零损失、省时间的类型。六、Muon 对 1D 标量变量的行为研究本次纪录还顺带做了一个优化器层面的实证当前 attention gates 与 smear gate 这类 1D 标量参数被传给了 Muon从实现粗看Muon 的 Newton-Schulz 正交化在 1D 变量上近似退化为F.normalize(x, p2, dim-1)——即无论梯度多大每一步的步长都被归一化到大致相同的距离于是 Muon 对 1D 变量来说变成了对先前梯度做指数平滑、且每步长度近似恒定的更新器把这类变量换到 Adam 上实测约 0.5 秒的运行时增加且损失无改善直接用F.normalize(x, p2, dim-1)替换 Newton-Schulz 处理这些变量表现反而略差。文档作者明确表示对背后的理论尚无完整解释I do not understand the theory here yet但经验上当前方案性能良好。这是一个典型的先有实证、后补理论的工程决策也提醒读者优化器与参数维度的匹配需要逐个形状实测不能仅凭理论推断。值得注意的是仓库在后续演进中如 2025-10-24_NorMuon、2025-11-10_CautiousWD 等纪录持续围绕 Muon 的标量参数处理与权重衰减展开调优说明这个方向在 speedrun 的收益曲线上一直很有价值。七、验证方法单样本 t 检验 均值标准差纪录的验证方法论非常严谨采用多次独立运行 统计检验而不是单次跑分import scipy.stats import torch accs [3.2786, 3.2798, 3.2762, 3.2781, 3.2778, 3.2801, 3.2774, 3.2772, 3.2777, 3.2789] times [151.559, 151.526, 151.516, 151.527, 151.606, 151.771, 151.546, 151.547, 151.44 , 151.872] print(p%.4f % scipy.stats.ttest_1samp(accs, 3.28, alternativeless).pvalue) # p0.0005 print(acc:, torch.std_mean(torch.tensor(accs))) # acc: (tensor(0.0012), tensor(3.2782)) print(time:, torch.std_mean(torch.tensor(times))) # time: (tensor(0.1305), tensor(151.5910))关键点单样本单尾 t 检验ttest_1samp(accs, 3.28, alternativeless)检验这批运行的均值是否显著低于 3.28。得到p0.0005远小于 0.05说明相对 3.28 的基线此前纪录约 3.2790见 2025-09-18_Smear/README.md 的统计改进在统计上显著损失均值 3.2782、标准差 0.001210 次运行非常稳定证明改动不是单次运行的噪声耗时均值 151.591 秒、标准差 0.1305 秒整个训练流程的耗时抖动被控制在约 0.13 秒内这也是 speedrun 竞速能精确对比的前提。文档同时说明验证运行完成后代码的语法与命名做了轻度重构Code syntax/naming was lightly refactored after performing validation runs因此发布版脚本与验证版逻辑一致、仅组织方式更整洁。八、总结与延伸阅读这次 151.5s 纪录的本质是三管齐下结构上用可解释性依据induction head 观察 smear 模块接管低阶功能安全删除首个注意力层让 124M 模型的注意力计算进一步向必要功能收敛调度上通过iteration_extension把尾段微调与主线步数解耦使后续调参可以隔离变量同时把验证长窗口扩到 20让验证损失更接近模型真实能力系统上指出 Muon 形状分片中 attention 侧 10/16 的 padding 浪费并验证了 1D 标量参数在 Muon 下的实际行为。想深入跟进这一系列演进可以继续阅读仓库内的相关纪录2025-09-18_Smear/README.mdsmear 模块、2025-09-10_Yarn/ReadMe.mdYaRN 窗口调度与验证扩展调度与参数的现代实现见 track_1_short/schedule.py 与 track_1_short/config.py稀疏层拓扑在后续纪录中不断演化当前 11 层模型的层级配置NO_ATTN_LAYERS、LONG_WINDOW_LAYERS等可参见 track_1_short/model/gpt.py 顶部常量区从中可以清楚看到哪些层跑注意力、哪些层只跑 MLP、哪些层两者皆无最终如何被系统化地表达与调度。赞分享人工智能大模型预训练分布式训练模型优化深度学习【免费下载链接】modded-nanogptNanoGPT (124M) in 90 seconds项目地址https://gitcode.com/GitHub_Trending/mo/modded-nanogpt点击查看免费下载相关推荐modded-nanogpt 153.9s 纪录拆解异步数据分片预取、首分片部分索引与最终验证窗口扩展modded nanogpt 153.9s 纪录拆解异步数据分片预取、首分片部分索引与最终验证窗口扩展 本篇文章以 modded nanogpt Track人工智能大模型预训练分布式训练模型优化深度学习Partial Key Offset 让 NanoGPT 提速modded-nanogpt 128.8s 世界纪录中的注意力机制改造实录Partial Key Offset 让 NanoGPT 提速modded nanogpt 128.8s 世界纪录中的注意力机制改造实录 导读 本篇文章围绕人工智能大模型预训练分布式训练模型优化深度学习modded-nanogpt 突破 3 分钟大关Long-Short 滑动窗口注意力、Attention Scale 与 Adam epsilon 调优实战modded nanogpt 突破 3 分钟大关Long Short 滑动窗口注意力、Attention Scale 与 Adam epsilon 调优实战人工智能大模型预训练分布式训练模型优化深度学习上一篇如何用3个步骤实现小红书无水印下载告别平台限制的烦恼下一篇如何通过GTA5线上小助手实现游戏参数深度定制完整技术指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考