Skip to content

NInfer 实战:Qwen3.8-27B 单卡 4090 跑满 256K 上下文与 1.5 倍速解码

云八云频道实测:把本地生产从 llama.cpp 迁移到 NInfer(RTX 4090 fork)后,Qwen3.8-27B 在 24GB 显存里全开 256K 原生上下文 + 视觉模型,解码速度 100-130 tokens/s(约 llama.cpp 的 1.5 倍),日耗电从 6-7 度降到 4.5-5 度。本文基于视频字幕全文,并用 NInfer 上游、4090 fork README、HuggingFace 模型卡做了逐条交叉验证。

目录


TL;DR

维度 llama.cpp(迁移前) NInfer 4090 fork(迁移后)
可用上下文 200K 稳定,208K + 视觉 = 红线 256K 全开 + 视觉模型,仍剩 ~1.3GB
解码速度 50-70 tokens/s(开 MTP) 稳定 100+,小任务峰值 ~130 tokens/s
冷启动首字(TTFT) ~5 秒 12-13 秒(冷 prefill 慢 2-3 成)
日耗电(同等用量) 6-7 度 4.5-5 度
长会话稳定性 长 session 可能动态 OOM 启动时静态校验,超预算直接拒启

代价:冷 prefill 慢 20-30%,且被锁死在「一张卡 + 一个模型家族」的路径上。


一、框架定位:通用兼容 vs 极致特化

四框架隐喻与定位

框架 视频隐喻 核心技术 最适场景 代价
llama.cpp 丰田 SUV(哪都能开,到处有零件) GGUF 通用格式、多后端分发 跨硬件/跨模型、个人桌面端 抽象层多,性能难压榨
vLLM 地铁系统(不管单人快慢,管总吞吐) PagedAttention、continuous batching、prefix caching 高并发在线服务 单请求延迟非首要目标
SGLang 智能物流中心(共享路线、缓存复用) RadixAttention 前缀树缓存 Agent loop(重复前缀多) 部署偏服务器侧
NInfer F1 赛车(赛道/发动机/轮胎/天气全固定) 从零写的 C++/CUDA 引擎,锁死模型+硬件 单卡单模型家族榨干性能 零兼容性,换卡换模型即失效

NInfer 的移植链路

视频用的不是原版,而是社区二次移植版:

Neroued/ninfer(上游,仅 RTX 5090 / sm_120a)
        │
        ├── Don-Chad/ninfer-3090(SM86 兼容层 + ReplaySSM)
        │           │
        │           ├── sergiuszm/ninfer-4090(★ 视频所用,sm_89 移植)
        │           │
        │           └── UDPSendToFailed/ninfer-4090(兄弟 fork:
        │               贡献 rk8v4/rk4v4/rk4v4-e8/rk2v4-e8 旋转 KV 量化
        │               与 E8 编解码器,被 sergiuszm cherry-pick)
        │
        └── jram4/ninfer-4090(更早的 2026-07 快照移植,已被放弃)

关键事实(来自官方 README,修正视频的模糊表述):

  • 上游 NInfer 构建脚本硬性拒绝非 sm_120a 架构——为 5090 而生,1.6k stars
  • 4090 fork 走 groupwise-int 权重路径(Blackwell 专属的 NVFP4/W4A4 在 Ada 上不可用)
  • 支持五种 artifact:Qwen3.6-27B / Qwen3.8-27B(groupwise-int 与 nvfp4)/ Qwen3.6-35B-A3B

判断决策树

你的场景是?
├─ 换模型像换衣服 / 硬件不是 3090/4090/5090
│    → 留在 llama.cpp(SUV 的价值就是通用)
├─ 多用户高并发在线服务
│    → vLLM / SGLang(地铁的价值是总吞吐)
├─ Agent 长循环、服务器有 prefix 复用红利
│    → SGLang(RadixAttention 吃这口饭)
└─ 一张 3090/4090/5090 + 就跑 Qwen3.8 家族 + 要长上下文单机 Agent
     → NInfer 对应 fork,直接迁移(本文主体)

二、为什么 24GB 装得下 256K:混合架构 + KV 量化

Qwen3.8-27B 架构拆解(官方模型卡验证)

视频只说了一句「它是混合架构,不是每层都有巨大 KV 缓存」,官方数据展开后这才是 256K 塞进 24GB 的根本原因:

属性 数值
总层数 64 层 + 1 MTP 层
线性注意力层(Gated DeltaNet) 48 层(3/4!)——维护恒定大小状态矩阵,不随上下文增长
全注意力层(Gated Attention) 16 层——24 个 Q 头 / 仅 4 个 KV 头,head_dim 256
KV 缓存增速 只有 16 层全注意力层随上下文线性增长
原生上下文 262,144 tokens(视频简称 256K)
上下文增长时的显存压力(示意)

传统 dense 全注意力模型          Qwen3.8-27B 混合架构
64 层 KV 全部线性增长            仅 16 层线性增长
─────────────────►              ──┐
4K        64K        256K         ├── 48 层 DeltaNet 状态恒定
███        ██████    ██████████    │
爆显存                       │   └── 16 层 KV:262K 时约 16GB
                                  │       (4 KV 头,比常规窄 6 倍)
                                  ▼
                              24GB 卡可容纳

KV 量化:E8 / 旋转量化模式族

视频口播的量化模式经 fork README 验证:

项 视频说法 验证结果
模式名 「RK4V4-E8,前面那个 2 代表 rotate」 实际模式族:rk8v4 / rk4v4 / rk4v4-e8 / rk2v4-e8(rk = rotated KV),视频口播经 ASR 有噪声,但方向正确
原理 旋转变换压制离群值(outliers),以极小精度损失换压缩 ✅ 与 E8 lattice 量化思路一致
定位 「主要不是为了提速,反而比 Q8 慢一点点」 ✅ README 实测:E8 4-bit KV 对比 INT8 KV,decode 税 5.7%、prefill 税 1-2%
回报 换来完整 256K 塞进 24GB ✅ E8 4-bit 已成为 4090 fork 的出厂默认,262K 原生上下文满开

量化后质量是否受损(官方评估)

NInfer 官方用 groupwise-int 权重跑过完整评测(INT8 group-64 KV,MTP=3):

Benchmark NInfer 量化版 官方 BF16 差距
IFBench(prompt-level strict) 77.67% 79.5 -1.8
AIME 2025 96.67% — —
GPQA-Diamond 87.37% 89.2 -1.8
ERQA 66.25% 65.5 +0.8
RealWorldQA 82.22% 85.9 -3.7

四个重叠 benchmark 的 delta 在 ±3.1 分内——「精度损失很小」的说法有数据背书。


三、实测数据:速度、延迟、显存、功耗

解码速度:视频体感 vs fork README 硬数据

两者高度吻合,且 README 补充了分场景细节:

场景 llama.cpp(同卡) NInfer 4090 fork 倍率
代码生成(MTP3,81% acceptance) 118.8 tok/s 148.6 tok/s 1.25x
混合文本 64K 深度(MTP3) 55.5 tok/s 86.1 tok/s 1.55x
混合文本 128K 深度(MTP3) 42.3 tok/s 77.5 tok/s 1.83x
无投机解码基线 45.9 tok/s 50.5 tok/s 1.10x
视频 Agent 实测(长链开发) 50-70 tok/s 稳定 100+,峰值 ~130 ~1.5x

要点:

  • 上下文越深,差距越大——视频的 1.5 倍是 Agent 长链场景的体感均值,README 数据显示浅层 code 只有 1.25x,128K 深度冲到 1.83x
  • 视频「小任务 130 tok/s」与 README 的 code 场景 148.6(81% acceptance)同量级
  • MTP 接受率决定一切:结构化代码 ~81% vs 混合语料 ~49%,输出越可预测,加速越猛

Prefill / 首字延迟(TTFT)

指标 llama.cpp NInfer 说明
Agent 冷启动 TTFT(视频实测) ~5 s 12-13 s 含一次性灌入全部上下文 + 全链路开销
纯 prefill 吞吐(视频口径) 基准 落后 20-30%
纯 prefill 吞吐(README 口径) 64K 28.7s / 128K 71.6s 64K 31.7s / 128K 74.5s 差距仅 4-10%,随深度收窄
256K 全量 prefill 不支持(144K 上限) 191.7s(1228 tok/s) llama.cpp 无此档位

⚠️ 注意两个口径的差异:README 是纯 prefill wall time(4-10%),视频的 20-30% 是 Agent 冷启动全链路(含调度、状态装载)。缓存命中后 TTFT 从十几秒收敛到几秒。

显存与多模态空间

24GB 显存分配(NInfer,256K 全开)

██ 权重 groupwise-int  ~17.0 GB
██ KV 缓存 E8 4-bit    ~5.5 GB(262K 原生满开)
░  剩余                ~1.3 GB → 可同时载入 Vision Encoder
─────────────────────────────
llama.cpp 同卡:208K + 视觉 = 贴红线运行,
请求一来就在 OOM 边缘反复横跳

4090 fork README 补充:视觉塔(vision tower)实测 22ms,图表读取 3/3 oracle facts 全对;128K needle-in-a-haystack 检索精确命中,prefill 1561 tok/s。

功耗:一年能省多少电费

视频实测(日处理量约 1 亿 tokens 的同等负载):

指标 llama.cpp NInfer
整机墙上功耗(decode 峰值) 530-540 W 同级
缓存命中时 — 200-300 W
日耗电 6-7 度 4.5-5 度

按日均差 1.5-2.5 度核算年化:

  • 年差额约 550-900 度
  • 民电 0.6 元/度 → 年省约 330-540 元
  • 商电/阶梯 1.5 元/度 → 年省约 820-1370 元

⚠️ 视频「年省约 1000 元」需要 ~1.5 元/度以上的电价才成立,家用民电打折。方向正确,数字依赖电价,且视频自己也承认样本还少。发热与风扇负载下降是体感确凿的。


四、稳定性:静态预算 vs 动态 OOM

两种截然不同的资源管理哲学:

维度 llama.cpp NInfer
显存预算 运行时动态分配 启动时一次性固定并校验
超载行为 跑到一半 OOM 崩溃 拒绝启动(问题暴露在部署时)
KV 管理 unified KV(概念好,单卡长上下文水土不服) paged KV + Device/Host 多级 checkpoint
slot 默认 默认多 slot(视频称 4),需手动固定 启动固定 1-8 个 active request
长会话表现 上下文越长越不稳定,最终崩掉 跑通后长时间极稳(视频已切生产)
一次长 Agent session 的两种结局

llama.cpp                        NInfer
─────────                        ──────
启动 ✅                           启动 → 容量校验
跑 10K tokens ✅                     │
跑 100K tokens ⚠️ slot 紧张          ├─ 超预算 → 拒绝启动(fail fast)
跑 200K tokens 💥 OOM 崩溃           └─ 通过 → 预算恒定,跑到 256K 也不变
(崩溃点在生产的第 N 小时)

这正是特化架构的红利:所有容量参数在启动期就锁定(--kv-capacity、--max-concurrency、--host-kv-mib),运行期零意外。

# 4090 fork 生产级启动示例(来自官方文档)
./build/apps/ninfer-serve models/qwen3_8_27b.ninfer \
  --max-context 240000 \
  --kv-capacity 240000 \
  --max-concurrency 2 \
  --kv-dtype fp8 \
  --spec mtp --draft-tokens 3 \
  --lm-head-draft \
  --preserve-thinking
# 每个 request 有 240K 逻辑上限;共享 KV 池允许两个
# 请求在预留总和放得下时并行;超载在启动期直接报错

五、验证与勘误记录

视频声称 验证结果 来源
Qwen3.8-27B 是混合架构,KV 缓存远小于同级 dense ✅ 64 层中 48 层是 Gated DeltaNet(恒定状态),仅 16 层全注意力且只有 4 个 KV 头 HF 官方模型卡
NInfer 原版锁定 RTX 5090 + Qwen3.8 家族 ✅ 构建硬性拒绝非 sm_120a,支持五种 Qwen artifact 上游 README
3090 大神移植 → 4090 fork ✅ Don-Chad/ninfer-3090 → sergiuszm/ninfer-4090(另追溯 UDPSendToFailed 的旋转 KV 工作) fork README
量化模式「RK4V4-E8,前面那个 2 代表 rotate」 ⚠️ 模式族实为 rk8v4/rk4v4/rk4v4-e8/rk2v4-e8,ASR 转写有噪声;旋转压 outliers 的原理描述正确 fork README
1.5 倍速提升 ✅ 分场景 1.25x(浅层 code)至 1.83x(128K 深度),Agent 场景均值 ~1.5x 成立;100-130 tok/s 与 README 的 106.5/148.6 吻合 fork README bench
「社区说能到两倍」 ✅ 保守了:上游 5090 nvfp4 MTP3 单请求 143.8 tok/s vs llama.cpp 同卡 ~46 tok/s,约 3 倍 上游 README + fork README
冷 prefill 慢 20-30% ⚠️ 纯 prefill wall time 实测差 4-10%(64K/128K);20-30% 是 Agent 冷启动全链路口径 fork README depth sweep
256K 全开剩 1.3GB,可同时开视觉 ✅ 方向成立(E8 4-bit 默认 262K 满开;视觉塔 22ms 实测在档) fork README
年省约 1000 元电费 ⚠️ 年差额 550-900 度属实;千元需 ~1.5 元/度电价,家用民电约 330-540 元 本笔记核算
llama.cpp 默认 slot = 4,unified KV 长 session 崩 ⚠️ 个人经验无法独立复现验证,但与单卡长上下文场景的已知痛点方向一致 —
4090 有 48GB 版遐想 ℹ️ 市面确有 48GB 魔改 4090(非官方),无官方优化,观望即可 —

六、行动建议:迁移决策指南

该不该把本地主力从 llama.cpp 换成 NInfer 4090 fork?

✅ 满足全部三条 → 迁移,收益 1.5x 速度 + 256K + 更省电更稳
│   1. 硬件是 RTX 3090 / 4090(5090 直接用上游)
│   2. 主力模型固定在 Qwen3.8 / Qwen3.6 家族
│   3. 单用户(个人 Agent / 长链开发),不追求多并发

❌ 任一条命中 → 留在通用框架
│   - 频繁切换小众模型 / 新模型首发即用
│   - 冷 prefill 极频繁(每次都是全新长文档单发问答)
│   - 需要长上下文 + 多并发(24GB 在 256K 下并发≈1)

✅/❌ 最佳实践

  • ✅ 把 NInfer 当「生产专用车道」:固定模型 + 固定卡,参数调优一次到位
  • ✅ 用 E8 4-bit KV 默认配置吃满 262K,检索精度经 260K needle 测试无损
  • ✅ Agent 场景保持缓存命中(同前缀复用),TTFT 会随使用大幅收敛
  • ❌ 不要拿它跑没注册的 checkpoint——没有 runtime fallback,直接不认
  • ❌ 不要指望 24GB 上同时要 256K 长上下文和高并发——物理定律,二者只能选一
  • ❌ 不要在 Windows 上折腾——fork 明确只支持 Linux

未解决的最后一块拼图:并发

视频留下的开放问题:256K 长上下文下单卡 24GB 并发≈1。他想要的是「4 路并发 × 256K × 100 tok/s」,自己评价「宛如做梦」。可行路径:

  1. 48GB 显存(魔改 4090 / 双卡拆分)——KV 池翻倍,并发 2-4 可期
  2. 等软件继续进化——毕竟几个月前 Qwen3.6 + MTP 才 40-50 tok/s,现在 3.8 原生破百
  3. 降上下文换并发——但视频明确表示 128K 对 Agent 长链开发已不够用,此路对他不通

参考资料

相关笔记


文档生成时间:2026-09-15 基于视频字幕全文 + NInfer 上游/4090 fork README + HF 官方模型卡交叉验证