同一个 6710 亿参数的模型:稠密版每 token 要 1.34 TFLOPs,MoE 版只要 0.07 TFLOPs, 差 18.1 倍。但权重显存一模一样,都是 336 GB。 一句话概括:算的时候省,装的时候一点都不省。
1.2 节把大模型的内部结构拆完了:注意力、位置编码、神经网络。 这一节落到一个具体模型上——DeepSeek 凭什么在同样的参数规模下把价格打下来。
一、它不是「更聪明的模型」,是「更省的模型」
2024 年底到 2025 年初,DeepSeek 上桌靠三件事:V3 的架构、R1 的推理链、 以及把权重和技术报告一起放出来。 三件事里最硬的是第一件——它没有把模型做大,而是把「算一次要花多少」做小了。 参数规模上它和同期头部模型同一档,都是几千亿级;但 API 的价格低一个数量级。 这个价差不是补贴打出来的,是结构差出来的。 所以「爆火」这件事,用技术的说法是: 在效果不掉队的前提下,把每个 token 的计算量压到了一个别人做不到的水平。
二、MoE:把「用哪个参数」变成一道选择题
稠密模型的做法是:每生成一个字,所有权重都参与一次乘法。 6710 亿参数,就是一个字乘 6710 亿次——算力跟参数量绑死。 MoE(混合专家)换了思路:把前馈层切成很多个小专家,再加一个路由器。 每来一个 token,路由器先判断「这次该找哪几个专家」,只让被选中的那几个干活。 DeepSeek-V3 的配置是 1 个共享专家加 256 个路由专家,每个 token 激活 8 个路由专家, 加起来约 370 亿参数参与计算。 于是就有了 Demo 里那两行: 显存 336 GB 对 336 GB 一模一样,计算量 1.34 对 0.07 TFLOPs。 差别全在第五列。
三、省的是计算,不省的是显存
这一条最容易被说反,必须说清楚:权重全都得待在显存里。 因为路由器是运行时才决定的——不知道下一个字会挑哪 8 个专家,所以 256 个专家的权重一个都不能卸载。 所以「6710 亿参数」这句话要拆成两个数讲: 总共 6710 亿,每次只用 370 亿。前者决定它要多大的机器,后者决定它跑起来多便宜。 家用显卡跑不动满血版,不是算力不够,是装不下——int4 量化也要三百多 GB 显存。 这也是为什么下一章本地部署讲的都是几 B 到几十 B 的小模型。
四、爆火还有三个非技术原因
一是开源权重:能下载、能自己部署,企业才敢拿去评估、才敢放进内网。 闭源模型再便宜,数据过不去就是零。 二是技术报告写得够细:数据量、并行策略、FP8 混合精度训练、通信优化,别人能照着复现思路。 这在小圈子里等于免费做了半年广告。 三是定价:API 直接压到「试一试不心疼」的档位。用量是试出来的,不是说服出来的。 但有一件事得纠正:官方技术报告里写的「约 278.8 万美元训练费用」,指的是最后那次正式训练租卡的钱。 前期试错、数据准备、人力全都不在里面。拿这个数当「大模型门槛很低」的证据,是误读。
五、动手 Demo:同一个 6710 亿参数:显存都是 336 GB,计算量差 18.1 倍
按 DeepSeek-V3 的公开配置建个模型:总参数 6710 亿、每 token 激活 370 亿。 和同样 6710 亿的稠密模型对比两件事——int4 量化下权重占多少显存、每生成一个 token 要做多少浮点运算。 再把账算到「一天一百万次请求」这个量级上。
total = 671e9 # 总参数
act = 37e9 # 每 token 激活参数
for nm, npar, nact in ((u'稠密模型 671B', total, total),
(u'MoE 模型 671B', total, act)):
gb4 = npar * 4 / 8 / 1e9 # int4:一个参数半个字节
fl = 2.0 * nact # 前向一次,一乘一加算两次浮点
print(nm, gb4, fl)
# 算到一天的请求量上:单卡有效算力按 50 TFLOPS 估
fl = req * tok * 2.0 * nact
hours = fl / 5e13 / 3600.0
实跑输出:
--------------------------------------------------------------------
DeepSeek 为什么爆火:MoE 省的是算力,一点都不省显存
--------------------------------------------------------------------
模型 总参数 每 token 激活 权重显存(int4) 每 token 计算量
-------------------------------------------------------------------------
稠密模型 671B 6710 亿 6710 亿 336 GB 1.34 TFLOPs
MoE 模型 671B 6710 亿 370 亿 336 GB 0.07 TFLOPs
看第 4 列和第 5 列:**显存一模一样,计算量差 18.1 倍。**
这就是 MoE(混合专家)的全部秘密:模型里有几百个小专家,但每算一个字只挑其中几个出来干活。**参数摊在显存里不省,算的时候省。**
所以「6710 亿参数」这个说法容易误导:它不是一个 6710 亿参数的稠密模型,而是「总共 6710 亿、每次只用 370 亿」。
再算一笔实际的账:一天 100 万次请求、每次 500 个 token,要多少算力。
模型 总浮点运算 单卡卡时 电费(元) 算力租用(元)
--------------------------------------------------------------
稠密 671B 6.71e+20 3728 671 7456
MoE 671B 3.70e+19 206 37 411
一天的量:稠密要烧 3728 小时单卡时间,MoE 只要 206 小时。
注意最后两列的量级——**电费几百块,租卡几千块。** 「推理很便宜」这个说法里,钱几乎全在硬件上,不在电上。
18 倍的差距摆在这里,但**这 18 倍不是白拿的**,代价有三个:
① 显存没省 6710 亿参数的权重全得放进去,int4 也要几百 GB
② 显存带宽吃紧 每个 token 都要调用不同的专家,权重来回搬
③ 训练更难 专家会「偏科」——几个专家被过度使用,其余吃闲饭
所以家用显卡跑不动满血的 6710 亿,不是因为算力不够,是因为**装不下**。这也是为什么本地部署那一章讲的都是几 B 到几十 B 的小模型。
第一张表只有两行,但这两行是整节的骨头。
第四列一模一样,第五列差 18.1 倍。MoE 的全部秘密就在这个「一样」和这个「差」之间的错位上。
第五列是怎么来的:前向一次,每个参数要做一次乘加,算两次浮点运算,所以是 2 × 激活参数。
稠密版 2 × 6710 亿 = 1.34 万亿次,MoE 版 2 × 370 亿 = 740 亿次。
第二张表把它折算成钱:一天一百万次请求、每次 500 个 token,稠密要烧 3728 小时单卡时间,
MoE 只要 206 小时。差的就是那 18 倍。
注意最后两列的量级:电费几百块,租卡几千块。「推理很便宜」这句话里,钱几乎全在硬件上,
不在电上。所以「省电」从来不是重点,「省卡」才是。
还有一个数要提一下:单卡 50 TFLOPS 是我给的估值,真实卡在 fp16 下能到几百 TFLOPS,
但实际吞吐会被显存带宽卡住。这张表要看的不是绝对卡时,是两行之间的比例。
30 秒实验
- 把激活参数从 370 亿改成 200 亿,看第五列变成多少,同时问自己:第四列变不变? 答案是不变——省算力不等于省显存,这两件事在 MoE 里是分开的。
- 把总参数从 6710 亿加到 1.5 万亿,激活参数保持 370 亿不动。看哪一列炸了、哪一列没动。 这就是「参数量」和「计算量」解耦之后的样子。
- 把单卡算力从 50 TFLOPS 改成 20,卡时变成 2.5 倍。 再想想:如果 MoE 的显存带宽成了瓶颈,这个线性换算还成不成立?
常见误区
- 「MoE 模型的参数比稠密模型少」。总参数一样多,只是每次只用一部分。 说「6710 亿」的时候指的是总量,说「370 亿」的时候指的是激活量,两个数都对,场景不同。
- 「MoE 省显存,所以能在小卡上跑」。 恰恰相反,MoE 的显存一分不省,而且因为专家分散在不同卡上,通信开销更大。 它省的是算力和电,不是显存。
- 「训练成本 278 万美元,说明做模型很便宜」。那个数只算最后一次训练的租卡钱。 之前的架构探索、数据清洗、失败重跑,一样都不少。
自测三问(点开对答案)
1. MoE 省的是哪一部分,不省的是哪一部分? —— 省的是每 token 的计算量(只激活一部分专家),不省的是权重占的显存(所有专家都得常驻, 因为路由是运行时才定的)。 2. 为什么每个 token 只用 370 亿参数,显存里却要放 6710 亿? —— 因为路由器要看到全部专家才能决定挑哪几个。 这一秒用 8 号专家,下一秒可能用 200 号,卸载任何一个都可能导致算不出来。 3. Demo 里那个「18.1 倍」是怎么算出来的? —— 两个模型的前向浮点运算量之比:2 × 6710 亿 ÷ (2 × 370 亿) = 18.1。 常数 2 会约掉,所以本质上就是总参数除以激活参数。算力省下来,落到用户身上就是价格。下一节把「你用哪种方式调它、每月花多少钱」这笔账算清楚。
- ☐ (本节完,下一节 1.3.2 DeepSeek的16种使用途径)