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

  1. 安装 Vulkan SDK: https://vulkan.lunarg.com/sdk/home#windows ,直接最新版就行

  2. 下载编译好的llama.cpp产物:https://github.com/ggml-org/llama.cpp/releases/

  3. 将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 选择模型即可。

posted @ 2026-04-22 12:55  3的4次方  阅读(530)  评论(0)    收藏  举报