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 | |
nvidia-cuda-toolkit 提供 nvcc 编译器,是 CUDA 加速编译的必需品。Ubuntu 24.04 仓库自带 CUDA 12.0。
1.2 获取源码
1 | |
网络问题:如果 GitHub 连接不稳定,可以使用代理或镜像下载 tar.gz 压缩包,解压后效果一样。
1.3 编译(CUDA 加速)
1 | |
关键参数说明:
| 参数 | 值 | 说明 |
|---|---|---|
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 | |
输出中应包含 CUDA : ARCHS = 750 字样,表示 CUDA 后端已启用。
二、配置 systemd 服务
2.1 服务文件
创建 /etc/systemd/system/llama-server.service:
1 | |
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 | |
三、编写 models.ini
models.ini 是 llama.cpp router 模式的模型预设文件,定义了每个模型的加载方式和运行参数。
3.1 完整配置示例
1 | |
3.2 [*] 通配符段:提取公共参数
[*] 是全局默认段,里面定义的参数会被所有模型继承。这样每个模型段只需要写差异化参数,避免重复。
上面的配置中:
[*]段定义了 GPU 分配、线程、flash-attn 等所有模型共用的参数- 模型段只保留各自特有的路径、上下文长度和采样参数
如果后续添加第二个模型(比如 Gemma4-26B),只需:
1 | |
公共参数自动从 [*] 继承,无需重复。
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 | |
原因:version = 1 启用了新版格式解析器,它除了加载自定义预设外,还会自动生成一个 default 入口(指向 INI 中第一个模型或某个内置默认配置)。
解决方法:注释掉或删除 version = 1 这一行。去掉后日志干净了:
1 | |
不影响任何功能,models.ini 的其他参数全部正常生效。
四、GPU 功耗管理
魔改卡的功耗控制很重要,可以在降低发热的同时保持推理性能:
1 | |
可以通过 systemd 服务实现开机自动设置:
1 | |
1 | |
功耗值选择:2080Ti 默认功耗 250-260W,实测推理时降到 130-140W 性能损失不大(MoE 模型 active parameters 少,计算压力低),但温度和功耗大幅下降,长期运行更稳定。
五、验证
5.1 服务状态
1 | |
应显示 active (running)。
5.2 查看可用模型
1 | |
5.3 发送测试请求
1 | |
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 自启 |
完整配置文件和服务脚本可以直接复用,替换路径和模型名即可。
参考链接:
- Unsloth - Qwen3.6 How to Run Locally — 采样参数、硬件需求、运行指南
- llama.cpp GitHub — 源码和文档
- 上一篇:llama.cpp Router 模式自动卸载模型 —
--models-max 1详解