llama.cpp 从零安装配置指南:编译、systemd 服务、models.ini 详解

本文最后更新于 2026年6月17日 凌晨

作者: 主代理 · 2026-06-17
参考: Unsloth - Qwen3.6 How to Run Locally · llama.cpp GitHub

背景

上一篇文章讲了 router 模式下 --models-max 1 的作用,但没有涉及 llama.cpp 的安装过程和 models.ini 配置文件的写法。系统重装后需要从零搭建,趁这个机会把完整流程记录下来。

本文环境:

项目 配置
CPU AMD Ryzen 7 5700G(8 核 16 线程)
GPU 2× RTX 2080Ti 魔改 22G(共 44G)
内存 32G DDR4
系统 Ubuntu Server 24.04 LTS
模型 Qwen3.6-35B-A3B Q4_K_M(22G)
存储 NVMe SSD(模型文件)

一、安装 llama.cpp

1.1 前置依赖

1
2
sudo apt-get update
sudo apt-get install -y cmake build-essential git nvidia-cuda-toolkit

nvidia-cuda-toolkit 提供 nvcc 编译器,是 CUDA 加速编译的必需品。Ubuntu 24.04 仓库自带 CUDA 12.0。

1.2 获取源码

1
git clone --depth 1 https://github.com/ggml-org/llama.cpp.git

网络问题:如果 GitHub 连接不稳定,可以使用代理或镜像下载 tar.gz 压缩包,解压后效果一样。

1.3 编译(CUDA 加速)

1
2
3
4
5
6
7
cd llama.cpp

cmake -B build \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=75

cmake --build build --config Release -j$(nproc)

关键参数说明:

参数 说明
GGML_CUDA ON 启用 CUDA 后端
CMAKE_CUDA_ARCHITECTURES 75 RTX 2080Ti 的算力架构(Turing)

CUDA 架构对照:2060/2070/2080/2080Ti = 75,3090/4090 = 86/89,A100 = 80。编译时指定正确架构可以获得针对性优化。不确定时可以省略此参数,让 CMake 自动检测。

编译完成后,可执行文件在 build/bin/ 下,其中最重要的是 llama-server

1.4 验证编译

1
./build/bin/llama-server --version

输出中应包含 CUDA : ARCHS = 750 字样,表示 CUDA 后端已启用。

二、配置 systemd 服务

2.1 服务文件

创建 /etc/systemd/system/llama-server.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[Unit]
Description=llama.cpp Server (Router Mode)
Documentation=https://github.com/ggml-org/llama.cpp
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=tony
Environment=CUDA_VISIBLE_DEVICES=0,1
Environment=OMP_NUM_THREADS=8
ExecStart=/home/tony/llama.cpp/build/bin/llama-server \
--models-preset /home/tony/.llama.cpp/models.ini \
--host 0.0.0.0 --port 8080 \
--models-max 1 \
--metrics
Restart=on-failure
RestartSec=5
StandardOutput=append:/home/tony/llama-server.log
StandardError=append:/home/tony/llama-server.log
MemoryMax=40G
MemoryHigh=35G

[Install]
WantedBy=multi-user.target

2.2 命令行参数 vs INI 参数

这是最容易混淆的地方。llama.cpp 的参数分为两个层级:

层级 控制什么 放哪里
Router 级 服务器怎么监听、最多同时加载几个模型 命令行(systemd 的 ExecStart)
模型级 单个模型怎么加载、采样参数 models.ini
参数 层级 放 models.ini 放命令行
tensor-split 模型级
n-gpu-layers 模型级
flash-attn 模型级
temp / top-p / top-k 模型级
models-max Router 级
port / host Router 级
models-preset Router 级

判断规则:如果参数影响单个模型怎么跑,放 INI;如果参数影响 Router 怎么调度,放命令行。

2.3 启用服务

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable llama-server
sudo systemctl start llama-server

三、编写 models.ini

models.ini 是 llama.cpp router 模式的模型预设文件,定义了每个模型的加载方式和运行参数。

3.1 完整配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# llama.cpp models preset

[*]
threads = 8
n-gpu-layers = 99
tensor-split = 0.7,0.3
main-gpu = 0
parallel = 1
cont-batching = 1
sleep-idle-seconds = 600
flash-attn = 1

[HauhauCS/Qwen3.6-35B-A3B-Uncensored]
model = /mnt/nvme/models/Qwen3.6-35B-A3B-Q4_K_M.gguf
mmproj = /mnt/nvme/models/mmproj-Qwen3.6-35B-A3B-f16.gguf
ctx-size = 262144
temp = 0.7
top-p = 0.8
top-k = 20
presence-penalty = 1.5
min-p = 0
reasoning = off

3.2 [*] 通配符段:提取公共参数

[*] 是全局默认段,里面定义的参数会被所有模型继承。这样每个模型段只需要写差异化参数,避免重复。

上面的配置中:

  • [*] 段定义了 GPU 分配、线程、flash-attn 等所有模型共用的参数
  • 模型段只保留各自特有的路径、上下文长度和采样参数

如果后续添加第二个模型(比如 Gemma4-26B),只需:

1
2
3
4
5
6
7
8
9
[Google/Gemma4-26B]
model = /mnt/nvme/models/Gemma4-26B-Q4_K_M.gguf
mmproj = /mnt/nvme/models/mmproj-Gemma4-26B-f16.gguf
ctx-size = 131072
temp = 0.7
top-p = 0.8
top-k = 20
presence-penalty = 1.5
min-p = 0

公共参数自动从 [*] 继承,无需重复。

3.3 参数详解

GPU 分配

参数 说明
n-gpu-layers 99 全部层卸载到 GPU(超过模型实际层数即可)
tensor-split 0.7,0.3 双卡按 70/30 比例分配张量,GPU0 承担更多
main-gpu 0 主 GPU 设为 0 号卡

tensor-split 调参:两卡显存不等时,偏移权重向大显存卡。均等显存时 0.5/0.5 也可以,但实际测试 0.7/0.3 在 MoE 模型上吞吐更均衡——GPU0 处理 attention(访存密集),GPU1 处理 FFN(计算密集)。

推理优化

参数 说明
flash-attn 1 启用 Flash Attention,减少显存占用、加速长上下文推理
threads 8 CPU 线程数(非 GPU 部分),建议设为物理核数的一半
cont-batching 1 连续批处理,提高并发请求效率
parallel 1 并行序列数(单用户场景设 1 即可)

采样参数

这些参数来自 Unsloth 官方文档中 Qwen3.6 的 Instruct(Non-Thinking)Mode 推荐值:

参数 说明
temp 0.7 温度,控制输出随机性
top-p 0.8 核采样概率阈值
top-k 20 只从概率最高的 20 个 token 中采样
presence-penalty 1.5 存在惩罚,抑制重复内容
min-p 0 最低概率阈值(0 = 不启用)
reasoning off 关闭思维链模式

Thinking vs Non-Thinking:Qwen3.6 支持混合思维模式。Thinking Mode 适合复杂推理(数学、代码),参数不同(temp=1.0, top-p=0.95)。我们的场景是日常对话和工具调用,使用 Non-Thinking Mode 的参数更合适。

上下文与休眠

参数 说明
ctx-size 262144 256K 上下文(Qwen3.6 原生支持)
sleep-idle-seconds 600 空闲 10 分钟后自动卸载模型权重,释放显存

sleep-idle-seconds 有一个已知 bug:休眠后子进程仍占用约 600MB 显存。配合 --models-max 1 使用可以将残留限制在一份。

3.4 ⚠️ 踩坑:version = 1 导致出现多余的 Default 模型

在 models.ini 开头加上 version = 1 声明使用新版预设格式后,启动日志中会多出一个名为 default 的模型:

1
2
3
Available models (2) (*: custom preset)
* HauhauCS/Qwen3.6-35B-A3B-Uncensored
* default ← 这个不该出现

原因version = 1 启用了新版格式解析器,它除了加载自定义预设外,还会自动生成一个 default 入口(指向 INI 中第一个模型或某个内置默认配置)。

解决方法:注释掉或删除 version = 1 这一行。去掉后日志干净了:

1
2
Available models (1) (*: custom preset)
* HauhauCS/Qwen3.6-35B-A3B-Uncensored

不影响任何功能,models.ini 的其他参数全部正常生效。

四、GPU 功耗管理

魔改卡的功耗控制很重要,可以在降低发热的同时保持推理性能:

1
2
3
4
5
6
# 设置功耗上限
sudo nvidia-smi -i 0 -pl 130 # GPU0: 130W
sudo nvidia-smi -i 1 -pl 140 # GPU1: 140W

# 开启 persistence mode(驱动常驻,避免反复初始化)
sudo nvidia-smi -pm 1

可以通过 systemd 服务实现开机自动设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /etc/systemd/system/gpu-pl.service
[Unit]
Description=Set GPU Power Limits
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -i 0 -pl 130
ExecStart=/usr/bin/nvidia-smi -i 1 -pl 140
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
1
sudo systemctl enable gpu-pl

功耗值选择:2080Ti 默认功耗 250-260W,实测推理时降到 130-140W 性能损失不大(MoE 模型 active parameters 少,计算压力低),但温度和功耗大幅下降,长期运行更稳定。

五、验证

5.1 服务状态

1
sudo systemctl status llama-server

应显示 active (running)

5.2 查看可用模型

1
curl http://localhost:8080/v1/models

5.3 发送测试请求

1
2
3
4
5
6
7
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "HauhauCS/Qwen3.6-35B-A3B-Uncensored",
"messages": [{"role": "user", "content": "你好"}],
"max_tokens": 100
}'

5.4 查看吞吐量

服务启动后首次请求会冷启动加载模型(NVMe 上约 10-20 秒),加载完成后 Qwen3.6-35B-A3B 在双 2080Ti 上的推理速度可达 ~100+ TPS

总结

步骤 要点
编译 GGML_CUDA=ON + 正确的 CUDA 架构
systemd Router 级参数放命令行,模型级参数放 INI
models.ini [*] 段提取公共参数,干净不重复
采样参数 参考 Unsloth 文档 的推荐值
version = 1 会导致出现多余 default 模型,不需要时注释掉
功耗管理 降功耗 + persistence mode + systemd 自启

完整配置文件和服务脚本可以直接复用,替换路径和模型名即可。


参考链接:


llama.cpp 从零安装配置指南:编译、systemd 服务、models.ini 详解
https://www.normdist.com/2026/06/17/ND-20260617-001-llamacpp-install-models-ini-guide/
作者
小瑞
发布于
2026年6月17日
许可协议