llama.cpp本地部署LLM
llama.cpp本地部署LLM
环境
- OS:Windows/Linux
- GPU: AMD Radeon 660M
- 专用显存:495MB
- 共享显存:7886MB
- 内存:16GB
安装llama.cpp
由于我是AMD显卡,所以用不了CUDA。我试过了用CPU推理,太慢且负载过重了,所以还是要用GPU加速。
这里选择用Vulkan做计算库,用HIP的方式可以参考这篇:https://www.cnblogs.com/eslzzyl/p/18706793
步骤:https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md#vulkan
-
安装 Vulkan SDK: https://vulkan.lunarg.com/sdk/home#windows ,直接最新版就行
-
下载编译好的llama.cpp产物:https://github.com/ggml-org/llama.cpp/releases/
-
将llama.cpp的可执行程序加入PATH
使用
去模型市场下载需要的GGUF格式的模型:https://modelscope.cn/models
然后就可以使用llama-cli或者llama-server了。
常用公共参数:
| 参数 | 说明 | 示例 |
|---|---|---|
| -m/--model | 指定模型文件路径(.gguf 格式,llama.cpp 主流格式) | -m D:\models\qwen-7b-q4_0.gguf |
| -c/--ctx-size | 上下文窗口大小(决定模型能记住的对话长度,单位:tokens)最大模型回复的速度越慢 | -c 4096(常用值:2048/4096/8192,需匹配模型支持的最大 ctx) |
| -n/--n-predict | 单次生成的最大 tokens 数(回答的最大长度) | -n 2048(设为 -1 则无限制,直到模型停止生成) |
| -t/--threads | 启用的 CPU 线程数(建议设为 CPU 核心数的 70%-90%) | -t 16(8 核 CPU 设 8,16 核设 12-16) |
| -ngl/--n-gpu-layers | 卸载到 GPU 的层数(核心!利用显卡加速,值越大越省 CPU) | -ngl 35(新手建议从 20/30 开始试,拉满设为 99) |
| -b/--batch-size | 批处理大小(影响推理速度,建议设为 ctx-size 的 1/4~1/2) | -b 1024(ctx=4096 时设 1024 较合适) |
llama-cli
最简单的命令:
llama-cli --model /path/to/model.gguf -ngl 100
llama-server
最简单的命令;
llama-server --model /path/to/model.gguf -ngl 100 --host 127.0.0.1 --port 9976 --api-key 123456
启动后可以在浏览器打开监听的端点,就能访问Web UI了。以及可以在opencode里面通过api key的方式接入。
辅助脚本
Windows批处理脚本
llama-server异常退出时自动拉起:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
REM ===========================
REM 用户可修改区
REM ===========================
set "MODEL=C:\models\Qwen3.5-35B-A3B-Q4_K_M.gguf"
set "HOST=0.0.0.0"
set "PORT=11434"
set "CTX=131072"
set "RESTART_DELAY=5"
REM ===========================
REM 自动查找 llama-server.exe
REM ===========================
set "SERVER_EXE="
if exist "C:\llama.cpp\build\bin\Release\llama-server.exe" set "SERVER_EXE=C:\llama.cpp\build\bin\Release\llama-server.exe"
if not defined SERVER_EXE if exist ".\build\bin\Release\llama-server.exe" set "SERVER_EXE=.\build\bin\Release\llama-server.exe"
if not defined SERVER_EXE if exist ".\build\bin\llama-server.exe" set "SERVER_EXE=.\build\bin\llama-server.exe"
if not defined SERVER_EXE if exist ".\llama-server.exe" set "SERVER_EXE=.\llama-server.exe"
if not defined SERVER_EXE (
echo [ERROR] 找不到 llama-server.exe
pause
exit /b 1
)
if not exist "%MODEL%" (
echo [ERROR] 找不到模型文件: %MODEL%
pause
exit /b 1
)
echo =========================================
echo llama-server Quick Start
echo -----------------------------------------
echo Server : %SERVER_EXE%
echo Model : %MODEL%
echo Host : %HOST%
echo Port : %PORT%
echo Ctx : %CTX%
echo =========================================
echo.
set "LLAMA_CHAT_TEMPLATE_KWARGS={"enable_thinking":false}"
set /a RESTART_COUNT=0
:RUN_SERVER
set /a RESTART_COUNT+=1
echo.
echo [INFO] 第 !RESTART_COUNT! 次启动 llama-server...
echo [INFO] 按 Ctrl+C 可手动退出脚本
echo [INFO] 启动时间: %date% %time%
echo.
"%SERVER_EXE%" ^
-m "%MODEL%" ^
--host %HOST% ^
--port %PORT% ^
--ctx-size %CTX% ^
--alias "qwen3.5-35b-a3b" ^
--cache-type-k q8_0 ^
--cache-type-v q8_0
set "EXITCODE=%ERRORLEVEL%"
echo.
echo [WARN] llama-server 已退出,退出码: !EXITCODE!
if "!EXITCODE!"=="0" (
echo [INFO] 检测到正常退出,脚本结束。
goto END
)
echo [WARN] 检测到异常退出,%RESTART_DELAY% 秒后自动重启...
timeout /t %RESTART_DELAY% /nobreak >nul
goto RUN_SERVER
:END
echo.
echo [INFO] 脚本已结束,按任意键关闭窗口...
pause >nul
endlocal
exit /b
作为Linux systemd服务
这里选择用户权限部署,毕竟LLM只是大脑。
tee ~/.config/systemd/user/llama-server.service >/dev/null <<'EOF'
[Unit]
Description=llama.cpp server
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/hupingbo/llama.cpp
ExecStart=/home/hupingbo/llama.cpp/build/bin/llama-server -m /home/hupingbo/Models/Qwen3.5-35B-A3B-Q4_K_M.gguf --alias "qwen3.5-35b-a3b" --host 0.0.0.0 --port 11434 --ctx-size 262144 --cache-type-k q8_0 --cache-type-v q8_0 --chat-template-kwargs '{"enable_thinking": false}'
Restart=always
RestartSec=3
[Install]
WantedBy=default.target
EOF
systemctl --user stop llama-server
systemctl --user daemon-reload
systemctl --user restart llama-server
systemctl --user enable --now llama-server
systemctl --user status llama-server
journalctl --user -u llama-server.service -f
作为MacOS launchd服务
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>llama-server</string>
<key>ProgramArguments</key>
<array>
<string>/home/hupingbo/llama.cpp/build/bin/llama-server</string>
<string>-m</string>
<string>/home/hupingbo/Models/Qwen3.5-35B-A3B-Q4_K_M.gguf</string>
<string>--alias</string>
<string>qwen3.5-35b-a3b</string>
<string>--host</string>
<string>0.0.0.0</string>
<string>--port</string>
<string>11434</string>
<string>--ctx-size</string>
<string>262144</string>
<string>--cache-type-k</string>
<string>q8_0</string>
<string>--cache-type-v</string>
<string>q8_0</string>
<string>--chat-template-kwargs</string>
<string>{"enable_thinking": false}</string>
</array>
<key>WorkingDirectory</key>
<string>/home/hupingbo/llama.cpp</string>
<key>RunAtLoad</key>
<true/> <!-- 自动重启 -->
<key>KeepAlive</key>
<true/>
<key>ThrottleInterval</key>
<integer>3</integer> <!-- 对应 RestartSec=3(单位秒) -->
<key>StandardOutPath</key>
<string>/tmp/llama-server.stdout.log</string> <!-- 可选,日志输出 -->
<key>StandardErrorPath</key>
<string>/tmp/llama-server.stderr.log</string> <!-- 可选,错误日志 -->
<key>EnvironmentVariables</key>
<dict>
<!-- 如需环境变量可在此添加,例如 PATH 等 -->
</dict>
</dict>
</plist>
llama-bench
用于测量模型的性能。
FAQ
Q:加载模型时提示“显存不足”怎么办?
A:换更小参数量的模型(比如从13B换成7B),或选择更低量化版本(比如从Q5_K_M换成Q4_K_M),同时关闭其他占用显存的软件(比如游戏、视频剪辑软件)。
Q:CPU推理速度太慢,每秒只有1-2个token怎么办?
A:如果有GPU,开启硬件加速(LMStudio在设置中开启,llama.cpp添加“-ngl”参数);Mac用户无需额外操作,Apple Silicon芯片会自动优化;纯CPU用户建议换7B Q2_K量化版,速度会提升不少。
Q:部分 agent(如 pi)接入 llama-server 按照上述命令所暴露的 HTTP 端点后,报错:Error: Failed to save API key for llama.cpp: Server is not running in llama.cpp router mode?
A:这个是因为 pi 默认需要 llama-server 的路由模式(即指定模型文件所在目录而非单个模型,从而支持运行时切换模型)。修改如下:
准备 llama-models.ini 配置文件,其中配置需要使用的模型和它们各自的参数:
; 我放在了/Users/sense/llm/llama-models.ini
version = 1
; 此 section 名同时作为 router 模型 ID,以及 pi 请求中的 model 字段。
[qwen2.5-coder-14b]
model = /Users/sense/llm/Qwen2.5-Coder-14B-Instruct-GGUF/qwen2.5-coder-14b-instruct-q5_k_m.gguf
n-gpu-layers = 99
flash-attn = on
cont-batching = true
jinja = true
ctx-size = 16384
cache-type-k = q8_0
cache-type-v = q8_0
然后修改启动命令为:llama-server --models-preset /Users/sense/llm/llama-models.ini --models-max 1 --models-autoload --host 0.0.0.0 --port 11434 --api-key 123456 。
最后,可以看到模型已经以 JSON 列表的形式出现。
sense@bogon LaunchAgents % curl -s \
-H 'Authorization: Bearer 123456' \
http://127.0.0.1:11434/props
{"role":"router","max_instances":1,"models_autoload":true,"model_alias":"llama-server","model_path":"none","default_generation_settings":{"params":null,"n_ctx":0},"ui_settings":{},"build_info":"b10566-bb4caa754","cors_proxy_enabled":false}
sense@bogon LaunchAgents % curl -s \
-H 'Authorization: Bearer 123456' \
http://127.0.0.1:11434/models
{"data":[{"id":"qwen2.5-coder-14b","aliases":[],"tags":[],"object":"model","owned_by":"llamacpp","created":1788759989,"status":{"value":"unloaded","args":["/opt/homebrew/Cellar/llama.cpp/0.2.0/bin/llama-server","--host","127.0.0.1","--jinja","--port","0","--alias","qwen2.5-coder-14b","--ctx-size","16384","--cont-batching","--cache-type-k","q8_0","--cache-type-v","q8_0","--flash-attn","on","--model","/Users/sense/llm/Qwen2.5-Coder-14B-Instruct-GGUF/qwen2.5-coder-14b-instruct-q5_k_m.gguf","--n-gpu-layers","99"],"preset":"[qwen2.5-coder-14b]\njinja = true\nctx-size = 16384\ncont-batching = true\ncache-type-k = q8_0\ncache-type-v = q8_0\nflash-attn = on\nmodel = /Users/sense/llm/Qwen2.5-Coder-14B-Instruct-GGUF/qwen2.5-coder-14b-instruct-q5_k_m.gguf\nn-gpu-layers = 99\n\n"},"architecture":{"input_modalities":["text"],"output_modalities":["text"]},"source":"preset","can_remove":false}],"object":"list"}
然后,只需要在 pi 中 /login llama.cpp(保存服务器配置),然后 /llama load 想要的模型,最后 /model 选择模型即可。

浙公网安备 33010602011771号