实测:一张 3090 跑 27B,新引擎比 SGLang 快 2.5 倍

实测:一张 3090 跑 27B,新引擎比 SGLang 快 2.5 倍

一张 24GB 的显卡,塞进一条相当于十几万字长文的提示词,157 秒后模型正常回话。做这件事的,是一个从零写起的引擎,叫 NInfer,它盯上的正是老牌选手 SGLang 的饭碗。
我们把它俩放在同一台双 3090 机器上做了一次尽量公平的实测。结论先给:单流解码快约 2.5 倍,上下文能塞到 16 万 token;但三个请求同时来时,首字延迟会被排到 3 秒开外。两者的长处恰好互补。

NInfer 是什么

NInfer 是一个从零编写的 C++20/CUDA 推理引擎,专门优化”单张显卡加单一常驻模型”的场景。它原生支持 Qwen3.8 的 qwen3_5 架构(Gated DeltaNet 混合线性注意力),为 27B 稠密模型在单卡上的长上下文推理专门调优。上游项目 Neroued/ninfer 面向 RTX 5090;面向 RTX 3090(Ampere sm_86)的是社区 fork ashalliants/ninfer-3090,它是 3090 线的活跃主线。
它有四项自研机制。ReplaySSM 让投机解码不再为每个位置保存完整的递归状态,只记录驱动状态转移的原始输入,接受长度确定后再重放,这让投机在 24GB 上也能开。DFlash2 与 MTP3 是两种投机解码后端,单流解码提速明显。rk4v4 KV 是 4-bit 量化 KV 缓存:键先做旋转,再用 Lloyd-Max 量化到 4-bit,每 GiB 显存能装的上下文约为 INT8 的两倍,把上下文推到模型原生的 262,144。最后是 OpenAI 与 Anthropic 双兼容 API 加前缀复用。
一句话,NInfer 是把”一张卡、一个模型、一条长上下文”这条路走到极致的引擎。

怎么测的

本文所有数字来自同一台双 RTX 3090 24GB 机器上的真实测试,非转载、非厂商标称。GPU0 带显示器、GPU1 无显示。NInfer 侧使用 ashalliants/ninfer-3090 v0.12.0 加与 release 配对的引擎作者转换模型 neroued/Qwen3.8-27B-NInfer(groupwise-int,v3 容器),跑在 GPU0,可用上下文 192K,用默认 tuned 档(DFlash2 投机加 rk4v4 KV 加 cuBLAS prefill)。SGLang 侧是生产基线 0.5.20 加 born2bewild Qwen3.8-27B W4A16,跑在 GPU1,上下文 150K,3 并发。
协议上两边同提示词、temperature=0 贪心、关闭思考;长文本用每段唯一的填充文本,避免命中前缀缓存,测的才是真实的冷 prefill。一个前提要记住:同是 Qwen3.8-27B,但量化不同(NInfer 用 groupwise-int,SGLang 用 W4A16 激进量化),一个跑带屏卡、一个跑无屏卡。

实测数据

指标 NInfer(GPU0,192K) SGLang(GPU1,150K)
单流 decode 133.9 t/s 53.8 t/s
长上下文(约 8.7 万 token)下 decode 83.1 t/s 44.3 t/s
冷 prefill @1.2万 token 2545 t/s(4.6s) 1333 t/s(8.8s)
冷 prefill @4.9万 token 1911 t/s(25s) 1111 t/s(44s)
冷 prefill @9.8万 token 1422 t/s(69s) 897 t/s(110s)
冷 prefill @16.2万 token 1036 t/s(157s) 超出上下文
可用上下文 192K 150K
3 请求聚合吞吐 155 t/s(1 通道串行) 143 t/s(批处理)
3 请求首字延迟(TTFT) 3.4s / 1.8s / 0.06s 0.04 / 0.10 / 0.10s
质量(长文检索、推理、代码) 正确 正确

最夸张的一条是表里那行 16.2 万 token。什么概念?相当于把一整本十几万字的中文书一次喂进去。NInfer 用 157 秒全部读完,还答出了我们预埋的验证码;同样的提示词丢给 SGLang,150K 的窗口直接报”超出”,连尝试的资格都没有。

结论:两种形态,而非谁替代谁

NInfer 明显更快,也更”长”。单流解码约 SGLang 的 2.5 倍,冷 prefill 快约 1.6 到 1.9 倍,上下文支持到 192K。

但 SGLang 的强项只有一处,却极其关键,就是多并发时的延迟可预测性。NInfer 的默认档是单通道(1 lane),并发请求会排队:三个请求的首字延迟分别是 3.4s、1.8s、0.06s,排在队里的请求要等前面那条长 prefill 跑完才轮到。SGLang 的 chunked prefill 让三个请求同时开跑,首字延迟都稳定在 0.1 秒以内。补一句:NInfer 若开第二条通道(MTP C2),2 并发下聚合可达约 180 到 200 t/s、首字压在 0.2 秒内,但 24GB 下双通道长上下文非常紧张,长任务仍以单通道更稳。

到底怎么选

如果你是一个人用一张卡,日常是让模型啃长文档、写长代码,那就上 NInfer——它更快、能装下的东西更多,省下的等待是实打实的。如果你把这张卡共享给好几个应用或子代理同时用,那就留 SGLang——它不会让排在后面的人干等。想两头兼顾,就两个引擎分工:NInfer 跑长任务,SGLang 跑并发。

真打算试 NInfer,先知道三件事:它用自有的 .ninfer 格式,现成的 GGUF 或 Safetensors 权重用不了;引擎版本必须和模型产物版本配对,v3 引擎配 v3 模型,配错直接启动失败;24GB 单卡在长上下文下只能开一到两条通道,高并发要靠短上下文档位。模型方面,与 release 配对的是 neroued/Qwen3.8-27B-NInfer;3090 分支还有更省显存、上下文更长的 imatrix 转换版,但需要更新的引擎。

环境与复现

引擎用 ashalliants/ninfer-3090 v0.12.0 加 neroued/Qwen3.8-27B-NInfer(v3 容器,sha256 校验通过);基线用 SGLang 0.5.20 加 born2bewild Qwen3.8-27B W4A16。测试脚本是一套自研的 OpenAI 兼容压测,覆盖流式首字延迟、冷 prefill、并发与质量探针,同一套脚本分别打两个端点。其中 16.2 万 token 一行来自单独的长 prefill 探针。

本地实测会受硬件、量化、驱动、负载影响,不同环境下绝对数值会有差异,但两者的相对水平大概率不变。


皖ICP备2025105865号-2|皖公网安备34010402704739号