文章

Strata推理引擎简介

Strata 是用 C++20 和 CUDA 写的推理程序,把一份检查点拆到显存、内存和只读 NVMe 上,精度、专家数和 top-k 按检查点原样执行,不静默降到四比特以下。入口是 strata-chat 与 OpenAI 兼容的 strata-server。

Strata推理引擎简介

Strata推理引擎简介

Strata(仓库 ro99/strata,Apache-2.0)是面向「权重放不进显存,甚至放不进显存加内存」的 C++20 / CUDA 推理程序。运行时没有 Python,也没有另一套机器学习框架。它按检查点声明的精度、路由、专家数和 top-k 计算;放不下就标明依赖磁盘读写,而不是悄悄换成更小的路径。下文依据仓库 README 与 docs/current-architecture.md、docs/server.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-IT60 层稠密混合注意力,另有视觉塔文本 INT8 group-32 或 MXFP4,视觉与 KV 为 BF16全在显存。128 token 预填充约 669 tok/s,解码约 29.7 tok/s;可输入图文
DeepSeek-V4-Flash-073143 层,256 专家,top-6专家 FP4 E2M1,骨干 FP8 E4M3常驻内存,解码阶段不再读检查点
Laguna S 2.148 层,256 专家加 1 个共享,top-10专家 NVFP4 或 MXFP4,其余 BF16骨干在显存,专家从内存流入
Inkling Small42 层,256 专家加 2 个 sink,top-6同上专家从内存流入
GLM-5.278 层,256 专家,top-8INT4 group-128,W4A16超过显存加内存,依赖磁盘
GLM-5.3-Flash45 层,288 路由专家加 1 个共享,top-8FP8,或路由专家 MXFP4 / NVFP4、共享专家 BF16仅文本;精确路径到 2048 token;MXFP4 解码约 3.88 tok/s
Kimi-K393 层,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_deviceCUDA 后端,或返回错误的占位实现
strata_kernelsCPU 参考核(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 之后启动服务。

本文由作者按照 CC BY 4.0 进行授权