1716 字
5 分钟
Ternary-Bonsai-2-27B-PTQ1_0 性能测试报告
2026-09-21

Ternary-Bonsai-2-27B-PTQ1_0 性能测试报告#

日期:2026-09-20 服务器:139.196.207.146(KVM,2× RTX 4090 48GB,无 NVLink) 测试方式:SSH 远程调用 :8188 的 OpenAI 兼容 API(/v1/chat/completions),全部在服务器本地执行,消除网络误差;单并发/多并发的吞吐数字以 llama.cpp 服务器日志的 print_timing 为准。


1. 部署信息#

引擎llama.cpp(PrismML 分支)llama-server,容器 bonsai-2-27b
模型文件Ternary-Bonsai-2-27B-PTQ1_0.gguf,5.6 GB
量化PTQ1_0,1.75 bit 三值化(ternary,group 128)
参数量26.896 B(n_params 26,895,998,464)
GPURTX 4090 #1,显存占用 23.0 GB,-ngl 99 全量上卡
并行--parallel 4:4 个独立 slot,每 slot 64K 上下文(总 KV 预算 256K token)
Flash Attentionon
采样temp 0.7 / top-p 0.95 / top-k 20
多模态无(纯文本)

上下文配置(回答用户问题)#

说明
compose 请求-c 262144(262K)目标值
实际生效n_ctx_slot = 65536(64K)显存装不下 262K,llama.cpp 自动降档
模型训练长度n_ctx_train = 262144模型本身支持 262K
全服务总容量4 slot × 64K = 256K token单请求最大 64K

结论:本部署下单请求上下文上限 = 64K。“拉满”即 ~60K(64K 减去生成余量)。


2. 测试方法#

  • 中文填充文本精确构造 prompt(每单位 ~17 token),档位:~130 / ~860 / ~5.7K / ~32K / ~40K token
  • 生成长度 128 / 256 token
  • 并发档位:短上下文 1、4;长上下文 1、2(llama.cpp 只有 4 个 slot,更高并发只会被 LRU 抢占排队,无额外并行收益)
  • 指标来源:API usage(prompt/completion tokens)+ 服务器日志 print_timing(prompt eval / token eval 真实速率)

3. 结果汇总#

3.1 单并发#

场景prompt (tok)生成prefill 速度decode 速度TTFT(≈prefill)总耗时
短上下文 A(~130 tok)159128834 t/s27.3 t/s1.49 s6.04 s
短上下文 B(~860 tok)863128821 t/s34.7 t/s2.54 s5.6 s
中上下文(~5.7K tok)5,6632561,554 t/s87.7 t/s3.62 s6.52 s
长上下文(~32K tok)32,063256*1,531 t/s75.4 t/s20.92 s22.41 s
拉满(~40K tok)40,0631281,377 t/s72.2 t/s6.19 s7.94 s

* 该请求模型实际生成 113 token 后 EOS 结束(对重复填充文本提前总结完毕)。

3.2 多并发(4 路)#

场景并发每路 prompt聚合 decode每路 decode 范围批耗时
短上下文(~130 tok)415939.7 t/s(=4 路全并行)27.3 → 34.7 t/s12.91 s
短上下文(~860 tok)486380.9 t/s33.7 ~ 35.1 t/s(几乎无损)6.33 s
中上下文(~5.7K tok)45,66340.1 t/s(未全并行,含抢占)8.1 ~ 38.1 t/s16.08 s
长上下文(~32K tok)232,06315.4 t/s(排队为主)5.9 ~ 57.1 t/s22.39 s
拉满(~40K tok)240,06326.6 t/s16.3 ~ 44.3 t/s9.63 s

3.3 关键行为:slot LRU 抢占#

4 个 slot 各自独占 64K KV。当进行中的请求数 > 4,或新请求比占坑的大时,llama.cpp 按 LRU + LCP 相似度 抢占最久未用的 slot,被抢占请求从头重算。实测案例:

  • 5.7K 并发 4 路中,一路任务(slot 0)被后来的 32K 任务抢占,prompt 重算到 5,316 token 后中止,decode 被压到 8.1 t/s,最终 115 token 用了 12.6 s(正常应 2.9 s)。
  • 32K 双并发中,一路 22K 的旧任务在 100 token 处被抢,decode 只剩 4.9 t/s。

含义:llama.cpp 的”并发”是固定 slot 池,不是真正的连续批处理(continuous batching)。大请求会踢掉小请求,混规模负载下尾延迟不可控。


4. 与其他引擎的对比(同机 GPU1 48GB)#

指标Bonsai(1.75-bit 三元)NInfer Qwen3.8-27B(~10-bit,GPU1 曾部署)sglang Qwen3.8-27B AWQ W4A16(GPU0)
权重显存5.6 GB16.7 GB~17.8 GB
部署总显存23.0 GB23.5 GB42.5 GB
单流 decode(短)27 ~ 35 t/s89 ~ 97 t/s53 t/s
单流 decode(~5.7K)87.7 t/s~101 t/s52.5 t/s
单流 decode(32K)75 t/s~86 t/s~52 t/s
prefill 速度821 ~ 1,554 t/s1,300 ~ 2,990 t/s—(chunked 16K)
最大上下文/请求64K262K262K
并发模型4 固定 slot,LRU 抢占串行调度(max-concurrency 4)连续批处理(16 并发 336 t/s)
16 并发聚合吞吐不适用(4 slot 上限)125 ~ 162 t/s336 ~ 341 t/s

解读

  • 1.75-bit 权重让 Bonsai 在小上下文(KV 短、decode 受权重带宽限制)时只有 27 ~ 35 t/s——比 NInfer 慢 2.5~3 倍,甚至比 sglang 的 4-bit AWQ 还慢。三元量化的反量化/带宽路径是瓶颈。
  • 长上下文(KV 读取占大头)时三者差距收敛到 1.2~1.5 倍,Bonsai 75 t/s @32K 属于可用水平。
  • prefill 是 Bonsai 的强项:1,531 ~ 1,554 t/s 的 prompt 处理速度,40K 上下文 TTFT 可低至 6 s(KV 命中时)。
  • 高并发服务能力 sglang 完胜(连续批处理 vs 固定 slot)。

5. 内容质量观察#

  • 回答连贯、无乱码,能正确完成”总结重复文本”的任务;
  • 对纯重复填充文本,模型会提前 EOS(32K 档只生成 113 token),属正常行为;
  • 1.75-bit 三元量化下未见明显语言退化(本次测试样本均为结构化任务,未做开放式创作/数学推理抽检)。

6. 结论与建议#

  1. 上下文:当前部署单请求上限 64K(请求的 262K 被显存限制自动降档)。如需真正 262K,需把 -np 降到 12 并减少单 slot 竞争,或换更大显存/量化更省的方案——但 5.6GB 三元权重下 262K 单请求 KV 约 1015GB,理论可行,需要重启容器调整 -c-np 组合(本次为只读测试,未修改)。
  2. 定位:Bonsai 适合长文档单用户分析(高 prefill + 75 t/s decode + 64K 上下文 + 极低权重占用),不适合多用户服务(4 slot 抢占机制尾延迟差)和高频短对话(decode 偏慢)。
  3. 与现有服务分工:GPU0 sglang 继续承担多用户/多模态主力;GPU1 上 Bonsai 与 NInfer 二选一——追求速度选 NInfer(Qwen),追求”最小显存占用跑长上下文”选 Bonsai。
  4. 量化代价明确:1.75-bit 换来了 1/3 的权重体积,但 decode 在小上下文下比 4-bit 还慢,属于”省显存、费带宽”的路线,选型时按显存紧张程度决定。

附录:原始数据#

  • 本地:F:\ds-harness-workspace\bonsai_bench_results.json(API 层 usage/wall)
  • 服务器:/tmp/bench_bonsai.py(压测脚本)、docker logs bonsai-2-27b(print_timing 原始速率)
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Ternary-Bonsai-2-27B-PTQ1_0 性能测试报告
https://blog.goodnightan.com/posts/ternary-bonsai-2-27b-ptq1_0-test-report/
作者
晚安
发布于
2026-09-21
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录