Puro-2B:$5090 真的能从零训出一个能打的 2B 模型吗?

训练一个能打的 2B 模型,到底要花多少钱?

把 Llama-3.2-3B 从零训练一遍要花多少钱?按 Puro-2B 论文的核算口径,答案是超过 150 万美元。Hugging Face 的 SmolLM3-3B 复现一遍,约 71.9 万美元(这是 Puro 论文按归一化租金折算的估算)。同一张账单上,Puro-2B 的报价是:最好的模型 6,900 美元,22,514 个活跃训练 GPU·小时,1.4 万亿 token,17.6 个自然日;一个中途档次的 uniform 版本只要 4,400 美元,15 项基准平均分已经超过 Qwen2-1.5B Puro-2B。差距不是一倍两倍,是两百多倍。

对这类数字只有两种读法:要么这块便宜货省掉了必须花的东西,要么它找到了别人没绕开的路。把 Puro-2B 摆在下面这张图里看,问题就变得具体了。横轴是复现成本(美元,对数刻度),纵轴是 15 项基准的平均分,图里同时标着 Qwen2-1.5B、Qwen2.5-1.5B、Llama-3.2-3B 等一票参考点。Puro 的两个成本节点落在最左侧,它想回答的正是这个问号:图上这个位置,怎么做到?

复现成本与性能散点图

图注:论文 Figure 1:横轴是复现成本(美元,对数刻度),纵轴是 15 项基准平均分。Puro-2B 的节点落在图最左端,与 Qwen 系列、Llama-3.2-3B 等参考点同图对照。Puro-2B

先解开标题的文字游戏,这一步不解决,后面全读歪。"Poor Lab's Qwen2-1.5B" 里的 Qwen2-1.5B 不是被训练的基座,而是被对标的靶子。Puro 是从零预训练的约 2B dense 模型,架构选了 Qwen3-1.7B 兼容配置,和 Qwen2-1.5B 比的是同一组基准的平均分。Qwen2-1.5B 是开放权重模型,28 层、12 个查询头加 2 个 KV 头、输入输出共享 embedding、32K 上下文,而它被拿来对标的 Qwen2.5 一代花了 18 万亿 token 预训练 Qwen2.5。Puro 用约 1.4 万亿 token 去追平这个量级,任务就变成了:少花 13 倍的 token,够不够?

顺带把标题里的数字对一遍:$5090 是双关,既是预算量级,也是那张显卡的型号。论文最严格的归一化口径下,最佳模型核算到 $6.9K,$4.4K 是最低一个越过对标线的价格。这些数字还有一个必须记牢的边界。$6.9K 不是现金支出,而是"租金等价"(rental-equivalent)口径下的边际加速器成本:把显卡按五年摊销加电费折算成每小时租金,再乘以实测的活跃训练 GPU·小时。它刻意不含数据清洗、消融实验、失败 run、后训练和人力。换句话说,这是"显卡账单",不是"实验室总账单"。模型、数据、代码则以 Apache 2.0 全量公开,这是后话。当前的问题是:这个故事成立,首先得有一台扛得起从零预训练的消费级显卡。一张 $1,999 的 RTX 5090,凭什么?

一张 $1,999 的消费级显卡和一套 2B 架构,凭什么能扛起从零预训练?

RTX 5090 是 2025 年 1 月首发的消费级旗舰,1,999 美元,GB202 核心,32 GB GDDR7 显存,575 W 功耗,21,760 个 CUDA 核心、680 个第五代 Tensor Core。它本质上是一张游戏卡,但有一件事让它从游戏卡变成了训练卡:第五代 Tensor Core 装上了第二代 FP8 Transformer Engine,和商用数据中心级 Blackwell 走的是同一条低精度计算路径 [RTX 5090](https://www.nvidia.com/en-us/geforce/graphics-cards/50-series/rtx-5090/ "citation: GeForce RTX 5090 官方规格页 || NVIDIA 官方规格:"citation: ,999、32 GB GDDR7、575 W TGP,第五代 Tensor Core 原生支持 FP8 与第二代 Transformer Engine")。FP8 是一种 8 位浮点格式。大模型训练里矩阵乘法吃掉绝大部分算力,如果这部分能用 8 位而不是 16 位去算,速度可以翻倍、显存占用腰斩;难点在于降了精度还能不能稳定收敛。这张卡恰好提供了便宜的 FP8 算力,单卡 FP8 稠密峰值算力就有 838 TFLOP·s,32 GB 显存则让 2B 模型连同优化器状态和激活一起住进单卡,不必做激进的显存卸载,训练配方因此能保持简单。全篇的成本故事就建立在这个前提上:消费级旗舰卡以每卡约 $0.31/小时(归一化估算)的价格提供可用的低精度训练。

模型架构同样不玄。Puro 采用 Qwen3-1.7B-compatible 配置,hidden size 2048、28 层、16+8 的 GQA heads。GQA 是分组查询注意力,让 16 个查询头共享 8 个 KV 头,是近几代小模型普遍采用的压缩方案。FFN 中间层 6144、词表 151,936、上下文 4,096;唯一明显的独立选择是 untied embedding,把输入 embedding 和输出语言头拆开,造成总参数约 2B Puro-2B。拆开两个 embedding 的代价是好懂的:词表 151,936 乘以 hidden 2048 再翻倍,一处就占掉约六亿参数,这也是总参数稳稳落在 2B 档次的原因。把它和 Qwen2.5-1.5B 摆在一起就看得出:这不是复刻,只是借了个壳:

配置Puro-2BQwen2.5-1.5B
层数2828
Q / KV 头数16 + 812 + 2
embeddinguntied(输入输出分离)tied(共享)
上下文4,09632,768
参数规模约 2B1.5B

层数与 Qwen 巧合相同,其余处处不同。下面这张流程图为整篇铺好了路线图:上半行是行业通行做法,长预训练、短 mid-train(中期训练)、最后做学习率退火拿到终版;下半行是 Puro 的路线,公开数据、RTX 5090 集群、两个预训练阶段,Phase 2 还分 uniform 与 curriculum 两条支线。

常见做法与 Puro 流程对照图

图注:论文 Figure 4:上半行是常见流程(长预训练 → 短 mid-train → 学习率退火),下半行是 Puro 路线(公开数据 → RTX 5090 集群 → Phase 1 → Phase 2 的 uniform 与 curriculum 双支线),blockwise FP8 与 Muon with Hyperball 优化器贯穿两阶段。Puro-2B

有卡、有壳,只是载体。钱到底是怎么一步步省出来的?答案分两条线:一是让单位算力买到更多有效训练,这是低精度训练的事;二是让同样的 token 预算买到更多能力,这是数据与收尾的事。先看第一条线。

算得更快、收敛得更稳:FP8 与 MuonH 各自省下了哪笔钱?

最常见的误读,是把 blockwise FP8 理解成"把精度降一档"。真正难的不是降精度,是降了精度还不炸。早期的 per-tensor scaling 做法里,整个张量共用一个缩放系数,张量中个别极大的数值会把其他数值的动态范围挤没,训练就飘,于是部分 transformer 层不得不留在 BF16 才能收敛,量化收益打了折扣。NVIDIA 的 MXFP8 把缩放粒度从"整个张量一个系数"压到"每 32 个元素一个系数",让局部极端值只影响自己那一小块 MXFP8。这就像一栋楼从"整楼一个温度计"改成"每个房间一个温度计":哪间屋热就只调哪间,而不是为了迁就某个角落把整栋楼都制冷。

MXFP 块级缩放示意图

图注:MXFP 格式概念图:一个 block 内多个元素共享同一个缩放系数 X(图上方位级表示),每个元素按符号、指数、尾数三段编码,右侧是解码公式 V_i = Q_i × X。缩放粒度越细,低精度训练越稳。MXFP8

块级缩放可信到什么程度?MXFP8 论文用 8B 模型跑了 15 万亿 token 的对照(验证在 Hopper 上以模拟方式完成),MXFP8 与 BF16 全程验证集困惑度差距不到 0.5%,而在 Blackwell Tensor Core 上 MXFP8 相对 BF16 是两倍吞吐。Puro 的选型是:E4M3 格式、激活按一维 128 个一组、权重按二维 128×128 一块,FP8 路径吃下全部计算的 72%;LayerNorm、attention 核心、embedding、通信与优化器状态仍然留在 BF16/FP32。具体到形状,激活按一维 128 个一组切,权重按二维 128×128 一块切,两组选择各自共享块内的缩放系数。这么做的意图很明确:让低精度只在矩阵乘法这一最肥的地方生效,把稳定性风险隔离在量化区间之外。Phase 1 跑出 238 TFLOP·s/GPU、Phase 2 跑出 192,MFU 约 73%,就是这套做法的现场效果。

算得快之外,还要训得稳,这是优化器的事。默认选项 AdamW 按每个参数自适应地缩放步长,Muon 换了一条完全不同的路:它只负责 hidden layers 的二维权重矩阵,先把梯度用 SGD 动量累成一个缓冲,再用 Newton-Schulz 五次迭代把更新矩阵"掰正"成近似正交阵,最后沿这个方向更新 Muon。看着抽象,拆开讲:把更新矩阵做奇异值分解,正交化就是把中间那串奇异值压到接近 1,留下的几乎只有方向。对带 normalization 的 transformer 层来说,方向比步长更可信,所以这种"只走方向"的更新收敛更快且开销极小(典型小于 1% 的 FLOP)。Newton-Schulz 之所以被选中,是因为这五次迭代能在 bf16 下稳定跑完,把奇异值压到接近 1,而直接做一次完整奇异值分解在 GPU 上慢得多,系数 (3.4445, −4.7750, 2.0315) 是社区调好贴在算法里的。它把 NanoGPT 速赛的成绩推进了 1.35 倍,社区把同一套优化器外推到 1.5B 量级,达到 GPT-2 (1.5B) 水平只需约 $233,对比原生路线的 $576 [Modded-NanoGPT](https://github.com/KellerJordan/modded-nanogpt "citation: modded-nanogpt README || README FAQ 给出 1.5B 外推证据:HellaSwag 上达到 GPT-2 (1.5B) 水平约需 "33,对比 Karpathy 原生路线的 $576,便宜约 2.5 倍")。

Puro 的贡献是把 MuonH 推到 2B、1.4 万亿 token 这个量级——Hyperball 这道加固来自此前 Wen 等人的论文,Puro 在其上做生产级验证。为什么需要这道加固?训练拉到这个量级后,普通动量更新的权重范数会随训练漂移,同一个学习率在不同阶段对应的真实步长完全不同,收敛行为变得难以预期。权重矩阵被始终钉在以原点为球心、半径等于初始范数 R 的超球面上,更新规则写成一个干净的式子:$W_{t+1} = R \cdot \text{Normalize}(W_t - \eta_t \cdot R \cdot \hat{u}_t)$。翻译一下:每一步更新只能改变矩阵的"朝向",不能改变它离原点的距离。这带来一个直接好处,权重范数不再随训练漂移,有效学习率就是式子里的 $\eta_t$ 本身,超参的含义变得干净;生产配置再加一个 m=10 的放大系数。所以 MuonH 不是"Muon 加一个普通权重约束",而是把超球约束、更新步长与有效学习率的定义耦合成了同一件事,这是第二个要纠掉的误读。embedding、lm_head 和所有一维参数仍然交给 AdamW,因为正交化只对二维权重矩阵有意义。

到这里五件套里的三件已经就位:消费级硬件、低精度训练、正交化优化器。要不要顺手把账加一加?不能。图里每个组件的节省都是相对它自己的基线测的,每根条形有自己的基线,数字不能直接相乘,FP8 的两倍吞吐不能乘上 5090 的性价比系数。这张图留到第 5 章对账时再细看。省钱还有最后一条线:同样的 token,数据怎么排、结尾怎么收,能差出多少?

同样的 token 预算,数据怎么排、结尾怎么收,能差出多少?

先看两阶段的骨架。Phase 1 用 24 张卡训 438.84B token,学习率走幂律从 5.00e-3 退到 1.04e-3;Phase 2 扩到 96 张卡、959.99B token,学习率线性从 1.04e-3 退到 1.00e-5,合计约 1.4 万亿 token Puro-2B。分两段的理由是,Phase 2 才是真正拼数据的阶段:同样的 960B token,打乱顺序喂(uniform)和排好序喂(curriculum),跑出的是不同档次的模型。

配置Phase 1Phase 2
token 数438.84B959.99B
GPU 数2496
并行 TP/PP/DP1 / 2 / 121 / 4 / 24
学习率幂律 5.00e-3 → 1.04e-3线性 1.04e-3 → 1.00e-5
TFLOP·s / GPU238192

这张表折成时间就是:Phase 1 实测 10.43 天;在同一 960B token 预算下,Phase 2 的 curriculum 与 uniform 两种排序都实测约 7.16 天。这里有一笔账不能混着加。22,514 活跃 GPU·小时和与之对应的 $6.9K canonical 口径,只合计 Phase 1 与 curriculum Phase 2 两段,10.43 加 7.16 得 17.59 天,正好对上第 1 章那个 17.6 个自然日。3.58 天是 $4.4K 档 uniform 对照运行的时长(该运行 Phase 2 只跑 480B token,作为 scaling-law 的半预算点),不计入这笔总账。

数据侧的省钱不是把预算砍小,而是用一个小得多的"侦察兵"替大模型探路。Puro 雇了一个共享的 Qwen3-0.6B 代理模型:对每个候选数据切片先续训 2,000 步,评出一个 15 项任务的能力向量,分数高的大数据源按 0/25/50/75 百分位切成多片,分数低的小数据源随机抽 4B token,最后拼出 Phase 2 的配方。用 0.6B 的便宜模型做筛选,大钱只花在筛完的刀刃上。为什么按百分位切片而不是按分数一刀切?一刀切会把来源磨得同质,丢掉的往往是低分段的多样性;百分位切片把"质量"和"多样性"两件事拆开处理。

选完再排。课程排序(curriculum)做的是一件事:在每个数据源内部按分数从低到高排列,用 376 个 bucket 对齐,同时跨组件保持目标混合比例不变。从易到难地喂数据,又不让任何一个源挤掉别人的份额。Phase 2 的混合以数学为主导,论文明确做了两处替换:移除 FineMath,引入 MegaMath-Web-Pro 的 13.5B token。这些小动作在 1.4 万亿的量级里毫不起眼,但它们决定了一个 2B 模型把有限的容量花在哪里。

最后是收尾,也是最容易被低估的一步:Curriculum Model Averaging(CMA)。谁的训练末尾都要退学习率,Puro 的收法不同。在 step-218,000 之后,它把基础学习率钉在常数 4.08e-5,最后约 29B token 以恒定学习率续训,每约 100 步(约 0.63B token)存一个 checkpoint,最后把 6 个 checkpoint 等权平均得到 canonical Puro-2B-Base。要纠正的误读就在这里:CMA 不是"最后取个平均",而是课程排序、常数学习率续训、等权平均三件套的耦合,缺一个都不是这个结果。对照实验很干净:在 step-215,000 恢复训练的对照组只拿到 56.80 分,218,000 恢复加 6-checkpoint 平均是 57.81,高出 1.01 分。后处理的痕迹在预训练之后仍可观察:论文用三种 SFT 设置做对照,专注数学的干净 GSM8K 配方、在它之上加去重 MetaMathQA 与 OpenMathInstruct 和过滤代码指令的扩展数学配方、以及用 Tulu-3 指令数据替换数学主导分布的泛化配方,三种设置里 curriculum 初始化的模型在 GSM8K 上依旧比 uniform 高 Puro-2B。

数据侧的故事讲完了。但这些课程、平均、代理筛选,到底值多少美元?该对账了。

$4.4K 就够、$6.9K 更稳——这笔钱到底花得值不值?

对账之前要先立一把尺子。行业里最著名的答案是 Chinchilla 的 compute-optimal:给定总算力,模型大小和训练数据量应该近似等比例地扩展。但 Puro 问的是另一个问题:给定我的钱,能训到什么程度?这两个问题不是同一把尺子,所以 Puro 不硬套 compute-optimal 曲线,而是拟合一条"配方专属"的成本缩放律。Chinchilla 自己列过三个局限:大规模参照只有两个点、高算力区的幂律假设不成立、只验证过 single-epoch,这些恰恰是低端预算可以合法偏离的空间 Chinchilla。

Puro 的账是这样算的。从同一个 Phase 1 checkpoint 出发,用 5 个不同 token 预算的 uniform 配方各跑一遍 Phase 2,得到 5 个实测成本点(2.16K 到 6.89K 美元),拟合成 $P = a + b \cdot \log_2(C - C_{P1})$,其中 $C_{P1} = $1.84K$ 是 Phase 1 的成本。加上这个位移项后,拟合残差 RMSE 从 0.452 降到 0.209,说明曲线立住了。两个关键结论:第一,$4.4K 那个 uniform 模型(Avg15 = 55.54)已经超过 Qwen2-1.5B,越线了;第二,curriculum 终点拿到的 57.17 分,uniform 配方要花约 $11.36K 才能买来,等于 1.65 倍;canonical Puro-2B-Base 的 57.81 分,反推 uniform 要 $16.55K,等于 2.40 倍。千万记住:这两个倍数是整条配方(排序、续训、平均)的联合收益,不是课程排序单独挣来的 Puro-2B。

下面这张图把两笔账放在一起。左半是五件套各自的相对节省条形图,右半就是刚才那条缩放曲线,实心点是实测成本,空心点是 uniform 等效反推。

成本节省拆解与成本缩放律

图注:论文 Figure 2:左图为硬件、FP8、MuonH 与各类 Phase 2 设计的相对成本节省条形图,每根条形都相对自己的基线计算,不可相乘;右图为 Puro Cost Scaling Law 拟合曲线,实心点为实测成本,空心点为 uniform 配方的等效成本反推(1.65× 与 2.40×)。Puro-2B

性能明细也摊在桌上。数学与代码 4 项(GSM8K、MATH、sanitized-MBPP、HumanEval)平均 43.50,超 Qwen2-1.5B 3.21 分,距 Qwen2.5-1.5B 4.02 分;推理与知识 11 项平均 63.02,超 2.48 分,距 2.51 分;整体 Avg15 57.81。逐项看更有味道:GSM8K 59.67 对 Qwen2-1.5B 的 46.9,MATH 30.30 对 21.6,MMLU 57.44 对 55.9;而 Qwen2.5-1.5B 靠着扩大到约 2.6 倍的数据量(从 Qwen2 的 7T 到 18T tokens)把这些数字又抬了一截 Puro-2B Qwen2.5:

基准Puro-2BQwen2-1.5BQwen2.5-1.5B
GSM8K59.6746.968.5
MATH30.3021.635.0
MBPP52.9246.960.2
HumanEval31.1034.837.2
MMLU57.4455.960.9
数学/代码 4 项平均43.5040.29(差 3.21)47.52(差 4.02)
推理/知识 11 项平均63.0260.54(差 2.48)65.53(差 2.51)

(Qwen 两项差值按 Puro 论文口径换算,单项成绩来自 Qwen2.5 Technical Report。)

注意两组任务的构成:数学与代码 4 项是生成式任务,模型要自己产出答案;推理与知识 11 项多数是选择题式评估。小模型最常在生成式任务上露馅,Puro 在两类上都没有明显偏科,说明这 1.4 万亿 token 买到的是比较均衡的能力。

看这组数字要抓住一个点:Puro 的主张从来不是"我的模型最强",而是"这个性能档位现在只卖这个价"。它的 Pareto 位置不在性能最高点,而在成本调整后的前沿最左端。4,400 美元买到越过 Qwen2-1.5B 的模型,6,900 美元买到与之拉开身位的均衡款,这就是它想让你记住的价签。账算清了,最后一个问题落到人身上:谁真的能用上这笔账?

穷人实验室的开放处方:哪些可以照抄,哪些要自己买单?

开放生态分三层:闭源只有 API,开放权重给你模型但把配方收进抽屉,完全开放(fully-open / open-recipe)把权重、数据、代码、日志全部摊开。现实里的对应是:GPT-4、Claude 在闭源层,Qwen、Llama 在开放权重层,OLMo 2、SmolLM 和 Puro 属于最后一层。分层不是学术分类,它决定了一篇论文的训练方法能不能被独立验证。Puro 属于最彻底的那一层:10 个 Hugging Face checkpoint、数据集 manifest、训练代码 Puro-Megatron、数据处理代码 Kaiyuan-Spark,全部 Apache 2.0 放出。这条路线不是它发明的。OLMo 2 证明过一件事:完全开放不必拿性能来换,它的模型就站在 Pareto 前沿上,和同等算力的半开放模型掰手腕不落下风 OLMo 2。Puro 的新贡献,是把完全开放配方的成本压到一万美元以下,并且跑在消费级硬件上。

OLMo 2 的 Pareto 前沿

图注:OLMo 2 论文 Figure 1:横轴为预训练 FLOPs,纵轴为 11 项基准平均分。完全开放的 OLMo 2 系列数据点落在 Pareto 前沿区域,说明开放配方路线不必以性能为代价。OLMo 2

Puro 不是这条穷人路上的孤例,而是取值最激进的那一个。SmolLM 家族同样是全开放的小模型,SmolLM2-1.7B 用 11 万亿 token、约 25 万美元训练,SmolLM3-3B 用 11.2 万亿 token、约 71.9 万美元(Puro 估算);Puro 是 1.4 万亿 token、6,900 美元。算下来,SmolLM 路线用了大约 8 倍的 token、36 到 104 倍的预算。三种定位没有对错:SmolLM 买的是规模与长上下文,Puro 买的是单位预算的能力产出率 SmolLM2 SmolLM3。

但照抄之前,代价清单要摆上桌。论文自己列了四条硬边界:benchmark 污染不能完全排除,课程后期混入的数据可能泄题;处理后的数据 provenance 仍需手工核查许可证;中文能力未充分评估(论文自述中文非主要目标,中文基准分数未纳入对外发布评测表);方法只在 dense 2B、过度训练区间(TPP 700)验证过,没有外推到 MoE 或更大规模。四条怎么读?第一条约等于"成绩单可能有水分",好在论文自己承认得足够坦率;第二条决定复用它的数据前要自己过一遍许可证;第三条对中文团队是一票否决项;第四条提醒你,这套配方是"小而肥"模型专属,不是越大越好用。成本账目还有三处要自己补:$0.31/小时是把 8 卡节点按五年摊销加电费折算的归一化估算,不是市场租金;Phase 2 从 24 卡扩到 96 卡,依赖论文明说的外部资源投入;真要复现,网络、存储、电费和人力都得自己另算 Puro-2B。

所以这份处方的适用对象是清楚的:如果你手上是有限的预算、想亲手研究 2B 量级从零预训练的方法本身,它几乎可以直接照抄,连代码和数据集都给你备好了;如果你要的是更大规模或中文场景,那几笔被"归一化"掉的成本,会原封不动回到你的账单上。Puro 证明的不是"训模型不要钱了",而是便宜这件事可以明码标价,并且公开到每个人都能复现。便宜从不是免费,但它给了穷实验室一份可以核对的价签,这比任何一句"低成本可行"的许诺都值钱。

想深入,可以读原文:Puro-2B: Poor Lab's Qwen2-1.5B Trained on RTX 5090 within $5090(arXiv:2608.27370)。

参考文献

Puro-2B:$5090 真的能从零训出一个能打的 2B 模型吗?