by 雪隐_上班了 from juejin.cn/user/143341...
欢迎分享与聚合,全文转载就不必了,尊重版权,圈子就这么大,若急用可联系授权。
一棵 5.9 GB 的"盆栽",一张 16GB 的显卡,一个有洁癖的聊天模板,以及一个至今待业的小模型。
专栏主旨 :用我那台 RTX 5060 Ti 16G + 64GB 内存 的"丐帮战车",做点不枉费电费的新奇事情。
前几章我们让显卡"听懂人话"(Whisper)、让显卡"画画"(ComfyUI)、让显卡当"翻译官"(QMT API)。这一章来点程序员最对口味的------让 Claude Code 这个云端 AI 程序员,喝上本地酿的粗粮酒。
先介绍主角:Bonsai-27B 是棵什么盆栽
Bonsai-27B 是 PrismML 在 2026 年 7 月放出的一棵"盆栽"------名字起得谦虚,实际上是个 27B 的多模态大模型,只不过用三进制(ternary)权重种在了一个特别小的花盆里:
- 底座 :基于 Qwen3.6-27B 改造,64 层、262K 上下文,混合注意力(约 75% 线性 + 25% 全注意力),还带一个 0.46B 的视觉塔,能看图。
- 体重 :三进制版有效位宽仅 1.71 bpw,模型本体 5.9 GB 。官方说法是"10 倍于 FP16 的智能密度"------翻译成人话:同样 1GB 显存,它装的智商是别人的十倍。 还有个更极限的 1-bit 版(3.9 GB),那是给手机准备的,咱就不欺负它了。
- 脑子 :官方跑了 15 项基准(数学、编码、agentic、工具调用、视觉......),三进制版保留了 Qwen3.6-27B 约 95% 的能力,数学和编码几乎无损。
- 证件 :Apache 2.0,完全开源,Hugging Face 上直接下(
prism-ml/Ternary-Bonsai-27B-gguf)。
一句话总结:这是一棵能在 16GB 显卡上撒欢跑的 27B,还能留出席位给 256K 上下文。 这感觉就像你租了个 50 平的房子,结果发现能塞下 200 平的家具------离谱,但香。
于是我的脑子开始不老实了:既然它编码能力"几乎无损",能不能让 Claude Code 直接跑在它上面?
说干就干。
第一幕:备料------先当一回编译民工
三进制权重是个新东西,原版 llama.cpp 不认识它 ,必须用 PrismML 官方的 fork。所以第一步不是双击什么 .bat,而是老老实实打开终端:
bash
git clone https://github.com/PrismML-Eng/llama.cpp
然后编译。我的卡是 RTX 5060 Ti,Blackwell 架构,sm_120------新到很多项目的默认配置还不认识它,得显式告诉 CMake 你的显卡是"哪个年代的":
bat
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=120
cmake --build build -j 8
配上 VS 2022 BuildTools 和一杯咖啡,等编译跑完,build\bin 里就有了一整套认识三进制的 llama.cpp 全家桶。
50 系显卡的朋友请注意:
CMAKE_CUDA_ARCHITECTURES=120这行是重点,漏了它编译不报错、运行才玄学------到时候你会对着满屏的CUDA error怀疑人生。
接着下载模型:
bash
hf download prism-ml/Ternary-Bonsai-27B-gguf --include "*-Q2_0.gguf"
主模型 Q2_0 十来 GB,外加一个 Q8_0 的 mmproj(视觉投影,看图用的)。备料完毕,才轮到写启动脚本、双击 start_server.bat。
第二幕:--flash-attn 吃掉了 --temp
然后,屏幕一闪:
go
error: unknown value for --flash-attn: '--temp'
我对着这行字沉思了十秒钟。--temp 怎么就成了 --flash-attn 的值?
答案很简单:这个参数的现代写法是 --flash-attn on|off|auto,必须带值 。我不带值,参数解析器本着"不能浪费粮食"的精神,把排在后面的 --temp 0.7 抓过来吃了。可怜的 --temp,还没上岗就成了别人的盘中餐。
改成 --flash-attn on,搞定。
第一个坑,深度:脚踝。 连崴脚都算不上,就是绊了一下。
顺便一提,启动参数里的
--temp 0.7 --top-p 0.95 --top-k 20不是拍脑袋,是官方模型卡给的推荐值,照抄就行。抄作业不丢人,丢人的是抄错了还跑不起来。
第三幕:CC Switch 牵线搭桥
服务器起来了,下一步是让 Claude Code 认这个本地后端。
这个 fork 的 llama-server 原生支持 Anthropic 的 /v1/messages 协议,连转换层都不用搭。理论链路:
css
Claude Code → CC Switch → llama-server → Bonsai 盆栽
一气呵成。
最省事的连接方式是 CC Switch ------一个图形化的 provider 切换工具,本质上帮你往 ~/.claude/settings.json 里写环境变量。添加一个自定义供应商:
json
{
"env": {
"ANTHROPIC_BASE_URL": "http://127.0.0.1:8080",
"ANTHROPIC_AUTH_TOKEN": "sk-local",
"ANTHROPIC_MODEL": "Ternary-Bonsai-27B",
"ANTHROPIC_SMALL_FAST_MODEL": "Ternary-Bonsai-27B"
}
}
几个小秘密:
ANTHROPIC_AUTH_TOKEN随便填,llama-server 不查户口本,写sk-i-love-my-pet也行ANTHROPIC_MODEL也随便填,server 只服务已加载的那一个模型,你叫它"旺财"它也答应
保存,切换,重启终端,运行 claude------
然后现实就扇了我一巴掌。
第四幕:一个有洁癖的模板
Claude Code 启动后,还没来得及高兴,就看到了这行:
javascript
API Error: 400 Unable to generate parser for this template.
...
Error: Jinja Exception: System message must be at the beginning.
翻译成人话:模型 GGUF 内置的 chat template(Qwen 系)有一条铁律------system 消息必须站在队伍最前面,否则原地爆炸 (raise_exception,宁可错杀不可放过)。
而 llama-server 这边,收到带 tools 的请求后会自动生成工具调用解析器(autoparser),生成过程中要拿模板反复试探渲染。一边爱试探,一边有洁癖,两边一碰------
嘭,400。
Anthropic 转换层其实是无辜的------它把 Claude Code 的 system 块规规矩矩合成了一个消息放在最前面。但模板在执行过程中就是会碰到"非开头的 system"这种场面,然后它选择了殉爆。
这个模板的内心戏大概是:
"什么?你不是第一个?那我死了算了。"
------然后它就真的死了。
第五幕:给模板做心理疏导
既然模板有洁癖,那就给它做脱敏治疗。
把模板从 GGUF 里完整导出,做两处小手术:
- 非开头的 system 消息 :不再抛异常,就地渲染成
<|im_start|>system...<|im_end|>,让它学会"随缘" - "No user query found" 异常:同样软化为默认行为,不再殉爆
存成 bonsai-chat.jinja,启动参数加上:
bat
--chat-template-file "F:\workspace\python\Bonsai-27B\bonsai-chat.jinja"
然后模拟 Claude Code 发了两轮请求实测:
- 首轮带 tools :返回 200,模型正确产出
thinking+tool_use块,调用get_weather(city=Beijing),stop_reason: tool_use - 把工具结果("晴天,26°C")喂回去:返回 200,正常给出最终回答
协议链路全通。
那一刻的心情,大概相当于看着自家阳台上的盆栽终于开出了花------虽然不是牡丹,但能开花就是胜利。
实际体验:真香警告
跑通之后实际用了一段时间,说实话,超出预期:
-
编程能力:确实不错。 官方说"数学和编码几乎无损",本来我持保留态度,实际让 Claude Code 挂着它写代码、改 bug、重构,大部分任务完成度都相当可以,工具调用的格式也很稳。当然,跟云端那几个旗舰比还有差距,但"本地免费无限量"这个前提摆在这儿,香得很。
-
速度:稳定 40+ tokens/s。 在 RTX 5060 Ti 16GB 上,生成速度实测约 43 t/s------对一棵本地 27B 来说,这是相当能打的成绩(官方在 RTX 5090 上跑到 134 t/s,咱这卡有这速度知足了)。Prefill 约 500 t/s,Claude Code 几千 token 的系统提示也就几秒钟的事。
43 t/s 什么概念?人类阅读速度 ≈ 3-4 t/s,说话 ≈ 2-3 t/s。你看一眼,它写一段。 以前是我等 AI,现在是 AI 等我,这感觉......有点不习惯。
-
上下文:每会话 262144 token(256K)拉满,服务器 4 个并发槽,Q2_0 + q4_0 KV 全塞进 16GB 显存毫无压力。
一个小插曲:日志里藏着一条无声的抗议--------fit on 因为我显式写了 -ngl 99 直接罢工("n_gpu_layers already set by user, abort")。好在模型够苗条,硬装也装下了,这条警告就当是 fit 功能递的请假条:
"老板,我今天不加班了,反正也没我啥事。"
------
--fit on
番外:待业青年 dspark
模型目录里还躺着一位兄弟:Ternary-Bonsai-27B-dspark-Q4_1.gguf。
这是配套的 drafter 小模型------推测解码(speculative decoding)里负责"打草稿"的那位。理想分工是:
- 小模型先飞速猜一串 token(跑得快,猜得不一定对)
- 大模型负责验收(跑得慢,但准)
- 猜对了就跳过,生成速度直接起飞
简历很亮眼,Q4_1 的身子骨也轻快,理论上是个好搭档。
但现实是:这个 fork 的 server 路径还没把它接进来。
启动脚本里特意写着:"do NOT add -md ...dspark..."。
于是这位小同志只能躺在 D 盘里,每天看着 27B 的大哥以 43 t/s 的速度一步一个脚印地干活,自己连个面试机会都没有。
dspark 的内心独白:
"我 Q4_1,我轻快,我能打草稿,我能加速......为什么不让我上班? "
我:"等 fork 更新,再忍忍。"
等哪天 fork 把它接上了,40+ t/s 变 60+ t/s 不是梦。
小模型,别急,你的时代会来的。
结尾:几句大实话
如果你也想复现,几个忠告:
- 50 系显卡编译时别忘了
CMAKE_CUDA_ARCHITECTURES=120,漏了你就等着玄学报错吧。 --flash-attn记得带值 ,别让它乱吃东西。参数解析器饿起来连--temp都吃。- 模板报错别慌 ,导出、脱敏、
--chat-template-file三连。给有洁癖的模板做心理疏导,是每个本地部署工程师的必修课。 - 想切回官方或第三方 API? CC Switch 点一下就换,配置不冲突,方便得很。
- 长会话后半段如果感觉模型开始"思考人生" (准确率下降、重复输出),开新会话比硬撑更有效------这是所有本地模型的通病,不是盆栽的问题。就当它需要"换换脑子"。
写在最后
总的来说:一棵 5.9 GB 的盆栽,让 Claude Code 在本地跑出了 40+ t/s 和不错的编程能力,还不用花一分 API 钱。
你的代码,你的模型,你的显卡,你的电费。
没有 API 账单,没有数据上传,没有"你已超出今日调用额度"。
这波不亏。
至于 dspark------等你转正那天,我再写一篇《待业青年翻身记》。
如果这篇文章让你对自己的 5060 Ti 多了几分信心,或者让你也想折腾一下本地 Claude Code,点赞、评论、转发都行。
谢谢大家 🙏
祝你们的模板永不报错,dspark 早日转正,生成速度永远跑在阅读速度前面。