菜单

高级特性

相关源文件

本页面介绍了 llama.cpp 除了基本文本生成之外的高级功能,包括安全性考量、多模态支持、生成约束以及复杂的服务器功能。有关模型加载和推理的基础知识,请参阅 入门指南

安全考量

在生产环境中部署 llama.cpp 时,必须考虑几个安全方面,以防范恶意输入、不可信模型以及多租户风险。

威胁模型

安全最佳实践

不可信模型

  • 始终在安全、隔离的环境(容器、虚拟机)中执行不可信模型
  • 加载模型前,请将模型哈希值与已知良好的值进行比对验证
  • 避免运行来自未知开发者或具有未知训练数据的模型

输入过滤

  • 对所有用户输入实施严格验证
  • 使用语法约束和 JSON schema 验证来限制输出格式
  • 在处理前过滤掉潜在的恶意内容
  • 考虑使用提示注入检测模型

多租户部署

  • 使用独立的网络段实施强大的租户隔离
  • 使用资源分配限制来防止拒绝服务攻击
  • 监控异常模式,以防范攻击
  • 注意共享环境中潜在的 GPU/TPU 侧信道攻击

服务器安全

  • 在暴露 llama-server 端点时,使用 API 密钥进行身份验证
  • 避免将 RPC 后端暴露给不受信任的网络
  • 对网络传输数据进行加密
  • 定期更新 llama.cpp 和依赖项

来源

多模态模型

Llama.cpp 支持多模态模型,可以同时处理文本和视觉输入,从而实现视觉问答和图像理解等应用。

服务器集成

llama-server 通过与 OpenAI 兼容的 API 提供多模态支持,自动处理图像处理和嵌入生成。

支持的输入格式

服务器通过 OpenAI API 接受多种格式的图像

图片 URL 格式

音频输入格式

处理流程

系统会自动

  • 下载远程图片(具有可配置的大小和超时限制)
  • 解码 base64 编码的图片
  • 将图片内容替换为占位符标记(mtmd_default_marker
  • 通过多模态投影仪处理图像
  • 将视觉嵌入与文本生成集成

来源

语法约束生成

语法约束生成通过对模型输出强制执行正式语法规则,能够通过服务器 API 实现 JSON、代码或特定领域格式的结构化生成。

JSON Schema 集成

服务器提供从 JSON schema 到语法约束的自动转换,简化了结构化输出生成。

语法触发器

系统支持通过触发机制进行条件语法应用,允许语法约束仅在特定模式出现时激活。

API 使用

直接语法

JSON 模式

语法触发器

实现细节

语法系统集成到采样链中

  1. Schema 转换json_schema_to_grammar 将 JSON schema 转换为 BNF 语法
  2. 触发器检测server_grammar_trigger 监视输出以激活模式
  3. 惰性应用:仅在触发器匹配时应用语法,提高性能
  4. Token 保留preserved_tokens 确保关键 token 不被过滤掉

来源

高级采样技术

Llama.cpp 提供了多种采样方法来控制文本生成,这些方法可以组合成采样链,从而对输出进行细粒度定制。

采样链架构

可用采样器

采样器描述参数用途
温度控制随机性。temp值越高,随机性越大
Top-K仅保留前 K 个 tokentop_kllama_sampler_init_top_k(params.top_k)
Top-P保留概率累积到 P 的前 K 个 tokentop_pllama_sampler_init_top_p(params.top_p, min_keep)
Min-P保留概率大于等于 min_p * prob_max 的 tokenmin_pllama_sampler_init_min_p(params.min_p, min_keep)
Typical保留具有典型概率的 tokentypical_pllama_sampler_init_typical(params.typ_p, min_keep)
XTC增强创造性采样的控制xtc_probability, xtc_thresholdllama_sampler_init_xtc(...)
Dry动态重复预防dry_multiplier, dry_basellama_sampler_init_dry(...)
惩罚重复惩罚penalty_repeat, penalty_freq, penalty_presentllama_sampler_init_penalties(...)
Mirostat保持恒定的困惑度mirostat_tau, mirostat_etallama_sampler_init_mirostat(...)

创建采样链

采样链通过 common_samplerllama_sampler_chain 结构实现

示例初始化

common_sampler* smpl = common_sampler_init(model, params.sampling);
llama_sampler_chain_add(smpl->chain, llama_sampler_init_top_k(params.top_k));
llama_sampler_chain_add(smpl->chain, llama_sampler_init_top_p(params.top_p, params.min_keep));
llama_sampler_chain_add(smpl->chain, llama_sampler_init_temp(params.temp));

来源

批量处理

批量处理允许 llama.cpp 一次性高效处理多个输入,显著提高了吞吐量和硬件利用率。

批处理架构

批处理模式

Llama.cpp 支持多种批处理方法

  1. Token 批处理:一次处理单个序列的多个 token
  2. 序列批处理:同时处理多个序列的 token
  3. Prompt 和生成批处理:高效处理 prompt 和生成的文本

批量基准测试参数

批量基准测试工具通过不同的配置帮助优化性能

参数目的影响
n_batch主批量大小控制一次处理的 token 数量
n_ubatch微批量大小对于 GPU 处理,较小的任务块
PPPrompt 处理 token 数从 prompt 中处理的初始 token 数
TGToken 生成计数要生成的 token 数量
PL并行序列计数并行运行的序列数量
is_pp_sharedPrompt 处理共享序列是否共享 prompt 上下文

来源

并行处理

并行处理允许同时运行多个推理,模拟多个客户端或同时生成多个文本流。

架构

实现细节

并行处理依赖于

  1. 序列 ID:每个并行流都有一个唯一的序列 ID(seq_id
  2. KV 缓存管理:高效地跨序列共享和管理 KV 缓存
  3. 批处理构建:将来自不同序列的 token 合并到一个批次中
  4. 上下文管理:单独跟踪每个序列的状态

并行示例模拟了多个客户端向服务器发送请求,每个客户端都有自己的序列和 prompt。

来源

文本填充

文本填充能够生成内容来填补现有文本中的空白,而不仅仅是附加在 prompt 末尾。

架构

实现方法

填充过程工作方式是

  1. 使用特殊 token 标记文本区域
  2. 处理前缀(gap 前的文本)和后缀(gap 后的文本)
  3. 生成内容来填充中间部分
  4. 在满足适当条件时停止生成

系统使用特殊词汇 token 来定义区域

  • llama_vocab_fim_pre:标记前缀内容的开始
  • llama_vocab_fim_suf:标记后缀内容的开始
  • llama_vocab_fim_mid:可选标记,用于生成中间内容

命令行示例

来源