菜单

服务器

相关源文件

本文档概述了 llama.cpp 中的 HTTP 服务器组件,它允许用户通过 REST API 接口与 LLaMA 模型进行交互。该服务器使应用程序无需直接集成 llama.cpp 库即可进行文本补全、聊天、嵌入和其他操作的请求。

概述和功能

llama.cpp 服务器是一个快速、轻量级的 HTTP 服务器,使用 httplibnlohmann 构建而成。它提供了一种通过网络暴露 LLM 推理能力的方式。

主要功能

  • 在 GPU 和 CPU 上对 F16 和量化模型进行 LLM 推理
  • 兼容 OpenAI API 的聊天补全和嵌入路由
  • 带有多用户支持的并行解码
  • 连续批处理以高效处理多个请求
  • 重排功能(进行中)
  • 多模态支持(进行中)
  • 监控端点
  • 基于模式的 JSON 响应格式
  • 用于各种模型类型的函数调用/工具使用

来源:examples/server/README.md3-18

架构

服务器采用基于任务的架构,并带有用于并发请求处理的插槽系统。当请求到达时,它会被转换为一个任务并放入队列。可用的处理插槽会拾取任务,使用加载的模型进行推理,并返回结果。

来源:examples/server/server.cpp45-80 examples/server/server.cpp189-216

服务器状态

服务器在两种状态之一运行

  • SERVER_STATE_LOADING_MODEL:服务器正在启动,模型尚未完全加载
  • SERVER_STATE_READY:服务器已准备就绪,模型已加载

来源:examples/server/server.cpp54-57

任务系统

任务系统负责管理请求。每个传入的请求都会被转换为一个具有特定类型的 server_task

  • SERVER_TASK_TYPE_COMPLETION:文本生成/补全
  • SERVER_TASK_TYPE_EMBEDDING:为文本生成嵌入
  • SERVER_TASK_TYPE_RERANK:重排提供的段落
  • SERVER_TASK_TYPE_INFILL:填充前缀和后缀之间的文本
  • SERVER_TASK_TYPE_CANCEL:取消正在运行的任务
  • SERVER_TASK_TYPE_NEXT_RESPONSE:请求流式响应的下一部分
  • SERVER_TASK_TYPE_METRICS:请求内部指标
  • SERVER_TASK_TYPE_SLOT_SAVE:将插槽状态保存到磁盘
  • SERVER_TASK_TYPE_SLOT_RESTORE:从磁盘恢复插槽状态
  • SERVER_TASK_TYPE_SLOT_ERASE:清除插槽状态
  • SERVER_TASK_TYPE_SET_LORA:应用 LoRA 适配器

来源:examples/server/server.cpp59-70 examples/server/server.cpp189-217

插槽系统

插槽系统是处理实际推理的核心组件。每个插槽代表一个可以并发处理任务的独立处理器。插槽有自己的状态和生命周期。

插槽状态

  • SLOT_STATE_IDLE:插槽可用于新任务
  • SLOT_STATE_STARTED:插槽正在准备处理任务
  • SLOT_STATE_PROCESSING_PROMPT:插槽正在编码提示
  • SLOT_STATE_DONE_PROMPT:提示编码已完成
  • SLOT_STATE_GENERATING:插槽正在生成 token

来源:examples/server/server.cpp46-52

每个插槽都有控制参数(slot_params),例如:

  • 采样设置(温度、top_k、top_p 等)
  • 最大预测长度
  • 上下文管理设置
  • LoRA 适配器
  • 语法约束

来源:examples/server/server.cpp91-187

API 端点

服务器提供了一整套 API 端点

端点描述兼容 OpenAI
/completion从提示生成文本补全
/chat/completions从消息历史生成聊天补全
/embedding为输入文本生成嵌入
/infill填充前缀和后缀之间的文本
/tokenize将文本转换为 token ID
/detokenize将 token ID 转换为文本
/metrics兼容 Prometheus 的指标端点
/health服务器健康状态
/slots插槽状态的监控端点
/props更改服务器属性
/v1/completions兼容 OpenAI 的补全 API
/v1/chat/completions兼容 OpenAI 的聊天 API
/v1/embeddings兼容 OpenAI 的嵌入 API
/apply-template将聊天模板应用于消息

来源:examples/server/README.md335-828

响应格式

服务器支持多种响应格式

  1. 原生格式:llama.cpp 自己的 JSON 响应格式
  2. 兼容 OpenAI 格式:模仿 OpenAI API 的响应结构
  3. 流式模式:用于实时 token 生成的服务器发送事件

原生补全响应示例

兼容 OpenAI 的聊天响应示例

来源:examples/server/server.cpp613-851

配置

服务器有许多配置选项,主要通过命令行参数指定。

关键配置选项

选项描述默认
-m, --model模型文件路径-
-c, --ctx-size上下文大小(以 token 为单位)4096
-t, --threads推理线程数汽车
-ngl, --n-gpu-layers要卸载到 GPU 的层数0
--host要监听的 IP 地址127.0.0.1
--port要监听的端口8080
--path用于提供静态文件的路径-
--embedding仅启用嵌入端点false
--api-key用于身份验证的 API 密钥-
--ssl-key-fileSSL 私钥文件的路径-
--ssl-cert-fileSSL 证书文件路径-
--chat-template自定义 jinja 聊天模板-

有关选项的完整列表,请参阅 README 或运行 --help

来源:examples/server/README.md22-172

还可以使用环境变量来配置服务器。每个命令行选项都有一个相应的环境变量,前缀为 LLAMA_ARG_

示例

来源:examples/server/README.md174-194

运行服务器

基本用法

使用默认设置启动服务器

这将启动一个监听在 127.0.0.1:8080 的服务器。

来源:examples/server/README.md255-273

Docker

服务器也可以使用 Docker 来运行

来源:examples/server/README.md275-281

SSL 支持

为了安全连接,服务器可以内置 SSL 支持

然后使用 SSL 证书和密钥运行

来源:examples/server/README.md209-219

Web UI

服务器包含一个基于 Web 的用户界面,用于通过 /chat/completions 端点与模型进行交互。该 UI 使用以下技术构建:

  • 用于前端的 React 框架
  • 用于样式的 Tailwind CSS 和 DaisyUI
  • 用于构建工具的 Vite

一个预构建版本已包含在存储库中,为一个用 gzip 压缩的单个 HTML 文件。

要访问 Web UI,请在 Web 浏览器中导航到服务器的 URL。

构建 Web UI

如果您想修改 Web UI

来源:examples/server/README.md222-248

测试

服务器包含一个全面的测试框架来验证功能

有关更详细的测试选项,请参阅测试文档。

来源:examples/server/tests/README.md1-66 examples/server/tests/tests.sh1-24