Strata推理引擎简介
Strata 是用 C++20 和 CUDA 写的推理程序,把一份检查点拆到显存、内存和只读 NVMe 上,精度、专家数和 top-k 按检查点原样执行,不静默降到四比特以下。入口是 strata-chat 与 OpenAI 兼容的 strata-server。
Strata推理引擎简介
Strata(仓库 ro99/strata,Apache-2.0)是面向「权重放不进显存,甚至放不进显存加内存」的 C++20 / CUDA 推理程序。运行时没有 Python,也没有另一套机器学习框架。它按检查点声明的精度、路由、专家数和 top-k 计算;放不下就标明依赖磁盘读写,而不是悄悄换成更小的路径。下文依据仓库 README 与
docs/current-architecture.md、docs/server.md。同名的一键安装包不是这一套代码。
参考与延伸阅读:
- 仓库:https://github.com/ro99/strata
- 当前架构:https://github.com/ro99/strata/blob/main/docs/current-architecture.md
- 命令行:https://github.com/ro99/strata/blob/main/docs/cli.md
- HTTP 服务:https://github.com/ro99/strata/blob/main/docs/server.md
- 目标调度(文档写明尚未实现):https://github.com/ro99/strata/blob/main/docs/architecture.md
目录
1. 它解决什么
常见引擎要把整份权重或至少一层的活跃专家放进显存。消费级显卡装不下千亿级混合专家模型时,常见退路是再量化、少挂专家、降低 top-k,或换成另一条更便宜的计算。Strata 把这些退路写成禁止项,并在代码里检查:
| 约束 | 含义 |
|---|---|
| 四比特是下限 | 权重、缓存、KV、草稿模型和预测器都不低于四比特 |
| 语义跟检查点走 | 精度、路由、专家个数、top-k 不在加载时被改掉 |
| 预测器只重排工作 | 不改变实际算了什么 |
| 精确模式要么算完要么失败 | 不静默换成近似结果 |
| 内存仍不够 | 标成依赖磁盘 I/O,不藏在缓存命中率后面 |
因此有些速度很难看:检查点大于显存加内存时,作者给出的就是慢的数字,而不是把模型裁小之后的数字。
2. 权重放在哪
一份检查点可以同时占三处:GPU 显存、主机内存、只读 NVMe。放哪一层由放置规划决定,而不是推理到一半再临时降精度。
规划在读权重之前完成。它先用检查点头做一份与机器无关的清单,再用实测硬件(内存、CPU 亲和性、NUMA、可见 GPU)解出放置方案,并按检查点身份、GPU、上下文长度、设备列表和显存比例做缓存。配置里写 0 表示向硬件探询;写非 0 就是操作者给的上限,按原值使用。
不想真正加载时,可以只打印方案:
1
2
./build/strata-chat --model /path/to/checkpoint --model-type gemma4 \
--admission-only --json
Gemma 4 的放置是规定性的,求解器决定数据怎么摆。GLM 与 DeepSeek 的求解器只复述运行时已经在做的轮询放置,用来发现规划错误,不改已经验证过的摆法。
多卡用 --devices 0,1 钉住 GPU。空设备列表会解析成当前可见的全部设备。
3. 已接入的模型
--model-type 目前是:gemma4、deepseek、glm、glm53、laguna、inkling、kimi-k3。下表的速度来自仓库在 64 GiB 显存、251 GiB 内存 那台工作站上的记录。换上下文长度或换机器,数字不能直接挪。
| 模型 | 结构要点 | 检查点精度 | 在该工作站上的摆法 |
|---|---|---|---|
| Gemma 4 31B-IT | 60 层稠密混合注意力,另有视觉塔 | 文本 INT8 group-32 或 MXFP4,视觉与 KV 为 BF16 | 全在显存。128 token 预填充约 669 tok/s,解码约 29.7 tok/s;可输入图文 |
| DeepSeek-V4-Flash-0731 | 43 层,256 专家,top-6 | 专家 FP4 E2M1,骨干 FP8 E4M3 | 常驻内存,解码阶段不再读检查点 |
| Laguna S 2.1 | 48 层,256 专家加 1 个共享,top-10 | 专家 NVFP4 或 MXFP4,其余 BF16 | 骨干在显存,专家从内存流入 |
| Inkling Small | 42 层,256 专家加 2 个 sink,top-6 | 同上 | 专家从内存流入 |
| GLM-5.2 | 78 层,256 专家,top-8 | INT4 group-128,W4A16 | 超过显存加内存,依赖磁盘 |
| GLM-5.3-Flash | 45 层,288 路由专家加 1 个共享,top-8 | FP8,或路由专家 MXFP4 / NVFP4、共享专家 BF16 | 仅文本;精确路径到 2048 token;MXFP4 解码约 3.88 tok/s |
| Kimi-K3 | 93 层,896 专家,top-16 | 专家 MXFP4,其余 BF16 | 约 1.45 TB,依赖磁盘,约 38.6 秒一步;视觉未实现 |
各模型保留自己的注意力和路由,而不是收成同一种 Transformer。例如 DeepSeek 的混合压缩注意力、Kimi 的 Kimi Delta Attention、Laguna 在全局层上的 YaRN。执行器按模型分开写:有的先批量预填充再逐 token 解码,有的按层分页。仓库写明,跨请求的票据调度、专家互调和对路由亲和的分组调度还在目标设计里,当前基准不能算成已经实现。
4. 精度怎么读
磁盘上是什么格式,计算就按什么格式读,不做一次再量化,也不在旁边再留一份更宽的权重。
MXFP4 按 MXFP4 解码:一字节两个 E2M1 码,每 32 个数一个 E8M0 指数。DeepSeek-V4-Flash 的专家 FP4 与骨干 FP8 留在同一模型里,不先统一成一种。E8M0 的 0 和 255 会变成 0 和无穷,这种检查点在准入时失败,而不是解码时算出错数。
Ada、Blackwell 的硬件有 FP4。Ampere(文中写 SM86,例如 RTX 3090)没有 FP4 张量指令。Strata 用软件核把 E2M1 和分组缩放送进 BF16 的 MMA 操作数寄存器,显存里的码仍是四比特,不另存加宽副本。在一张 RTX 3090、batch 为 1 的两组 DeepSeek V4 形状上,读权重约 743–750 GB/s,大约是该卡实测读上限的 88%;四比特解码本身没有再占出可测时间,瓶颈在读权重。
这只在「这一步的时间主要花在读显存里的权重」时才加快墙钟。Gemma 4 31B 的 MXFP4 约 19.5 GB,能整份放进 24 GB 显卡,解码约 29.7 tok/s。专家要从内存经 PCIe 流进来的混合专家模型,时间花在搬运,矩阵乘只占几个百分点;同一套寄存器路径对它们没有收益,因此按模型单独打开,流式专家仍走标量 MXFP4。
5. 程序怎么分层
六个静态库只允许向下依赖,make check 会查头文件引用和链接符号。
| 库 | 职责 |
|---|---|
strata_platform | 类型、safetensors 与分片读写、JSON、NUMA、硬件画像、诊断 |
strata_device | CUDA 后端,或返回错误的占位实现 |
strata_kernels | CPU 参考核(Q4、INT4 group-128、注意力) |
strata_engine | 放置求解、缓存、驻留、采样、会话 |
strata_models | 七个模型各一个目录,外加检查点读取和分词 |
strata_app | 会话运行时和 OpenAI 协议 |
模型用静态注册挂到执行器上。strata-chat 和 strata-server 只按 --model-type 查找,源码里没有一份总的名字分支。头文件是程序内部接口,不作为可安装的 C++ SDK,也不承诺 ABI。
CUDA 架构在构建里写成 86 和 120。换一块不同计算能力的 NVIDIA 卡要改构建;换其他厂商的 GPU 不在当前后端里。CPU 路径是与 CUDA 并行维护的一份存根,新接口要两边一起加。
6. 对话与 HTTP
先编过测试再对话:
1
2
make check
./build/strata-chat --model /path/to/checkpoint --model-type gemma4
HTTP 与计算是同一条运行时,不是另一条降级实现。模型没有精确实现的端点直接返回错误。服务端开销在一次解码上大约占 0.04%。
1
2
./build/strata-server --model models/glm52 --model-type glm \
--model-id glm52 --context-size 2048 --devices 0,1,2
默认监听本机 8080。已提供的路径包括:
| 路径 | 作用 |
|---|---|
/v1/models | 列出模型 |
/v1/health | 健康检查 |
/v1/chat/completions | 对话,可用 SSE 流式 |
/v1/completions | 补全 |
/v1/tokenize | 分词 |
也可以用一份 models.ini 做路由:目录里每个条目拉起独立的单模型子进程,路由进程本身不读权重、不创建 CUDA 上下文。请求里的 model 字段决定进哪一个;未加载的条目默认首次使用时再加载。--models-max 默认是 1,空闲最久的子进程会被换出;正在回答的子进程不换,槽位全忙返回 503。显式加载和卸载是 POST /models/load 与 POST /models/unload,卸掉正忙的模型返回 409。
采样语义、随机种子和各模型的抄录命令在 docs/sampling.md 与 docs/models/。
7. 适用边界
适合。 要在自有 NVIDIA 机器上按检查点原样跑已接入的混合专家或 Gemma 4,并且接受「放不进内存就受磁盘带宽限制」。需要先看放置方案、再决定是否加载时,用 --admission-only。
不适合当成通用推理服务。 模型种类是清单里的七个,不是任意 GGUF 或任意 Hugging Face 仓库。目标文档里的专家调度还没进当前代码。Kimi-K3 的视觉未实现;GLM-5.3 的精确文本上下文停在 2048。Ampere 上的 FP4 是软件路径,且只在权重已经在显存里时才明显加快解码。
网上另有同名的 Windows / Linux 一键包,用来在游戏显卡上跑某一版 Qwen 混合专家并提供本机 API。那是另一套安装器,命令、模型和约束都与本文的 strata-chat / strata-server 不同。
8. 小结
| 要点 | 结论 |
|---|---|
| 是什么 | C++20 / CUDA 推理程序,Apache-2.0,运行时无 Python |
| 放置 | 显存、内存、只读 NVMe;装不下就标成依赖磁盘 |
| 精度 | 按检查点读取,不低于四比特,不静默再量化 |
| 入口 | strata-chat、strata-server(默认 :8080 的 OpenAI 兼容接口) |
| 速度 | 以仓库标明的机器和上下文为准;流式专家的时间主要在搬运 |
| 注意 | 七个模型类型;跨请求调度未实现;同名安装包不是本仓库 |
先用 --admission-only --json 看这份检查点会落在显存、内存还是磁盘上,再决定是否 make check 之后启动服务。
