Strata 项目推荐:在 12GB 显卡上跑 125B 的 MoE 模型,把 CPU、显卡和 SSD 拼成一台机器
Strata(Niko1221/Strata)是一个用 C++ 写的本地大模型推理引擎。它只做一件事,但做得很极端:让一个原本"需要几百 GB 显存服务器"的 1250 亿参数模型,在一张 12~24GB 的消费级显卡 + 普通内存的台式机上跑起来。README 的卖点一句话讲清楚:“Run a 125-billion-parameter AI model on your own gaming PC”。
跑的还是每个本地推理玩家都眼馋的那个模型——Qwen3.8-Flash-Next,一个 24576 个专家(expert)、48 层的稀疏 MoE。正常跑它需要把 35~50GB 的专家权重放进显存,而 Strata 的思路是:既然每个 token 只会用到其中 10 个专家,那就别让显卡一个人扛。 它把整台 PC 当成一台分级存储的机器——显存是柜台、内存是储藏间、SSD 是仓库,让 GPU 和 CPU 同时干活。
关键数据概览
| 项目 | 数据 |
|---|---|
| 仓库 | Niko1221/Strata |
| Stars / Forks | 10,964 / 961(2026-10-05 实时抓取) |
| 语言 | C++(对话采样/内核层)+ Python(安装器、MCP、工具) |
| 许可 | MIT(third_party/ggml 亦为 MIT;模型文件各自适用原许可) |
| 创建时间 | 2026-09-24(本文写作时刚满 10 天) |
| 最近推送 | 2026-10-04 12:32(仍在高频提交) |
| 最新版本 | v0.1.39(2026-10-04 发布,Windows CUDA12 / HIP / CPU 三个包) |
| 提交量 | 845 页 ×1 = 840+ 次提交,10 天内 |
| 贡献者 | 68 人(主作者 Niko1221 520 次,其余 21/20/11/10/9…) |
| 按需关注的数字 | 24,576 个专家、48 层、每 token 激活 10 个专家、28.8GB n-gram 表 |
| 端侧速度 | RTX 5070 12GB + Ryzen 5 7600 + 64GB:Q2_0 94 tok/s 输出、2650 tok/s 提示词读取 |
| 显存门槛 | NVIDIA / AMD,12GB 起,Windows 10/11 或 Linux |
有两个数字比 star 更能说明问题:10 天 840+ 次提交、68 位贡献者。这种迭代密度配合它仓库里那份 docs/paper/Strata-Paper.pdf(论文)、docs/DETAILS.md(1127 行、把每个数字的来源与边界都写清楚)来看,它不是一个"写个 demo 冲 star"的项目——v0.1.36 → v0.1.39 之间连着发的都是内核级优化(下文会看到)。
起源故事:MoE 把"显存不够"从死路变成了工程问题
要理解 Strata 为什么长这样,得先讲清楚它踩中的那个技术转折点。
过去两年本地推理的主线是"量化":7B 压到 4bit 就 3.5GB,塞进消费级显卡,皆大欢喜。但模型规模一旦上到百 B 级别,光靠量化就不够了——即便压到 2bit,125B 模型也要 30~50GB,早就超出 12GB / 24GB 显卡的范围。
而 MoE 架构把这道墙凿开了一个洞:一个 125B 的稀疏模型,看起来是 125B,实际上每个 token 只走一小撮专家。这意味着"全部权重必须在显存里"这个前提本身是多余的。 于是"跑不动"这件事,从一个容量问题变成了一道调度问题:怎么把"哪些专家此刻在显卡上、哪些让 CPU 算、哪些从 SSD 读"这套决策做对。
现有的本地推理栈(llama.cpp / ggml)并不是为这种"专家按需换入换出"的场景设计的——它可以 offload 到 CPU,但那是轮流:GPU 算完 CPU 算,中间有同步等待。Strata 的独立价值就长在这个缝里:它从一开始就假设"专家不可能全在显存",然后把整个引擎围绕这个假设重写。 它甚至复用了 third_party/ggml 的量化内核与工具链(在 Credits 里明确致谢 llama.cpp / ggml),但专家的调度层与旁路计算路径是自己的。
技术亮点:把一个"装不下"的问题拆成四层工程
亮点一:四级内存分层 + 自适应专家缓存
Strata 的 docs/HOW_IT_WORKS.md 用"厨房"来打比方,翻成技术语言是这样一个分工:
- GPU(显存):常驻每 token 都要用的部分——注意力与 DeltaNet 混合层、门控残差权重、路由器、共享专家(shared experts)、输出头、MTP 草稿层,以及 KV cache。剩下的显存全部拿来放专家缓存(expert cache)。
- RAM:全部 24576 个专家,钉住(pinned)。CPU 就地(in-place)计算那些没在显卡上的专家。
- SSD:一张 28.8GB 的 n-gram 表(
--ple-io direct,绕过 OS cache 直读),每个 token 只读几行。
真正的精髓在"自适应“三个字上:专家缓存不是静态的,它会随着你的对话内容自己学"哪些专家最近被用得多”,把热专家留在显存里、把冷专家请出去。文档里有一句很关键的话——“every extra GB holds ~700 more experts”(每多 1GB 显存大约多装 700 个专家),而每多一个专家在 GPU 上,就是 CPU 少算一个专家。所以在这套架构里,“多加显存"的收益是可以被线性量化的,这本身就是设计目标清晰的证据。
更细的一层是 0.1.26 引入的 low-RAM mode:如果内存小、显卡大,它只把"显卡装不下的那部分专家"留在内存,其余交给显存。同一件事,从两端都做了适配。
亮点二:CPU 与 GPU 并发计算,而不是轮流
如果只是"显存放热的、内存放冷的、轮流算”,那这只是一次粗糙的 offload。Strata 真正难的地方是:让 CPU 和 GPU 同时算专家,谁也不等谁。
这套设计在文档里的表述是 “The CPU computes the experts that are not on the GPU in place, at the same time as the GPU works on the cached ones”。工程上要同时解决几件事:
- 钉住内存(pinned memory):全部专家在 RAM 里是 pinned 的,CPU 可以直接原地计算,也避免被换页影响;
- 内核分工:CPU 侧走 AVX-512 / AVX2 内核,i-quant 部分走 ggml 的;GPU 侧走自己的 CUDA/HIP 内核;
- PCIe 份额可调:
--pcie-frac决定"错过的专家"里有多少是走 PCIe 让 GPU 顺便算掉的,而不是全丢给 CPU。文档明确说这是个与硬件相关的经验值——“快的 PCIe 链路配慢的 CPU 想调高,笔记本的窄链路调低”; - 顺手预热:CPU 在算某一层时,会有线程同时把下一层可能用到的专家流进 GPU,“while the CPU works on a layer, a thread applies…"。
伪代码大致是这个形状:
def decode_step(token, layers, vram_cache, ram_experts, ssd_ngram):
for layer in layers:
# 1. 路由:本 token 命中哪些专家
expert_ids = router(token, layer)
# 2. 专家分两拨:在显存的走 GPU,不在的让 CPU 原地算
on_gpu = [e for e in expert_ids if e in vram_cache]
on_cpu = [e for e in expert_ids if e not in vram_cache]
# 3. 并发发出,CPU 与 GPU 都不等对方
fut_gpu = gpu_compute(on_gpu, layer) # CUDA / HIP kernel
fut_cpu = threadpool.submit(cpu_compute, on_cpu, # AVX-512 / AVX2 in-place
ram_experts[on_cpu]) # 钉住的内存,不拷贝
# 4. 下一层预热:CPU 算这层时,GPU 已在收下一层的专家
prefetch_to_vram(next_experts(layer + 1), pcie_frac)
merge(fut_gpu, fut_cpu) # 两拨结果合并,继续前向
# 5. 缓存自适应:把这次用到的专家记进热度,冷热交换
vram_cache.adapt(recent_usage)
return logits
这套"并发"带来的直接结果,就是下文那张速度表:RTX 5070(12GB)也能把 125B 模型写到 94 tokens/s。
亮点三:投机解码 + KV 流式 + 量化内核,一串"省下来的速度”
在"跑得动"之后,Strata 用一串优化把"跑得快"也补上了。最有代表性的三处:
(1)MTP 投机解码(guess, then check)。 模型自带的 MTP 层先猜最多 3 个 token,然后一次前向过全部 48 层,一次性把猜的 token 全部验证,保留同意的、自己改写分歧处。文档强调了一个很重要的性质——“the helper only guesses, the big model decides every word”,所以答案的质量不变,只是快了 1.6~1.8 倍。平均每轮 2.4~3.2 个 token。
这里最见功力的是它把"投机"做成了有条件的:0.1.7 引入 prompt lookup,当回复在重复上下文(改代码、引用文本)时,从前面已出现的内容里草拟最多 5 个 token——但只在"实测接受率与成本核算下来划算"的地方才用(代码编辑快 6~11%,普通文本保持不变)。这是一个非常工程化的取舍:不做无脑加速,只做被测量支撑的加速。
(2)KV 流式。 长上下文时,KV cache 本身就是显存杀手。策略是:从 64K 起,KV cache 主体留在 RAM,只有注意力当下要读的那段留在显存(--kv-resident 32768),于是显存腾出来装专家。文档给了一组很诚实的对照:Q2_0 在 262K 上下文下,因显存能放的专家从 1589 涨到 3872,输出速度从 50.9 → 62.6 tok/s,“注意力读到的值完全一样,只是 KV 存在哪儿变了”,代价约 13.7KB/上下文 token 的内存。
(3)持续打磨的量化内核(v0.1.36 为例)。 这一段最能看出这个项目"在跑分之外还很实在":
- Q2_0 的 prompt 专家改走融合 int8 tensor-core 内核(RTX 30 及更新):32K 提示词读取 2170 → 2653 tok/s(+22%),128K 2123 → 2468;
- decode 路径的 block 选择与 greedy argmax 挪到线程块集群(RTX 50 / sm_90+):Q2_0 在 128K 上输出 64.5 → 76.4 tok/s;
- 而且它主动交代精度代价:“as close to an FP16 reference as the previous kernels”(32K 处 teacher-forced KL 0.009 vs 0.012),并提供
STRATA_PF_FUSED=0一键退回旧内核,且答案字节级一致。
“提供可复现的对比开关、并把精度差一起写出来”——这是很成熟的内核开发习惯。
优点与要注意的地方
优点:
- 把"跑不动"真做成了"跑得动":125B 稀疏模型 + 12GB 显卡 + 64GB 内存,输出 94 tok/s(Q2_0),32K 提示词读取 2650 tok/s,这套数字在 10 天前还不存在于消费级硬件上;
- 分层调度是真架构,不是套壳:自适应专家缓存 + pinned RAM + CPU/GPU 并发 + SSD n-gram 表 + PCIe 份额可调,五件事互相咬合;
- 速度优化有测量边界,不吹不黑:每项优化都标了机型、引擎版本、测试方法;投机解码明确说明"质量不变";4-bit KV 明确写着"perplexity +8~12%",建议只在能接受时开;
- Apache-2.0 生态级的诚意(其实是 MIT):模型文件按原许可、ggml 致谢 llama.cpp、论文与 1127 行细节文档一并开源,
bench/results/里留着每次跑分原始目录; - 双厂商同引擎:NVIDIA(CUDA)与 AMD(HIP)编译同一套引擎,
AMD_HIP.md列了验证过的机器与贡献者(RX 9070 XT / 7800 XT / 9060 XT / 6900 XT / MI50 等); - 对"让 AI 帮你装"这件事想得很细:仓库里专门有一份写给 AI 编码助手的
docs/AI_SETUP.md(含安全检查表、分级权限、别把无 key 的端口暴露出去),还把tools/strata_mcp.py做成一个只用标准库的单文件 MCP server——你可以直接对 Claude Code 说"给这台机器装 Strata / 启停它 / 看看日志"; - 接口标准:本地起 OpenAI 兼容(
/v1/chat/completions、/v1/responses)与 Anthropic 兼容(/v1/messages)的 API 在127.0.0.1:8080,任何能改 base URL 的 App 或编码 Agent 都能接(Claude Code 只要ANTHROPIC_BASE_URL=http://127.0.0.1:8080)。
要注意的地方:
- 硬件门槛不是"随便一台机":12GB 显存起,内存 32GB 只能上"Coder"(裁掉一半专家、代码强但通用弱),要体验完整模型推荐 64GB;磁盘要留约 80GB 空余,模型下载本身 ~70GB(Unsloth 的 4bit 版 94~111GB);
- 首次启动电脑会卡 1~3 分钟:它要把 35~55GB 权重载入内存并锁定一部分给显卡,文档明确说这是正常的、别关窗口;内存不足时会"引擎意外停止",此时要关掉其他程序或换更小的尺寸;
- 默认一次只答一个请求:要并发得手动设
"parallel": 2(docs/BATCHING.md),且 12GB 卡上并发会让每次回答都变慢; - 可选功能各自有代价:4-bit KV cache 省一半内存但长文档精度下降(已如实标注);
--host 0.0.0.0远程访问必须配--api-key,文档用很重的语气强调了这一点; - 新项目、迭代极快:10 天发了 39 个版本,参数与默认值仍在快速演进(很多优化项带
--xxx 0/1的开关做 A/B),跟着升级要接受"默认值会变"; - 它只跑一个模型:就是 Qwen3.8-Flash-Next 的各个尺寸与版本(Coder / Swift 1.5 / Unsloth 量化),不是通用推理框架,换别的模型不适用。
适合谁
- 手上有一张 12~24GB 显卡、想本地跑"真正的大模型"的人:这是目前最直接的路径之一,4090/3090 24GB 档位官方估到 100~140 tok/s;
- 对显存敏感、长期被"模型装不进显卡"卡住的人:MoE 分级调度 + 自适应专家缓存正是为这个场景设计的;
- NVIDIA / AMD 双平台玩家:AMD 走 HIP,有验证机型清单与贡献者,不用另找一套栈;
- 把本地模型接进编码 Agent 的人:OpenAI + Anthropic 双兼容 API,Claude Code / Codex CLI / Open WebUI 都能直接指过去,离线且不出本机;
- 喜欢用 AI 管理本地环境的人:
strata_mcp.py+AI_SETUP.md让你直接对着助手说"帮我装/启停/看日志"; - 想学"内存分级 + 专家调度 + 投机解码"怎么落地的 C++/推理工程师:MIT 许可、有论文、有 1127 行细节文档与 bench 原始数据,是一份很难得的活体教材。
一句话总结:Strata 做的事情,本质上是把"模型必须装进显存"这个默认前提拆掉,改成一套显存/内存/SSD 分级 + CPU/GPU 并发的调度系统。它没有发明新模型,但把"消费级硬件跑 125B MoE"从一句口号落成了 39 个版本、一套论文和一张张带机型标注的速度表。在 10 天 840 次提交、68 人参与的密度下,这是那种"越看越能感觉到作者真在用自己电脑跑它"的项目。
项目地址:https://github.com/Niko1221/Strata 技术细节:https://github.com/Niko1221/Strata/blob/main/docs/DETAILS.md | 论文:
docs/paper/Strata-Paper.pdf快速上手:Windows 双击START-HERE.bat,Linux 执行./setup.sh;装完打开http://127.0.0.1:8080