Appearance
采样、量化与部署 — 概念
采样器链 (Sampler Chain)
sampler-chain 采样器链是一个管道,logits 依次经过多个采样器处理:
常见采样器
| 采样器 | 作用 |
|---|---|
| Temperature | 缩放 logits 温度 |
| Top-K | 只保留概率最高的 K 个 |
| Top-P | 只保留累积概率前 P 的 token |
| Min-P | 过滤概率低于最大概率 × min_p 的 token |
| Typical | 基于信息熵的采样 |
| Mirostat | 自适应温度控制 |
| Grammar | 基于语法约束输出格式 |
| Penalties | 重复惩罚、频率惩罚 |
| Logit Bias | 手动调整特定 token 的概率 |
后端采样:对于 MTP 推测解码,Top-K 可在 GPU 上执行(
--spec-draft-backend-sampling),避免将全部 logits 传回 CPU。多输出后端采样(本窗口重点,
dd1ea5243,#25532):采样器链不再只是 CPU 概念——可在创建 context 时逐序列挂载(llama_context_params::samplers数组,或llama_set_sampler(ctx, seq_id, smpl)),采样在解码图内于 GPU 上执行,一次 decode 可产出每序列多个输出(n_outputs_max_per_seq),结果经llama_get_sampled_token_ith()等_ith系列 getter 按输出行读取。关键语义:采样器状态在被 accept 时才推进(不是被读取时);接受多个输出时必须接受输出顺序的连续前缀——被拒的推测不消耗 RNG。llama_sampler_sample保留兼容:先查后端已产出的 token(有则 accept 并返回),否则回退 CPU 链。配套llama_sampler_i新增backend_init/accept/apply/set_input/reset钩子与copy_state(llama_sampler_copy())。历史类采样器签名变化:
common_sampler_init去掉了n_ctx参数(采样器先于 context 构造);penalty_last_n = -1现解析为 1024 而非上下文长度;llama_sampler_init_penalties新增打头的n_vocab参数;llama_sampler_init_dry去掉context_size。suppress_tokens 并入 logit-bias:模型级屏蔽 token 从 gemma4 的图级 hack 改为通用机制——
llama_vocab_get_suppress_tokens()暴露,common/sampling.cpp在采样器初始化时并入 logit-bias(-INFINITY)。推测解码家族:除 MTP 外,llama.cpp 还支持 EAGLE3(
LLM_ARCH_EAGLE3,直接复用目标模型的层输入特征;EAGLE/EAGLE2 为早期方案,已不作独立架构存在)、DFlash(LLM_ARCH_DFLASH,块扩散 draft,一次前向产出整块 token)、DFlash2(局部卷积 + candidate selector,spec 类型可从 draft GGUF 元数据自动检测)、DSpark(在 DFlash draft 上新增低秩 Markov head,anchor-first 半自回归;本窗口扩展到 LFM2 / Nemotron3.5 / bailingmoe3)与 ngram 等多种 draft 方案。DFlash — 块扩散(block diffusion)推测解码:
--spec-type draft-dflash,draft 把目标模型隐藏状态注入自身 attention(encoder 现已融合进 KV 注入图),多层但每步吐出整块;--spec-draft-n-max被钳制到训练块大小(详见 推理图)。采样器名称匹配放宽:
--sampler等参数的名称匹配现已更宽松,容错性更好。top-n-sigma 精简:top-n-sigma 采样器移除了原先内部多余的 softmax + sort——这两个步骤对该采样器是冗余的,去掉后逻辑更清晰、开销更低。
量化 (Quantization)
quantization 将模型权重从 F16 压缩为低比特整数:
量化类型对比
| 类型 | 比特/权重 | 模型大小 (7B) | 质量损失 |
|---|---|---|---|
| F16 | 16 | 13.5 GB | 基准 |
| Q8_0 | 8.5 | 7.2 GB | 极小 |
| Q5_1 | 6.0 | 5.2 GB | 小 |
| Q5_0 | 5.5 | 4.7 GB | 小 |
| Q4_1 | 5.0 | 4.3 GB | 中等 |
| Q4_0 | 4.5 | 3.8 GB | 中等 |
| IQ4_XS | 4.25 | 3.6 GB | 中等 |
| NVFP4 | 4 | ~3.4 GB | 中等(NVIDIA 特定浮点格式,加载时统一附加 per-tensor scale) |
GGUF 量化元数据走 LLM_KV:写 GGUF 时,
general.quantization_version(=GGML_QNT_VERSION)与general.file_type改用统一的LLM_KV接口(LLM_KV_GENERAL_QUANTIZATION_VERSION/LLM_KV_GENERAL_FILE_TYPE)写入,消除了原先硬编码 key 的 TODO。这与架构 / 超参数的 KV 命名一致,保证元数据键的统一来源。NVFP4 FFN 边界修复:在
build_ffn中,后 GEMM 的反量化 MUL 移至 LoRA 残差与 bias-add 之前,并限制 NVFP4 仅用于受支持的算子组合(详见 推理图)。 | Q3_K_S | 3.5 | 3.0 GB | 较大 | | Q2_K | 2.75 | 2.4 GB | 大 | | Q2_0 | 2.25 | ~1.9 GB | 大(blockQK2_0=64,18 字节:f16 scale + 16 字节 2-bit 打包值) |
注:
Q3_K_S是文件类型(LLAMA_FTYPE_MOSTLY_Q3_K_S),不存在对应的GGML_TYPE_Q3_K_Sblock 类型——其底层 block 仍为GGML_TYPE_Q3_K(=11)。
FP8 → Q8 转换:
convert_hf_to_gguf.py现支持将 FP8 源权重直接转换为 Q8_0,无需先转 F16。新量化 kernel:
GGML_TYPE_Q2_0(blockQK2_0=64,18 字节)的 CPU 通用 + ARM + x86 kernel 已落地(Vulkan 端经sync: ggml);NVFP4 的点积 kernel 新增 x86 AVX2(UE4M3 LUT)与 ARM(UE4M3 LUT)优化路径。注意GGML_QNT_VERSION维持 2(Q2_0 插入既有类型空间,未改盘上布局)。本窗口量化无新类型:
ggml-quants.c零改动、类型定义不变——量化侧的工作全在后端 kernel(CUDA branchless Q4_K/Q5_K unpack + DGX Spark L2 prefetch、Vulkan TQ1_0、OpenCL lm_head 量化 GEMV/GEMM)与稀疏 FA(ggml_flash_attn_ext_set_n_kv_max)。实验性
ggml-et后端:一套把算子融合成 uber-kernel 的第二 CPU 后端(MUL_MAT / ROPE / RMS_NORM 等),默认 OFF,见 后端抽象。
Block Quantization
量化以 block 为单位(通常 32 个权重):
Block Q4_0 (18 bytes for 32 weights):
┌──────────┬──────────────────────┐
│ d (F16) │ 16 × uint8 (4-bit × 32) │
│ scale │ quantized values │
└──────────┴──────────────────────┘
dequantize: weight = (quantized - 8) × dImportance Matrix (imatrix)
imatrix 通过在校准数据上统计各张量的重要性,指导量化时保留关键权重:
bash
# 生成 imatrix
./llama-imatrix -m model.gguf -f calibration.txt -o imatrix.dat
# 使用 imatrix 量化
./llama-quantize --imatrix imatrix.dat model.gguf model-Q4_K_M.gguf Q4_K_Mllama-server
llama-server 提供 OpenAI 兼容 API,也可通过统一入口 llama serve 启动:
bash
# 方式 1:直接使用 llama-server
./llama-server -m model.gguf --port 8080
# 方式 2:通过统一入口
./llama serve -m model.gguf --port 8080
# 调用 chat completion
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"model","messages":[{"role":"user","content":"Hello"}]}'支持的端点:
/v1/chat/completions— Chat Completion/v1/completions— Text Completion/v1/embeddings— Embeddings/v1/models— 模型列表/health— 健康检查
Server 新增功能
- Token 计数 API —
*/input_tokens端点可仅计数 token 而不执行完整推理 - 实时推理中断 —
POST /v1/chat/completions/control可在生成过程中中断 thinking(reasoning) - SSE ping interval — 配置化心跳防止长生成时连接断开
- HTTP ETags — 基于 FNV-hash 的缓存支持,减少重复传输
- Thinking 模式 — UI 支持推理模式切换和 reasoning effort 级别
- API Key 文件 —
LLAMA_ARG_API_KEY_FILE环境变量支持从文件读取 API key - 超时延长 — 默认 timeout 提升至 3600s
--log-prompts-dir— 将每个 prompt 写入指定目录下的独立文本文件,便于审计- router 模式日志精简 — router 模式下跳过无用的日志行
- 推测解码 checkpoint 优化 — 跳过
pos_next之后的 checkpoint,减少验证开销 - KV cache 保护 — 无统一 KV cache 时不清空 slot;刷新 HTTP 头时跳过请求解析
- SSE Replay Buffer — 流式响应支持断线重连:首次请求附带
X-Conversation-Id头,服务端在客户端断开后继续后台缓冲 SSE 字节;客户端通过GET /v1/stream?conv_id=<id>&from=N回放续接(conv_id是查询参数,非路径段,from=N指定回放起点),另可POST /v1/streams/lookup查询、DELETE /v1/stream?conv_id=<id>终止;长生成不再因网络抖动丢失(不存在X-Stream-Resume头) - schema + 校验 — 请求体新增
schema字段并对参数做校验 /models/sse— 模型加载进度通过 SSE 实时推送(UI 同步显示状态与进度)- router 模式 — child ↔ router 通信重构、新增 model 管理 API、模型下载移至独立进程
--agent参数;tool call responses API 新增id;last-5-seconds 生成速度显示- 错误码 — 无效 grammar 返回 HTTP 400;禁用功能返回 HTTP 403
- 每条 user message 建 checkpoint;batch 构造重构
- MiniCPM5 工具调用 — 新增 MiniCPM5 PEG tool-call parser;
--reasoning-preserve控制输出是否保留推理内容(本窗口起 server 的preserve_reasoningkwarg 默认开启,并记录其生效状态,e750b887a) - MCP stdio 传输 — server 支持以 stdio 方式对接 MCP(
20455a4ad,#26062);新增common/subproc.{cpp,h}包装 --cors-*选项 — 细粒度 CORS 配置(6e52db5b7,#25655)- 单模型模式修复 — 单模型模式下修复 stop 与 reasoning skip 的行为
- 任务队列重构(本窗口,
947fd9bb2)— server 队列改为 worker 线程 +yield_to_queue,callback_new_task返回 bool、支持多个 sleeping-state 回调;休眠期间也能服务/metrics - 多模型 LRU(
dff15d4ac等) — router/多模型的 LRU 调度器:忙模型不逐出、启动模型可懒加载;修复多请求同模型的 LRU 挂起(160bd031b) - checkpoint 逐出收紧(
5d806aa25) — min-step 逐出仅在 checkpoint 列表满时应用;同 token 数的 checkpoint 被取代而非重复堆积 - MCP 工具隔离 — MCP tool 可跑在 docker / ssh remote / podman rootless 隔离环境(
dd2c7c447、4ae84dea2);新增read_media工具 - 媒体输入的 slot save/restore — 带图片/视频输入的会话槽位保存恢复(
5d9e5ac30) - httplib 移入 vendor/ — 从
tools/server/httplib.h迁至vendor/cpp-httplib/(现拆为 .h + .cpp,版本 0.54.1) - 测试基建 — server 测试改用 pytest-xdist 并行(
42f0225fe)
多模态 (mtmd) 视频
server 现支持视频输入:多模态请求中可传入 base64 编码的视频,由 mtmd 经 lazy bitmap API 按需解码帧后送入 vision tower。
废弃 API
llama_set_warmup()— 已标记为废弃。对 MoE 模型会导致额外的图重分配,建议手动执行 warmup
相关概念
- sampler-chain — 采样器链设计
- quantization — 量化算法
- imatrix — 重要性矩阵