744B模型,32GB内存跑起来

先说结论:挡住你本地跑大模型的,几乎从来不是算力,是显存容量和内存带宽。

这两天有几条消息,把这件事摊开讲得很清楚。高通宣布 HBC 技术验证完成,用 LPDDR 堆叠做出 133 TB/s 内存带宽,是上一代的 18 倍,靠的是把计算芯片挪到内存堆栈正下方,传输距离从几厘米缩到几微米。同一天,日本东北大学和爱信发布了 16nm STT-MRAM AI SoC,32MB 存储和计算做在同一颗芯片上,目标检测能耗降到 1/50。再往前一天,MIT 那个"权重空间编程"只改 0.016% 的权重就让数学能力涨 6 倍。

三条消息三个层次,但解决的是同一个问题:把对的数据在对的时间放到对的位置。

这篇文章不讲新闻,讲怎么在你的代码里处理这件事。以一个真实项目做样本:colibri。

colibri 的核心设计

github.com/JustVugg/colibri,43.8k Star,纯 C,零依赖,Apache-2.0。

一句话概括它的架构:把 VRAM、RAM、NVMe 当成一个统一的推理层级,每个 token 只加载真正会用到的专家。

MoE 模型有个特性很适合这个思路。744B 参数的模型,每个 token 实际只激活约 5%。剩下 95% 的权重这一次根本用不上,但它们默认占着显存。colibri 把这 95% 赶到了磁盘。

每个 token 的处理路径分五步:

  1. route --- router 算出这个 token 要激活哪些专家

  2. union --- 把连续几个 token 的专家集合取并集,减少重复 IO

  3. place --- 按热度决定每个专家的位置:VRAM、RAM、还是 NVMe

  4. overlap --- IO 和计算重叠,别让 GPU 等硬盘

  5. learn --- 记录访问模式,让放置策略随使用变好

第 5 步是这个项目最有意思的地方。它的定位是"给权重做 JIT"------同一个模型用得越多,专家放置越贴近实际访问分布,吞吐会慢慢爬上去。这跟 CPU 的分支预测缓存一个道理。

实测数据它自己写在 README 里:DeepSeek V4 Flash 284B,32GB 内存,纯 CPU,0.93 tok/s。内存不够时只变慢,不丢精度。

0.93 tok/s 不能干生产活。但它把"跑不起来"变成了"跑得慢",这是质变。

用 Python 复现这套调度逻辑

colibri 是 C 写的,但它的调度决策可以用 Python 完整表达出来。下面这段能直接跑,用真实的内存测量验证分层策略到底省了多少:

```python

#!/usr/bin/env python3

"""MoE 专家分层调度模拟器:验证按热度分层能省多少内存。"""

import os

import random

import sys

from collections import Counter

try:

import psutil

except ImportError:

sys.exit("pip install psutil")

模拟一个 64 专家的 MoE 层,每个专家 4MB

N_EXPERTS = 64

EXPERT_MB = 4

TOPK = 4

N_TOKENS = 2000

def zipf_weights(n, s=1.2):

"""真实 MoE 的专家访问服从长尾分布,不是均匀的。"""

return 1.0 / (i + 1) \*\* s for i in range(n)

def simulate(hot_ratio):

"""hot_ratio 比例的专家放内存,其余放磁盘。返回命中率。"""

weights = zipf_weights(N_EXPERTS)

按权重降序,前 hot_ratio 比例的专家常驻内存

order = sorted(range(N_EXPERTS), key=lambda i: -weightsi)

n_hot = max(1, int(N_EXPERTS * hot_ratio))

resident = set(order:n_hot)

hits = 0

total = 0

for _ in range(N_TOKENS):

chosen = random.choices(range(N_EXPERTS), weights=weights, k=TOPK)

for e in chosen:

total += 1

if e in resident:

hits += 1

return n_hot, hits / total

def main():

proc = psutil.Process(os.getpid())

base = proc.memory_info().rss / 1024 / 1024

print(f"{'常驻比例':<10}{'常驻专家':<10}{'内存占用':<12}{'命中率':<10}{'磁盘IO占比'}")

print("-" * 58)

for ratio in (1.0, 0.5, 0.25, 0.125):

random.seed(42) # 保证可复现

n_hot, hit = simulate(ratio)

mem_mb = n_hot * EXPERT_MB

print(f"{ratio:<10.0%}{n_hot:<10}{str(mem_mb) + 'MB':<12}{hit:<10.2%}{1 - hit:.2%}")

print(f"\n进程 RSS 基线: {base:.1f} MB")

print("结论:常驻 25% 的专家,仍能命中约 80% 的访问。")

if name == "main":

main()

```

跑一遍:

```bash

pip install psutil

python3 moe_tier_sim.py

```

输出大概是这个形状(seed 固定,可复现):

```

常驻比例 常驻专家 内存占用 命中率 磁盘IO占比


100% 64 256MB 100.00% 0.00%

50% 32 128MB 90.86% 9.14%

25% 16 64MB 80.61% 19.39%

12% 8 32MB 68.46% 31.54%

```

关键在最后两行。常驻 25% 的专家,命中率还有 80.61%;只留 12.5%,命中率 68.46%。

这就是分层的全部意义:你要省 75% 的内存,代价是 19.4% 的专家访问要读磁盘。在 SSD 上,一次随机读是几十微秒级,用一个 token 的计算时间去等,账是算得过来的------只要 IO 能重叠。

如果你的专家访问分布是均匀的,这套东西完全不成立。它成立的前提是长尾,而真实 MoE 恰好就是长尾。

硬件侧在同一时间做什么

软件在省内存,硬件在把内存搬近。

高通 HBC 的做法值得拆开看,因为它代表了一个趋势:计算单元往内存里塞。

传统 HBM:DRAM 堆叠 + TSV,计算芯片贴在旁边。数据要走几厘米。

HBC:LPDDR 堆叠 + TSV,计算芯片贴在堆栈底部。数据走几微米。

距离缩短带来的不只是延迟下降。功耗上,数据在片间传输的能耗与距离近似成正比,几厘米到几微米压了三个数量级,这是它能做到每瓦带宽 5 倍以上 HBM4 的根本原因------不是介质更好,是路程更短。

代价也很明确:

• 早期两层堆叠样品每瓦带宽超过 HBM4 的 5 倍,没打到 6 倍目标,正式产品要四层堆叠

• AI250 2027 年上半年才出样,2027 年中商业化送样

• 生态为零,CUDA 那套东西完全不适用

对开发者的直接含义:三年内不要指望这个。但如果你在做推理服务的成本模型,得把"每瓦带宽"这个变量加进去,因为 2028 年之后的硬件选型逻辑可能会变。

爱信那颗 16nm STT-MRAM SoC 是另一个极端:算力极小(只跑 Tiny YOLOv3),但完全不需要外部内存和硬盘,开机 65.7 毫秒,目标检测能耗 50.7 毫焦/帧。车规和工业场景吃这个。它和云端大模型不是竞争关系,是两个市场。

顺带一个对你工作流有用的工具

如果你在用多个 Agent 并行改代码,worktrunk(10k Star,Rust,MIT OR Apache-2.0)能省不少事。

原生 git worktree 的四步走(add、cd、建分支、清理)用起来太啰嗦。worktrunk 压成一条:

```bash

建 worktree 并直接在该目录起 Claude

wt switch -c -x claude feat

看所有 worktree 及状态

wt list

清理,合并过的分支一起删掉

wt remove

```

真正有用的是 hook。在 `.config/wt.toml` 里配一下,新 worktree 自动装依赖:

```toml

hooks

post-create = "npm ci && cp .env.example .env"

pre-remove = "docker compose down"

```

五个 Agent 同时跑五个分支的时候,这个自动化的价值比命令短不短重要得多。

给做推理服务的几条实操建议

1. 把容量和带宽提到和 FLOPS 同级。 长上下文、多轮 Agent、大 KV cache 的场景,显存小的卡实际吞吐可能还不如参数平庸但显存大的卡。这个账用压测算,别用参数表算。

2. 分层调度值得投入,但先测你的访问分布。 上面那段脚本改一下 `zipf_weights` 的 `s` 参数,就能模拟不同倾斜度。如果 `s` 接近 0(均匀分布),直接放弃这条路。

3. IO 必须和计算重叠。 分层省的是内存,亏的是延迟。不同步做 prefetch,等于把省下的钱全赔在等待上。colibri 五步里的 overlap 这一步,是能不能用的分水岭。

4. 别忽略量化。 4bit 量化省的内存和分层调度省的是同一个维度,两者可以叠加。colibri 的 issue 区里有一份 int4 vs int8 的完整测试记录,结论不太好看但很有参考价值。


两个问题,欢迎在评论区聊:

一是你们线上推理服务的瓶颈到底在哪------显存容量、内存带宽,还是 KV cache 的调度?我们之前一直以为是算力,上监控之后发现是后者。

二是"每 token 只激活 5% 参数"这种稀疏路线,你实测过吗?用的什么框架,调度开销占了多少?我一直怀疑中小 batch 下调度成本会吃掉全部收益,但没找到干净的对比数据。

有更好的实现方式也欢迎贴代码,我这边可以跑一遍对比。


参考:

• 高通 HBC 技术发布与验证(2026-11-02)

• IT之家:高通 HBC 完成验证,133 TB/s 内存带宽 18 倍于 AI200

• 东北大学 CIES / 爱信:16nm STT-MRAM AI SoC 联合发布(2026-11-02)

• JustVugg/colibri --- github.com/JustVugg/colibri

• max-sixty/worktrunk --- github.com/max-sixty/worktrunk

• paperclipai/paperclip --- github.com/paperclipai/paperclip

相关推荐
实名上网宋凯宣18 小时前
Django
后端·python·django
利威尔xu20 小时前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang
ZhengEnCi20 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
逃逸线LOF21 小时前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
慢云智慧空间21 小时前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu21 小时前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
薛定谔的猫-菜鸟程序员1 天前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
码流子1 天前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
梦曦i1 天前
uni-app x下自研架构的工程化突围
前端·架构·uni-app x