2026年10月3日
bonsai2_3060_cover

RTX 3060 部署 Bonsai 2 27B:12GB 显存实测与服务教程

本文以 Ubuntu 与 NVIDIA RTX 3060 12GB 为例。主机名、用户名、目录、IP 和网段均已替换为通用示例,请按自己的环境修改。

结论与实测边界

Bonsai 2 27B 是基于 Qwen3.8-27B 的 27B 级混合注意力模型,采用三值权重和运行时 Hadamard 激活变换。PQ2_0 语言模型约 7.21 GB,视觉投影器约 0.63 GB;它不是“7B 模型”,只是权重文件更小。官方模型卡 标注的上下文上限为 262K token。

本文对应的服务已实际确认加载 Ternary-Bonsai-2-27B-PQ2_0.gguf,运行在 RTX 3060 12GB 上。单并发 API 压测在 512–8192 token 输入、固定生成 128 token 时,平均 Prefill 为 511.70 tokens/s,平均 Decode 为 32.76 tokens/s。

项目 结果
GPU NVIDIA GeForce RTX 3060,12 GB 显存
模型与格式 Bonsai 2 27B,PQ2_0 GGUF
运行时 PrismML llama.cpp fork(CUDA)
服务配置 全层 GPU offload、128K 配置、Q4_0 K/V Cache、单并发
测试输入 / 输出 512–8192 token / 固定 128 token
平均 Prefill 511.70 tokens/s
平均 Decode 32.76 tokens/s
Decode P50 / P90 / P95 32.63 / 34.77 / 35.03 tokens/s
Decode 范围 30.54–35.34 tokens/s

Prefill 是输入处理吞吐,Decode 是逐 token 生成吞吐;不要把 Prefill 直接称为“首字延迟”。

本次数据是指定输入范围内的单并发、端到端 API 服务吞吐,不是 llama-bench 裸内核成绩。服务用 -c 131072 成功按 128K 上下文配置启动,但压测最大输入只有 8192 token,不能据此宣称已经完成 128K 满载稳定性或质量测试。运行时约 10.78 GiB 的显存占用是快照,不是长上下文请求过程的峰值。

EvalScope 基础能力评估:Bonsai 2 与 Qwen3.8 27B Q4_K_M

速度数据只采用本文开头的 RTX 3060 截图压测。下面的 EvalScope 记录用于考察基础能力,不用于推导 tokens/s、TTFT 或硬件性能。

两模型均完成同一批 102 条评测样本:AIME-2024(10)、C-Eval(20)、IFEval(20)、Live-Code-Bench(10)和 MMLU-Pro(42)。所有请求均成功完成。模型分别为 Bonsai-2-27B-PQ2_0 与 Qwen3.8-27B-Q4_K_M-128K。

基准 样本数 指标 Bonsai 2 PQ2_0 Qwen3.8 27B Q4_K_M
AIME-2024 10 Accuracy 20.00% 30.00%
C-Eval 20 Accuracy 85.00% 85.00%
IFEval 20 Prompt-level strict 65.00% 70.00%
Live-Code-Bench 10 Pass@1 30.00% 40.00%
MMLU-Pro 42 Accuracy 59.52% 80.95%

这批结果呈现出清晰但有限的结论:Bonsai 在 C-Eval 与 Qwen Q4 持平;在数学、指令遵循、代码和 MMLU-Pro 这四个抽样指标上落后于该 Qwen Q4 基线,其中 MMLU-Pro 的差距最大。它支持“Bonsai 是可运行的 27B 级本地 Agent 模型”这一定位,但不支持把它表述成对 Qwen3.8 27B Q4 的全面能力替代。

如何正确引用这组评估

评测记录来自内部 EvalScope 仪表盘,运行时间为 2026-09-17 至 2026-09-18。每项仅有 10–42 条样本,总计 102 条;它适合作为可追溯的功能抽样,而不是统计显著的模型排行榜,也不能替代厂商的完整 benchmark 套件或第三方大规模复现。

公开发布时,建议附上仪表盘的评估截图与导出的原始 JSON。仪表盘只在受控内网开放,文章不公开其访问地址;同时应保留基准版本、提示词模板、采样设置和运行时版本,以便后续复测。

为什么必须使用 PrismML 运行时

Bonsai 2 的 PQ2_0 与 PTQ1_0 依赖三值权重内核和 Hadamard 激活变换。普通 stock llama.cpp 不具备这套支持,可能拒绝加载,或输出无意义结果。请使用 PrismML-Eng/llama.cpp 或 Bonsai Demo 下载的配套运行时。

组件 大小 说明
PTQ1_0 语言模型 5.95 GB 优先考虑显存最紧张的环境
PQ2_0 语言模型 7.21 GB 本文实测所用;官方说明其提示词处理通常更快
mmproj-Q8_0 约 0.63 GB 图像输入需要;纯文本可不加载

“约 5.9 GB”只指 PTQ1_0 的语言模型,不等于 PQ2_0 加视觉投影器的总大小。

部署前检查

以下命令针对 Ubuntu 22.04/24.04:

nvidia-smi
git --version
curl --version

# 仅在手动编译时需要。
sudo apt update
sudo apt install -y build-essential cmake git curl python3-pip

export APP_DIR="$HOME/bonsai2-serve"
mkdir -p "$APP_DIR"
cd "$APP_DIR"

方案 A:推荐,官方 Demo 自动安装

官方 Demo 是最稳妥的路径:它会下载与模型匹配的 PrismML llama.cpp 二进制和权重。下面关闭可选 Open WebUI 与代码解释器,减少额外下载:

git clone https://github.com/PrismML-Eng/Bonsai-demo.git
cd Bonsai-demo
BONSAI_OPENWEBUI=0 BONSAI_CODE_INTERPRETER=0 ./setup.sh
./scripts/start_llama_server.sh

验证默认本机服务:

curl http://127.0.0.1:8080/health
curl http://127.0.0.1:8080/v1/models

官方 Demo README 是每个平台运行参数、预编译二进制和兼容性变化的首选参考。它支持 macOS、Linux CUDA、Vulkan、ROCm 与 CPU 路径。

方案 B:手动下载,适合自建目录与 Systemd

下载配套框架

从源码构建 CUDA 版 PrismML fork:

cd "$APP_DIR"
git clone https://github.com/PrismML-Eng/llama.cpp.git runtime
cmake -S runtime -B runtime/build \
  -DCMAKE_BUILD_TYPE=Release \
  -DGGML_CUDA=ON
cmake --build runtime/build -j"$(nproc)" --target llama-server

二进制将位于 $APP_DIR/runtime/build/bin/llama-server。不想编译时,可从 PrismML llama.cpp Releases 下载与系统和 CUDA 运行时匹配的 Linux x64 CUDA 预编译资产;不要把旧教程中写死的 release tag 当作长期下载地址。

下载模型

模型官方下载页为 prism-ml/Ternary-Bonsai-2-27B-gguf。以下下载本文使用的 PQ2_0,以及可选的视觉投影器:

python3 -m pip install --user -U "huggingface_hub[cli]"
mkdir -p "$APP_DIR/models"

hf download prism-ml/Ternary-Bonsai-2-27B-gguf \
  Ternary-Bonsai-2-27B-PQ2_0.gguf \
  --local-dir "$APP_DIR/models"

# 仅在需要图像输入时下载;纯文本服务可跳过。
hf download prism-ml/Ternary-Bonsai-2-27B-gguf \
  Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf \
  --local-dir "$APP_DIR/models"

# 建议记录校验值,便于复现和排错。
ls -lh "$APP_DIR/models"
sha256sum "$APP_DIR/models"/*.gguf

启动 OpenAI 兼容服务

先仅绑定本机,这是推荐默认值。图像功能需要 --mmproj;纯文本服务可删除该行。

export BIN="$APP_DIR/runtime/build/bin/llama-server"
export MODEL="$APP_DIR/models/Ternary-Bonsai-2-27B-PQ2_0.gguf"
export MMPROJ="$APP_DIR/models/Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf"

"$BIN" \
  -m "$MODEL" \
  --mmproj "$MMPROJ" \
  --host 127.0.0.1 \
  --port 8080 \
  -ngl 999 \
  -fa on \
  -c 131072 \
  -np 1 \
  --cache-type-k q4_0 \
  --cache-type-v q4_0 \
  --jinja \
  --alias bonsai2-27b \
  --temp 1.0 --top-p 0.95 --top-k 20
  • -ngl 999:请求将全部可卸载层放到 GPU,实际层数由运行时决定。
  • -c 131072:将服务上下文配置为 128K,不是向模型“扩展”上下文。
  • -np 1:限制为单并发槽位,适合 12GB 显存上的个人或单用户服务;它不等于“把四份 KV Cache 必然缩成一份”。
  • --cache-type-k/v q4_0:4-bit KV Cache,属于面向长上下文的实验性优化,需按业务样本评估质量。
  • --jinja:启用模型聊天模板和工具调用格式。

官方 KV Cache 文档 估算 Q4 KV Cache 为约 18 KiB/token,即约 1.8 GiB/100K token;128K 理论约 2.25 GiB。还要为 CUDA 运行时、激活、视觉投影器和显存碎片预留余量。

设置为 Systemd 常驻服务

建立启动脚本:

mkdir -p "$APP_DIR/scripts"
nano "$APP_DIR/scripts/start-bonsai2.sh"

写入:

#!/usr/bin/env bash
set -euo pipefail

APP_DIR="${APP_DIR:-$HOME/bonsai2-serve}"
BIN="$APP_DIR/runtime/build/bin/llama-server"
MODEL="$APP_DIR/models/Ternary-Bonsai-2-27B-PQ2_0.gguf"
MMPROJ="$APP_DIR/models/Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf"

exec "$BIN" \
  -m "$MODEL" \
  --mmproj "$MMPROJ" \
  --host "${BONSAI_HOST:-127.0.0.1}" \
  --port "${BONSAI_PORT:-8080}" \
  -ngl 999 -fa on -c "${BONSAI_CTX:-131072}" -np "${BONSAI_PARALLEL:-1}" \
  --cache-type-k q4_0 --cache-type-v q4_0 \
  --jinja --alias bonsai2-27b \
  --temp 1.0 --top-p 0.95 --top-k 20
chmod +x "$APP_DIR/scripts/start-bonsai2.sh"
sudo nano /etc/systemd/system/bonsai2.service

写入,且将 YOUR_LINUX_USER 替换为普通 Linux 用户:

[Unit]
Description=Bonsai 2 27B OpenAI-compatible server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=YOUR_LINUX_USER
WorkingDirectory=%h/bonsai2-serve
Environment=BONSAI_HOST=127.0.0.1
Environment=BONSAI_PORT=8080
Environment=BONSAI_CTX=131072
Environment=BONSAI_PARALLEL=1
ExecStart=%h/bonsai2-serve/scripts/start-bonsai2.sh
Restart=on-failure
RestartSec=3
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now bonsai2.service
systemctl status bonsai2.service --no-pager
journalctl -u bonsai2.service -f

API 验证与工具调用

确认模型元数据。应看到 PQ2_0、约 26.9B 参数及配置的上下文:

curl -s http://127.0.0.1:8080/v1/models

最小文本调用:

curl -s http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bonsai2-27b",
    "messages": [{"role": "user", "content": "用一句话介绍三值量化。"}],
    "max_tokens": 128,
    "chat_template_kwargs": {"enable_thinking": false}
  }'

工具调用格式测试:

curl -s http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "bonsai2-27b",
    "messages": [{"role": "user", "content": "请查询东京天气。"}],
    "tools": [{
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "查询一个城市的天气",
        "parameters": {
          "type": "object",
          "properties": {"city": {"type": "string"}},
          "required": ["city"]
        }
      }
    }],
    "chat_template_kwargs": {"enable_thinking": false}
  }'

返回 tool_calls 只表示模型提出调用建议;函数执行、参数校验和结果回填仍由 Agent 或应用程序负责。

局域网开放:先做好访问控制

llama-server 的 OpenAI 兼容接口不等于完整生产级网关。不要把 8080 直接暴露到公网,也不要在未经限制的网络中绑定 0.0.0.0。

只向受信任局域网开放时:

  1. 将 Systemd 中 BONSAI_HOST 改为 0.0.0.0。
  2. 用防火墙仅允许自己的局域网网段。
  3. 重启服务,再从另一台设备用服务器的实际私网 IP 验证。
# 请将示例网段替换为真实、受信任的 CIDR。
sudo ufw allow from 192.168.1.0/24 to any port 8080 proto tcp
sudo systemctl restart bonsai2.service

# 在局域网另一台设备上执行。
curl http://SERVER_LAN_IP:8080/health
curl http://SERVER_LAN_IP:8080/v1/models

需要跨网络访问时,优先 VPN、Tailscale 或带鉴权的反向代理,而非直接映射端口。

如何复现实测数据

本次单并发压测使用 512、1024、1536……8192 token 输入,每档固定输出 128 token,超时 30 秒。公开自己的结果时,至少记录:

类别 应记录内容
硬件 GPU 型号、显存、驱动版本
模型 GGUF 文件名、文件大小、SHA-256
运行时 PrismML llama.cpp 的 release tag 或 Git commit
服务 上下文、KV 类型、并发、视觉投影器、GPU offload
方法 输入、输出、并发、预热次数、超时
结果 Prefill 与 Decode 的均值、分位数、失败率

若要验证真实的 128K 能力,应另测 32K、64K、96K、128K 四档输入,并记录完成率、延迟、nvidia-smi 峰值显存与回答质量。仅凭 -c 131072 启动成功,不能替代该测试。

FAQ

文件只有约 7GB,为什么不会比普通 Q4 快数倍?

更小的权重主要降低存储和显存带宽需求,但 Bonsai 2 还要执行三值解包与 Hadamard 激活变换。不同 GPU 对计算和访存的平衡不同,因此“更小”不等于必然“更快”。对 RTX 3060,更现实的价值是让 27B 级模型、单并发服务和较长上下文进入 12GB 显存的可部署范围。

为什么吞吐测试关闭 thinking?

思考 token 同样消耗输出预算和生成时间。连通性、工具调用格式和吞吐测试关闭 thinking,结果更可控;复杂推理任务则应单独评估端到端延迟与正确率。

旧客户端还能沿用原模型名吗?

可以在启动参数或 Router 层加入别名,但公开教程建议统一使用 bonsai2-27b。这样日志和压测截图更易辨认,避免把 Bonsai 2 的实测误标为其他模型。

总结

RTX 3060 12GB 部署 Bonsai 2 27B 的价值,并不是“7GB 文件一定快过任何 Q4”,而是三值权重加专用运行时降低了 27B 级模型的本地部署门槛。按本文的实测条件,它可作为约 33 tokens/s 的单用户本地 Agent 服务,提供 OpenAI 兼容 API、图像输入和工具调用格式。

可公开复现的关键是:使用 PrismML 配套运行时;把 128K 配置和 128K 满载实测分开表述;并在开放局域网前完成访问控制。

About The Author

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注