5258mf/ninfer-rtx3060-27b

RTX 3060 12GB/8GB 本地跑 27B 大模型:256K 上下文、约 45 token/秒,能看图、调工具,附懒人包和源码

C++

38

49 commits

updated Oct 13, 2026

See the code

See what people are saying

SourceMessageScoreDate

Ninfer-rtx3060 gets 50 tok/s for Swift-1.5-Qwen3.8-27b (r/LocalLLM)

Found [https://github.com/5258mf/ninfer-rtx3060-27b](https://github.com/5258mf/ninfer-rtx3060-27b), a 3060 port with Swift IQ3\_XXS Decode \~50 tok/s (44 to 52) KV 46,400 tokens, 131K context Pass beautifully in 1st try one liner prompt.…

4

Oct 15, 2026

README

ninfer:在 RTX 3060 上本地运行 27B 模型

简体中文 | English

当前源码与懒人包:Swift 1.5 IQ2S / IQ3XXS 0.1.4,Bonsai2 8G / 12G 0.1.5。四款懒人包共用下方的百度、夸克网盘目录。详情见更新记录。

为 Windows 提供 Swift 1.5 和 Bonsai2 的本地推理方案,支持对话和图片输入,也支持工具调用与 KVMem 长上下文。懒人包解压后双击启动,模型在第一次运行时下载。

选择版本

版本显卡与显存模型入口
Swift 1.5(默认推荐)RTX 30 系,12 GB 以上;RTX 40 系可运行但未实测IQ2S MTP-Q4 约 9.46 GiB;IQ3XXS MTP-Q4 约 10.24 GiB;共用引擎源码使用指南
Bonsai2 12G按 RTX 3060 12GB 调整,面向 RTX 30 系Swift-Bonsai-2 三元模型,约 7.7 GiB12G 版说明
Bonsai2 8G面向 RTX 30 系 8GB;测试在 12GB 卡限制显存完成Swift-Bonsai-2 ptq1,约 6.6 GiB8G 版说明

Swift IQ2S 默认总上下文为 200K,IQ3XXS 为 128K,两者最多可配置 256K;KVMem 会从历史中选取部分内容放入显存。容量上限与长文召回效果请一起看测试结果与已知限制。

下载

懒人包不包含模型。请完整解压,保留 engine、launcher 和 patch 等目录。

四个包都在同一个共享目录里,打开任一网盘后按文件名选择。

网盘共享目录提取码
百度网盘打开共享目录v2sh
夸克网盘打开共享目录XPzf
懒人包版本文件名
Swift 1.5 IQ2S0.1.4ninfer-3060-swift15-q2s-mtp-oneclick-0.1.4.zip
Swift 1.5 IQ3XXS0.1.4ninfer-3060-swift15-iq3xxs-mtp-oneclick-0.1.4.zip
Bonsai2 12G0.1.5ninfer-3060-12g-bonsai2-oneclick-0.1.5.zip
Bonsai2 8G0.1.5ninfer-3060-8g-bonsai2-oneclick-0.1.5.zip

压缩包校验值见 PACKAGES-SHA256SUMS.txt。IQ3XXS 已提供独立懒人包,支持首次下载、SHA256 校验和 MTP-Q4 转换。四包均于 2026-10-13 重新构建,通过短请求和解压自检;验收范围见更新记录。

已转换的无审查 NInfer 模型

以下 Huihui Qwen3.8 27B Abliterated 模型已转换为 NInfer 格式,可从 Hugging Face 下载:

Abliterated 版本会削弱模型的拒答或安全过滤能力。使用前请阅读各自模型卡中的来源、许可和使用警告;Swift 版本的模型卡建议用于研究和本地受控推理,不建议用于面向公众或未成年人的服务。

当前源码 Release:Swift 0.1.4 和 Bonsai2 0.1.5,各附件只含对应引擎系列,均包含最新 BAT/容量修正。本次懒人包的启动器源码已同步到 main。

快速开始

下面以 Swift 1.5 IQ2S 为例:

  1. 准备 Windows 10 / 11、支持 CUDA 13 的 NVIDIA 驱动、12 GB 以上显存。内存建议 32 GB,第一次下载和转换模型需约 22 GB 空闲磁盘。
  2. 下载懒人包,解压到简单路径,例如 D:\ninfer-swift15。
  3. 双击 启动.bat,确认配置后按回车。第一次会下载、校验并转换模型;出现 listening 后即可使用。
  4. 双击 测试.bat 检查回答。连接客户端时,按启动后生成的 接入信息.txt 填写接口和输出上限。

默认接口为 http://127.0.0.1:8084/v1,模型 ID 为 qwen3.8-27b。修改参数、模型准备和客户端接入见使用指南;常见使用问题见下文,已知启动错误见修复记录。

本页导航

Swift 1.5 使用说明

运行前准备

  • Windows 10 / 11,64 位。RTX 30 系、12 GB 以上显存已作为目标;RTX 40 系可运行,但没有实测。
  • NVIDIA 驱动需支持 CUDA 13,现有包建议 580 以上。正常完整解压无需安装 CUDA 或 Python;VC 运行库 DLL 已随包携带。
  • 内存建议 32 GB;第一次准备模型需约 22 GB 空闲磁盘。

把懒人包完整解压到简单路径,例如 D:\ninfer-swift15。engine 中的 DLL 必须与 ninfer-serve.exe 保持在同一目录。

启动和停止

  1. 在 IQ2S 包中双击 启动.bat。默认选择 rk4v4、完整 MTP 输出头、200K 总上下文和自动输出。
  2. 回车确认配置。首次使用会提示下载和转换模型,再按提示确认;下载可以断点续传。
  3. 等待窗口出现 listening。首次遇到没有校准记录的显卡还会测量运行路线,因此比后续启动慢。
  4. 双击 测试.bat 检查回答和速度。用完关闭启动窗口即可停止引擎。

同一时间只运行一个引擎。菜单中回车启动、C 重新配置、R 重新读取空闲显存、Q 退出。

启动.bat last
启动.bat dryrun

last 直接使用保存的配置;dryrun 只显示参数,不启动或下载。

KVMem 与四种组合

按实际提示词分配 KVMem 窗口

当前 main 源码(2026-10-06): 自动 KVMem 模式只确定驻留预算,有限的 API 申请上界随驻留容量变化;不再提前按固定 SYS、固定 36K/平分或 32K 输出封顶划分。引擎按实际 system/developer/工具前缀逐请求分配检索与输出。本引擎的 --default-max-tokens 也会限制显式请求,并非只在客户端不传参数时生效。旧 SYS/sink 配置或初始化种子不等于真实前缀。客户端压缩策略由客户端自行配置,包内不附 DSH 测试启动项。

本轮 main 启动器支持三种驻留选择:recommended 取历史推荐与当前允许上限的较小值,auto 取当前允许上限,也可手动填写范围内的 token 数。推荐值不是硬上限;读不到显存或配置越界时拒绝启动。按 C 先选 KV/输出头/Graph,再选驻留、逻辑上下文和 API 上限;菜单支持数字选项,启动前会重新检查显存。8G 始终按整卡 8GiB 扣除桌面与其他占用。校准范围与短测结果见更新记录。

启动时先按空闲显存确定总驻留容量 C;每次请求再准确计算系统提示、developer 指令和工具定义的完整开头 S。检索不包含 S,输出使用剩余容量。

总上下文检索推荐范围优先目标输出预留
256K32K–36K36KC − S − 检索,至少 8K
128K16K–18K18KC − S − 检索,至少 8K
200K25K–28.125K28.125K同上

开头按完整渲染后的 token 数计算,Bonsai 按 64 token、Swift 按 128 token 对齐。不再固定预留 8K 开头,也不再把 KVMem 输出限制为 16K/32K。容量不足时先缩检索,低于推荐范围会提示;完整开头和 8K 输出都放不下时返回容量错误。实际生成仍受客户端请求长度、剩余总上下文、停止词以及模型结束影响;8K 是显存预留,不保证每次生成 8K。

Harness 在第一次请求前即可配置:contextWindow 填总上下文,maxTokens 使用启动器生成的数字。这是最短开头情况下的申请上限,实际请求的开头更长时,引擎会自动降低本轮输出预算。启动缩窗后重新生成接入信息;本机启动器在允许同步时同步 dsh。旧的手动 OUT/ANSWER、SYS/SINK 和 WINDOW 会迁移到自动分配。

8G 在 12GB 测试卡上也先扣除当前桌面/驱动占用,再按 8GB 预算计算。20K 是小容量测试或低空闲显存下的容量,67K 是假设整块 8GB 空闲时的理想预算;二者不能作为同一台电脑的固定上限。较小窗口可以运行,但超长历史召回可能变差。

支持的四种组合与历史解码测量如下;驻留容量以本次启动为准:

组合总上下文检索目标输出历史解码速度
rk4v4 + 完整头推荐 200K,最多 256K200K 时 28.125K;256K 时 36K剩余容量约 43 token/秒
rk4v4 + 精简头最多 128K18K剩余容量约 47 token/秒
rk8v4 + 完整头最多 128K18K剩余容量历史测量慢 14–22%
rk8v4 + 精简头最多 128K18K剩余容量—
  • rk4v4:对话记录的 K、V 都存 4 位。同样显存可容纳更多 KV;速度与精度差异取决于测试设置,本页新表列出当前同口径速度,旧百分比只作为历史记录。
  • 精简头:MTP 猜字时只在 13 万个常用词里猜,快约 10%,猜中率不变;代价是多占 340 MiB 显存,窗口变小。

修改参数

双击 启动.bat 后按 C,依次选择 KV 格式、MTP 输出头、看图、总上下文、单次输出、固定保留的开头和思考上限。回车保持当前值,选好后会写回 设置.ini。

也可以用记事本编辑 设置.ini 后重新启动:

设置项作用
KVrk4v4 / rk8v4
HEADfull / lite
CTX总上下文,默认 204800
OUTauto,启动前生成 Harness 申请上限;实际预算随请求计算
SYSauto,完整系统/developer/工具定义的实际 token 数
THINK思考上限,0 表示不限
POST_THINKING思考结束后切换正文采样参数,默认 1;设 0 关闭
POST_THINKING_TEMP / POST_THINKING_TOP_P / POST_THINKING_TOP_K正文的温度、top-p、top-k;留空使用引擎预设,温度默认为 0.2
POST_THINKING_SAMPLER正文采样组合,例如 temp=0.2,top_p=0.95
ADAPTIVE_MTP自适应 MTP 草稿长度,默认 0,使用固定 3 token
RECOVER_INVARIANT内部不变量错误时尝试恢复请求,默认 1
VISION是否启用看图
HOST / PORT监听地址和端口
API_KEY访问密码,默认留空
MODEL_ID客户端使用的模型 ID

窗口与自动输出会随空闲显存变化。开头与输出自动分配;启动后以生成的 接入信息.txt 为准。

推理控制设置已包含在当前懒人包中。RECOVER_INVARIANT 只处理引擎支持恢复的内部错误,不能保证所有错误都能恢复。

连接客户端

等待 listening 后,打开自动生成的 接入信息.txt。它包含当前配置和 DeepSeek Harness 的配置示例。

客户端字段默认值或填写方式
接口类型OpenAI 兼容 / Chat Completions
Base URLhttp://127.0.0.1:8084/v1
模型 IDqwen3.8-27b
API Key未设置密码时可填 none,部分客户端不允许为空
contextWindow / 上下文长度与 CTX 一致,默认 204800
maxTokens / 最大输出按本次 接入信息.txt 的数值填写

接口也支持 Anthropic Messages 和 OpenAI Responses。思考内容在 reasoning_content 字段;请求中 enable_thinking: false 可以关闭思考。支持的思考档位为 low / medium / xhigh,加上关闭思考。

一次处理一个请求,多个请求会排队。需要局域网访问时,将 HOST 改为 0.0.0.0 并设置 API_KEY;接入信息中会列出可用地址。

修改 dsh 的配置后,完全退出程序和托盘图标,再重新打开,避免它把内存中的旧配置写回文件。

0.1.0 对客户端发送的较大输出上限按服务端配置封顶;中途压缩、编辑历史或分叉的 KVMem 请求回退到重新预填,因此可能比直接续写慢。多工具 required/any 按 Auto 处理,不能保证一定调用工具;接受 strict:true 的入口也不提供严格 JSON Schema 约束。Swift Responses 入口仍拒绝 strict:true。具体覆盖范围见三项兼容修改与限制。

模型下载和转换

模型来源:魔搭社区 Swift-1.5-Qwen3.8-27B-GSQ-RCO-NInfer。

合并后的 Qwen 3.8 27B 模型库使用上方同一组共享下载目录。

  • 原始下载文件:swift15_iq2s_mtp.ninfer,10,257,632,000 字节。
  • 启动器使用包内 patch 转换成 swift15_iq2_s_mtpq4.ninfer,10,155,600,640 字节。
  • 只修改 MTP 草稿头的 7 个张量,其余模型对象保持原样;下载和转换后都进行 SHA256 校验。
  • 转换使用 PowerShell,无需安装 Python。校验通过后,启动器会删除原始下载文件。
  • 也可以自行下载原始文件,按原名放入 model 目录,再启动完成转换。

文件 hash 和自行生成补丁的方法见编译与开发。已有转换完成的模型可继续使用,升级引擎无需重新下载模型。

包内文件

路径内容
启动.bat / 测试.bat启动和测试入口
设置.ini用户配置
engine/EXE 与运行所需 DLL
launcher/启动器和测试脚本
patch/模型转换的数据补丁
model/初始为空,下载与转换后的模型
版本信息.txt新修复包的构建识别信息
SHA256SUMS.txt / verify-kit-manifest.ps1新版包的核心文件哈希、DLL 完整性和中文文件名检查
verify-arch-engine.ps1新版包的引擎验收脚本,包含短提示、超窗正负对照与多轮复用
logs/ / 接入信息.txt运行时生成的日志和客户端说明

包里的 使用说明.txt 可离线查阅;速度与长文召回范围见测试结果与已知限制。

上述校验和验收工具已包含在当前源码和懒人包中。完整包解压后可运行:

powershell -ExecutionPolicy Bypass -File .\verify-kit-manifest.ps1
powershell -ExecutionPolicy Bypass -File .\verify-arch-engine.ps1

第一项检查文件;第二项会启动测试引擎并占用显存,运行前关闭其他模型。模型默认从包内 model 目录读取,也可用 -ModelPath 指定。SHA256SUMS.txt 和校验脚本对应指定发布构建;自行编译或修改脚本重新打包时,需要一起更新清单与脚本内的预期哈希。

测试结果与已知限制

这里按版本保存已有测量和验证范围。不同工具、模型格式、提示词和输出长度的速度不能直接横向比较;文档整理没有重新测量这些历史结果。256K 是可配置的总上下文,KVMem 每轮只读入选中的历史,不能据此保证所有内容都能精确召回。

质量(困惑度,越低越好)

IQ3XXS 于 2026-10-05 使用独立 ninfer-perplexity 评分入口测量:ninfer-ppl-1m-v1 quick 四个流,context 4096 / stride 2048,rk4v4、GDN FP16、词嵌入放内存。每个模型文件评分 261,167 token、124 个窗口;PPL 预填充及评分分块为 1024,与聊天服务的 512 不同。下表 Bonsai2/IQ2S 列保留历史参考;Bonsai2 原报告已恢复,IQ2S 对应原报告本次未找到。设置不同,不能据此单独归因权重量化差异。

领域Swift-Bonsai-2(历史 int8)IQ2S(历史)IQ3XXS(rk4v4)
中文维基7.894155.4435.29369
PG-198.656297.4397.26160
WikiText7.826746.3216.21847
NInfer 代码1.859721.7161.69572
总体5.628434.5874.49564

IQ3XXS 原始 MTP Q6 与转换后的 Q4 文件,总体均为 4.495637819904494;124 个窗口在报告精度下逐项一致。CausalScoring 只测主模型,不运行 MTP 草稿或视觉塔,不能据此声称草稿质量、接受率或多模态能力不变。Q4 原始报告、Q6 原始报告、已找到的 19 份报告。早期 custom 语料结果属于流水线/参数扫描记录,不是更多项可直接对比的质量认证。

速度(RTX 3060 12GB)

2026-10-05,RTX 3060 12GB / Windows;完整输出头、MTP draft3、CPU 看图、prefill chunk512。文本/代码输入分别为 56/49 token,输出 256 token;每组预热 1 次、正式 3 次。生成速度是引擎 decode 中位数(token/s),不是端到端吞吐。

配置Graph测试驻留窗口文本生成代码生成
Bonsai2 12G · int8关98K45.8345.11
Bonsai2 12G · int8开98K47.1946.57
Bonsai2 12G · rk8v4关131K45.0945.95
Bonsai2 12G · rk8v4开131K46.6747.74
Bonsai2 8G · rk4v4关48K32.2631.03
Swift IQ2S · rk4v4关73K42.2144.93
Swift IQ2S · rk4v4开73K43.2446.12
Swift IQ2S · rk8v4关49K42.1947.13
Swift IQ2S · rk8v4开49K43.2748.33
Swift IQ3XXS · rk4v4关37K44.3446.03

无缓存预填充:实际输入为 2K / 8K / 16K,每档预热 1 次、正式 3 次,最多生成 8 token。下表是 prefill 中位速度,首 token 延迟(TTFT)单列;引擎计时和 usage 输入计数一致,缓存命中为 0。

配置Graph2K 预填充8K 预填充16K 预填充16K TTFT(秒)
Bonsai2 12G · int8关818.60813.05743.9322.04
Bonsai2 12G · int8开805.78791.72733.6722.34
Bonsai2 12G · rk8v4关803.26790.37734.3122.32
Bonsai2 12G · rk8v4开805.24790.50735.1222.30
Bonsai2 8G · rk4v4关558.43557.65533.9030.71
Swift IQ2S · rk4v4关483.66498.10489.0233.55
Swift IQ2S · rk4v4开483.40497.85489.3633.52
Swift IQ2S · rk8v4关484.26498.14490.3833.44
Swift IQ2S · rk8v4开483.59498.52490.6533.44
Swift IQ3XXS · rk4v4关500.47515.41505.6932.44

10 个配置共计 90 个正式 prefill 样本、30 个预热样本。不同模型驻留量不同;同模型/KV 的 Graph 对照使用相同窗口,小幅差异不构成普遍提速保证。输入均未超出驻留窗口,不代表超长历史换页速度。表中 IQ3 37K、Bonsai8 48K 是当时测试窗口,当前推荐档为 IQ3 33K、Bonsai8 36K,均不是硬上限;auto 和手动驻留受实时显存及匹配组合的校准边界限制。IQ3 首次因余量 223.68 MiB 触发旧 300 MiB 规则,重试完成,异常记录保留。原始指标与方法。

长上下文

场景结果
12 万 token 长文藏一句话找到;多轮追问、切到别的对话再切回都正常
19 万 token 长文藏句、工具调用、多轮复用单次输出 16K 时 5 次全部通过;输出调到 23K(检索区变小)时,工具那一项没过
25 万 token 长文藏一句话没找到:暗号所在的那一块没被挑进显存(见本页的已知限制)
6 万 token 对话,超出显存窗口以后接着问每轮 2–4 秒(改之前每轮约 140 秒)

测试环境

项配置
显卡RTX 3060 12GB(28 SM,显存带宽 360 GB/s)
CPURyzen 7 3700X
内存32 GB(Host KV:200K 上下文预留 8 GB,256K 预留 10 GB)
系统Windows 11
前端DeepSeek Harness 桌面版(其他 OpenAI 兼容客户端也能用)

已知限制

  • 25 万 token 藏句没找到:按块打分时,暗号所在那一块得分偏低,没被挑进显存。需要精确查找时,材料尽量控制在 12–19 万以内;贴很长的材料时,先发材料,再单独发一条问题,召回会好很多。
  • 第一次读入慢:19 万约 9 分钟,25 万约 12 分钟。之后接着问很快。
  • 一次只处理一个请求:同时发多个会排队。
  • 单次输出(含思考)有上限:自动时 3060 上约 23–28K,超过会被截断,写很长的东西要分几步。
  • 显存大于 12 GB 的卡:窗口有上限,多出来的显存暂时用不上。
  • 只支持 RTX 30 / 40 系:引擎按 sm_86 编译。RTX 50 系请用 Ryan-gsq 分支的官方预编译包。

测试方法

  • 速度用引擎项目自带的 refbench,困惑度用 ninfer-perplexity。开关交替测,排除显卡过热降频的影响。
  • 长上下文用藏句找回、多轮追问、工具调用、切对话再切回测试,每次改动后都回归。
  • 懒人包实测过下载(含断点续传)、校验、补丁转换、真机启动和 测试.bat。

技术实现

下列性能数字对应原有测试,不表示每次更新都会再次获得同等提升。按日期发生的修复和发布状态见更新记录。

1. 让新引擎在 RTX 30 系上跑

Swift 1.5 的模型格式(GGUF 量化块,IQ2_S / IQ3_XXS 等十几种)只有 ninfer-all 这条新分支能读,它的预编译包只支持 RTX 50 系。移植时:

  • 按 sm_86 编译,补齐 cuBLAS 等依赖;
  • 精简引擎(编译开关 NINFER_SLIM_3060):只保留单卡、单路要用的注意力内核,显存和编译时间都省下来;
  • SM 数运行时自动识别:同一个程序在 3060(28 SM)和更大的卡上都能用,不用重新编译。

2. KVMem:12 GB 显存跑 256K 上下文

  • 底子是 qzshch/ninfer-kvmem 在新引擎结构上的实现:完整对话放内存(Host KV),显存块表里用"空洞"表示不在显存的页,位置保持原样;
  • Windows 上 Host KV 改用可分页内存:原来用锁页内存,Windows 上分不出 8 GB;
  • 检索按 kv9 的做法完整移植:按消息分段做查询,挑块时对准换行,打分时排除开头、保护块和最近块,CPU 打分矩阵化、多线程;
  • 和 MTP 投机解码、看图都兼容。

3. 输出留在显存、超窗后只重算新内容

  • 单次输出整段预留在显存里,不会被挤出去;开头(系统提示)固定保留;
  • 历史超出窗口以后,多轮对话只重算新内容。6 万 token 的对话,接着问每轮从约 140 秒降到 2–4 秒;
  • 多个对话来回切时,长对话的接续点不会被挤掉。

4. 省显存(每一项都换成更大的窗口)

改动省下代价
词嵌入放内存(--embedding-host)约 360 MiB无,速度不变
视觉权重放内存(overlay)约 280 MiB第一张图约 1.7 秒
MTP 草稿头压成 Q4(用补丁改模型文件)约 95 MiB无,速度和猜中率在波动范围内
rk4v432K 上下文省约 260 MiB困惑度 +0.10%

5. 提速

  • 注意力跳过不在显存的空洞页;
  • 页面从内存搬上显卡时批量拷贝(gather),按碎片程度自动选用;
  • 精简 MTP 输出头做成可选项(+10.5%)。

6. 启动器

  • 按启动时的空闲显存自动算窗口,整卡留约 150–200 MiB;估多了引擎会报真实可用量,启动器自动缩小窗口重试;
  • 单次输出可以选"自动",按窗口大小分配;
  • 先显示上次配置,回车直接启动;按 C 一步步重新选,每一步都写着推荐值和上限。

当前源码中的构建支持

改动内容
KVMem移植 qzshch/ninfer-kvmem 的空洞块表、设备放置事务、稀疏工作集、滚动预填窗口、解码环形窗口和检索机制
3060 精简NINFER_SLIM_3060 保留单卡、单路、H24 注意力和 int8 / rk8v4 / rk4v4 内核
内存和显存Windows Host KV 用可分页内存;词嵌入放锁页内存;开头和输出按环境变量预留
kv9 检索按消息分段查询、对准换行、排除开头/保护块/最近块、CPU 打分矩阵化多线程;默认查询行数 1024
注意力和换入跳过空洞页;页面换入按碎片程度自动选批量 gather
SM 自适应GDN 路线表运行时按真实 SM 数选择;rope 容量 = 6 × SM
Windows 显存预算引擎读取 CUDA 和 NVML 空闲显存,NVML 可用时取两者较小值;NINFER_FREE_VRAM_MIB 可进一步限制预算
KVMem 内容打分包含单段查询和达到提示窗口边界的选择路径,日志用 kvmem_score: SELECT 标识
连接保活Windows TCP 保活为 10 秒 / 3 秒,HTTP 连接保活 120 秒,读写超时 300 秒

后三项对应 2026-10-04 同步的源码。它们的修复背景和发布状态见更新记录;原有性能表保持此前测量结果。

源码与编译

Swift 1.5 IQ2S 与 IQ3XXS 共用的完整引擎源码在 swift15/engine/,包含 CMake 工程和实现代码,应用、测试及第三方源码也在目录中。当前 IQ2S 懒人包的启动器和设置在 swift15/oneclick-iq2s/,构建脚本在 swift15/scripts/。目录索引见 swift15/README.md。

Bonsai2 8G 与 12G 共用的引擎源码、构建脚本和两套启动器已公开在 bonsai2/。两种显存方案使用不同模型文件和启动配置;引擎改动共用。从源码编译见 12G README 和 8G README。

从源码编译

1. 下载源码

git clone https://github.com/5258MF/ninfer-rtx3060-27b.git
cd ninfer-rtx3060-27b

也可以在 GitHub 上点击 Code → Download ZIP。IQ2S / IQ3XXS 共用的引擎源码位于 swift15/engine/,上游基线是 Ryan-gsq 分支 b06908b,此前的改动均已合入。

2. 环境(Windows)

  • CUDA 13.x(要带 cuBLAS;我们用的是 13.3)
  • MSVC 2022(C++ 桌面开发)、CMake、Ninja
  • FFmpeg 开发包(看图用)、zlib、libcurl(我们用 conda 里的)

3. 编译

改好 swift15/scripts/build-sm86.bat 开头的 CUDA、MSVC 和依赖路径,然后在仓库根目录运行:

swift15\scripts\build-sm86.bat

脚本默认使用仓库里的 swift15/engine/,输出到 swift15/build/;源码和构建路径使用纯英文路径。产物是 swift15/build/apps/ninfer-serve.exe。把它和运行要用的 DLL(cudart、cublas、cublasLt、FFmpeg、zlib、libcurl、libssh2、libcrypto、zstd 等)放到懒人包的 engine\ 目录。

  • 只编译 sm_86。RTX 30 系能跑,RTX 40 系(sm_89)二进制兼容也能跑;RTX 50 系不行,请用上游的预编译包。
  • SM 数在运行时自动识别,不同型号不用重新编译。
  • 改动头文件以后,完整重新编译可能要近 1 小时。

4. 必须加的启动参数

单卡 12 GB 上,--device-state-slots 0 --prefill-chunk 512 必须加,否则显存不够。完整参数由启动器生成,大致是:

ninfer-serve swift15_iq2_s_mtpq4.ninfer --model-id qwen3.8-27b
  --kv-dtype rk4v4 --gdn-state-fp16 --spec mtp --draft-tokens 3
  --max-context 204800 --kv-capacity auto --kvmem-window-pages <按空闲显存算>
  --host-kv-mib 8192 --device-state-slots 0 --prefill-chunk 512
  --cuda-graph-allowance-mib 144 --default-max-tokens <输出>
  --max-private-continuations 4 --embedding-host
  [--lm-head-draft] [--vision --vision-residency overlay --vision-max-merged 4096]

环境变量:NINFER_KVMEM_SINK_PAGES(开头保留页数)、NINFER_KVMEM_GEN_RESERVE_PAGES(输出预留页数)、NINFER_KVMEM_LONG_REUSE=1。Windows 上开 KVMem 时 Host KV 自动用可分页内存(NINFER_HOST_KV_PAGEABLE=0/1 可以强制)。1 页 = 64 token。这些值由启动器源码计算。

模型补丁与转换工具

懒人包不放模型,第一次启动时从魔搭下载 swift15_iq2s_mtp.ninfer(10,257,632,000 字节,SHA256 2df7259e93cbbb972183966e40ff23392e66a8ce4fc84748d08849bc6182045e),再用补丁转成 swift15_iq2_s_mtpq4.ninfer(10,155,600,640 字节,SHA256 1941ef5f4bd4be61938521236d0e499c5e6d69ff69b4fbcfe83527f7fd9b3bdd)。

自己生成模型补丁(在 swift15/engine/ 里运行,要 pip install gguf numpy torch):

python -X utf8 -m tools.mtpq4 swift15_iq2s_mtp.ninfer swift15_iq2_s_mtpq4.ninfer
python -X utf8 -m tools.mkpatch swift15_iq2s_mtp.ninfer swift15_iq2_s_mtpq4.ninfer patch_out

两个脚本已经放在引擎的 tools/ 目录,会使用同一源码树中的 tools.artifact。

mtpq4.py 只改 MTP 的 7 个张量:注意力 query/gate(Q4)、key/value(Q8,引擎的 linear_pair 只收 Q8)、注意力 output(Q4)、MLP gate+up 和 down(Q4);input_projection 没有对应形状的 Q4 内核,保留 Q6_K。量化用项目自带的 quantize_matrix_mse。其余对象逐字节复制。

升级现有包

重新编译后替换包内 engine/ninfer-serve.exe,保留完整依赖 DLL。已经下载和转换的模型可以继续使用;修复所需版本见更新记录。

常见问题

显存或主机内存分配失败

情况处理
显存分配失败或窗口放不下关闭其他占显存程序;按 R 重新读空闲显存,或按 C 调小单次输出
运行后突然很慢检查是否显存被其他程序占用,释放后重新启动
cudaMallocHost / bad allocation检查主机内存和其他模型占用,可调小总上下文;缩显存窗口不能覆盖所有主机锁页失败
已有模型运行或端口占用关闭原模型,或修改 设置.ini 的 PORT

启动器只处理它识别的容量报错,不能保证所有分配失败都自动恢复。输入很长的材料时,也需要考虑长文召回范围。

下载、转换与客户端

  • 下载中断:重新启动,已有 .part 文件会继续下载。
  • 校验失败:检查模型文件是否完整,按包内说明重新下载。
  • 补丁缺失:重新完整解压 patch 目录;现成的转换后模型可以继续使用。
  • 客户端输出截断:最大输出按本次生成的 接入信息.txt 填写;思考也占输出预算。
  • dsh 改完不生效:退出程序与托盘图标后再打开,避免旧配置写回。
  • 窗口闪退:在包目录地址栏输入 cmd,再运行 启动.bat 查看具体错误。

引擎日志在包内 logs 目录。分享错误信息时,去掉 API Key 等私人信息。

DLL 缺失、KV 容量曲线越界或首次显卡校准失败时,见启动错误与处理。

来源与许可

代码许可与模型许可分别适用。Swift 1.5 引擎代码的 Apache-2.0 文本见 swift15/LICENSE,源文件保留上游许可证和贡献者信息。

  • Swift-1.5 Qwen3.8-27B GSQ-RCO:UkisAI(Swift Open License v1.0,允许署名再分发;年收入超过 100 万美元的商用需要另外和 UkisAI 谈);基座 Qwen3.8-27B(Apache-2.0)。
  • .ninfer 格式模型:魔搭社区 fyb423 转换发布(Swift-1.5-Qwen3.8-27B-GSQ-RCO-NInfer)。
    • 本项目对模型的改动(Swift Open License 4(b) 要求的变更说明):只把 MTP 草稿头的 7 个张量从 Q6_K 重新量化成 Q4(query/gate、output、MLP)和 Q8(key/value),其余权重逐字节不变。懒人包里只放补丁,不放模型本身,模型由用户从魔搭下载。
  • 引擎:Ryan-gsq/ninfer-16g-5070ti-5080-5090-qwen3.8-27b-gsq-rco(Apache-2.0),它是 iamwavecut/ninfer-all 的分支,最早来自 Neroued/ninfer。
  • KVMem:qzshch/ninfer-kvmem(Apache-2.0)的新引擎实现;kvmem-llama.cpp 项目和它的论文。
  • 3090 分支和其他 3060 用户公开的调优记录,也提供了很多参考。

5258mf/ninfer-rtx3060-27b

RTX 3060 12GB/8GB 本地跑 27B 大模型:256K 上下文、约 45 token/秒,能看图、调工具,附懒人包和源码

C++

38

49 commits

updated Oct 13, 2026

See the code

See what people are saying

SourceMessageScoreDate

Ninfer-rtx3060 gets 50 tok/s for Swift-1.5-Qwen3.8-27b (r/LocalLLM)

Found [https://github.com/5258mf/ninfer-rtx3060-27b](https://github.com/5258mf/ninfer-rtx3060-27b), a 3060 port with Swift IQ3\_XXS Decode \~50 tok/s (44 to 52) KV 46,400 tokens, 131K context Pass beautifully in 1st try one liner prompt.…

4

Oct 15, 2026

README

ninfer:在 RTX 3060 上本地运行 27B 模型

简体中文 | English

当前源码与懒人包:Swift 1.5 IQ2S / IQ3XXS 0.1.4,Bonsai2 8G / 12G 0.1.5。四款懒人包共用下方的百度、夸克网盘目录。详情见更新记录。

为 Windows 提供 Swift 1.5 和 Bonsai2 的本地推理方案,支持对话和图片输入,也支持工具调用与 KVMem 长上下文。懒人包解压后双击启动,模型在第一次运行时下载。

选择版本

版本显卡与显存模型入口
Swift 1.5(默认推荐)RTX 30 系,12 GB 以上;RTX 40 系可运行但未实测IQ2S MTP-Q4 约 9.46 GiB;IQ3XXS MTP-Q4 约 10.24 GiB;共用引擎源码使用指南
Bonsai2 12G按 RTX 3060 12GB 调整,面向 RTX 30 系Swift-Bonsai-2 三元模型,约 7.7 GiB12G 版说明
Bonsai2 8G面向 RTX 30 系 8GB;测试在 12GB 卡限制显存完成Swift-Bonsai-2 ptq1,约 6.6 GiB8G 版说明

Swift IQ2S 默认总上下文为 200K,IQ3XXS 为 128K,两者最多可配置 256K;KVMem 会从历史中选取部分内容放入显存。容量上限与长文召回效果请一起看测试结果与已知限制。

下载

懒人包不包含模型。请完整解压,保留 engine、launcher 和 patch 等目录。

四个包都在同一个共享目录里,打开任一网盘后按文件名选择。

网盘共享目录提取码
百度网盘打开共享目录v2sh
夸克网盘打开共享目录XPzf
懒人包版本文件名
Swift 1.5 IQ2S0.1.4ninfer-3060-swift15-q2s-mtp-oneclick-0.1.4.zip
Swift 1.5 IQ3XXS0.1.4ninfer-3060-swift15-iq3xxs-mtp-oneclick-0.1.4.zip
Bonsai2 12G0.1.5ninfer-3060-12g-bonsai2-oneclick-0.1.5.zip
Bonsai2 8G0.1.5ninfer-3060-8g-bonsai2-oneclick-0.1.5.zip

压缩包校验值见 PACKAGES-SHA256SUMS.txt。IQ3XXS 已提供独立懒人包,支持首次下载、SHA256 校验和 MTP-Q4 转换。四包均于 2026-10-13 重新构建,通过短请求和解压自检;验收范围见更新记录。

已转换的无审查 NInfer 模型

以下 Huihui Qwen3.8 27B Abliterated 模型已转换为 NInfer 格式,可从 Hugging Face 下载:

Abliterated 版本会削弱模型的拒答或安全过滤能力。使用前请阅读各自模型卡中的来源、许可和使用警告;Swift 版本的模型卡建议用于研究和本地受控推理,不建议用于面向公众或未成年人的服务。

当前源码 Release:Swift 0.1.4 和 Bonsai2 0.1.5,各附件只含对应引擎系列,均包含最新 BAT/容量修正。本次懒人包的启动器源码已同步到 main。

快速开始

下面以 Swift 1.5 IQ2S 为例:

  1. 准备 Windows 10 / 11、支持 CUDA 13 的 NVIDIA 驱动、12 GB 以上显存。内存建议 32 GB,第一次下载和转换模型需约 22 GB 空闲磁盘。
  2. 下载懒人包,解压到简单路径,例如 D:\ninfer-swift15。
  3. 双击 启动.bat,确认配置后按回车。第一次会下载、校验并转换模型;出现 listening 后即可使用。
  4. 双击 测试.bat 检查回答。连接客户端时,按启动后生成的 接入信息.txt 填写接口和输出上限。

默认接口为 http://127.0.0.1:8084/v1,模型 ID 为 qwen3.8-27b。修改参数、模型准备和客户端接入见使用指南;常见使用问题见下文,已知启动错误见修复记录。

本页导航

Swift 1.5 使用说明

运行前准备

  • Windows 10 / 11,64 位。RTX 30 系、12 GB 以上显存已作为目标;RTX 40 系可运行,但没有实测。
  • NVIDIA 驱动需支持 CUDA 13,现有包建议 580 以上。正常完整解压无需安装 CUDA 或 Python;VC 运行库 DLL 已随包携带。
  • 内存建议 32 GB;第一次准备模型需约 22 GB 空闲磁盘。

把懒人包完整解压到简单路径,例如 D:\ninfer-swift15。engine 中的 DLL 必须与 ninfer-serve.exe 保持在同一目录。

启动和停止

  1. 在 IQ2S 包中双击 启动.bat。默认选择 rk4v4、完整 MTP 输出头、200K 总上下文和自动输出。
  2. 回车确认配置。首次使用会提示下载和转换模型,再按提示确认;下载可以断点续传。
  3. 等待窗口出现 listening。首次遇到没有校准记录的显卡还会测量运行路线,因此比后续启动慢。
  4. 双击 测试.bat 检查回答和速度。用完关闭启动窗口即可停止引擎。

同一时间只运行一个引擎。菜单中回车启动、C 重新配置、R 重新读取空闲显存、Q 退出。

启动.bat last
启动.bat dryrun

last 直接使用保存的配置;dryrun 只显示参数,不启动或下载。

KVMem 与四种组合

按实际提示词分配 KVMem 窗口

当前 main 源码(2026-10-06): 自动 KVMem 模式只确定驻留预算,有限的 API 申请上界随驻留容量变化;不再提前按固定 SYS、固定 36K/平分或 32K 输出封顶划分。引擎按实际 system/developer/工具前缀逐请求分配检索与输出。本引擎的 --default-max-tokens 也会限制显式请求,并非只在客户端不传参数时生效。旧 SYS/sink 配置或初始化种子不等于真实前缀。客户端压缩策略由客户端自行配置,包内不附 DSH 测试启动项。

本轮 main 启动器支持三种驻留选择:recommended 取历史推荐与当前允许上限的较小值,auto 取当前允许上限,也可手动填写范围内的 token 数。推荐值不是硬上限;读不到显存或配置越界时拒绝启动。按 C 先选 KV/输出头/Graph,再选驻留、逻辑上下文和 API 上限;菜单支持数字选项,启动前会重新检查显存。8G 始终按整卡 8GiB 扣除桌面与其他占用。校准范围与短测结果见更新记录。

启动时先按空闲显存确定总驻留容量 C;每次请求再准确计算系统提示、developer 指令和工具定义的完整开头 S。检索不包含 S,输出使用剩余容量。

总上下文检索推荐范围优先目标输出预留
256K32K–36K36KC − S − 检索,至少 8K
128K16K–18K18KC − S − 检索,至少 8K
200K25K–28.125K28.125K同上

开头按完整渲染后的 token 数计算,Bonsai 按 64 token、Swift 按 128 token 对齐。不再固定预留 8K 开头,也不再把 KVMem 输出限制为 16K/32K。容量不足时先缩检索,低于推荐范围会提示;完整开头和 8K 输出都放不下时返回容量错误。实际生成仍受客户端请求长度、剩余总上下文、停止词以及模型结束影响;8K 是显存预留,不保证每次生成 8K。

Harness 在第一次请求前即可配置:contextWindow 填总上下文,maxTokens 使用启动器生成的数字。这是最短开头情况下的申请上限,实际请求的开头更长时,引擎会自动降低本轮输出预算。启动缩窗后重新生成接入信息;本机启动器在允许同步时同步 dsh。旧的手动 OUT/ANSWER、SYS/SINK 和 WINDOW 会迁移到自动分配。

8G 在 12GB 测试卡上也先扣除当前桌面/驱动占用,再按 8GB 预算计算。20K 是小容量测试或低空闲显存下的容量,67K 是假设整块 8GB 空闲时的理想预算;二者不能作为同一台电脑的固定上限。较小窗口可以运行,但超长历史召回可能变差。

支持的四种组合与历史解码测量如下;驻留容量以本次启动为准:

组合总上下文检索目标输出历史解码速度
rk4v4 + 完整头推荐 200K,最多 256K200K 时 28.125K;256K 时 36K剩余容量约 43 token/秒
rk4v4 + 精简头最多 128K18K剩余容量约 47 token/秒
rk8v4 + 完整头最多 128K18K剩余容量历史测量慢 14–22%
rk8v4 + 精简头最多 128K18K剩余容量—
  • rk4v4:对话记录的 K、V 都存 4 位。同样显存可容纳更多 KV;速度与精度差异取决于测试设置,本页新表列出当前同口径速度,旧百分比只作为历史记录。
  • 精简头:MTP 猜字时只在 13 万个常用词里猜,快约 10%,猜中率不变;代价是多占 340 MiB 显存,窗口变小。

修改参数

双击 启动.bat 后按 C,依次选择 KV 格式、MTP 输出头、看图、总上下文、单次输出、固定保留的开头和思考上限。回车保持当前值,选好后会写回 设置.ini。

也可以用记事本编辑 设置.ini 后重新启动:

设置项作用
KVrk4v4 / rk8v4
HEADfull / lite
CTX总上下文,默认 204800
OUTauto,启动前生成 Harness 申请上限;实际预算随请求计算
SYSauto,完整系统/developer/工具定义的实际 token 数
THINK思考上限,0 表示不限
POST_THINKING思考结束后切换正文采样参数,默认 1;设 0 关闭
POST_THINKING_TEMP / POST_THINKING_TOP_P / POST_THINKING_TOP_K正文的温度、top-p、top-k;留空使用引擎预设,温度默认为 0.2
POST_THINKING_SAMPLER正文采样组合,例如 temp=0.2,top_p=0.95
ADAPTIVE_MTP自适应 MTP 草稿长度,默认 0,使用固定 3 token
RECOVER_INVARIANT内部不变量错误时尝试恢复请求,默认 1
VISION是否启用看图
HOST / PORT监听地址和端口
API_KEY访问密码,默认留空
MODEL_ID客户端使用的模型 ID

窗口与自动输出会随空闲显存变化。开头与输出自动分配;启动后以生成的 接入信息.txt 为准。

推理控制设置已包含在当前懒人包中。RECOVER_INVARIANT 只处理引擎支持恢复的内部错误,不能保证所有错误都能恢复。

连接客户端

等待 listening 后,打开自动生成的 接入信息.txt。它包含当前配置和 DeepSeek Harness 的配置示例。

客户端字段默认值或填写方式
接口类型OpenAI 兼容 / Chat Completions
Base URLhttp://127.0.0.1:8084/v1
模型 IDqwen3.8-27b
API Key未设置密码时可填 none,部分客户端不允许为空
contextWindow / 上下文长度与 CTX 一致,默认 204800
maxTokens / 最大输出按本次 接入信息.txt 的数值填写

接口也支持 Anthropic Messages 和 OpenAI Responses。思考内容在 reasoning_content 字段;请求中 enable_thinking: false 可以关闭思考。支持的思考档位为 low / medium / xhigh,加上关闭思考。

一次处理一个请求,多个请求会排队。需要局域网访问时,将 HOST 改为 0.0.0.0 并设置 API_KEY;接入信息中会列出可用地址。

修改 dsh 的配置后,完全退出程序和托盘图标,再重新打开,避免它把内存中的旧配置写回文件。

0.1.0 对客户端发送的较大输出上限按服务端配置封顶;中途压缩、编辑历史或分叉的 KVMem 请求回退到重新预填,因此可能比直接续写慢。多工具 required/any 按 Auto 处理,不能保证一定调用工具;接受 strict:true 的入口也不提供严格 JSON Schema 约束。Swift Responses 入口仍拒绝 strict:true。具体覆盖范围见三项兼容修改与限制。

模型下载和转换

模型来源:魔搭社区 Swift-1.5-Qwen3.8-27B-GSQ-RCO-NInfer。

合并后的 Qwen 3.8 27B 模型库使用上方同一组共享下载目录。

  • 原始下载文件:swift15_iq2s_mtp.ninfer,10,257,632,000 字节。
  • 启动器使用包内 patch 转换成 swift15_iq2_s_mtpq4.ninfer,10,155,600,640 字节。
  • 只修改 MTP 草稿头的 7 个张量,其余模型对象保持原样;下载和转换后都进行 SHA256 校验。
  • 转换使用 PowerShell,无需安装 Python。校验通过后,启动器会删除原始下载文件。
  • 也可以自行下载原始文件,按原名放入 model 目录,再启动完成转换。

文件 hash 和自行生成补丁的方法见编译与开发。已有转换完成的模型可继续使用,升级引擎无需重新下载模型。

包内文件

路径内容
启动.bat / 测试.bat启动和测试入口
设置.ini用户配置
engine/EXE 与运行所需 DLL
launcher/启动器和测试脚本
patch/模型转换的数据补丁
model/初始为空,下载与转换后的模型
版本信息.txt新修复包的构建识别信息
SHA256SUMS.txt / verify-kit-manifest.ps1新版包的核心文件哈希、DLL 完整性和中文文件名检查
verify-arch-engine.ps1新版包的引擎验收脚本,包含短提示、超窗正负对照与多轮复用
logs/ / 接入信息.txt运行时生成的日志和客户端说明

包里的 使用说明.txt 可离线查阅;速度与长文召回范围见测试结果与已知限制。

上述校验和验收工具已包含在当前源码和懒人包中。完整包解压后可运行:

powershell -ExecutionPolicy Bypass -File .\verify-kit-manifest.ps1
powershell -ExecutionPolicy Bypass -File .\verify-arch-engine.ps1

第一项检查文件;第二项会启动测试引擎并占用显存,运行前关闭其他模型。模型默认从包内 model 目录读取,也可用 -ModelPath 指定。SHA256SUMS.txt 和校验脚本对应指定发布构建;自行编译或修改脚本重新打包时,需要一起更新清单与脚本内的预期哈希。

测试结果与已知限制

这里按版本保存已有测量和验证范围。不同工具、模型格式、提示词和输出长度的速度不能直接横向比较;文档整理没有重新测量这些历史结果。256K 是可配置的总上下文,KVMem 每轮只读入选中的历史,不能据此保证所有内容都能精确召回。

质量(困惑度,越低越好)

IQ3XXS 于 2026-10-05 使用独立 ninfer-perplexity 评分入口测量:ninfer-ppl-1m-v1 quick 四个流,context 4096 / stride 2048,rk4v4、GDN FP16、词嵌入放内存。每个模型文件评分 261,167 token、124 个窗口;PPL 预填充及评分分块为 1024,与聊天服务的 512 不同。下表 Bonsai2/IQ2S 列保留历史参考;Bonsai2 原报告已恢复,IQ2S 对应原报告本次未找到。设置不同,不能据此单独归因权重量化差异。

领域Swift-Bonsai-2(历史 int8)IQ2S(历史)IQ3XXS(rk4v4)
中文维基7.894155.4435.29369
PG-198.656297.4397.26160
WikiText7.826746.3216.21847
NInfer 代码1.859721.7161.69572
总体5.628434.5874.49564

IQ3XXS 原始 MTP Q6 与转换后的 Q4 文件,总体均为 4.495637819904494;124 个窗口在报告精度下逐项一致。CausalScoring 只测主模型,不运行 MTP 草稿或视觉塔,不能据此声称草稿质量、接受率或多模态能力不变。Q4 原始报告、Q6 原始报告、已找到的 19 份报告。早期 custom 语料结果属于流水线/参数扫描记录,不是更多项可直接对比的质量认证。

速度(RTX 3060 12GB)

2026-10-05,RTX 3060 12GB / Windows;完整输出头、MTP draft3、CPU 看图、prefill chunk512。文本/代码输入分别为 56/49 token,输出 256 token;每组预热 1 次、正式 3 次。生成速度是引擎 decode 中位数(token/s),不是端到端吞吐。

配置Graph测试驻留窗口文本生成代码生成
Bonsai2 12G · int8关98K45.8345.11
Bonsai2 12G · int8开98K47.1946.57
Bonsai2 12G · rk8v4关131K45.0945.95
Bonsai2 12G · rk8v4开131K46.6747.74
Bonsai2 8G · rk4v4关48K32.2631.03
Swift IQ2S · rk4v4关73K42.2144.93
Swift IQ2S · rk4v4开73K43.2446.12
Swift IQ2S · rk8v4关49K42.1947.13
Swift IQ2S · rk8v4开49K43.2748.33
Swift IQ3XXS · rk4v4关37K44.3446.03

无缓存预填充:实际输入为 2K / 8K / 16K,每档预热 1 次、正式 3 次,最多生成 8 token。下表是 prefill 中位速度,首 token 延迟(TTFT)单列;引擎计时和 usage 输入计数一致,缓存命中为 0。

配置Graph2K 预填充8K 预填充16K 预填充16K TTFT(秒)
Bonsai2 12G · int8关818.60813.05743.9322.04
Bonsai2 12G · int8开805.78791.72733.6722.34
Bonsai2 12G · rk8v4关803.26790.37734.3122.32
Bonsai2 12G · rk8v4开805.24790.50735.1222.30
Bonsai2 8G · rk4v4关558.43557.65533.9030.71
Swift IQ2S · rk4v4关483.66498.10489.0233.55
Swift IQ2S · rk4v4开483.40497.85489.3633.52
Swift IQ2S · rk8v4关484.26498.14490.3833.44
Swift IQ2S · rk8v4开483.59498.52490.6533.44
Swift IQ3XXS · rk4v4关500.47515.41505.6932.44

10 个配置共计 90 个正式 prefill 样本、30 个预热样本。不同模型驻留量不同;同模型/KV 的 Graph 对照使用相同窗口,小幅差异不构成普遍提速保证。输入均未超出驻留窗口,不代表超长历史换页速度。表中 IQ3 37K、Bonsai8 48K 是当时测试窗口,当前推荐档为 IQ3 33K、Bonsai8 36K,均不是硬上限;auto 和手动驻留受实时显存及匹配组合的校准边界限制。IQ3 首次因余量 223.68 MiB 触发旧 300 MiB 规则,重试完成,异常记录保留。原始指标与方法。

长上下文

场景结果
12 万 token 长文藏一句话找到;多轮追问、切到别的对话再切回都正常
19 万 token 长文藏句、工具调用、多轮复用单次输出 16K 时 5 次全部通过;输出调到 23K(检索区变小)时,工具那一项没过
25 万 token 长文藏一句话没找到:暗号所在的那一块没被挑进显存(见本页的已知限制)
6 万 token 对话,超出显存窗口以后接着问每轮 2–4 秒(改之前每轮约 140 秒)

测试环境

项配置
显卡RTX 3060 12GB(28 SM,显存带宽 360 GB/s)
CPURyzen 7 3700X
内存32 GB(Host KV:200K 上下文预留 8 GB,256K 预留 10 GB)
系统Windows 11
前端DeepSeek Harness 桌面版(其他 OpenAI 兼容客户端也能用)

已知限制

  • 25 万 token 藏句没找到:按块打分时,暗号所在那一块得分偏低,没被挑进显存。需要精确查找时,材料尽量控制在 12–19 万以内;贴很长的材料时,先发材料,再单独发一条问题,召回会好很多。
  • 第一次读入慢:19 万约 9 分钟,25 万约 12 分钟。之后接着问很快。
  • 一次只处理一个请求:同时发多个会排队。
  • 单次输出(含思考)有上限:自动时 3060 上约 23–28K,超过会被截断,写很长的东西要分几步。
  • 显存大于 12 GB 的卡:窗口有上限,多出来的显存暂时用不上。
  • 只支持 RTX 30 / 40 系:引擎按 sm_86 编译。RTX 50 系请用 Ryan-gsq 分支的官方预编译包。

测试方法

  • 速度用引擎项目自带的 refbench,困惑度用 ninfer-perplexity。开关交替测,排除显卡过热降频的影响。
  • 长上下文用藏句找回、多轮追问、工具调用、切对话再切回测试,每次改动后都回归。
  • 懒人包实测过下载(含断点续传)、校验、补丁转换、真机启动和 测试.bat。

技术实现

下列性能数字对应原有测试,不表示每次更新都会再次获得同等提升。按日期发生的修复和发布状态见更新记录。

1. 让新引擎在 RTX 30 系上跑

Swift 1.5 的模型格式(GGUF 量化块,IQ2_S / IQ3_XXS 等十几种)只有 ninfer-all 这条新分支能读,它的预编译包只支持 RTX 50 系。移植时:

  • 按 sm_86 编译,补齐 cuBLAS 等依赖;
  • 精简引擎(编译开关 NINFER_SLIM_3060):只保留单卡、单路要用的注意力内核,显存和编译时间都省下来;
  • SM 数运行时自动识别:同一个程序在 3060(28 SM)和更大的卡上都能用,不用重新编译。

2. KVMem:12 GB 显存跑 256K 上下文

  • 底子是 qzshch/ninfer-kvmem 在新引擎结构上的实现:完整对话放内存(Host KV),显存块表里用"空洞"表示不在显存的页,位置保持原样;
  • Windows 上 Host KV 改用可分页内存:原来用锁页内存,Windows 上分不出 8 GB;
  • 检索按 kv9 的做法完整移植:按消息分段做查询,挑块时对准换行,打分时排除开头、保护块和最近块,CPU 打分矩阵化、多线程;
  • 和 MTP 投机解码、看图都兼容。

3. 输出留在显存、超窗后只重算新内容

  • 单次输出整段预留在显存里,不会被挤出去;开头(系统提示)固定保留;
  • 历史超出窗口以后,多轮对话只重算新内容。6 万 token 的对话,接着问每轮从约 140 秒降到 2–4 秒;
  • 多个对话来回切时,长对话的接续点不会被挤掉。

4. 省显存(每一项都换成更大的窗口)

改动省下代价
词嵌入放内存(--embedding-host)约 360 MiB无,速度不变
视觉权重放内存(overlay)约 280 MiB第一张图约 1.7 秒
MTP 草稿头压成 Q4(用补丁改模型文件)约 95 MiB无,速度和猜中率在波动范围内
rk4v432K 上下文省约 260 MiB困惑度 +0.10%

5. 提速

  • 注意力跳过不在显存的空洞页;
  • 页面从内存搬上显卡时批量拷贝(gather),按碎片程度自动选用;
  • 精简 MTP 输出头做成可选项(+10.5%)。

6. 启动器

  • 按启动时的空闲显存自动算窗口,整卡留约 150–200 MiB;估多了引擎会报真实可用量,启动器自动缩小窗口重试;
  • 单次输出可以选"自动",按窗口大小分配;
  • 先显示上次配置,回车直接启动;按 C 一步步重新选,每一步都写着推荐值和上限。

当前源码中的构建支持

改动内容
KVMem移植 qzshch/ninfer-kvmem 的空洞块表、设备放置事务、稀疏工作集、滚动预填窗口、解码环形窗口和检索机制
3060 精简NINFER_SLIM_3060 保留单卡、单路、H24 注意力和 int8 / rk8v4 / rk4v4 内核
内存和显存Windows Host KV 用可分页内存;词嵌入放锁页内存;开头和输出按环境变量预留
kv9 检索按消息分段查询、对准换行、排除开头/保护块/最近块、CPU 打分矩阵化多线程;默认查询行数 1024
注意力和换入跳过空洞页;页面换入按碎片程度自动选批量 gather
SM 自适应GDN 路线表运行时按真实 SM 数选择;rope 容量 = 6 × SM
Windows 显存预算引擎读取 CUDA 和 NVML 空闲显存,NVML 可用时取两者较小值;NINFER_FREE_VRAM_MIB 可进一步限制预算
KVMem 内容打分包含单段查询和达到提示窗口边界的选择路径,日志用 kvmem_score: SELECT 标识
连接保活Windows TCP 保活为 10 秒 / 3 秒,HTTP 连接保活 120 秒,读写超时 300 秒

后三项对应 2026-10-04 同步的源码。它们的修复背景和发布状态见更新记录;原有性能表保持此前测量结果。

源码与编译

Swift 1.5 IQ2S 与 IQ3XXS 共用的完整引擎源码在 swift15/engine/,包含 CMake 工程和实现代码,应用、测试及第三方源码也在目录中。当前 IQ2S 懒人包的启动器和设置在 swift15/oneclick-iq2s/,构建脚本在 swift15/scripts/。目录索引见 swift15/README.md。

Bonsai2 8G 与 12G 共用的引擎源码、构建脚本和两套启动器已公开在 bonsai2/。两种显存方案使用不同模型文件和启动配置;引擎改动共用。从源码编译见 12G README 和 8G README。

从源码编译

1. 下载源码

git clone https://github.com/5258MF/ninfer-rtx3060-27b.git
cd ninfer-rtx3060-27b

也可以在 GitHub 上点击 Code → Download ZIP。IQ2S / IQ3XXS 共用的引擎源码位于 swift15/engine/,上游基线是 Ryan-gsq 分支 b06908b,此前的改动均已合入。

2. 环境(Windows)

  • CUDA 13.x(要带 cuBLAS;我们用的是 13.3)
  • MSVC 2022(C++ 桌面开发)、CMake、Ninja
  • FFmpeg 开发包(看图用)、zlib、libcurl(我们用 conda 里的)

3. 编译

改好 swift15/scripts/build-sm86.bat 开头的 CUDA、MSVC 和依赖路径,然后在仓库根目录运行:

swift15\scripts\build-sm86.bat

脚本默认使用仓库里的 swift15/engine/,输出到 swift15/build/;源码和构建路径使用纯英文路径。产物是 swift15/build/apps/ninfer-serve.exe。把它和运行要用的 DLL(cudart、cublas、cublasLt、FFmpeg、zlib、libcurl、libssh2、libcrypto、zstd 等)放到懒人包的 engine\ 目录。

  • 只编译 sm_86。RTX 30 系能跑,RTX 40 系(sm_89)二进制兼容也能跑;RTX 50 系不行,请用上游的预编译包。
  • SM 数在运行时自动识别,不同型号不用重新编译。
  • 改动头文件以后,完整重新编译可能要近 1 小时。

4. 必须加的启动参数

单卡 12 GB 上,--device-state-slots 0 --prefill-chunk 512 必须加,否则显存不够。完整参数由启动器生成,大致是:

ninfer-serve swift15_iq2_s_mtpq4.ninfer --model-id qwen3.8-27b
  --kv-dtype rk4v4 --gdn-state-fp16 --spec mtp --draft-tokens 3
  --max-context 204800 --kv-capacity auto --kvmem-window-pages <按空闲显存算>
  --host-kv-mib 8192 --device-state-slots 0 --prefill-chunk 512
  --cuda-graph-allowance-mib 144 --default-max-tokens <输出>
  --max-private-continuations 4 --embedding-host
  [--lm-head-draft] [--vision --vision-residency overlay --vision-max-merged 4096]

环境变量:NINFER_KVMEM_SINK_PAGES(开头保留页数)、NINFER_KVMEM_GEN_RESERVE_PAGES(输出预留页数)、NINFER_KVMEM_LONG_REUSE=1。Windows 上开 KVMem 时 Host KV 自动用可分页内存(NINFER_HOST_KV_PAGEABLE=0/1 可以强制)。1 页 = 64 token。这些值由启动器源码计算。

模型补丁与转换工具

懒人包不放模型,第一次启动时从魔搭下载 swift15_iq2s_mtp.ninfer(10,257,632,000 字节,SHA256 2df7259e93cbbb972183966e40ff23392e66a8ce4fc84748d08849bc6182045e),再用补丁转成 swift15_iq2_s_mtpq4.ninfer(10,155,600,640 字节,SHA256 1941ef5f4bd4be61938521236d0e499c5e6d69ff69b4fbcfe83527f7fd9b3bdd)。

自己生成模型补丁(在 swift15/engine/ 里运行,要 pip install gguf numpy torch):

python -X utf8 -m tools.mtpq4 swift15_iq2s_mtp.ninfer swift15_iq2_s_mtpq4.ninfer
python -X utf8 -m tools.mkpatch swift15_iq2s_mtp.ninfer swift15_iq2_s_mtpq4.ninfer patch_out

两个脚本已经放在引擎的 tools/ 目录,会使用同一源码树中的 tools.artifact。

mtpq4.py 只改 MTP 的 7 个张量:注意力 query/gate(Q4)、key/value(Q8,引擎的 linear_pair 只收 Q8)、注意力 output(Q4)、MLP gate+up 和 down(Q4);input_projection 没有对应形状的 Q4 内核,保留 Q6_K。量化用项目自带的 quantize_matrix_mse。其余对象逐字节复制。

升级现有包

重新编译后替换包内 engine/ninfer-serve.exe,保留完整依赖 DLL。已经下载和转换的模型可以继续使用;修复所需版本见更新记录。

常见问题

显存或主机内存分配失败

情况处理
显存分配失败或窗口放不下关闭其他占显存程序;按 R 重新读空闲显存,或按 C 调小单次输出
运行后突然很慢检查是否显存被其他程序占用,释放后重新启动
cudaMallocHost / bad allocation检查主机内存和其他模型占用,可调小总上下文;缩显存窗口不能覆盖所有主机锁页失败
已有模型运行或端口占用关闭原模型,或修改 设置.ini 的 PORT

启动器只处理它识别的容量报错,不能保证所有分配失败都自动恢复。输入很长的材料时,也需要考虑长文召回范围。

下载、转换与客户端

  • 下载中断:重新启动,已有 .part 文件会继续下载。
  • 校验失败:检查模型文件是否完整,按包内说明重新下载。
  • 补丁缺失:重新完整解压 patch 目录;现成的转换后模型可以继续使用。
  • 客户端输出截断:最大输出按本次生成的 接入信息.txt 填写;思考也占输出预算。
  • dsh 改完不生效:退出程序与托盘图标后再打开,避免旧配置写回。
  • 窗口闪退:在包目录地址栏输入 cmd,再运行 启动.bat 查看具体错误。

引擎日志在包内 logs 目录。分享错误信息时,去掉 API Key 等私人信息。

DLL 缺失、KV 容量曲线越界或首次显卡校准失败时,见启动错误与处理。

来源与许可

代码许可与模型许可分别适用。Swift 1.5 引擎代码的 Apache-2.0 文本见 swift15/LICENSE,源文件保留上游许可证和贡献者信息。

  • Swift-1.5 Qwen3.8-27B GSQ-RCO:UkisAI(Swift Open License v1.0,允许署名再分发;年收入超过 100 万美元的商用需要另外和 UkisAI 谈);基座 Qwen3.8-27B(Apache-2.0)。
  • .ninfer 格式模型:魔搭社区 fyb423 转换发布(Swift-1.5-Qwen3.8-27B-GSQ-RCO-NInfer)。
    • 本项目对模型的改动(Swift Open License 4(b) 要求的变更说明):只把 MTP 草稿头的 7 个张量从 Q6_K 重新量化成 Q4(query/gate、output、MLP)和 Q8(key/value),其余权重逐字节不变。懒人包里只放补丁,不放模型本身,模型由用户从魔搭下载。
  • 引擎:Ryan-gsq/ninfer-16g-5070ti-5080-5090-qwen3.8-27b-gsq-rco(Apache-2.0),它是 iamwavecut/ninfer-all 的分支,最早来自 Neroued/ninfer。
  • KVMem:qzshch/ninfer-kvmem(Apache-2.0)的新引擎实现;kvmem-llama.cpp 项目和它的论文。
  • 3090 分支和其他 3060 用户公开的调优记录,也提供了很多参考。