【免费下载链接】parameter-golf
Train the smallest LM you can that fits in 16MB. Best model wins!
本篇文章以 OpenAI Parameter Golf 竞赛非记录提交 PR #363(Depth Recurrence + Mixed-Precision Quantization)为对象,系统复盘一次"用权重共享换有效深度"的完整失败实验:包括 Middle-Cycle 循环架构的 Stem/Core/Tail 布局、3x3 与 2x5 两种循环配置的受控对比、原创的 Noisy QAT 量化感知训练技术(量化 gap 从 0.37 bpb 压缩到 0.002 bpb),以及 12 项带具体数字的负面结果。读完本文,你将掌握为什么"参数高效"的循环架构在 10 分钟训练赛制下反而落后平面模型 0.025 bpb,以及哪些结论可以直接迁移到其他深度循环 / 权重共享架构的实践中。
背景:在 16MB / 10 分钟约束下,循环深度为什么诱人
Parameter Golf 的赛制是:在 8xH100 上训练不超过 10 分钟,把"模型权重 + 代码"打包进 16,000,000 字节(十进制 16MB,非 16 MiB)的 artifact,在 FineWeb 验证集上以 tokenizer 无关的 bits-per-byte(bpb)作为唯一评分指标。项目根 README.md 明确欢迎参数共享、深度循环(depth recurrence)、低秩训练、激进量化等非常规路线。
深度循环的核心论点是:把同一个 transformer block 在前向中复用多次,每一字节 artifact 就能买到更多"有效深度"。这一思路的谱系包括 Universal Transformer(Dehghani et al., 2019)、Alibaba Huginn、Samsung TRM,以及竞赛内的 PR #325(Aum08Desai,1.1462 bpb 的循环 2x5 Middle-Cycle 提交)。PR #363 的作者 Evangeline Kamin 从 PR #325 fork 出发,历时 4 天、约 35 次实验,在 8xH100 SXM 裸金属、2xH100、RTX 3070、A4500 等多种硬件上验证了这一命题,最终结论是:在竞赛约束下循环架构不具竞争力——受控对比中平面 11 层模型比循环 3x3 模型领先 0.025 bpb(1.1648 vs 1.1894)。有趣的是,三位独立研究者(作者、Frosty40、Ciprian-Florin Ifrim)从不同起点得出了相同结论。
值得先说明本仓库的记录形态:该 PR 的说明文档位于 records/track_non_record_16mb/2026-03-21_DepthRecurrence_MixedPrecisionQuant/README.md,其 submission.json 记录了本次非记录提交的元数据(val_bpb 2.3876、val_loss 4.0314、bytes_total 1,461,542,作者 evangelinehelsinki)。文档中提到的训练脚本名是pr325_train_gpt.py,仓库实际收录的可复现脚本为 train_gpt.py,下文会指出两者环境变量名的差异。
架构:Middle-Cycle 循环布局与其源码实现
Stem / Core / Tail 三段式布局
PR #325 提出的 Middle-Cycle 架构把层切成三段,参数节约全部来自中间的共享段:
[Stem blocks] → [Core blocks × R repeats] → [Tail blocks]- Stem blocks(茎段):处理原始 embedding 的唯一层,不共享;
- Core blocks(核心段):共享层,在前向中执行 R 次,参数节约的来源;
- Tail blocks(尾段):产出最终表示的唯一层,不共享;
- U-Net skip connections:Stem 输出以可学习权重加到 Tail block 输入上。
文档重点测试了两种配置(模型维度均为 640d、8 注意力头 + 4 KV 头 GQA、3x MLP 扩展、tied embedding + vocab 1024,并沿用 PR #325 基线的 SmearGate + BigramHash + RoPE):
| 配置 | Stem | Core | Repeats | Tail | 有效深度 | 唯一 block 数 |
|---|---|---|---|---|---|---|
| 3x3 | 3 | 3 | 3 | 3 | 12 | 9 |
| 2x5 | 2 | 2 | 5 | 2 | 16 | 6 |
2x5 是 fork 自 PR #325 的起点;3x3 则源自对 Frosty40 的 Frugendorff(PR #499,6 block × 2 repeats)的研究。3x3 之所以最终胜出,核心直觉是"更多唯一 block、更少重复次数 = 每个参数买到更多表征多样性",详见下文受控对比。
仓库源码中的对应实现
收录脚本 train_gpt.py 中,循环架构由RecurrentGPT(train_gpt.py)实现,关键设计:
- 循环调度表:
block_schedule = [i % num_unique_blocks for i in range(effective_depth)](L862-L863),由NUM_UNIQUE_BLOCKS(唯一 block 数)与EFFECTIVE_DEPTH(虚拟层数)两个超参驱动; - 编码器/解码器切分 + U-Net skip:
num_encoder_layers = effective_depth // 2,skip 权重为可学习参数(L837-L842); - Per-depth LoRA 适配器:每个虚拟深度挂一组 Q/V 低秩适配(
DepthLoRA,L771-L793),由DEPTH_LORA_RANK控制(0 为关闭),up 分支零初始化保证起始无扰动; - BigramHash:把相邻 token 对哈希进 embedding 表(
bigram_emb+bigram_proj,L866-L870),由BIGRAM_BUCKETS/BIGRAM_DIM控制; - XSA(Exclusive Self Attention):仅作用于最后 N 个虚拟层(
xsa_last_n,L872-L877),把注意力输出中与 value 对齐的分量投影掉。
这些超参全部集中在Hyperparameters类中(L74-L136),通过环境变量注入,为复现与扫描提供了统一入口。优化侧使用 Newton-Schulz 迭代的 Muon 优化器(zeropower_via_newtonschulz5,L142-L153)配分参数组学习率(token/embedding 用 Adam,矩阵用 Muon,标量/控制张量用 Adam)。
两大"循环税":循环架构在竞赛约束下失败的结构性原因
文档把失败归因于两个结构性惩罚,并称之为the two taxes of recurrence(循环的两项税)。强调"结构性"的意思是:这不是超参没调好或实现有 bug,而是固定时间预算 + artifact 大小限制共同作用下的必然结果。
税 1:量化误差复合(Quantization Compounding)
共享权重只存储一次、只量化一次,但推理时量化误差会穿过每一次循环迭代:3x3 每个 core block 的误差被看到 3 次,2x5 则被看到 5 次,且由于上一轮输出是下一轮输入,误差以非线性方式复合。作者实测的放大倍数约为3 个循环周期内放大 900 倍;int6 的逐行误差大约是 int8 的 4 倍,这个差距穿过循环就变成灾难。
Day 1 的 8xH100 首跑给出了最直观的证据:量化前 bpb 2.07(对该架构算不错),量化后 3.22,1.14 bpb 的量化 gap。社区成员 boreas 的总结一针见血:"所以你没法利用更小的尺寸来放大循环,因为复合的量化税挡在前面?"——正是如此。
税 2:步时开销(Step Time Overhead)
每一次循环迭代都增加 wall-clock 时间。8xH100 上的换算:
- Flat 11L:600s / 0.112s ≈5375 steps
- Looped 3x3:600s / 0.144s ≈4175 steps
循环模型少训练了约 22% 的步数,而在"每步都算数"的 10 分钟赛制里这是残酷的惩罚。
为什么尺寸优势无法弥补
循环模型 artifact 小 0.8 MB(14.5 vs 15.3 MB),能否用这部分 headroom 升级精度来填平 0.025 bpb 的差距?文档给出明确否定:把 0.8 MB 参数从 int5 升到 int8 大约只换回 0.005 bpb(基于全竞赛的量化 delta 经验),比 0.025 的缺口差一个数量级。权重共享省下的参数是真实的,但不足以同时抵消两项税。
受控对比:同一硬件、同一技巧下,平面 11L 完胜循环 3x3
这是文档中最具决定性的实验:8xH100 SXM 裸金属、全部 int5 量化、全 MHA(8 KV 头)、BigramHash 4096、warmdown 2000、同一 seed、同一评估管线(滑动窗口 stride 64、T=0.90)。
| 指标 | Flat 11L 512d | Looped 3x3 640d | Delta |
|---|---|---|---|
| bpb(滑动窗口) | 1.1648 | 1.1894 | +0.025(循环更差) |
| Artifact 大小 | 15.3 MB | 14.5 MB | -0.8 MB(循环更小) |
| 训练步数 | 5375 | 4175 | -1200 步(循环更少) |
| ms/step | 112 | 144 | +32 ms(循环更慢) |
同时期 Frosty40 在 Discord 公开了自己的结论:"yeah i did a ton of a/b testing and its not improving anything, it was other modifications... the recursion in this form is a bust",并补充说那些加在"循环层"上的修改本身有效,只是循环层在浪费周期。Ciprian-Florin Ifrim(三元量化提交,250+ 实验)的评估深度循环扫描显示,5 种不同重复次数的 bpb 总跨度仅0.0009 bpb,纯属噪声。三位独立研究者、三种架构、三种优化路线,结论一致。
8xH100 上的完整结果汇总如下(含 3-seed 均值口径):
| 配置 | 滑动 bpb | Steps | ms/step | Artifact | 16MB 内? |
|---|---|---|---|---|---|
| Flat 11L tuned(fullMHA+bg4096+wd2000, all-int5) | 1.1648 | 5375 | 112 | 15.3MB | YES |
| Flat 11L baseline(GQA, bg2048, wd1500, all-int5) | 1.1671 | 5550 | 108 | 15.0MB | YES |
| Flat 11L(int6, 超预算) | 1.1600 | 5550 | 108 | 17.2MB | NO |
| Looped 3x3 best(EMA+MTP+int5+GPTQ-lite) | 1.1787 | 4200 | 143 | 15.6MB | YES |
| Looped 3x3 tuned(与 flat 胜者同配置) | 1.1894 | 4175 | 144 | 14.5MB | YES |
| Looped 2x5(PR #325 fork, 3-seed 均值) | 1.1834 | 4200 | 143 | 15.6MB | YES |
作为赛况参照(约 640 个 PR 时的 meta):总体领先者 #573 以多遍流式 legal TTT 拿到 1.0523;无 TTT 的平面堆栈最佳约 1.1154(#609)与 1.1171(#593);起点 PR #325 为 1.1462;本 PR 最佳循环结果 1.1787,比最佳无 TTT 平面提交落后 0.063 bpb——这就是该约束下循环的代价。
幸存发现 1:Noisy QAT——把循环架构的量化 gap 从 0.37 压到 0.002 bpb
这是 PR #363 最核心的原创贡献,也是该 PR 存在的理由。
问题:STE 假量化在循环架构上失效
标准 STE(Straight-Through Estimator)QAT 在前向中模拟量化、反向直通。这对"每个权重矩阵只用一次"的平面架构有效;但对循环架构,误差会在 N 次迭代中传播复合。文档测得 int8 误差经 3 次循环放大约900 倍,Day 1 首跑因此出现 2.07 → 3.22 的灾难性量化 gap。
修复:注入与 int8 逐行量化误差同量级且可微的均匀噪声
与 STE 的"前向假量化、反向直通"不同,Noisy QAT 在前向注入可微的均匀噪声,让模型学到对量化尺度扰动鲁棒的权重配置。文档给出的核心代码(仅用于循环 core block 的CastedLinear.forward()):
# In CastedLinear.forward(), for loop core blocks only: with torch.no_grad(): amax = self.weight.float().abs().amax(dim=1, keepdim=True).clamp_min(1e-12) step_size = amax / 127.0 noise = (torch.rand_like(w) - 0.5) * step_size.to(w.dtype) w = w + noise三个关键属性:
- 可微:与 STE 不同,梯度穿过噪声流动,模型学到对量化尺度扰动鲁棒的配置;
- 循环感知:只作用于 core(共享)block,不作用于 stem/tail;
- 校准过:噪声量级与 int8 逐行量化步长相匹配,是"贴齐实际导出格式"的正则化,而非任意噪声。
结果:量化 gap 从0.37 bpb 塌缩到 0.002 bpb,约 185 倍改善;推理时零成本,且对任何深度循环架构原则上可迁移。
一个重要的边界条件(对应负面结果 #10):在 Middle-Cycle + int5 导出的组合下,按 int8 校准的 Noisy QAT 反而轻微有害(+0.006 bpb),因为噪声量级对 int5 的步长来说是错的——噪声必须与真实导出精度匹配。
收录脚本中的对应实现
需要如实说明:仓库收录的 train_gpt.py 中,QAT 路径是按步数分片启用的 STE 假量化:_fake_quantize_int6_ste()(L597-L605)实现前向 int6 假量化 + 反向直通;全局开关_QAT_ACTIVE(L49)由QAT_FRACTION控制,在训练末尾max_wallclock_ms * (1.0 - qat_fraction)时刻激活(L1174-L1180),CastedLinear.forward()(L621-L627)在训练中且开关打开时套用。文档中的 Noisy QAT 是该 PR 的原始方法叙述,与收录脚本中这条 STE 路径是两种不同实现,读者复现时需区分。值得一提的插曲是:文档披露 26 模型代码审查关曾揪出一个global _QAT_ACTIVEbug——QAT 可能从未真正运行过,这类全局开关的正确性值得每一位实验者警惕。
幸存发现 2:SWA 在 Middle-Cycle 上"反转"量化 gap
这是最诡异的结果:Stochastic Weight Averaging(SWA,周期性平均模型 checkpoint)使权重分布更平滑,在 Middle-Cycle 架构上,量化后的 bpb 有时反而优于量化前。
作者假说:SWA 把权重推向更平坦的最小值,使各行的权重分布更均匀;逐行量化恰好擅长处理均匀分布,SWA 的平滑效应意外地"补偿"了量化噪声,而不是与之对抗。对任何把 SWA 与激进量化方案结合的实践者,这都是一条可能被复用的线索。
幸存发现 3:3x3 优于 2x5——更多唯一 block、更少重复
这是对循环 transformer 实践者最有操作价值的一条。受控对比(单 GPU、完全相同的超参):
| 配置 | 有效深度 | bpb | Artifact 大小 | ms/step |
|---|---|---|---|---|
| 3x3(3 core × 3 repeats) | 12 | 1.3462 | 11.9 MB | 236 |
| 2x5(2 core × 5 repeats) | 16 | 1.3519 | 13.2 MB | 260 |
3x3 在全部维度胜出:-0.006 bpb、-1.3 MB、-24 ms/step。2 个共享 block 重复 5 次,模型只能组合出 2 个不同的计算"程序";3 个共享 block 重复 3 次则有 3 个不同程序,多样性多 50%,代价仅多一个 block 的参数。推论是:在参数预算内优先增加唯一 block 数,而非重复次数。
一条免费的经验教训:永远用满全部 80 个训练分片
Day 3 中作者在 8xH100 VM 上反复拿到 1.28 bpb,而同一份代码在 Hyperbolic 裸金属上是 1.18。做了 A/B 测试、把 LeakyReLU 做成可配置、排查代码回归,全部无果。根因出人意料:只下载了 1 个训练分片而不是 80 个。模型在记忆单个分片,泛化极差:
- 80 个分片:1.1914 bpb
- 1 个分片:约 1.30 bpb
仅训练数据多样性一项就值 0.1 bpb。数据下载方式可参考 data/README.md(cached_challenge_fineweb.py --train-shards N,默认 80 个分片 / 8B tokens)。这条忠告对任何参赛者都成立:永远用满全部 80 个 shards,永远。
12 项负面结果:带具体数字的完整清单
文档明确表示这部分可能是全文最有用的一节。以下 12 项全部按原文档数字整理,其中多项揭示出"平面架构上的技巧搬不到循环架构"这一共性规律。
1. 全层 XSA(循环版)
XSA 施加到包括循环 core 在内的所有 block:+0.001 更差(1.1953 vs 1.1940)。平面 11L 的"all 11 layers"是 11 个唯一计算;循环版的"all layers"是 3 个唯一计算各重复 3 次,语义完全不同,过犹不及。
2. 循环 Muon 动量(0.85–0.95,周期 50)
平面架构上报告 -0.0045(PR #623)。与 XSA、QuadgramHash 组合后:+0.058 更差(灾难性)。动量掉到 warmup 目标(0.85)以下,扰动经循环迭代复合,破坏循环收敛。
3. QuadgramHash(1024 buckets, dim 32)
与 #2 组合测试,无法单独隔离;预算不足未独立验证。结论:inconclusive。
4. 分解嵌入(EMBED_DIM 192 / 256)
FIIZiK_ 在 768d 三元模型上用 EMBED_DIM=254 称"损失很小",但那是三元权重 + 8192 vocab 的架构。在 int5 + vocab 1024 上:
| EMBED_DIM | 比例 | bpb | Delta | Artifact |
|---|---|---|---|---|
| 640(无分解) | 100% | 1.1787 | 基线 | 15.6MB |
| 256 | 40% | 1.2416 | +0.063 | 14.8MB |
| 192 | 30% | 1.2316 | +0.053 | 16.4MB(超限) |
两个都糟糕。1024 词表下嵌入表本已很小(1024 × 512 ≈ 0.5M 参数),再压缩省不了多少参数却摧毁表示质量。分解嵌入只在大词表(如 8192)下才有意义。
5. Value Residual(ResFormer)
平面架构报告 -0.015(PR #486/#490)。循环版:+0.14 更差(1.4378),即使加初始化修复(lambda 初始化为 -4.0,使 sigmoid(-4.0) ≈ 0.018,初始几乎不混合)。原因是循环 core 每一轮都看到同一个 stem 的 V,V 残差随深度变成越来越过期的参考;共享权重无法为不同重复轮次学不同的混合比例。Value Residual 假设每层在网络中有唯一位置,共享层违反该假设。
6. 渐进循环展开(2 → 5 repeats)
训练开始时 2 次循环、线性增至 5 次:DDP 崩溃。动态控制流与 torch.compile + DistributedDataParallel 不兼容;单 GPU 下 2172 ms/step(比基线 236 ms/step 慢 9 倍),每次 repeat 数变化都会打破编译图、触发整体重编译。
7. 锯齿形 LR 调度
LR 变化触发 torch.compile guard 检查,每一步都重编译:步时从 248 ms 涨到 987 ms(4 倍),只完成 607 步,结果作废。与 #6 同根因——任何被 torch.compile 追踪的值发生变化都会引发重编译,LR 调度必须实现在编译区之外。
8. 全权重测试时训练(TTT)
在验证数据上跑 829 步 AdamW:1.56 bpb vs 1.38 基线,严重过拟合。GPTQ 量化后的权重处于狭窄的、对齐曲率的最小值中,AdamW 的自适应学习率会摧毁它。TTT 与激进量化本质冲突,除非用 SGD 或严格约束的 LoRA。(文档注明:per-document LoRA TTT 已实现,但 DDP 崩溃阻止了多 GPU 测试。)
9. LeakyReLU(0.5)²
平面架构报告 -0.003。2xH100(1 分片)上观察到 -0.003 改善,但 8xH100(80 分片)上可忽略。可能是数据 regime 相关:1 分片时数据多样性低,leaky 激活对负值区间的梯度流有帮助;80 分片时模型自然学会绕开死亡 ReLU 区域。教训:单 GPU 结论必须在目标硬件上验证。
10. Late QAT + int5
最后 10% 步数启用 QAT 并配 int5 导出:+0.006 更差。按 int8 噪声校准的 QAT 量级对 int5 导出是错的——模型被训练成对 int8 尺度扰动鲁棒,实际面对的却是 int5 尺度扰动。QAT 噪声必须匹配导出精度(呼应 Noisy QAT 一节)。
11. BigramHash(10240)
平面 11L 上报告 -0.070(PR #450)。循环版:无改善(2xH100 上 1.2980 vs 1.2963)。假说:循环架构"多次看到同一批数据",本身已获得某种 n-gram 式模式识别能力,额外 bigram 容量与循环冗余。
12. 704d 模型维度
640d → 704d 增加单 block 容量:2xH100 上更差。更宽的模型在 10 分钟内训练步数不足,增加的每步成本无法被容量收益抵消。
超参数扫描与实验时间线
2xH100 上的扫描(1 个数据分片,方向性可靠但绝对值高于 8xH100)
- EMA × Warmdown(20 组合,多数被 torch.compile 重编译污染):幸存最佳为EMA 0.996 + Warmdown 2000 = 1.2910 bpb;
- MTP(Multi-Token Prediction):
| MTP Heads | Loss Weight | bpb |
|---|---|---|
| 4 | 0.3 | 1.2974 |
| 6 | 0.3 | 1.3010 |
| 2 | 0.3 | 1.3045 |
- Muon Weight Decay(循环架构上越低越好,与平面惯例相反):
| WD | bpb | Delta |
|---|---|---|
| 0.02 | 1.2955 | 基线 |
| 0.04 | 1.2983 | +0.003 |
| 0.06 | 1.3060 | +0.011 |
假说:共享参数的 weight decay 影响被放大,因为这些权重在每次循环迭代中都被使用;激进的 decay 就像量化误差一样穿过循环复合。
四天实验时间线摘要
- Day 0:部署 15 个研究 agent 跨国挖论文,锁定深度循环;3070 上首个循环模型 1.5630 bpb / 6.1M 参数 / 4.1MB artifact;3070 上做宽/深/均衡三向 scaling sweep,全部吞吐受限;调研自定义压缩(entropy 分析 int6 约 2.94 bits/value vs zstd 的 5.0–5.5),测试 bit-packing、delta encoding(失败)、Huffman;
- Day 1:2x A4500 平价 pod 扫 scaling;LoRA adapter 在低步数下 NoLoRA 胜出;BigramHash 与循环兼容良好;SmearGate 伤循环;MTP 严重破坏共享循环权重;首个 8xH100 跑出 1.14 bpb 灾难性量化 gap;发现 ~900x 误差放大;发明 Noisy QAT(0.37 → 0.002);提交 PR #363;
- Day 2:fork PR #325;批量套用 Muon 0.99、warmdown 调整、Partial RoPE 16/64、LN Scale、XSA last 4、Late QAT;发现 SWA gap 反转;26 模型代码审查揪出
global _QAT_ACTIVEbug 等 6 个问题;双 2xH100 并行扫超参;确认 EMA(0.997) ≈ SWA、warmdown 1500 > 3000 > 1000、MTP 4 头/0.3、Muon WD 0.02;GPTQ-lite 白赚 -0.0027;Value Residual 与循环灾难性冲突(+0.14);AdamW TTT 灾难性过拟合(1.5636); - Day 3:3x3 全面胜 2x5;分片教训(1 vs 80 shards);8xH100 循环最佳1.1787(3x3 + EMA + MTP + int5 + GPTQ-lite + T=0.90);验证 stride 16 eval(-0.015,显著)与 T=0.90(relu² 网格搜索最优,SwiGLU 架构则用 T=1.0,激活依赖,非普适默认);分解嵌入 192d / 256d 均灾难;
- Day 4:Frosty40 确认递归是死路;受控 flat vs looped 对比落地;把循环加回 tuned flat 配置再次确认 +0.025 惩罚;对照 PR #499 发现其增益来自 MLP 宽度而非循环。
更多算力下可能成立的方向(明确标注为推测)
- 更长训练预算:循环模型用步数换有效深度,10 分钟不利;30+ 分钟或无限算力赛道下,步数惩罚缩小、参数效率优势放大(参照 PR #612 在 100 分钟赛道的 1.1079 bpb)。循环架构可能在更长时间尺度上有竞争力;
- 推理期自适应深度:每 token 选择循环次数,简单 token 提前退出、难 token 多迭代(Universal Transformer 的原始提议),挑战在于与 torch.compile 和批量推理要求的静态计算图兼容;
- 匹配导出精度的 Noisy QAT:当前校准到 int8(step_size = amax / 127.0)却按 int5 导出;若按 int5 校准(step_size = amax / 15.0)可能填平缺口(作者因算力耗尽未验证);
- 更好的循环设计:3x3 > 2x5 说明最优配置远未探明——非对称循环(stem 多于 tail)、异构重复次数(block 1 重复多于 block 2)、只在首尾轮次做 attention 而中间轮次只跑 MLP,均未探索。
复现指南:环境变量与运行方式
原文档给出的受控对比复现命令(训练脚本名按其 PR 内文件为pr325_train_gpt.py):
# Flat 11L 512d(可提交最优:1.1648 bpb) NUM_LAYERS=11 MODEL_DIM=512 LOOP_CORE_LAYERS=0 LOOP_REPEATS=1 \ MLP_INT5=1 ATTN_INT5=1 NUM_HEADS=8 NUM_KV_HEADS=8 \ BIGRAM_VOCAB_SIZE=4096 WARMDOWN_ITERS=2000 \ EVAL_TEMPERATURE=0.90 EVAL_STRIDE=64 SEED=42 # Looped 3x3 640d(同配置下 1.1894 bpb) NUM_LAYERS=9 MODEL_DIM=640 LOOP_CORE_LAYERS=3 LOOP_REPEATS=3 \ MLP_INT5=1 ATTN_INT5=1 NUM_HEADS=8 NUM_KV_HEADS=8 \ BIGRAM_VOCAB_SIZE=4096 WARMDOWN_ITERS=2000 \ EVAL_TEMPERATURE=0.90 EVAL_STRIDE=64 SEED=42两条配置均以MAX_WALLCLOCK_SECONDS=600在 8xH100 SXM 上配合 80 个训练分片运行。
仓库收录脚本的变量名差异(重要):本仓库收录的 train_gpt.py 并非 PR #325 原文件,其Hyperparameters(L74-L136)使用另一套环境变量:循环配置由NUM_UNIQUE_BLOCKS(默认 3)与EFFECTIVE_DEPTH(默认 9)驱动(L119-L122),此外还有DEPTH_LORA_RANK、BIGRAM_BUCKETS、BIGRAM_DIM、XSA_LAST_N、QAT_FRACTION、MUON_WEIGHT_DECAY、MATRIX_LR、MUON_MOMENTUM等。按收录脚本复现时,需将上表LOOP_CORE_LAYERS/LOOP_REPEATS映射为对应的NUM_UNIQUE_BLOCKS/EFFECTIVE_DEPTH语义(3x3 即 NUM_UNIQUE_BLOCKS=3 + EFFECTIVE_DEPTH=9 的 block 循环调度;文档中的平面配置可理解为 unique blocks = 层数、EFFECTIVE_DEPTH = 层数、无重复)。
运行方式与依赖:
- 脚本以
torchrun --standalone --nproc_per_node=N启动(脚本头注释 L14),要求 CUDA;数据路径由DATA_PATH、TOKENIZER_PATH指向 FineWeb sp1024 缓存; - 训练受
MAX_WALLCLOCK_SECONDS(默认 600.0)硬性封顶,到达后停止并进入序列化阶段; - 序列化默认走int6/zstd-22混合精度量化路径(
quantize_state_dict_int6,L457-L512),zstd 不可用时回退 int8/zlib-9(compress_bytes,L521-L526);脚本会在 L1246-L1249 检查 artifact 是否超出 16,000,000 字节上限并打印 headroom,随后做"量化 → 反量化 → 重评"的 roundtrip 验证,输出final_int6_roundtrip行; - 依赖清单见 requirements.txt(torch、sentencepiece、zstandard、huggingface-hub、datasets、tiktoken 等)。
另需注意评估口径:文档中 1.1787 / 1.1648 等数字来自滑动窗口评估(stride 64、T=0.90),这是竞赛社区验证出的显著收益项(可参见先例 SlidingWindowEval,stride 64 相对非重叠基线带来可观改善);而 submission.json 中的 2.3876 bpb 是另一种评估口径下的存档值,两者不可直接比较。
结论:这次"失败"留下了什么
作者的原话是:"我出发去证明深度循环能在 Parameter Golf 中有竞争力,我失败了。但这次失败的价值超过标准堆栈上的又一个 0.001 提升。"
结构性结论已经明确:量化复合与步时开销这两项"循环税"不是超参问题、不是实现 bug,而是固定时间预算 + artifact 大小限制的直接后果。三条可迁移的经验是:
- Noisy QAT:循环 core 权重应当用与量化误差校准一致的噪声训练;int8 目标下量化 gap 从 0.37 塌缩到 0.002 bpb,是该工作最强的单一结果,且对任意深度循环架构原则上可迁移;
- 3x3 > 2x5:优先更多唯一 block、更少重复次数;
- 12 项负面结果:特别是"平面架构技巧不可直接搬上循环架构"(XSA 全层、Value Residual、分解嵌入、TTT、BigramHash 扩容等),为后来者省下真实算力与真金白银。
最后回到文档的致谢名单:Aum08Desai(PR #325 Middle-Cycle 起点)、Frosty40(PR #499,公开分享递归负面结果)、Ciprian-Florin Ifrim(250+ 实验的系统记录)、boreas(点破量化税)、OpenAI / Will DePue(算力赞助与"people aren't being nearly ambitious enough"的激励)以及整个 Parameter Golf 社区。对每一位考虑在 Parameter Golf 里尝试深度循环的人,这份记录的目标就一句话:读它,省下 4 天和 200 美元。
最佳循环:1.1787 bpb(3x3,8xH100,滑动窗口)| 最佳平面:1.1648 bpb(11L,同硬件)| 受控差距:+0.025 bpb(循环更差)
【免费下载链接】parameter-golf
Train the smallest LM you can that fits in 16MB. Best model wins!
相关推荐
IceCubesApp:纯 SwiftUI 打造的多平台 Mastodon 客户端,从本地缓存到端到端加密推送
IceCubesApp:纯 SwiftUI 打造的多平台 Mastodon 客户端,从本地缓存到端到端加密推送 想找一个能用纯 SwiftUI 从头读到尾的 M
移动开发社交NiBabel支持的8种神经影像格式全解析:从DICOM到CIFTI
NiBabel支持的8种神经影像格式全解析:从DICOM到CIFTI 在神经影像分析领域,处理多种不同格式的医学图像数据是一项常见挑战。Python神经影像库N
图解 React 源码之两大工作循环:任务调度循环与 fiber 构造循环
图解 React 源码之两大工作循环:任务调度循环与 fiber 构造循环 本文基于 react illustration series https://lin
教程前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考