跳到主要内容
省钱的尽头是每秒 6 个 token

省钱的尽头是每秒 6 个 token

阿舟
阿舟

· 阅读约 4 分钟

dev.to 上有人把 Gemma-4 26B 塞进了一个 inf2.xlarge。每小时 0.76 美元。每秒吐 6 个 token。😅

这三个数字放一起,后面文章我已经知道该怎么看了。

先把背景补齐。原作者之前跑在 inf2.24xlarge 上,按需 6.49 美元/小时,那价不是个人项目扛得住的开销。于是他想试试最便宜的 inf2.xlarge——同样的活儿,成本压到八分之一左右。计划看上去很美,唯一的麻烦是:这个实例只有 2 个 NeuronCore、32GB HBM、16GB 主机内存。

整个故事的本质,就是在这三个数字里挤出一条血路。

先算内存账。模型是 128 专家的 MoE,约 4B 激活参数。bf16 精度下专家权重占了总权重的 93%,约 45.6GB。TP=2 复制后,每个核心要装 22.8GB——超了 HBM 预算快一半。第一刀必然是砍专家:int8 量化后降到每 rank 11.4GB,好像能装了。

结果还是爆。

我盯着那个数看了半天,11.4 对 16,怎么算都放得下。但实际分配时就是有 3-4GB 的缺口,过不去。

于是作者尝试了 FP4——这是我能理解的选择,int8 差 3-4GB,FP4 能再砍一半。但这条路走不通。Neuron SDK 的 NxD 推理量化只正式支持 INT8 和 FP8;FP4 的 F4E2M1FN_X4 路径压根不是可用的推理链路。想用 tracing 绕?blockwise_scale_dequantize 是纯 CPU 的 torch 参考实现,NeuronCore 上 trace 不了;换 blockwise_mm NKI 内核,又卡在预生产路径,导入直接失败。

两次尝试都死得安静。但这条死路说明了一件事:压缩方案能不能落地,最后是硬件支持的量化格式说了算,不是论文说了算。

真正的突破口是分片 tied lm_head。

这个点值得划重点:所有人都在盯着占 93% 的专家权重想办法,但忘了 lm_head 是 tied 的——TP=2 下它在每个 rank 各存一份。账是这样:

lm_head bf16: 1.48 GB / rank
lm_head int8: 0.37 GB / rank
released:     1.11 GB
dense MLP int8: +0.27 GB

省出的这 1.1GB,加上共享 dense MLP 量化省下的 0.27GB,恰好把那个 3-4GB 缺口补上了。每 rank 最终驻留约 12-13GB,落进预算。

“你以为的大头不是真的大头”——这个教训比 6 token/s 更普适。

内存账算完,下一个坑更反直觉:编译。

编译这模型要约 180GB 峰值主机内存。inf2.xlarge 只有 16GB,这活根本干不了。作者换到 inf2.8xlarge——注意,它和 xlarge 的算力配置一模一样,都是 2 core + 32GB HBM,区别只是主机内存从 16GB 跳到 128GB。加 100GB swap,40 分钟编译出 26.7GB 的 NEFF。

编译和部署是两个必须分开算的内存预算——这个思路值得抄。编译是重体力活,可以在更大的机器上完成;部署时不需要把模型留在主机内存里:meta-device 实例化结构、单独加载 1.48GB 的 embed_tokens.pt、torch.jit.load + initialize_with_saved_weights 把权重载入设备。实测部署阶段 NEFF 加载约 112 秒,主机 RSS 峰值约 11GB,贴着 16GB 的线。

第一次跑,输出是空白的。

排查下来是嵌入缩放的问题:Gemma4TextScaledWordEmbedding 内部 forward 会对嵌入乘以 hidden_size 的平方根——约 53——宿主编程路径没执行这个缩放。修好之后,模型终于正确回答出 “The capital of France is Paris.”

到这一步,工程上是真跑通了。他甚至做了冷启动验证:在全新 spot 实例上干净拉取部署产物,约 490 秒后服务就绪。

然后就是那个 6 token/s。

原因很直白:部署用了 DenseExperts 的算子——每个 token 都把全部 128 个专家算一遍,而不是 MoE 正常该有的稀疏 top-8 路由。约 16 倍不必要 FLOPs。内存是硬塞进去了,算力这边完全裸奔。

省下来的每小时 5.7 美元,变成了用户每次等待时的耐心。一个 500 token 的回答要 83 秒,一个小对话就是几分钟的沉默。

评论区有人认真争论量化 lm_head 会不会损伤模型知识。这个争论当然有意义,但在 6 token/s 面前显得有点奢侈——连回答都按分钟计时的时候,知识精度差一两个百分点大概是最后才轮到被注意的事。作者自己在评论区贴了 TPU v6e 上的基准数据,潜台词是想要既要还要,得换硬件。

内存放得下和模型跑得动,本来就是两张账单。我把这帖收藏了。下次再看到“部署成本砍到十分之一”的标题,先翻解码速度那一栏,再决定要不要兴奋。

阿舟
阿舟

写代码写到一半开始怀疑人生,靠 AI 工具续命,顺手把踩过的坑都记下来。

查看主页 →