Skip to content

采样、量化与部署 — 概念

采样器链 (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_statellama_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 为早期方案,已不作独立架构存在)、DFlashLLM_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)质量损失
F161613.5 GB基准
Q8_08.57.2 GB极小
Q5_16.05.2 GB
Q5_05.54.7 GB
Q4_15.04.3 GB中等
Q4_04.53.8 GB中等
IQ4_XS4.253.6 GB中等
NVFP44~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 | 大(block QK2_0=64,18 字节:f16 scale + 16 字节 2-bit 打包值) |

注:Q3_K_S文件类型LLAMA_FTYPE_MOSTLY_Q3_K_S),不存在对应的 GGML_TYPE_Q3_K_S block 类型——其底层 block 仍为 GGML_TYPE_Q3_K(=11)。

FP8 → Q8 转换convert_hf_to_gguf.py 现支持将 FP8 源权重直接转换为 Q8_0,无需先转 F16。

新量化 kernelGGML_TYPE_Q2_0(block QK2_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) × d

Importance 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_M

llama-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_reasoning kwarg 默认开启,并记录其生效状态,e750b887a
  • MCP stdio 传输 — server 支持以 stdio 方式对接 MCP(20455a4ad#26062);新增 common/subproc.{cpp,h} 包装
  • --cors-* 选项 — 细粒度 CORS 配置(6e52db5b7#25655
  • 单模型模式修复 — 单模型模式下修复 stop 与 reasoning skip 的行为
  • 任务队列重构(本窗口,947fd9bb2)— server 队列改为 worker 线程 + yield_to_queuecallback_new_task 返回 bool、支持多个 sleeping-state 回调;休眠期间也能服务 /metrics
  • 多模型 LRUdff15d4ac 等) — router/多模型的 LRU 调度器:忙模型不逐出、启动模型可懒加载;修复多请求同模型的 LRU 挂起(160bd031b
  • checkpoint 逐出收紧5d806aa25) — min-step 逐出仅在 checkpoint 列表时应用;同 token 数的 checkpoint 被取代而非重复堆积
  • MCP 工具隔离 — MCP tool 可跑在 docker / ssh remote / podman rootless 隔离环境(dd2c7c4474ae84dea2);新增 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

相关概念