Hacker News 中文摘要

RSS订阅

998美元训出38亿参数LLM,CORE 0.384 -- Training a 3.8B LLM to 0.384 CORE for $998

在纳米GPT(nanoGPT)玩具与需要研究实验室之间,有一片被低估的领域:个人花几千美元就能训练出有意义的模型。我想亲眼看到语言与理解从随机权重中涌现,从零学习只能从头学的部分。项目在晚上编写,于 5090 上调试,在租用 B200 上完成,深受安德烈·卡帕西(Andrej Karpathy)的纳米对话(nanochat)启发。结果是 38亿(3.8B)参数模型在 CORE 获 0.384 分,以 998 美元在 43 小时内训练 650亿(65B) tokens。

正文

在“nanoGPT玩具”和“你需要研究实验室”之间,有一个大片未被充分描述的区域:一个有几干美元的人可以训练出有意义的模型。

我想亲眼看到语言和理解从随机权重中涌现,并从零学习只能从头学的部分。这个项目在晚上写,在5090上调试,在租的B200上完成,深受Karpathy的nanochat启发。

结果是一个38亿参数的模型,在CORE上得分0.384,用65B词元训练43小时,花费998美元。

以下是奏效的、不奏效的、以及我仍不知道的。

| 模型 | 参数 | 词元 | 硬件 | 时间 | 成本 | CORE | | --- | --- | --- | --- | --- | --- | --- | | GPT-2 (OpenAI) | 1.5B | — | — | — | — | 0.2565 | | nanochat d26 | ~561M | 11.2B | 8× H100 | ~3h | — | ~0.258 | | nanochat d32 | ~1B | — | 8× H100 | ~33h | ~$1000 | 0.310 | | little-lm 3.8B (1024 ctx) | 3.848B | 57.3B | 8× B200 | 35.9h | $820 | 0.338 | | little-lm 3.8B (2048 ctx) | 3.848B | 65.3B | 8× B200 | 43h | $998 | 0.384 |

我的模型比nanochat d32大,墙钟时间相似。B200每单位工作比H100性价比高,花差不多的钱,nanochat的1000刀能让你走得更远。

设置

我构建了little-lm作为配置驱动框架来训练小解码器LLM。每次运行由YAML完全指定:模型、数据集、优化器、调度、回调。组件自注册到全局registry并按名解析,换优化器或数据集是一行配置改动。

好的基础设施几乎立刻回本。普通软件工程纪律(关注点分离、干净接口、可换组件)在AI工作里极重要。初期花点成本,后续修坏合约,但这投资在首个收敛问题就回本。好基础设施是几乎不需手动改代码的设施;读配置能确切懂发生什么且无隐藏机制,就是做的好。后续报告就是能用三行YAML diff表达实验而非开分支的结果。

最终模型是Llama风格:RMSNorm、RoPE、GQA(24查询头、8 KV头)、relu² MLP、QK-norm、logit softcap、每层可学习残差标量、ResFormer风格value embeddings。

| 组件 | 参数 | | --- | --- | | Token embeddings | 154.5M | | LM head (untied) | 154.5M | | 28 decoder layers | 2,818.7M | | Value embeddings (14 tables) | 721.2M | | Total | 3.848B |

注意value embeddings占参数19%,是14个vocab×kv_dim表,每隔一层一个。

结果

早期实验

好运行前有许多坏运行。

我训了858M Llama在FineWeb-Edu上16.4B词元,单A100跑5.8天。AdamW学习率2.5e-4,余弦衰减到0,5%预热,批256梯度累积,2048上下文。

结果:PIQA 60.45%。GPT-2 124M约63%。花六天算力造出比2019年小七倍模型还差的东西,生成重复且近乎无意义。

损失曲线说明:

  1. 余弦衰减到零。约70%步后曲线全平,最后30%算力因学习率太低几乎无产出,线性冷却能保持有用率更久。
  2. 峰值学习率太保守。2.5e-4对858M偏低,小模型可更激进。
  3. 全用AdamW。Muon对该规模矩阵参数每词元应明显更好,消融很快证明。
  4. 数据。FineWeb-Edu还行,但不是最好。

五大改变出自复盘,是将上述运行与大幅胜GPT-2模型拉开差距的关键。

梯形学习率调度:5%预热,保持平坦最后50%线性冷却到峰值5%。要点是模型直到结束都在学而非尾段滑行。3.8B运行评估损失在最后步仍在降,正是858M缺失的行为。

矩阵参数用Muon,其他AdamW。Muon每步慢(Newton-Schulz正交化不免费,浅累积基准约25%),但每优化步付一次:7梯度累积步稀释至~4%,总运行时间衡量收敛快得多。

ClimbMix替代FineWeb-Edu,收敛速度巨大跳跃,Karpathy也发现。

FP8+词表填充:通过torch.scaledmm动态张量缩放三个GEMM,词表50257填到50304(64倍数)让张量核满意,合计+33%吞吐主要来自fp8。

1024上下文替代2048:半上下文约双批大小固定显存,每词元吞吐几乎不变,仍由MLP主导,是好信号有效用硬件。下文讨论上下文影响。

整个运行如下:

| 步 | 词元 | 评估损失 | CORE | | --- | --- | --- | --- | | 2,500 | 5.7B | 2.3278 | 0.2389 | | 5,000 | 11.5B | 2.2072 | 0.2752 | | 7,500 | 17.2B | 2.1571 | 0.2934 | | 10,000 | 22.9B | 2.1269 | 0.3104 | | 12,500 | 28.7B | 2.1075 | 0.3147 | | 15,000 | 34.4B | 2.0710 | 0.3224 | | 17,500 | 40.1B | 2.0395 | 0.3294 | | 20,000 | 45.9B | 2.0160 | 0.3267 | | 22,500 | 51.6B | 1.9963 | 0.3345 | | 25,000 | 57.3B | 1.9868 | 0.3384 |

稳定态~480,000词元/秒,57.3B词元对应33小时,墙钟35.9h,差是CORE评估(每次约15分,共十次)耗总7%。

同配方2048上下文得0.3840,差距几乎全因某些任务极依赖上下文。

GPU上:92% SM活动,40% SM占用。高活动意味SM几乎不闲,无数据加载饥饿或网络等,因本地下分片而非流氏,免遭网络挂起;低占用是连续大GEMM特征,matmul核刻意用占用换寄存器块大小。计算密集喂得好,是好信号善用硬件且每美元延展更好模型。

每B200约1,047 TFLOP/s持续,或Blackwell稠密FP8峰值~25% MFU(对bf16峰值算50%,因非全线性层跑FP8这数更重)。

分布式策略用普通DDP。3.8B单节点梯度通信从非约束,分片优化器机械不必要。

提升吞吐量

租GPU不便宜,工作中常先想模型质量再成本,自己钱烧吞吐突重要。

单RTX 5090上真做工作:基线858M bf16编译26,144 tok/s,最终37,621 tok/s。

FP8(+25%):三GEMM(1前2后)FP8动态缩放,需SM90+但吞吐跳好。

词表填充(+33%累计):50257→50304费47未用嵌入行解锁快张量核路,近免费。

融合线性交叉熵(+44%累计):Liger的FusedLinearCrossEntropyLoss将lm_head matmul融进损失内部分块,全(B*T, vocab) logits不物化。同批大小正面对比慢6%:

| 配置 | 吞吐 | 显存 | | --- | --- | --- | | 基线CE, 批6 | 34,724 tok/s | 27,852 MiB | | 融合CE, 批6 | 32,952 tok/s | 19,630 MiB | | 融合CE, 批8 | 35,979 tok/s | 24,028 MiB | | 融合CE, 批10 | 37,621 tok/s | 28,872 MiB |

虽每步慢,但收回大量VRAM(5090上8GB)使微批增大补回失6%。Claude因低6%快拒,但整体是好法抓额外吞吐。

非门控MLP:去门投影(SwiGLU→relu²,两matmul代三)小模型183,035→214,173 tok/s且6GB少VRAM。注意消融:SwiGLU中间比2.75不转relu²,学明显差,非门控要用4×。

bf16主权重:优化器主权重bf16代fp32降VRAM 27%,提吞吐640K→1.4M tok/s于1.5B配置,2.2×大加速。质量损真实但小:CORE 0.22 vs 0.23于4000步。优化每美元能力时,谨慎dtype处理是最高杠杆且少讨论旋钮。

硬件:同代码150M FP8,5090为184,662 tok/s,B200为477,440 tok/s,仅硬件2.59×,未计额外VRAM推批大小。

不起作用的部分

文档边界掩码flex attention:打包文档进一序列让跨边界注意力,用每词元文档ID掩码仅注当前文档,优雅但删了。Karpathy也发现BOS对齐打包下跨文档泄漏不坏,best-fit packing十行代替换,注意力回退无条件F.scaleddotproductattention(..., iscausal=True),这亦条件于数据集和训练文档。

Liger RMSNorm和RoPE:RoPE微基准2.2×快但端到端吞吐无测变,该规模RoPE非关键瓶颈;RMSNorm比PyTorch 2.9内置F.rms_norm慢(0.41ms vs 0.25ms)。都回退不值复杂。

Nanochat风格初始化:嵌入N(0, 0.8)等,理论比GPT-2 N(0, 0.02)好,损失曲线起稍低~1500步重叠,无测质差。留为美学非证据。

流氏数据集:好上手错真实跑。即使网络健康本地分片多2-3%吞吐,偶网络跌损更甚,长几小时运行值训练初付下载一次。

价值嵌入消融

价值嵌入3.8B模型占721M。同配置关掉value_embeddings比原跑到12.5K步29B词元:

| | 参数 | 损失@12.5K | CORE@12.5K | 吞吐 | | --- | --- | --- | --- | --- | | Value embeddings开 | 3.848B | 2.1075 | 0.3147 | 479,445 tok/s | | Value embeddings关 | 3.128B | 2.1171 | 0.3047 | 477,908 tok/s |

0.46%好损失、3.2%好CORE,费19%多参数。吞吐同因VE查表,费内存优化器态几乎无FLOPs。

两发现:

  • VE买约1200训练步。计价:10000到12500基线损失降0.0194,2500步买大概;VE优0.0096约半,叫1200/25000。19%多参数值~5%多训练。
  • CORE动约七倍于损失(3.2% vs 0.46%),训练中间隙稳缩。用CORE决策须知:它是精度指标,边界翻动,且中心化随机基线放大相对差而分低。

VE对小模型有用几乎无吞吐成本,花点VRAM给模型对某些概念偏置利CORE。

讨论

误导性的微基准

易信1024词元上下文够高CORE,回看每任务日志,某些极上下文敏感任务错。

22个CORE任务中3个提示基本不适1024:

| 任务 | 提示裁 | 步2.5K | 步25K | | --- | --- | --- | --- | | squad | 10570 / 10570 (100%) | 0.1478 | 0.0000 | | boolq | 3265 / 3270 (99.8%) | 0.5798 | 0.5131 | | bigbenchlanguageid | 9965 / 10000 (99.7%) | 0.2454 | 0.2538 |

SQuAD惊人:不滞单调衰到恰零(0.1478→0.0617→0.0099→0.0007→0.0000),模型训越长此任务越差,非寻常。

两细节:SQuAD是DCLM包中10-shot,每提示十例加真,中位1998词元,无一个适1024;提示过长工具留最后maxseqlen词元。测试段在尾总活(例~169词元),截的是十演示,模型读段问题几乎没看教输出格式例。SQuAD精确匹配金答案,流利散文得零。

也解衰:早高熵偶短泛匹配,锐化后commit格式续写意外命中消失,变好语言意外猜对更差。

boolq同形温和版,峰10k步0.6294降到0.5131;语言识别不动。

简之0.338测时3/22任务近零因与模型质无关,仅喂上下文长度。

更大上下文的效果

欲最高CORE需更大上下文,但训吞吐后果。

双上下文半微批保VRAM,每优化步词元同。停~28k步省租尾几小时,LR warmdown未全完,下界。

CORE 0.3384→0.3840。步20k两运行同评估损失四位(2.0160 vs 2.0164)差0.034 CORE,ClimbMix上CORE与评估损失低相关惊人。

| 任务 | 1024 | 2048 | 裁 | | --- | --- | --- | --- | | squad | 0.0000 | 0.3114 | 100% → 47% | | boolq | 0.5131 | 0.7095 | 99.8% → 3.2% | | bigbenchlanguageid | 0.2538 | 0.2585 | 99.7% → 14% | | 其他19任务 | | | +0.008合 |

squad和boolq占83%增益,boolq最多因随机基线0.5而CORE中心化:原始+0.196变中心+0.517。剥两余二十共动+0.008约14%多词元自买。

语言识别99.7%→14%裁动+0.005,是当前模型CORE基准最难任务。

些任务变差:commonsenseqa降0.072、csalgorithms 0.031,22任务双向动预期。

2048值作为测量决定非质量,耗9%吞吐(480K→437K),外任务几乎无买。1024训好且廉得高CORE,2048解锁上下文绑定任务。

未来工作

局限

四未消融:峰值LR用nanochat的sqrt(768/d_model),不想花钱扫;余弦到梯形因858M复盘,或有更高效调度;QK-norm默认开未关;GQA比,省内存杠杆。多承nanochat非测,小预算可他人已付实验,但意味信Karpathy结果迁我模型数据规模。

开放问题

  • 价值嵌入 versus 再分配:上比对VE对无,要紧是VE对花721M别处。
  • 1024 versus 2048 匹配墙钟:重跑改上下文且更长,解测量非质量。
  • 为何commonsense_qa退0.072长上下文,无关长提示。
  • 分片优化器nanochat式:我平DDP单GPU Muon每rank全优化器态重算同Newton-Schulz;nanochat去DDP包装做ZeRO-2分片优化器内重叠reduce-scatter、算、all-gather。内存赢确定转化批大小即同美元词元;冗余正交化是否消看分片:Muon需全梯度矩阵,跨rank分矩阵无帮,给每rank整矩阵有。未探索但好提总吞吐费额外机械。
  • 额外数据探索:没时分析CORE基准或ClimbMix,同算预算可抓更高性。

收尾思考

GPT-2是2019前沿结果,富实验室大团队产1.5B模型CORE 0.2565。7年后我晚间$998租小时硬件宽幅胜。

前沿移一切带:需实验室工作现单工程师晚间可做。好奇7年后能建何等insane machine。

评论

讨论整体积极务实,几乎没有人质疑用小模型做这件事的价值;所谓分歧更多是话题焦点的分散——有人反思 LLM 写作的元现象,有人从工程落地角度补充经验,更多人关心成本门槛和工具化前景。

人类写作可能正在被 LLM 的输出风格反向同化

  • 有人注意到这篇关于 LLM 的文章本身就是用 LLM 写的,由此延伸出担忧:读多了 LLM 的输出之后,人类的写作会不会也开始变得像 LLM。(少数人) > 我已经读了太多 LLM 的输出,现在到处都能看到它的影子,想知道人类会不会开始写得越来越像 LLM。(@johnnylambada)

工程师已经从「写代码再也不一样了」的失落转向把 LLM 当作新的构建方式

  • 一位工程师描述自己曾为「写代码再也不会和从前一样」而难过数月,如今站到了另一边,认为 LLM 有价值,且作为工程师,这是一条解锁软件构建新方式的途径。(较多人) > LLM 本身很有意思,但作为工程师,这是一条解锁新构建方式的路。(@brainless)

希望小模型训练变成选架构、选参数量、选数据集的标准化流程

  • 有人期待出现开源项目,让人可以像选配置一样选择 Qwen 或 DeepSeek 的架构、参数量、数据集,然后在本地或租用的 GPU 上直接跑起来。(较多人)

更关心蒸馏成本和让模型在基准测试上及格的资金门槛

  • 有人好奇从 Qwen 最强的 30B 模型蒸馏要花多少钱;也有人追问,要让模型在 AIME 上拿到好成绩,最低需要多少钱。(较多人)

有价值的补充

  • 有评论建议把目标定在约 1B 参数,并尝试当下小模型的整套思路,包括 gated delta nets、逐层或 n-gram 嵌入、gated 残差等,但不确定 2K 上下文是否太短、能否从中受益。(@rao-v)
  • 一种值得关注的模式是把确定性代码与 LLM 混合:先用确定性逻辑识别已知格式、提取行列组合,再把表头交给 Haiku 生成到目标列的映射方案;随着训练与推理的差距缩小,可以按需生成样本、训练小模型,从而减少对大模型的依赖。