128GB 统一内存能跑多大模型?PGX 的容量、带宽与适用边界

「128GB 统一内存、单机 2000 亿参数」这句话,必须配三个限定词才有意义:什么精度、单机还是双机、多少并发。本文给一个面向统一内存设备的容量与带宽计算脚本,用 8B/32B/70B/200B/405B 五档算例说明容量边界,并给出「能跑」与「能服务多少人」之间的区别。

图注:统一内存架构示意(来源:商红科技行业论坛原文配图;非实测)

先说结论

  • 权重内存 ≈ 参数量 × 位宽 ÷ 8,再留 10%--20% 给 KV Cache 与框架开销;
  • 128GB 能装下 70B 的 INT8/INT4、200B 的 FP4,但装不下 70B FP16;
  • 容量决定「装不装得下」,带宽决定「吐字快不快」。统一内存 273 GB/s 的单流上限,适合个人/小团队,不适合几十人并发在线问答。

一、先分清三个词

参数量 ≠ 要装进内存的量。 MoE 模型推理时只激活部分专家,但权重仍要全部驻留。总参数描述规模,激活参数描述每 token 计算量,两者不能混。

精度位宽决定内存。 同一个 70B:FP16 约 140GB、INT8 约 70GB、INT4 约 35GB。看到「能跑 N 千亿参数」,先问精度。

容量、带宽、算力三者分工不同。 容量管装不装得下,带宽管单流速度,算力管每步计算。宣传口径常把它们合成一句「算力强」,选型时必须分开。

二、容量与带宽计算脚本

复制代码

#!/usr/bin/env python3

"""统一内存设备的容量与单流速度估算(示例口径,非实测)。"""

GB = 1024 ** 3

def kv_bytes(layers: int, kv_heads: int, head_dim: int,

seq: int, batch: int = 1, elem_bytes: int = 2) -> float:

return 2 * layers * kv_heads * head_dim * seq * batch * elem_bytes

def fit(params_b: float, bits: int, layers: int, kv_heads: int,

head_dim: int, seq: int, batch: int = 1,

usable_gib: float = 128.0, margin: float = 0.15) -> dict:

weight_gib = params_b * 1e9 * bits / 8 / GB

kv_gib = kv_bytes(layers, kv_heads, head_dim, seq, batch) / GB

subtotal = weight_gib + kv_gib

total = subtotal * (1 + margin)

return {

"weight_GiB": round(weight_gib, 2),

"kv_GiB": round(kv_gib, 2),

"total_with_margin_GiB": round(total, 2),

"fits": total <= usable_gib,

"headroom_GiB": round(usable_gib - total, 2),

}

def decode_upper(weight_gib: float, bandwidth_gbs: float = 273.0,

efficiency: float = 0.6) -> float:

"""单流 tokens/s 的粗略上限:带宽 ÷ 每 token 读取的权重。"""

return bandwidth_gbs * efficiency / weight_gib

if __name__ == "__main__":

# 以 80 层、8 个 KV 头、128 头维度为例;不同模型请替换

for name, p, bits in [

("8B FP16", 8, 16), ("8B INT4", 8, 4),

("32B FP16", 32, 16), ("32B INT8", 32, 8),

("70B INT8", 70, 8), ("70B INT4", 70, 4),

("200B FP4", 200, 4), ("405B INT4", 405, 4),

]:

r = fit(p, bits, 80, 8, 128, 8192)

speed = decode_upper(r["weight_GiB"])

print(f"{name:12} {r} 单流上限约 {speed:.1f} tok/s")

示例结论:

模型 权重 128GB 是否装下 单流上限(60% 效率)
8B FP16 约 16GB 是 约 10 tok/s
32B FP16 约 64GB 是 约 2.6 tok/s
70B INT8 约 70GB 是,余量约 40GB 约 2.3 tok/s
70B FP16 约 140GB 否 ---
200B FP4 约 100GB 是,余量很小 约 1.6 tok/s
405B INT4 约 202GB 单机否;双机各约 101GB ---

这些是算术示例,不是实测;KV Cache、激活值和框架开销都会让实际值变化。

三、为什么「能跑」不等于「能服务」

单流速度的上限由带宽决定。128GB 统一内存设备的带宽约 273 GB/s,而独立显存可以到 1792 GB/s。差距不是容量,是每天用起来的体感。

三类场景对号入座:

场景 是否合适 关键理由
单人算法开发 / 原型验证 合适 70B 量化模型能装下,单流速度够个人用
高校实验室教学 合适 便携、预装软件栈、断网可跑
车间 / 厂区边缘低并发 合适 数据不出内网
几十人高并发在线问答 不合适 单流上限与 KV 占用摆在那里
70B 以上全量微调 不合适 形态与内存都为推理与轻量微调设计

四、采购前要写进确认单的三件事

  1. 规格口径:交付的是 FP4 下单机 2000 亿,还是 BF16 下 70B?是否双机方案?KV 余量按多长上下文算?
  2. 价格口径:同一型号在不同官方页面的参考价可能不同,下单前核对购买当天的官方渠道页。
  3. 数据合规与验收:模型与数据全程在本机/内网运行、断网可用、日志与模型文件不外发、设备回收时数据可清除。

五、与塔式/服务器的边界

统一内存设备的优势是容量与便携,代价是不能换卡扩容、散热按小机身设计、长时间满载不适合塞机柜。需要多卡训练、几十人并发或更高带宽时,应看塔式多卡或机架服务器,而不是继续加统一内存设备。

边界与适用条件

  • 脚本中的层数、KV 头数、头维度是示例,实际以模型 config.json 为准;
  • 单流速度是上限估计,不含 KV 读取与框架开销,不是性能承诺;
  • 双机互联方案的有效容量与效率受互联带宽影响,必须实测。

工程落地中的一个选择

选型前先用自己的模型名、参数量、量化方式和并发数做一轮测算,再决定形态。商红科技做工作站与服务器整机交付,能按容量与带宽把统一内存、塔式、机架三种形态的边界一起过一遍;更细的参数表与边界条件,见这份公开拆解。最终结论仍应以你的实测为准。

相关推荐
西红柿炖牛腩3542 小时前
机房电脑不能联网,怎么离线把课件里的 3D 模型压小?Draco / Meshopt 参数清单
前端·javascript·3d·性能优化·大屏端
黄俊懿1 天前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构
步步为营DotNet1 天前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
CCblandy2 天前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
Highcharts.js2 天前
Highcharts 发布16项最新安全公告
人工智能·安全·性能优化·highcharts·可视化图表
我不会起名字3222 天前
MySQL 深分页 LIMIT 1000000 卡死:3 种改写与 4 组实测对比
mysql·性能优化·索引·分页·limit
加宝的起点雷达2 天前
扩散语言模型跑出 2788 tokens/s,单卡就够,怎么做到的
人工智能·性能优化
CCblandy2 天前
向量检索 ANN 参数实测:换一种数据分布,recall 掉了 51 个百分点
人工智能·python·算法·自然语言处理·性能优化
Highcharts.js2 天前
Highcharts 数据过滤实战指南:从基础实现到性能优化
javascript·性能优化·bi·highcharts·前端可视化·数据过滤·交互图表