news 2026/10/22 0:14:50

parameter-golf 16MB 赛道实践:MLP GPTQ 离群值裁剪重调(MLPClip12)如何在 int6 量化下再降 0.00096 BPB

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
parameter-golf 16MB 赛道实践:MLP GPTQ 离群值裁剪重调(MLPClip12)如何在 int6 量化下再降 0.00096 BPB

【免费下载链接】parameter-golf

Train the smallest LM you can that fits in 16MB. Best model wins!

项目地址:https://gitcode.com/gh_mirrors/pa/parameter-golf
点击查看免费下载

本指南以 parameter-golf 仓库records/track_10min_16mb/2026-04-22_SP8192_CaseOps_GatedAttn_QuantGate_Loop45_PhasedTTT_MLPClip12这一提交为蓝本,完整讲解其核心创新——MLP 权重的 GPTQ 逐行 σ 裁剪参数mlp_clip_sigmas从 10.0 重调至 12.0——如何在不改动架构、不触碰任何其他超参的前提下,把 5-seed 平均 val_bpb 从基线的 1.06549 压到 1.06453。读完本文,你将掌握:int6 GPTQ 校准中裁剪宽度与量化网格之间的偏差/方差权衡、phased TTT 的 score-first 评估协议、Gated Attention 与 Quant Gate 的实现细节,以及该提交完整的 5-seed 复现命令与数据准备流程。

提交概览:一个"一行改动"的量化再调优

该提交的元信息位于 submission.json,基线成绩为:

  • val_bpb 1.06453(5-seed 均值,std 0.00068)
  • val_loss 2.32958 nats/token(std 0.00148)
  • Artifact 约 15.98 MB(5 个种子全部低于 16,000,000 字节上限)
  • 运行环境:8×H100 80GB SXM,PyTorch 2.9.1+cu128,训练 600s / 评估 600s 双预算,Phased TTT

与基线 PR #1736(records/track_10min_16mb/2026-04-19_SP8192_CaseOps_GatedAttn_QuantGate_Loop45_PhasedTTT)相比,唯一的代码改动只有一行——train_gpt.py中mlp_clip_sigmas的默认值由 10.0 改为 12.0:

# Base submission: mlp_clip_sigmas=10.0 (aggressive — clips MLP rows with large outlier columns) # This submission: mlp_clip_sigmas=12.0 (preserves tail mass of MLP weight distribution) mlp_clip_sigmas = float(os.environ.get("MLP_CLIP_SIGMAS", 12.0))

对应源码位于 train_gpt.py。注意该行同时保留了MLP_CLIP_SIGMAS环境变量覆盖通道,意味着无需改代码即可实验其他裁剪宽度。

核心创新:MLP GPTQ 离群值裁剪的偏差/方差权衡

int6 量化网格的构造原理

在gptq_mixed_quantize(train_gpt.py)中,量化路径按张量名分派裁剪参数:

if "tok_emb" in name: cs = h.embed_clip_sigmas elif ".mlp." in name: cs = h.mlp_clip_sigmas # ← 本次改动的落点 elif ".attn." in name: cs = h.attn_clip_sigmas else: cs = h.matrix_clip_sigmas

随后调用gptq_quantize_weight(train_gpt.py)完成逐行量化。其网格构建的关键一行是:

row_std = W_orig.std(dim=1) s = (clip_sigmas * row_std / clip_range).clamp_min(1e-10).to(torch.float16)

即:每个权重行的量化步长s = clip_sigmas × row_std / clip_range。clip_range = 2^(bits-1) - 1,在 int6 下为 31。因此clip_sigmas直接决定了均匀量化网格的覆盖范围——σ 裁剪越宽(数值越大),步长越大、网格越粗,但能保留权重分布尾部的离群列。

为什么 12.0 优于 10.0

README 给出的机制解释是:在MLP 4× 宽度、int6的设定下,逐行 σ 裁剪是对权重分布尾部的偏差/方差权衡:

  • 10σ(激进裁剪):网格更细、低幅度权重量化误差更小,但会把训练后 MLP 权重中携带不成比例有效信号的离群列裁掉;
  • 12σ(宽松裁剪):网格略粗,但保留了尾部离群列——这些列在 4× 宽度 MLP 里恰恰承载了大部分有效信号。

README 特别指出,10σ 是在早期更窄 MLP、更浅模型的栈上标定的,在 PR #1530 → PR #1626 → PR #1736 系列把模型迁移到11 层 / MLP 4× / Loop4-5几何结构后从未重新调过——这正是本次重调的动机。

实验结果:7-seed 与 5-seed 双重验证

核心成绩表(phased TTT)

SeedStepsPre-TTT BPBPost-TTT BPBTTT gainTTT timeArtifact (bytes)
31448721.075911.06357-0.01234400.7s15,979,114
202548691.076491.06413-0.01236394.7s15,977,203
77748661.077011.06467-0.01234394.6s15,971,178
148691.077501.06510-0.01240391.2s15,979,182
133748641.077521.06517-0.01235390.2s15,971,129
Mean48681.076881.06453-0.01236394.3s15,975,561
Std0.000700.000684.2s4,101

补充诊断表

SeedPost-EMA BPB (pre-quant)Quantized BPB (no TTT)Post-TTT BPBval_loss (nats)Train timeEval time
3141.066371.075911.063572.32748596.09s400.7s
20251.067011.076491.064132.32871596.14s394.7s
7771.067621.077011.064672.32989596.07s394.6s
11.068071.077501.065102.33083596.06s391.2s
13371.068021.077521.065172.33098596.06s390.2s

解读:诊断表把误差来源拆成了三段——Post-EMA(未量化)、Quantized(量化后、无 TTT)、Post-TTT(量化 + TTT 后)。可以看到 pre-TTT 的量化后 BPB 1.07591–1.07752,而 TTT 阶段贡献了约 -0.0124 BPB 的提升,最终全部 5 个种子同时满足 600s 训练预算、600s 评估预算与 16,000,000 字节十进制 artifact 上限,且 5-seed std 0.00068 BPB 远低于 0.005-nat 的显著性门槛。

7-seed 完整披露

README 还披露了额外的 9999、7 两个种子(同train_gpt.py、MLP_CLIP_SIGMAS=12.0):

Seedval_bpbval_loss
3141.063572.32748
20251.064132.32871
7771.064672.32989
11.065102.33083
13371.065172.33098
99991.065342.33136
71.065412.33150

7-seed 均值为 1.06477(std 0.00069),5 个最低种子的均值为 1.06453。两种口径下都显著优于基线 PR #1736(3-seed 均值 1.06549),差距 0.00096 BPB ≈ 0.00249 nats/token,约为 sp8192 赛道 0.005-nat 记录门槛(≈0.00194 BPB)的 1.2 倍。

相对基线的完整变更清单

ComponentPR #1736 baseThis submission
TokenizerSP8192 + CaseOpssame
BPB accountingper-token byte sidecarsame
Attention out-gatelearned scalar per head, init_std=0.005same
Attention quant-gateenabledsame
Depth recurrenceLoop4-5same
TTT3-phase SGD score-first on 2000-doc prefixsame
MATRIX_CLIP_SIGMAS12.8512.85
ATTN_CLIP_SIGMAS13.013.0
EMBED_BITS77
MLP_CLIP_SIGMAS10.012.0

净效果:5-seed 均值-0.00096 BPB / -0.00210 val_loss(nats/token),对比 PR #1736 的 1.06549 / 2.33168。

架构基线(与 PR #1736 完全一致)

ItemValue
num_layers11
model_dim512
num_heads / num_kv_heads8 / 4
mlp_mult4.0
rope_base / rope_dims10000 / 16
logit_softcap30.0
loop_start / loop_end3 / 5 (NUM_LOOPS=2)
parallel_start_layer8
eval_seq_len / eval_stride2048 / 64
matrix_bits / embed_bits6 / 7
compressorbrotli

关键组件源码走读

Gated Attention(Qwen,NeurIPS 2025 Best Paper,arXiv:2505.06708):在CausalSelfAttention.forward(train_gpt.py)中,对 SDPA 输出、out_proj之前施加逐头 sigmoid 门:

if self.gated_attn: x_c = x.contiguous() g = torch.sigmoid(F.linear(x_c, self.attn_gate_w.to(x.dtype))) y = y * g[..., None]

门权重attn_gate_w形状为(num_heads, dim) = (8, 512),以gated_attn_init_std=0.005近零初始化(源码默认 0.01,本提交通过环境变量收紧),初始 g≈0.5 会减半注意力输出,由逐块的attn_scale(初始 1.0)在训练中补偿。参数名含attn_gate子串,因此被CONTROL_TENSOR_NAME_PATTERNS(train_gpt.py)路由到标量 AdamW 优化组。

Quant Gate(int8-per-row):门张量只有 4096 个参数,按numel<=65536原本会走 fp16 passthrough;本提交通过GATED_ATTN_QUANT_GATE=1将其导向专门的_quantize_gate_int8_row(train_gpt.py)对称 int8 逐行量化:

row_max = W.abs().amax(dim=1).clamp_min(1e-10) s = (row_max / 127.0).to(torch.float16) q = torch.clamp(torch.round(W / sf), -127, 127).to(torch.int8)

每头一个 fp16 scale(共 8 个),存储减半、BPB 影响可忽略,且无需 Hessian(门权重不在collect_hessians()中)。分派逻辑在 train_gpt.py。

Phased TTT 评估路径:eval_val_ttt_phased(train_gpt.py)首先用_find_docs(train_gpt.py)按BOS_ID=1切分文档,然后取前PHASED_TTT_PREFIX_DOCS=2000个文档、按PHASED_TTT_NUM_PHASES=3划分阶段边界。每个 chunk 先以当前 LoRA 前向打分(forward_ttt_train),在torch.no_grad()下累加 loss/byte/token 计数,然后才对 chunk 内 token 做 LoRA SGD 更新(needs_train分支,train_gpt.py)。每到达一个阶段边界,就暂停并调用train_val_ttt_global_sgd_distributed(train_gpt.py)对已打分文档做全局 SGD 微调(cosine 退火学习率、跨 rank all-reduce 梯度平均),随后重置可复用 LoRA(reusable_lora.reset())防止跨文档泄漏。

BPB 字节预算:启用CASEOPS_ENABLED=1时,评估用fineweb_val_bytes_*.bin逐 token 字节 sidecar 作为权威原始字节预算(train_gpt.py),最终由_loss_bpb_from_sums(train_gpt.py)按val_bpb = val_loss / ln(2) × (token_count / byte_sum)计算。

规则合规性检查

该提交逐条通过了竞赛规则验证:

  • Artifact ≤ 16,000,000 字节(十进制):5 个种子全部 ≤ 15,979,182 字节(约 21 KB 余量);
  • train_time ≤ 600s:全部 596.06–596.14s(stopping_early: wallclock_cap触发,见 train_gpt.py);
  • total_eval_time ≤ 600s:全部 390.2–400.7s;
  • Issue #1017 因果依赖:phased TTT 在每个 chunk 打分之后才更新逐文档 LoRA,任何位置 t 的预测都不依赖 y_t 或 >t 的位置;
  • Issue #1017 完整归一化分布:每个位置都在完整 8192-token softmax 上计算 CE,无 x_t 相关的 Σ 截断;
  • Issue #1017 score-before-update:TTT 路径快照更新前的逐 chunk logits 并在 adapter SGD 之前打分,reusable_lora.reset()防止跨文档泄漏;
  • Issue #1017 单次从左到右扫描:评估以滑动 stride 64 做单遍左到右推理,无 rescore/selection;
  • Section V 字节级 BPB:基于变换前原始 UTF-8 字节打分,无硬编码 bytes/token;
  • 训练不接触验证数据:训练仅用fineweb_train_*.bin;TTT prefix(前 2000 个 val 文档)与基线 PR #1736 使用同一切片并遵循 score-first 协议;
  • CaseOps 双射性:decode_lossless_caps_v2(encode_lossless_caps_v2(x)) == x对所有测试串成立,可在 lossless_caps.py 中验证;
  • 评估期间无外部网络:tokenizer + 变换 + CaseOps SentencePiece 模型随文件夹自带;
  • 可复现性:相对 PR #1736 的唯一代码改动即那行默认值;除 MLP_CLIP_SIGMAS 变为隐式默认外,Run Command 的环境变量覆盖与基线完全一致。

环境依赖与一次性数据准备

安装要求

# Python >= 3.12 required (minified f-strings use PEP 701 nested same-type quotes). pip install torch --index-url https://download.pytorch.org/whl/cu128 pip install flash-attn-interface sentencepiece triton numpy

注意 Python ≥ 3.12 的硬性要求来自 PEP 701 嵌套同类型引号在压缩 f-string 中的使用。

数据构建(只需运行一次)

提交自带训练好的 CaseOps SentencePiece 模型(tokenizers/fineweb_8192_bpe_lossless_caps_caseops_v1_reserved.model)与双射变换模块(lossless_caps.py)。训练/验证 shard 与字节 sidecar 从规范 FineWeb-10B 文档流重建:

# 1. 确保 docs_selected.jsonl 存在(仓库标准设置步骤)。 python3 ../../data/download_hf_docs_and_tokenize.py # 或指向已有文件 # 2. 构建 CaseOps 变换后的 shard + val 字节 sidecar。 python3 prepare_caseops_data.py \ --docs ./fineweb10B_raw/docs_selected.jsonl \ --out ./data/datasets/fineweb10B_sp8192_caseops/datasets \ --sp ./tokenizers/fineweb_8192_bpe_lossless_caps_caseops_v1_reserved.model

输出布局(CASEOPS_ENABLED=1时train_gpt.py期望的目录结构):

data/datasets/fineweb10B_sp8192_caseops/datasets/ tokenizers/fineweb_8192_bpe_lossless_caps_caseops_v1_reserved.model datasets/fineweb10B_sp8192_lossless_caps_caseops_v1_reserved/ fineweb_train_000000.bin ... fineweb_val_000000.bin fineweb_val_bytes_000000.bin

复现健全性检查(步骤 2 之后)

每个 shard 的每个文档开头必须包含BOS_ID=1——train_gpt.py的 phased TTT 评估路径_find_docs依赖它。快速检查第一个 val shard:

python3 -c " import numpy as np d = np.fromfile('data/datasets/fineweb10B_sp8192_caseops/datasets/datasets/fineweb10B_sp8192_lossless_caps_caseops_v1_reserved/fineweb_val_000000.bin', dtype=np.uint16) # First 256 uint16 slots are the shard header; tokens start after. tokens = d[512:] bos_count = int((tokens == 1).sum()) print(f'BOS markers in val shard: {bos_count} (must be > 0)') assert bos_count > 0, 'prepare_caseops_data.py is broken — re-run with BOS prepend' "

如果bos_count == 0,说明 prep 脚本过期——需要从本文件夹拉取最新 prepare_caseops_data.py(SP tokenizer 为特殊 token + CaseOps 算子保留 ID 0–7,prep 脚本必须显式给每个文档前插BOS_ID=1;评估路径_find_docs对缺失 BOS 标记没有回退)。

5-seed 复现运行命令

for SEED in 314 2025 777 1 1337; do NCCL_NET=Socket \ DATA_DIR=./data \ CASEOPS_ENABLED=1 \ PHASED_TTT_PREFIX_DOCS=2000 PHASED_TTT_NUM_PHASES=3 \ MATRIX_CLIP_SIGMAS=12.85 ATTN_CLIP_SIGMAS=13.0 \ EMBED_BITS=7 EMBED_CLIP_SIGMAS=15.0 \ MATRIX_LR=0.026 \ GPTQ_RESERVE_SECONDS=4 GPTQ_CALIBRATION_BATCHES=16 \ GATED_ATTN_ENABLED=1 GATED_ATTN_INIT_STD=0.005 GATED_ATTN_QUANT_GATE=1 \ SEED=$SEED \ torchrun --standalone --nproc_per_node=8 train_gpt.py \ > train_seed${SEED}.log 2>&1 done

注意:MLP_CLIP_SIGMAS不在环境中设置——它取train_gpt.py里的新默认值 12.0。GPTQ_RESERVE_SECONDS=4意味着训练主循环会预留 4 秒给 GPTQ 校准(见 train_gpt.py),GATED_ATTN_INIT_STD=0.005覆盖源码默认 0.01。日志会打印全部超参与mlp_clip_sigmas: 12.0(可在train_seed*.log第 57 行确认)。

技术谱系与演进脉络

该提交是 modded-nanogpt 系实验栈的连续迭代产物:

  • PR #549— 原始 modded-nanogpt 栈(Keller Jordan);
  • PR #1019(merged)— 字节级 BPB SentencePiece 记账(piece.encode);
  • PR #1394(merged)— SP8192 + 多阶段 score-first TTT 基线;
  • PR #1530— Loop4-5 深度循环 + parallel residual 起始层 8(samacqua);
  • PR #1626(已提交)— GPTQ 修剪 + 多阶段 SGD + 自适应裁剪;
  • PR #1736(已提交)— CaseOps + gated attention + quant-gate + phased TTT,本提交的基线;
  • 本次提交— MLP GPTQ 离群值裁剪的一行重调(10.0 → 12.0)。

包含文件清单

  • train_gpt.py— 训练脚本(131,887 字节,相对 PR #1736 仅一行默认值差异);
  • submission.json— 元数据(5-seed 结果 + 7-seed 披露);
  • README.md— 本说明文档;
  • train_seed314.log/train_seed2025.log/train_seed777.log/train_seed1.log/train_seed1337.log— 5-seed 运行日志;
  • tokenizers/fineweb_8192_bpe_lossless_caps_caseops_v1_reserved.model— CaseOps SentencePiece 模型(366.5 KB);
  • lossless_caps.py— 双射 CaseOps 变换(prepare_caseops_data.py使用);
  • prepare_caseops_data.py— 一次性数据准备:通过 CaseOps 对 FineWeb 分词并输出逐 token 字节 sidecar。

实践要点总结:在 int6 均匀量化网格中,clip_sigmas不是越大越好也不是越小越好——它是量化精度与离群值保留之间的连续权衡,且最优值会随模型几何(层数、MLP 宽度、深度循环结构)漂移。当架构栈发生重大变化后,重新标定每个权重组(embed / MLP / attn / matrix)的裁剪宽度,可能是比堆叠新模块更划算的"免费"收益。

【免费下载链接】parameter-golf

Train the smallest LM you can that fits in 16MB. Best model wins!

项目地址:https://gitcode.com/gh_mirrors/pa/parameter-golf
点击查看免费下载
上一篇:如何利用KLayout实现高效版图自动化验证:面向芯片设计新手的完整指南
下一篇:Agency Agents 接入 ZCode:从 Markdown Agent 文件生成到 `~/.zcode/agents` 安装全指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 22:23:39

2026年薪酬设计服务商排名:哪些机构最值得企业信赖?

随着企业数字化转型的深入与人才竞争的白热化&#xff0c;薪酬设计已从单一的“发工资”工具&#xff0c;演变为关乎企业战略落地的核心管理杠杆。2026年&#xff0c;企业对薪酬设计服务的需求呈现出数据精准性、行业垂直度、解决方案定制化三大核心趋势。本文将基于技术实力、…

作者头像 李华
网站建设 2026/10/18 10:10:48

风光水火储多能系统调峰优化与Matlab实现

1. 项目背景与核心挑战风光水火储多能系统互补协调优化调度是当前能源电力领域的前沿研究方向。随着可再生能源占比的不断提高&#xff0c;电力系统面临着两个突出矛盾&#xff1a;一方面是风电、光伏的随机性和波动性导致的调峰压力&#xff0c;另一方面是传统火电机组调节灵活…

作者头像 李华
网站建设 2026/10/21 16:33:51

厂商内核与驱动定制实战:从源码结构到性能功耗调优

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/19 3:13:40

两个视频流网络,一个动作识别难题

2014年秋天&#xff0c;如果你去问计算机视觉领域的研究者一个问题&#xff1a;机器能看懂视频里发生了什么动作吗&#xff1f;大多数人会摇头。不是因为没人做&#xff0c;而是因为做的人都撞了南墙。当时最强的视频动作识别方法,不是什么深度神经网络,而是一套叫做密集轨迹的…

作者头像 李华
网站建设 2026/10/19 10:05:58

SkillScaffold_论文解读报告

SkillScaffold&#xff1a;智能体怎样学会判断“这条经验现在有没有用”&#xff1f; arXiv 最新人工智能算法论文解读&#xff5c;检索日期&#xff1a;2026 年 10 月 14 日 本文依据论文 v1 正文与附录撰写。实验数字为作者报告&#xff0c;未进行独立复现&#xff1b;文中的…

作者头像 李华
网站建设 2026/10/21 5:30:13

LLM-WIKI 测试 demo1

请在 D:\workspace\llm-wiki 初始化/补齐一个基于 Karpathy LLM Wiki 思路的个人知识库系统。 当前目录可能已有文件&#xff0c;请只创建缺失项&#xff1b;已有文件先读取、对比并汇报差异&#xff0c;未经我确认&#xff0c;不要覆盖、移动、删除或重命名。 重要约束&#x…

作者头像 李华