夜雨聆风学习资料网

ARTICLE · 1136882

Ai应用_从源码到双击启动:27B 本地大模型搭建手记

Ai应用_从源码到双击启动:27B 本地大模型搭建手记

从源码到双击启动:27B 本地大模型搭建手记

1

感受

将近两个月没有更新公众号了,因为我发现在Ai这个时代洪流的冲击下,类似于去年我那种躬身力行研究代码和分析流程的方式变得越来越不适宜了,这种方式虽然扎实,但效率极低,且容易陷入细节而忽略整体架构的合理性。Ai能分析的比我自己好太多,也快太多了!!!

因此也不得不承认在当前Ai智能突飞猛进的时代下,代码实现已经不再是一道很高的门槛了,而是提升到对需求的整理,对问题的分析以及对整体的把控,借助Ai强大的代码理解与生成能力,我们可以将重心从“如何实现”转移到“实现什么”以及“如何验证”中去。

这两个月我也一直在尝更深入的学习Ai,并尝试新的思路。由于Ai时代的做事和思维方式已经完全不同于以往,以前需要很多人共同协助的事,可能只需要一两个智能体就能完成,所以呢,我也想着开始新的方向的探索。

2

 前言

毕竟在线的要花钱,一不小心就会过头,可能还解决不了问题白白花钱,而且现在开源的模型,已经能在本地跑27B的了,也基本能处理常见的任务。所以先在本地电脑上搭建一个勉强能用的LLM环境,本文是双卡 5060+P40、MTP 投机采样,从零编译Ternary-Bonsai-2-27B到双击启动开浏览器的全程实测数据。

我有两张卡:一张 RTX 5060(8G)一张 Tesla P40(24G)。之前一直想着在把27B级别的大模型跑顺,刚开始直接用ollama拉的qwen3.8:27b,跑是能跑,但3t/s的速度着实不行,后面刷到Ternary-Bonsai-2-27B这个极限压缩但质量基本不降的模型,但需要自行编译 llama.cpp,也正好赶上它的一个社区分支把MTP投机采样做了进来,据说能白拿一波生成速度,于是决定从源码编译开始,一路折腾到"双击一个bat 文件、浏览器自动弹出对话界面"的完全体。

整个过程踩了很多坑(编译报错、双卡拆分崩溃、上下文档位爆显存……),最后都解决了,实测数据如下:

1、纯推理性能:pp1024 = 311.35 t/s,tg256 = 21.82 t/s

2、开启 MTP 后:25.4 ~ 25.9 t/s,草稿接受率 0.767,约提速 18%

3、冷启动到服务就绪:8 秒,浏览器自动打开 Web UI

速度实在是比不上在线,本身硬件性能也不好,只怪囊中羞涩上不起90,只能说可以将就用用吧。

注:本文面向装过 Visual Studio、在命令行里敲过命令的朋友,不是我这两张显卡的话过程也是一样的,当然最简单的方法是将https://github.com/PrismML-Eng/llama.cpp扔给opendcode、deepseek harness等一句换按照源码说明进行编译,下面是纯手动过程。

3

 环境

1、NVIDIA 显卡(本文:RTX 5060 8G + Tesla P40 24G,双卡/单卡)2、Windows 10/113、Visual Studio 2022,勾选"使用 C++ 的桌面开发"工作负载4、CMake、Ninja、Git(VS 安装器里勾选)5、CUDA Toolkit 12.9(装完确认 nvcc --version 能用)6、VC++ 2015-2022 运行库(一般装 VS 就带了)7、llama特定的源码:社区分支https://github.com/PrismML-Eng/llama.cpp8、模型文件:Ternary-Bonsai-2-27B 两个文件——(可以在魔塔或Hugging Face下载)9、Ternary-Bonsai-2-27B-PQ2_0-MTP-Q8_0.gguf(主模型,7.13 GB,自带 MTP 权重)10、Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf(视觉投影器,600MB,给多模态用)

为了和文中的命令对上,目录约定如下:

1、源码编译目录:D:\llama-prism\

2、最终一键包目录:D:\llama\

2、最终一键包目录:D:\llama\

4

 编译

进入源码目录执行一下命令:

:: 1. 源码clonegit clone https://github.com/PrismML-Eng/llama.cpp D:\llama-prismcd /d D:\llama-prism:: 2. 配置:Release + Ninja,关掉 ccache,覆盖两代显卡架构61和120cmake -B build -G Ninja ^  -DCMAKE_BUILD_TYPE=Release ^  -DGGML_CCACHE=OFF ^  -DCMAKE_CUDA_ARCHITECTURES=61-virtual;120a-real:: 3. 编译,-j 跑满所有CPUcmake --build build --config Release -j

两个配置项:

1、61-virtual;120a-real:P40是sm_61,5060是sm_120(Blackwell),一行让编译出的ggml-cuda.dll同时带两张卡的内核。否则运行时会报"no kernel image is available for execution"。

2、-DGGML_CCACHE=OFF:不开ccache,它和nvcc组合会在编译中途报`filesystem_error`

编译顺利的话,最后会看到构建完成,编译结果在build\bin\目录下,包括:llama-cli.exe、llama-server.exe、llama-bench.exe 和一堆 llama-*-impl.dll和ggml-*.dll

5

 测速

编译完成后,在本机环境下通过下面指令不开MTP,纯双卡推理测速:

llama-bench -m "模型路径\Ternary-Bonsai-2-27B-PQ2_0-MTP-Q8_0.gguf" ^  -p 1024 -n 256 -r 1 ^  -ngl 999 -sm layer -mg 0 -fa auto -t 20

本机实测(模型7.12 GiB/27.32B参数,CUDA后端):

pp三百多属于双卡的正常水平;tg21.82是后面加速的基准线,往下看。

6

 双卡参数调整

llama.cpp 多卡拆分可通过下面指令完成:

1、-ngl 999:所有层都上 GPU(CPU 兜底层数设成 999 等于不兜底)2、-sm layer:按层拆分——一部分层丢 5060,剩下的丢 P40。比按行拆(-sm row)稳一些3、-mg 0:多生成的主批次放到 0 号卡(5060)上跑4、-fa auto:开启 Flash Attention,可以省显存

为什么不搞--tensor-split 0.6,0.4这种手动配比?测试过,会直接崩溃无法启动—因为P40是TCC模式且VMM:no(不支持虚拟内存管理),tensor-split依赖VMM,一传就会报内存错误。-sm layer是这套硬件下唯一稳定的拆分方式,效果也够用。

生成过程中用 nvidia-smi 查看的实况:

如下图(生成任务进行中,nvidia-smi 每秒刷新):

P40 扛了大头(22.8 G),5060 出 6.2 G——和 -sm layer 按层分摊的预期一致(这是默认llama计算出来的176128上下文大小显存占用)

7

 开MTP

MTP是这个分支的招牌功能:模型自带的草稿头先猜一个词,主模型只做一次校验,猜对了就赚一个token。开启只需要添加三个命令(注意-md指向的是同一个模型文件,MTP权重在里面):

-md "models\Ternary-Bonsai-2-27B-PQ2_0-MTP-Q8_0.gguf" ^--spec-type draft-mtp ^--spec-draft-n-max 1 ^--parallel 1

1、--spec-draft-n-max 1:每步最多猜 1 个词,收益/风险比最稳的一档

2、--parallel 1:MTP 模式要求单并发(开 Web UI 单人聊天够用,多人就用不上MTP模式了)

实测效果(同一张卡、同一套双卡参数):

Web UI 里能实时看到草稿接受率:draft acceptance = 0.767(116 次里接受 89 次)接近八成的猜测被采纳,这一波加速是实打实的。

8

 打包

编译的结果在build\bin里,模型在别处,每次手动敲一长串参数显然不是我想要的。因此需要将其一键打包(不含模型)约630MB,整目录随便挪位置,双击 start.bat 即用,结构如下:

D:\llama\├── start.bat                 ← 一键启动(双击它)├── bin\                      ← 3 个 exe + 16 个 DLL│   ├── llama-cli.exe / llama-server.exe / llama-bench.exe│   ├── 依赖dll 10 个:ggml、ggml-base、ggml-cpu、ggml-cuda(41MB)、│   │   llama、llama-common、mtmd、llama-{cli,server,bench}-impl│   ├── VC 运行库 3 个:msvcp140、vcruntime140、vcruntime140_1│   └── CUDA 运行库 3 个:cudart64_12(0.5MB)、cublas64_12(95MB)、│       cublasLt64_12(451MB)└── models\    ├── Ternary-Bonsai-2-27B-PQ2_0-MTP-Q8_0.gguf   (7.13 GB)    └── Ternary-Bonsai-2-27B-mmproj-Q8_0.gguf      (600 MB)

两个容易漏的东西:

1、CUDA 依赖库:ggml-cuda.dll运行时会动态去找cublas、cudart,缺一个会弹"找不到 DLL"。直接从安装的12.9 的CUDA toolkit bin目录里拷贝

2、VC 运行库(VS2022 Redist)也拷进去

start.bat启动文件

@echo offrem ============================================================rem  Ternary Bonsai 2 27B - one-click launcherrem  MTP speculative decoding + dual GPU (5060/P40) + web UIrem  Double-click to start; close this window to stop server.rem ============================================================if /i "%~1"=="poll" goto :pollcd /d "%~dp0"title Ternary Bonsai 2 27B - llama-server (close window to stop)set HOST=0.0.0.0set PORT=8080set CTX=131072set MODEL=models\Ternary-Bonsai-2-27B-PQ2_0-MTP-Q8_0.ggufset MMPROJ=models\Ternary-Bonsai-2-27B-mmproj-BF16.ggufrem spawn a background poller that opens the browser once /health is OKstart "" /b cmd /c "call "%~f0" poll"bin\llama-server.exe ^  -m "%MODEL%" ^  -md "%MODEL%" ^  --spec-type draft-mtp --spec-draft-n-max 1 --parallel 1 ^  -ngl 999 -sm layer -mg 0 -fa auto ^  -t %NUMBER_OF_PROCESSORS% ^  -c %CTX% ^  --host %HOST% --port %PORT% ^  --mmproj "%MMPROJ%" ^  --no-mmproj-offload ^  --reasoning off ^  --reasoning-effort mediumecho.echo [start.bat] llama-server exited with code %ERRORLEVEL%.pauseexit /b %ERRORLEVEL%:pollrem wait up to 120s for /health, then open the web UIfor /l %%i in (1,1,60) do (  curl -s -f -o nul "http://127.0.0.1:%PORT%/health" && (    start "" "http://127.0.0.1:%PORT%/"    exit /b 0  )  timeout /t 2 /nobreak >nul)echo [start.bat] WARNING: server did not become healthy within 120s, browser not opened.exit /b 1

想改配置就改文件头部那几个 set即可:

1、变量都集中在开头:端口、上下文、模型路径,想换配置改那几行

2、自动开浏览器:脚本开头把自己再调用一次(call "%~f0" poll)跑出一个后台轮询器,每 2 秒 curl 一下 /health,最多等 120 秒,一旦服务就绪就 start http://127.0.0.1:8080/ 拉起浏览器

3、`cd /d "%~dp0"`:所有相对路径(bin\、models\)以 bat 所在目录为准,整个文件夹移动也能跑

4、关窗即停:server 在前台窗口里跑,日志全程可见;异常退出时 pause 留屏,不会窗口一闪而过看不到报错

5、-t %NUMBER_OF_PROCESSORS%:线程数动态取本机逻辑核数

启动情况

双击 start.bat,完整时间线:

1、控制台出现,开始加载两个模型(主模型 + 视觉投影器)——下图是服务就绪后的控制台:

2、WebUi打开,约8 秒后 /health 返回 200,后台轮询器立刻打开浏览器,Web UI 自动打开:

3、开始对话,此时可在对话框中直接输入问题开始对话。服务监听 0.0.0.0:8080(局域网内其他设备也能访问,注意防火墙放行),日志里能看到 speculative decoding enabled: draft-mtp 和实时的 draft acceptance,生成速度 约25.9 t/s

4、想停服务,直接关控制台窗口,进程全部结束

9

 常用设置

1、上下文开多大?

llama.cpp的默认机制是:如果不传-c,会从模型上限(262144)往下自动拟合,KV cache在启动时一次性全量预分配,所以默认会将显存全部用上,仅受限于模型上限。本机实测四档(后三档是通过-c配置的,256K直接是显存不足,无法启动):

最终选了 131072(128K):P40 还剩 4.5 G 余量,对话一口气聊几万字也用不完。改 start.bat 里的 set CTX= 一行即可。

2、怎么关掉深度思考(reasoning)?

有两种方式关闭,一种是通过前端注入enable_thinking=false,另一种是直接在模型端关闭(--reasoning off),同时如果设置为on,则可选的reasoning_effort 根据不同模型有不同,一般来说有low/medium/high等。start.bat 里加上:

--reasoning off ^--reasoning-effort medium

当前是关闭状态;哪天想让它思考,把off改成on即可以medium档思考。验证过:关闭后回答直接给结果,不吐任何思考段,响应里连reasoning_content字段都没有。

10

 后记

最终成果就是一个630MB的自包含目录(不含模型):D:\llama下双击start.bat,8秒就绪、浏览器自动弹出、双卡满载、MTP提速约18%、128K上下文、思考可一键开关—所有配置集中在文件头部几行set,改完存盘即生效。

下一步打算基于此模型来处理我的HSimSys系统框架,并将可执行层全部公开出来,同时补全B/S架构,分布式引擎及其他智能相关的仿真推演工具。

往

期

推

荐

外部数据统一接入分发中间件

分布式想定运行分析

服务端仿真引擎框架

电磁传播衰减模型扩展

相关学习资料