Inference Stack · llama.cpp

llama.cpp 部署前沿大模型

本册覆盖 llama.cpp v0.9.0 的完整部署链路:参数语义、显存与 KV 计算、并行拓扑、逐模型可复制命令、调优方法与故障排查。

引擎llama.cpp v0.9.0
核验2026-11-06
来源官方文档与仓库

00导读

llama.cpp 的定位

llama.cpp 是一个纯 C/C++ 的 LLM 推理实现,基于 ggml 张量库,零 Python 依赖,可编译到几乎任何平台:x86、ARM、Apple Silicon、CUDA、ROCm、Vulkan、SYCL、Metal、甚至浏览器(WASM)。

2026 年它的定位非常清晰:

它不是用来跑万亿 MoE 的。1.6T 的模型即便量化到 2-bit 也要几百 GB,llama.cpp 的多卡能力(pipeline / experimental tensor parallel)撑不住这个量级。

它的真正价值在三处:

场景为什么选它
本地 / 边缘部署单机、单卡、甚至 CPU,无 Python 环境,一个二进制文件
极致量化支持 1.5–8 bit 的几十种量化格式,让 70B 跑在 24GB 显卡上
快速验证与原型-hf user/repo 一条命令拉模型就跑,无需写代码

2026 年的一个新变化:llama.cpp 的 speculative decoding 能力大幅增强,已经支持 EAGLE-3、MTP、DFlash、DSpark、n-gram 系(ngram-simple / ngram-map-k / ngram-map-k4v / ngram-mod / ngram-cache)。这让它在小模型 + 低延迟场景下的竞争力明显提升。

数据基准

组件基线
llama.cppv0.9.0(2026-11-04)
模型格式GGUF
后端CPU / CUDA 12 / CUDA 13 / ROCm / MUSA / SYCL / Vulkan / Metal / CANN
Python仅转换脚本需要

三个必须先建立的心智模型

① GGUF 是唯一格式。

llama.cpp 只认 GGUF。HF 上的 safetensors 必须先转:

BASH
python convert_hf_to_gguf.py <hf-model-dir> --outtype bf16 --outfile model.gguf

或者直接下社区已转好的:

BASH
# 直接从 HF 拉,自动选量化
llama-cli -hf ggml-org/gemma-3-1b-it-GGUF

② -ngl(GPU layers)是最重要的参数。

它决定「多少层放进显存」。放不下的层会跑在 CPU 上——速度会掉一到两个数量级。所以 -ngl 的目标永远是「能放多少放多少」。

新版本的默认值是 auto,配合 --fit on(默认开启)会自动按显存调整未设置的参数。

③ 多卡是「流水」不是「张量」。

--split-mode layer(默认)是流水并行:每卡持有一段连续的层,KV 跟着层走。这种方式通信量最小,但需要足够多的 token 才能填满流水线。

--split-mode tensor 是实验性的张量并行,能降低延迟,但对互联带宽敏感,且限制很多(KV 必须是 f16/bf16/f32,--fit 不支持)。


012026 的部署格局

llama.cpp 能跑什么、不能跑什么

能跑(官方生态支持良好):

模型族说明
Llama 3.x / 4最成熟
Qwen 2.5 / 3支持完善
Gemma 3 / 4官方有 GGUF 仓库
gpt-oss 20b / 120b官方支持
Mistral / Mixtral支持
DeepSeek 蒸馏版支持
Phi / Granite / Command-R支持

不建议跑:

模型原因
DeepSeek-V4(1.6T)量化后仍数百 GB,多卡能力不足
Kimi-K3(2.8T)同上
Qwen3.5-397B即便 2-bit 也约 100 GB,需 4×A100,不划算
GLM-5(744B)边界情况,2-bit 约 190 GB
MiniMax-M3(427B)边界情况

边界判断经验:

CODE
量化后大小 ≈ 参数量 × bits / 8
模型规模4-bit 大小2-bit 大小可行性
7B3.5 GB1.8 GB✅ 单卡/CPU
32B16 GB8 GB✅ 单张 24GB
70B35 GB18 GB✅ 单张 48GB / 双卡
120B(gpt-oss,MXFP4)—~63 GB✅ 单张 80GB
235B118 GB59 GB⚠️ 多卡
397B199 GB99 GB⚠️ 4–8 卡
744B372 GB186 GB❌ 不推荐
1.6T800 GB400 GB❌ 不可行
实际可用性还要打折

除权重外还要 KV Cache 和计算缓冲。上表的 2-bit 数字是理论下限。

2026 年 llama.cpp 的能力增长

Speculative decoding 的方法矩阵(来自 docs/speculative.md):

方法--spec-type 值需要 draft 模型说明
Draft modeldraft-simple✅最经典,小模型起草
EAGLE-3draft-eagle3✅读取目标模型 hidden states,接受率更高
MTPdraft-mtp✅目标模型自带 MTP 头
DFlashdraft-dflash✅块扩散,一次前向产出整块草稿
DSparkdraft-dspark✅DeepSeek 系的融合草稿模块
N-gram (simple)ngram-simple❌零额外模型
N-gram (map-k)ngram-map-k❌基于哈希表
N-gram (map-k4v)ngram-map-k4v❌变体
N-gram (mod)ngram-mod❌模运算索引
N-gram (cache)ngram-cache❌缓存式

可以混用:带 draft 模型的方法可以与不带 draft 模型的方法组合。


02显存预算与 KV 计算

显存划分

CODE
┌────────────────────────────────────────────────────┐
│  Weights(-ngl 层在 GPU,其余在 CPU)│ KV │ Compute │
└────────────────────────────────────────────────────┘

llama.cpp 的显存管理和其它框架最大的不同:权重可以部分放 CPU。

CODE
-ngl N     → 前 N 层放 GPU
-ngl 999   → 全部放 GPU(等价于 all)
-ngl auto  → 自动(默认)

关键:放不下的层走 CPU,每 token 都要通过 PCIe 传输权重/激活。速度会掉 10–100 倍。所以:

-ngl 的目标不是「刚好装下」,而是「尽量多放」。

如果 40 层里有 36 层能放 GPU,不要满足于 36——试试能不能通过降 -c(上下文)或 -ctk q8_0 挤出第 37 层。

--fit 自动适配

--fit on(默认)会自动调整未显式设置的参数来适配设备内存。

BASH
# 什么都没设,让它自己算
llama-server -m model.gguf

--fit 与 --split-mode tensor 不兼容。用 tensor 模式时需要手动设 --ctx-size。

KV Cache 计算

CODE
KV_bytes_per_token = 2 × n_layers × n_kv_heads × head_dim × kv_dtype_bytes

n_kv_heads 由架构决定:MHA 等于 n_heads,GQA 等于 n_heads / g,MQA 等于 1。三者公式相同,只是取值不同。

llama.cpp 的 KV 精度用 -ctk(K)和 -ctv(V)分别控制:

值字节说明
f324最高精度
f162默认
bf162与 f16 同大小
q8_0~1.068-bit 量化,几乎无损
q5_1~0.755-bit
q5_0~0.69
q4_1~0.63
q4_0~0.56
iq4_nl~0.56

实践建议:

  • -ctk q8_0 -ctv q8_0 是最划算的一档:省一半显存,精度损失极小
  • 不要只量化 K 或只量化 V:通常两个一起
  • -ctv 量化要求开 Flash Attention(-fa on)

量化的收益

权重侧:

量化bits/权重70B 模型大小相对质量
F16 / BF1616140 GB基准
Q8_08.575 GB几乎无损
Q6_K6.658 GB极小损失
Q5_K_M5.750 GB很小损失
Q4_K_M4.842 GB最常用平衡点
Q3_K_M3.934 GB可感知损失
Q2_K3.026 GB明显损失
IQ1_S~1.614 GB仅极限场景
Q4_K_M 是社区公认的性价比拐点

。再往下质量下降明显快于体积下降。

怎么估算总显存

CODE
总显存 ≈ 权重(量化后) + KV(ctx × per_token) + 计算缓冲(约 1–2 GB)

例:Llama-3.3-70B,Q4_K_M,32K 上下文,q8_0 KV

CODE
权重:  42 GB
KV:    2 × 80 × 8 × 128 × 1.06 ≈ 174 KiB/token × 32768 ≈ 5.4 GB
缓冲:  ~1.5 GB
总计:  ≈ 49 GB  → 需要 2× 24GB 或 1× 48GB

03架构与参数作用点

llama-server 的组件

CODE
┌──────────────────────────────────────────────┐
│  httplib(HTTP 层)                            │
│  · OpenAI 兼容:chat/completions, responses   │
│  · Anthropic Messages API                     │
│  · /v1/embeddings, /rerank                    │
│  · /metrics, /slots, /props                   │
│  · Web UI                                     │
└───────────────────┬──────────────────────────┘
                    ▼
┌──────────────────────────────────────────────┐
│  server-context(多 slot 管理)                 │
│  · -np 个 slot,每个 slot 一条独立对话           │
│  · slot 可保存/恢复 KV(--slot-save-path)      │
└───────────────────┬──────────────────────────┘
                    ▼
┌──────────────────────────────────────────────┐
│  llama_context(批处理与采样)                   │
│  · continuous batching(-cb,默认开)           │
│  · logical batch (-b) / physical batch (-ub)   │
│  · speculative decoding                        │
└───────────────────┬──────────────────────────┘
                    ▼
┌──────────────────────────────────────────────┐
│  libllama + ggml(计算图)                      │
│  · 后端:CPU / CUDA / ROCm / Metal / Vulkan    │
│  · 层分配:-ngl / --n-cpu-moe                  │
└──────────────────────────────────────────────┘

一次请求的路径

CODE
① HTTP 接入     /v1/chat/completions
                  ↓
② 模板渲染      Jinja(--jinja,默认开)
                  ↓  --chat-template-kwargs
③ slot 分配     -np 个 slot 中找一个空的
                  ↓  --parallel
④ 分词          内置 tokenizer(GGUF 里带)
                  ↓
⑤ 批处理        continuous batching
                  ↓  -b / -ub
⑥ 推理          层在 GPU / CPU 之间切分
                  ↓  -ngl / --n-cpu-moe
⑦ 采样 + 推测   可选 speculative
                  ↓  --spec-type
⑧ 输出          流式 / 全量
                  ↓  --reasoning-format

两个 batch 参数的区别

这是 llama.cpp 特有的概念,容易混淆:

参数名称含义
-b, --batch-size逻辑批大小一次 prompt 处理最多多少个 token(默认 2048)
-ub, --ubatch-size物理批大小单个计算图里最多多少个 token(默认 512)

关系:逻辑批会被拆成多个物理批依次计算。

  • -b 影响吞吐(一次能吃多长的 prompt)
  • -ub 影响显存峰值(单个计算图多大)
  • 显存不够时,优先降 -ub

04核心参数详解

4.1模型与上下文

参数默认说明
-m, --model—GGUF 文件路径
-hf <user>/<repo>[:quant]—直接从 HF 拉取并选择量化
-mu, --model-url—从 URL 拉取
-md, --model-draft—草稿模型路径(投机解码)
-mm, --mmproj—多模态投影器路径
--alias—API 里显示的模型名(逗号分隔多个)
-c, --ctx-size0(从模型读)上下文长度
-n, --predict-1(无限)最大生成 token 数
--keep0保留 prompt 开头的多少 token(-1 = 全部)
--rope-scaling模型默认none / linear / yarn
--rope-scale—缩放倍数
--rope-freq-base—RoPE 基频

4.2GPU 与内存

参数默认说明
-ngl, --gpu-layersauto最重要的参数:放 GPU 的层数。可用 999 或 all
-sm, --split-modelayernone / layer / row(废弃)/ tensor(实验)
-ts, --tensor-split自动各卡分配比例,如 3,1 表示 75% / 25%
-mg, --main-gpu0主 GPU(split-mode none 时选卡)
-dev, --device自动限定设备,如 CUDA1
--list-devices—列出可用设备与显存
--n-cpu-moe N0把前 N 层的 MoE 专家权重放 CPU
--n-cpu-ffn N0把前 N 层的稠密 FFN 权重放 CPU
--moe-cache-mib N0MoE 专家在 CPU 的 GPU 缓存大小(MiB)
-fit, --fiton自动适配未设置的参数到设备内存
--mlock关锁定内存,防止换出
--no-mmap关(即默认 mmap)禁用内存映射

--n-cpu-moe 是 2026 年 llama.cpp 最有价值的参数之一。MoE 模型的专家权重占用巨大但每次只激活少量,把它放 CPU 只传激活的那部分,比把整层放 CPU 高效得多。这让 120B–235B 的 MoE 模型在单机上变得可行。

4.3KV Cache

参数默认说明
-ctk, --cache-type-kf16K 的精度:f32/f16/bf16/q8_0/q4_0/q4_1/iq4_nl/q5_0/q5_1
-ctv, --cache-type-vf16V 的精度,同上
-fa, --flash-attnautoon / off / auto
--swa-full关用全尺寸 SWA cache
--slot-save-path关闭slot KV 的保存路径
-ctv 量化必须开 Flash Attention

。设了 -ctv q8_0 但 -fa off 会报错。

4.4批处理与并行

参数默认说明
-b, --batch-size2048逻辑批大小
-ub, --ubatch-size512物理批大小(显存峰值由它决定)
-np, --parallel-1(自动)slot 数,即并发对话数
-cb, --cont-batching开启连续批处理
-t, --threads-1(自动)生成阶段的 CPU 线程数
-tb, --threads-batch同 -t批处理/prompt 阶段的线程数
-C, --cpu-mask—CPU 亲和性掩码(十六进制)
-Cr, --cpu-range—CPU 范围,如 0-7
--cpu-strict0严格 CPU 放置
--prio0进程优先级:-1 低 / 0 普通 / 1 中 / 2 高 / 3 实时
--poll50轮询级别 0–100

4.5服务

参数默认说明
--host127.0.0.1监听地址
--port9931端口
--api-key无API 密钥(逗号分隔多个)
--api-key-file—密钥文件,一行一个,# 开头为注释
--metrics关闭Prometheus 指标端点
--slots—slot 监控端点
--props关闭允许 POST /props 改全局属性
--path—静态文件目录(Web UI)
--timeout3600读写超时(秒)
--media-path关闭本地媒体文件目录
--models-dir—模型目录(支持动态加载多模型)
--jinja开启用 Jinja 模板引擎
--chat-template-kwargs—传给模板的 JSON 参数
--reasoning-format—none / deepseek / deepseek-legacy
--tool-server—内置工具服务(如 demo)
默认端口是 9931

,不是 8000 也不是 30000。这个很容易踩。

4.6采样

参数默认
--temp0.80
--top-k40(0 = 关闭)
--top-p0.95(1.0 = 关闭)
--min-p—

4.7投机解码

参数说明
--spec-type逗号分隔的方法列表
--model-draft / -md草稿模型路径
--spec-draft-n-max最大草稿 token 数
--target-model-dir转换 EAGLE-3 / DFlash 时指定目标模型

05并行策略选型

本引擎的推理拓扑与 KV 存放

为便于阅读,下图使用小规模设备组解释机制,不代表旗舰模型能装入这些设备。

layer 是按层放置,tensor 是实验性权重/KV 切分,不是路由专家 EP。这里不画不存在对应配置的 TEP/DEP;-ngl 和 CPU offload 也不是 EP。

llama.cpp · layer:按层放置--split-mode layer -ngl all层数是示意;KV 跟随所属层,不能将其标成 GQA 的 KV-head TP 分片。请求入口 / 调度器GPU 0层 0–9仅这些层的 KV权重不做层内 TPGPU 1层 10–19仅这些层的 KV权重不做层内 TPGPU 2层 20–29仅这些层的 KV权重不做层内 TPGPU 3层 30–39仅这些层的 KV权重不做层内 TP层组之间传递激活;同一请求按层顺序前进。输出 / 进入后续计算
llama.cpp · layer:按层放置 · 层数是示意;KV 跟随所属层,不能将其标成 GQA 的 KV-head TP 分片。
llama.cpp · tensor:实验性切分--split-mode tensor -fa on -ctk f16 -ctv f16按所引官方文档:tensor 为实验特性;KV 类型与 --fit 等限制以目标构建为准。请求入口 / 调度器GPU 0权重矩阵切片GQA KV heads 0–1示例有 8 个 KV headGPU 1权重矩阵切片GQA KV heads 2–3示例有 8 个 KV headGPU 2权重矩阵切片GQA KV heads 4–5示例有 8 个 KV headGPU 3权重矩阵切片GQA KV heads 6–7示例有 8 个 KV head多卡归约部分结果;不是专家编号 EP 分配。输出 / 进入后续计算
llama.cpp · tensor:实验性切分 · 按所引官方文档:tensor 为实验特性;KV 类型与 --fit 等限制以目标构建为准。
llama.cpp · MoE 专家留 CPU--n-cpu-moe N;可选 --moe-cache-mib不把 vLLM/SGLang 的 TEP、DEP、共享专家布局套用到 llama.cpp。请求入口 / 调度器GPUAttention / KVGPU 常驻部分其余按配置卸载CPU RAM指定层的专家权重CPU / 缓存执行路径不是 GPU 间 EP请求路由top-k 选专家逻辑仍由模型决定不是存满全部激活数据交换按实际执行路径传激活 / 结果等不承诺只拷权重这是异构卸载机制,不是 TP4 + EP4。输出 / 进入后续计算
llama.cpp · MoE 专家留 CPU · 不把 vLLM/SGLang 的 TEP、DEP、共享专家布局套用到 llama.cpp。

官方依据:llama.cpp 并行与配置文档。图示策略存在不代表某个模型、精度、硬件组合已实测。

三种 split mode

模式机制何时用限制
none单卡,--main-gpu 选卡显式限制在单卡—
layer(默认)流水并行:每卡持连续的一段层,KV 跟着层走默认选择;要更大显存 + 快 prefill;能容忍慢互联—
row旧的行切分 TP已废弃,勿用性能差
tensor实验性 TP:权重和 KV 都切要低延迟;快互联(NVLink)KV 必须 f16/bf16/f32;--fit 不支持;FA 必须开

流水 vs 张量的本质差异

官方文档讲得很清楚:

Pipeline-parallel runs different layers on different GPUs and processes tokens sequentially through the pipeline. This minimizes data transfers between GPUs but requires many tokens to scale well. Tensor-parallel splits each layer across GPUs and does multiple cross-GPU reductions per layer. This enables parallelizing any workload but is much more bottlenecked by the GPU interconnect speed. Pipeline-parallel maximizes batch throughput; tensor-parallel minimizes latency.

翻译成决策规则:

CODE
你的目标是?
├─ 吞吐(离线批处理、多用户)→ --split-mode layer(默认)
└─ 延迟(单用户交互)→ --split-mode tensor(需 NVLink)

分配比例

BASH
# 两张卡显存不同:第一张 3 份,第二张 1 份
llama-server -m model.gguf -ts 3,1

# 等价写法(比例归一化)
llama-server -m model.gguf -ts 75,25

比例按 --device 的顺序对应。

MoE 的 CPU 卸载策略

这是 llama.cpp 在 MoE 上的独门技巧。

传统做法:-ngl 放不下的层整层放 CPU。但 MoE 层的专家权重占绝大部分,而每次只激活 top-k 个。

llama.cpp 的做法:

BASH
# 把前 N 层的 MoE 专家权重放 CPU,注意力/共享专家留在 GPU
llama-server -m model.gguf --n-cpu-moe 20

# 给 CPU 上的 MoE 专家一个 GPU 缓存
llama-server -m model.gguf --n-cpu-moe 20 --moe-cache-mib 2048

稠密模型用 --n-cpu-ffn:

BASH
llama-server -m model.gguf --n-cpu-ffn 10
效果

让 120B 级 MoE 在单张 24–48GB 显卡上可跑。这是 llama.cpp 相对其它框架的独特优势。


06逐模型实战配置

6.1快速上手:一条命令

BASH
# 从 HF 直接拉(自动选量化)
llama-cli -hf ggml-org/gemma-3-1b-it-GGUF

# 服务化
llama-server -hf ggml-org/gemma-3-1b-it-GGUF

6.2gpt-oss-120b(推荐的重点模型)

117B 总参 / 5.1B 激活,原生 MXFP4,量化后约 63 GB。

单张 80GB 卡:

BASH
llama-server \
  -m gpt-oss-120b-mxfp4.gguf \
  -ngl 999 \
  -c 131072 \
  -fa on \
  -ctk q8_0 -ctv q8_0 \
  --jinja \
  --reasoning-format deepseek \
  --host 0.0.0.0 --port 8000 \
  --alias gpt-oss-120b

单张 48GB 卡(用 MoE 卸载):

BASH
llama-server \
  -m gpt-oss-120b-mxfp4.gguf \
  -ngl 999 \
  --n-cpu-moe 16 \
  --moe-cache-mib 4096 \
  -c 32768 \
  -fa on

双卡(流水):

BASH
llama-server \
  -m gpt-oss-120b-mxfp4.gguf \
  -ngl 999 \
  -sm layer \
  -c 65536 \
  -fa on

工具调用:

BASH
llama-server \
  -m gpt-oss-120b-mxfp4.gguf \
  -ngl 999 \
  --jinja \
  --tool-server demo

gpt-oss 用 harmony chat 格式,--jinja 会从 GGUF 元数据里读模板。

验证:

BASH
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-oss-120b",
    "messages": [{"role":"user","content":"Explain eigenvalues briefly."}],
    "max_tokens": 256
  }'

6.3Llama-3.3-70B

70B 稠密,Q4_K_M 约 42 GB。

单张 48GB(如 RTX 6000 Ada / A6000):

BASH
llama-server \
  -m Llama-3.3-70B-Instruct-Q4_K_M.gguf \
  -ngl 999 \
  -c 32768 \
  -fa on \
  -ctk q8_0 -ctv q8_0 \
  -b 2048 -ub 512

双卡 24GB(流水):

BASH
llama-server \
  -m Llama-3.3-70B-Instruct-Q4_K_M.gguf \
  -ngl 999 \
  -sm layer \
  -ts 1,1 \
  -c 16384 \
  -fa on \
  -ctk q8_0 -ctv q8_0

纯 CPU(64GB 内存,慢但可用):

BASH
llama-server \
  -m Llama-3.3-70B-Instruct-Q4_K_M.gguf \
  -ngl 0 \
  -t 32 \
  -c 8192

CPU 上 70B Q4 大约 2–4 tok/s(取决于 CPU)。只适合离线/实验。

6.4Qwen3 系列

BASH
# Qwen3-32B,单张 24GB
llama-server \
  -m Qwen3-32B-Q4_K_M.gguf \
  -ngl 999 \
  -c 32768 \
  -fa on \
  -ctk q8_0 -ctv q8_0 \
  --jinja

# Qwen3-30B-A3B(MoE),用 CPU 卸载跑在 16GB 卡上
llama-server \
  -m Qwen3-30B-A3B-Q4_K_M.gguf \
  -ngl 999 \
  --n-cpu-moe 24 \
  -c 32768 \
  -fa on

6.5投机解码实战

EAGLE-3

BASH
# 1) 转换草稿模型(必须指定目标模型以继承 tokenizer)
python convert_hf_to_gguf.py AngelSlim/Qwen3-4B_eagle3 \
  --target-model-dir Qwen/Qwen3-4B \
  --outtype bf16 \
  --outfile Qwen3-4B-eagle3.gguf

# 2) 启动
llama-server \
  -m Qwen3-4B.gguf \
  -md Qwen3-4B-eagle3.gguf \
  --spec-type draft-eagle3

官方支持的 EAGLE-3 草稿模型(部分):

  • yuhuili/EAGLE3-LLaMA3.1-Instruct-8B
  • yuhuili/EAGLE3-LLaMA3.3-Instruct-70B
  • AngelSlim/Qwen3-{1.7B,4B,8B,14B,32B}_eagle3
  • Tengyunw/qwen3_8b_eagle3
  • Tengyunw/qwen3_30b_moe_eagle3
  • RedHatAI/gpt-oss-20b-speculator.eagle3
  • lmsys/EAGLE3-gpt-oss-120b-bf16
  • nvidia/gpt-oss-120b-Eagle3-long-context

DFlash

BASH
python convert_hf_to_gguf.py z-lab/Qwen3-4B-DFlash \
  --target-model-dir Qwen/Qwen3-4B \
  --outtype bf16 \
  --outfile Qwen3-4B-DFlash.gguf

llama-server \
  -m Qwen3-4B.gguf \
  -md Qwen3-4B-DFlash.gguf \
  --spec-type draft-dflash \
  --spec-draft-n-max 15 \
  -fa on --jinja

N-gram(零额外模型)

BASH
llama-server \
  -m model.gguf \
  -ngl 999 \
  --spec-type ngram-simple

适合代码补全、模板化输出这类重复性强的场景。对自由文本收益有限。

混用

BASH
# 同时用 draft 模型 + n-gram
llama-server \
  -m model.gguf \
  -md draft.gguf \
  --spec-type draft-simple,ngram-simple

6.6多模态

BASH
llama-server \
  -m model.gguf \
  --mmproj mmproj-model-f16.gguf \
  -ngl 999 \
  -c 8192

-hf 拉取时,如果仓库里有 mmproj,会自动关联。

6.7配置速查

场景关键参数
单卡尽量跑满-ngl 999 -fa on -ctk q8_0 -ctv q8_0
显存不够--n-cpu-moe N(MoE)/ --n-cpu-ffn N(稠密)/ 降 -c / 降 -ub
多卡吞吐-sm layer -ts 1,1(默认)
多卡低延迟-sm tensor + -fa on + 非量化 KV
多用户-np 4 + -cb(默认开)
低延迟单用户--spec-type draft-eagle3
代码补全--spec-type ngram-simple
生产 API--api-key xxx --metrics --host 0.0.0.0

07调优方法论

先定位瓶颈

现象瓶颈检查
生成慢(< 5 tok/s)但 GPU 利用率低层在 CPU 上看启动日志的 offloaded N/M layers to GPU
prefill 慢-b 太小 / -ub 太小提高 -b(与显存权衡)
显存刚好卡住KV 太大-ctk q8_0 -ctv q8_0;降 -c
多用户时变慢slot 太少提高 -np
延迟抖动调度开销降 -np;考虑 --prio 2

按顺序调

第一步:确保层都在 GPU

看启动日志:

CODE
load_tensors: offloaded 41/41 layers to GPU

如果是 offloaded 35/41 layers,说明 6 层在 CPU——这是最大的性能杀手。

解决:降 -c、量化 KV、用 --n-cpu-moe(MoE)。

第二步:量化 KV

BASH
-ctk q8_0 -ctv q8_0 -fa on

省一半 KV 显存,精度几乎无损。

第三步:调 -b / -ub

  • -b 2048 是默认,长 prompt 场景可提到 4096
  • -ub 512 是默认,显存紧可降到 256 或 128
  • 提高 -b 提升 prefill 吞吐;提高 -ub 提升单批效率但增显存

第四步:调线程(CPU 推理时)

BASH
-t $(nproc)          # 生成阶段
-tb $(nproc)         # prompt 阶段

一般设为物理核数。超线程核心不计入,设成逻辑核数反而变慢。

CPU 亲和性:

BASH
-Cr 0-31             # 限定在前 32 个核
--cpu-strict 1

第五步:投机解码

  • 交互场景:EAGLE-3 收益最大
  • 代码/模板:n-gram
  • 有一定成本(额外显存放 draft 模型),要权衡

按场景的配方

场景配置
本地单用户聊天-ngl 999 -fa on -ctk q8_0 -ctv q8_0 -np 1 --spec-type draft-eagle3
本地多用户 API-ngl 999 -np 8 -cb -b 4096 --host 0.0.0.0 --api-key xxx
离线批处理-ngl 999 -b 8192 -ub 1024 -np 1(大 batch 吞吐优先)
CPU 部署-ngl 0 -t <物理核数> -c 4096 -ctk q8_0
边缘设备-ngl 999 -c 4096 -ctk q4_0 -ctv q4_0(极致省显存)
MoE 大模型单卡-ngl 999 --n-cpu-moe N --moe-cache-mib 4096

性能观测

BASH
# 内置性能计时
--perf

# Prometheus
--metrics
curl http://localhost:9931/metrics

llama.cpp 的日志会打印每个请求的:

  • prompt eval time(prefill)
  • eval time(decode)
  • tokens per second

这是最直接的调优依据。


08生产化与排错

8.1容器

官方提供多个镜像:

镜像内容
ghcr.io/ggml-org/llama.cpp:server仅 llama-server
ghcr.io/ggml-org/llama.cpp:server-cudaCUDA 12
ghcr.io/ggml-org/llama.cpp:server-cuda13CUDA 13
ghcr.io/ggml-org/llama.cpp:server-rocmROCm
ghcr.io/ggml-org/llama.cpp:server-musaMUSA
ghcr.io/ggml-org/llama.cpp:server-intelSYCL
ghcr.io/ggml-org/llama.cpp:full含转换与量化工具
ghcr.io/ggml-org/llama.cpp:light仅 CLI
BASH
docker run -d \
  --gpus all \
  --name llama-server \
  -p 8000:8000 \
  -v /models:/models \
  ghcr.io/ggml-org/llama.cpp:server-cuda13 \
  -m /models/model.gguf \
  -ngl 999 \
  -c 32768 \
  -fa on \
  --host 0.0.0.0 --port 8000 \
  --api-key your-secret-key \
  --metrics

8.2端点

端点说明
/v1/chat/completionsOpenAI 兼容对话
/v1/completions补全
/v1/responsesResponses API
/v1/embeddings向量
/v1/models模型列表
/rerank重排序
/health健康检查
/metricsPrometheus(需 --metrics)
/slotsslot 状态(需 --slots)
/props全局属性(需 --props 才能改)
/Web UI

支持 Anthropic Messages API,可直接接 Claude Code:

BASH
llama-server -m model.gguf -ngl 999 --jinja --host 0.0.0.0 --port 8000

ANTHROPIC_BASE_URL=http://localhost:8000 \
ANTHROPIC_AUTH_TOKEN=dummy \
claude

8.3故障排查

现象原因处理
速度只有几 tok/s层被 offload 到 CPU看日志 offloaded N/M;降 -c;量化 KV;--n-cpu-moe
启动 OOM层数 × 权重 + KV 超了降 -ngl;降 -c;降 -ub
-ctv q8_0 报错没开 Flash Attention加 -fa on
tensor 模式报错KV 是量化格式 / --fit 开着-ctk f16 -ctv f16;--fit off
模型加载失败GGUF 版本不匹配重新转换或升级 llama.cpp
中文乱码 / 分词异常tokenizer 缺失确认 GGUF 内含 tokenizer
工具调用不生效模板不支持加 --jinja;检查 --chat-template-kwargs
推理内容混在 content--reasoning-format 未设设 deepseek 或 deepseek-legacy
多用户时排队-np 太小提高 -np(代价是每个 slot 的上下文变小)
端口连不上默认 9931检查 --port
多模态报错mmproj 未加载加 --mmproj

8.4安全

  • 默认只监听 127.0.0.1:要对外必须显式 --host 0.0.0.0
  • 默认无鉴权:务必设 --api-key 或 --api-key-file
  • --media-path 会暴露本地文件读取,只在可信环境开
  • --props 允许运行时改配置,生产环境慎开

09附录

A. 参数速查

参数一句话
-m模型路径
-hf从 HF 直接拉
-ngl放 GPU 的层数,最重要的参数
-c上下文长度
-faFlash Attention
-ctk / -ctvK/V 的 KV Cache 精度
-b / -ub逻辑 / 物理批大小
-npslot 数(并发对话)
-cb连续批处理(默认开)
-smsplit mode:layer / tensor / none
-ts各卡分配比例
--n-cpu-moeMoE 专家放 CPU 的层数
--n-cpu-ffn稠密 FFN 放 CPU 的层数
--moe-cache-mibCPU 专家在 GPU 的缓存
--fit自动适配内存(默认 on)
-t / -tb生成 / 批处理线程数
--jinjaJinja 模板(默认开)
--spec-type投机解码方法
-md草稿模型
--reasoning-format推理内容格式
--api-key鉴权
--metricsPrometheus
--port端口(默认 9931)

B. 环境变量

变量作用
LLAMA_ARG_*所有参数都有对应的环境变量形式(见参数表)
LLAMA_API_KEY等价 --api-key
CUDA_VISIBLE_DEVICES控制可见 GPU
MODEL_ENDPOINT指定 HF 兼容的模型源
LLAMA_ARG_N_GPU_LAYERS等价 -ngl

C. 量化格式选择指南

格式用途
Q8_0几乎无损,体积大
Q6_K高保真
Q5_K_M高质量
Q4_K_M默认推荐,性价比最佳
Q4_0更快但质量略低
Q3_K_M显存极度受限
Q2_K仅极限场景
IQ4_XS / IQ3_XSi-quant,同体积下质量更好但更慢
IQ1_S / IQ2_XXS极端压缩,质量明显下降

D. 来源

来源用途
github.com/ggml-org/llama.cpp/tools/server/README.mdserver 全部参数(自动生成)
.../docs/multi-gpu.md多卡 split mode 与配方
.../docs/speculative.md投机解码方法矩阵
.../docs/models.md模型获取与量化
.../docs/docker.md镜像列表
.../docs/function-calling.md工具调用
.../docs/multimodal.md多模态
github releases版本核验

本文档基于 2026-11-06 可获取的公开资料整理。llama.cpp 的参数表由代码自动生成,迭代频繁;具体参数的默认值请以 llama-server --help 输出为准。