尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

llama-server 压测指南:用 k6 与 xk6-sse 对 OpenAI 兼容 Chat Completions 服务做端到端基准测试

llama-server 压测指南:用 k6 与 xk6-sse 对 OpenAI 兼容 Chat Completions 服务做端到端基准测试 llama-server 压测指南用 k6 与 xk6-sse 对 OpenAI 兼容 Chat Completions 服务做端到端基准测试【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp本指南讲解 ik_llama.cpp 仓库中 examples/server/bench 目录提供的整套服务端基准测试方案如何用 k6 配合 xk6-sse 扩展对 llama-server 的 OpenAI 兼容 Chat Completions 接口进行流式并发压测如何准备数据集与模型、启动被压测服务、解读 k6 与 Prometheus 指标以及如何用 bench.py 一键完成启服 → 压测 → 拉取指标 → 出图的 CI 化流程。读完本文你将能复现文档中的完整压测命令并理解每条指标与每个环境变量背后的源码实现。目录结构bench 压测套件由哪些文件组成bench 目录下共有 5 个文件各司其职文件作用README.md官方使用说明本文即以它为主体展开script.jsk6 压测脚本加载数据集、构造 Chat Completions 请求、通过 SSE 流式读取响应并统计指标bench.pyCI 自动化脚本启动 server、运行 k6、查询 Prometheus、生成图表与汇总结果prometheus.ymlPrometheus 抓取配置每 10 秒抓取一次本地 8080 端口requirements.txtbench.py 的 Python 依赖matplotlib与requests整个压测链路是k6模拟并发用户通过 SSE 流式请求 Chat Completions→ llama-serverOpenAI 兼容 API→ Prometheus抓取 /metrics 端点→ bench.py汇总并出图。第一步安装 k6 与 SSE 扩展k6 默认不支持 Server-Sent EventsSSE而 Chat Completions 的流式输出正是基于 SSE 实现的因此必须使用官方扩展构建工具 xk6 打一个带xk6-sse扩展的 k6 二进制。官方文档给出的构建命令如下go install go.k6.io/xk6/cmd/xk6latest xk6 build master \ --with github.com/phymbert/xk6-sse执行后会在当前目录生成一个k6可执行文件。压测脚本 script.js 的第一行import sse from k6/x/sse正是依赖这个扩展提供的 SSE 客户端能力。第二步准备数据集与模型下载数据集压测使用的对话数据集源自 vLLM 基准测试所用数据集ShareGPT 对话数据下载命令wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json这个 JSON 文件会在 k6 脚本启动时被加载并解析。从 script.js 的源码可以看到数据预处理逻辑过滤掉对话轮数少于 2 轮、且首条消息不是human的样本取出第一轮人机对话分别统计 prompt 与 completion 的伪 token 数过滤掉过短prompt 或 completion 少于 4 个 token和过长超出SERVER_BENCH_MAX_PROMPT_TOKENS与SERVER_BENCH_MAX_CONTEXT限制的样本只保留前SERVER_BENCH_N_PROMPTS条作为压测池。需要特别注意的是文档明确提醒脚本里的 tokenizer 只是简单的按空格和标点切分字符串源码中tokenizer (message) message.split(/[\s,.?]/)并非真实分词器因此统计出的 token 数与模型实际分词结果会有差异它主要用于控制压测负载规模的近似估计。下载模型文档以 PHI-2 的 q4_0 量化版为例使用仓库提供的 hf.sh 脚本从 Hugging Face 拉取../../../scripts/hf.sh --repo ggml-org/models --file phi-2/ggml-model-q4_0.gguf../../../scripts/hf.sh是相对 bench 目录的位置从仓库根目录看就是 scripts/hf.sh。第三步启动被压测的 llama-server被压测服务必须能够响应 OpenAI Chat Completions 请求默认地址为http://localhost:8080/v1可通过环境变量SERVER_BENCH_URL覆盖。文档给出的启动示例server --host localhost --port 8080 \ --model ggml-model-q4_0.gguf \ --cont-batching \ --metrics \ --parallel 8 \ --batch-size 512 \ --ctx-size 4096 \ --log-format text \ -ngl 33参数说明含义与 examples/server/README.md 中llama-server的用法一致--host localhost --port 8080监听地址与端口--model模型文件路径--cont-batching启用连续批处理dynamic batching支持多用户并行请求的合并调度--metrics开启 Prometheus 兼容的/metrics端点压测后可用于对照分析默认关闭--parallel 8并行处理的槽位slots数量即同时服务的请求数--batch-size 512prompt 处理的逻辑最大批大小--ctx-size 4096上下文窗口大小-ngl 33将 33 层放到 GPU 计算--n-gpu-layers--log-format text以纯文本格式输出日志便于脚本消费。第四步运行 k6 基准测试基础用法对 8 个并发用户、共 500 次 Chat Completions 请求、最长运行 10 分钟的场景./k6 run script.js --duration 10m --iterations 500 --vus 8其中--vus 88 个虚拟并发用户--iterations 500总执行 500 次迭代即 500 个请求--duration 10m压测最长持续 10 分钟若提前完成 500 次迭代则提前结束。环境变量覆盖项压测脚本的行为由环境变量控制完整清单如下与 script.js 源码一一对应环境变量作用默认值SERVER_BENCH_URLChat Completions 请求的服务端 URL 前缀http://localhost:8080/v1SERVER_BENCH_N_PROMPTS从数据集中随机抽取的 prompt 总数600 / 10 * 8约 480即10 分钟 / 每请求 10 秒 × 用户数的估算SERVER_BENCH_MODEL_ALIAS请求体中携带的模型别名my-modelSERVER_BENCH_MAX_TOKENS单次请求最大预测 token 数512SERVER_BENCH_DATASET数据集文件路径./ShareGPT_V3_unfiltered_cleaned_split.jsonSERVER_BENCH_MAX_PROMPT_TOKENS数据集中 prompt 的最大 token 数过滤阈值1024SERVER_BENCH_MAX_CONTEXT请求最大上下文prompt 预测 token过滤阈值2048环境变量可以直接加在命令行前SERVER_BENCH_N_PROMPTS500 k6 run script.js --duration 10m --iterations 500 --vus 8注意脚本中的--iterations与SERVER_BENCH_N_PROMPTS是两个独立维度——前者决定总请求次数后者决定数据集池中可供轮询选取的样本数量。调试 HTTP 请求需要排查请求细节时可用 k6 内置的 HTTP 调试功能完整打印每个请求与响应头./k6 run script.js --http-debugfull第五步理解压测指标k6 侧指标由 script.js 统计压测脚本从 OAI Chat Completions 流式响应的usage字段计算并输出以下 k6 指标指标类型含义llamacpp_tokens_secondTrendusage.total_tokens / 请求总耗时即整条请求的综合吞吐token/sllamacpp_prompt_processing_secondTrendprompt 处理阶段吞吐token/s由首个 SSE 事件到达时间与usage.prompt_tokens计算llamacpp_prompt_tokensTrend每次请求的usage.prompt_tokensllamacpp_prompt_tokens_total_counterCounterprompt token 累计计数llamacpp_completion_tokensTrend每次请求的usage.completion_tokensllamacpp_completion_tokens_total_counterCounter生成 token 累计计数llamacpp_completions_truncated_rateRatefinish_reason length因达到 max_tokens 被截断的比例llamacpp_completions_stop_rateRatefinish_reason stop模型自然结束的比例脚本还设置了质量门槛llamacpp_completions_truncated_rate超过 80% 时压测会被判定失败并中止见 script.js 中的 thresholds 配置{threshold: rate 0.8, abortOnFail: true, delayAbortEval: 1m}。这是因为过高的截断率意味着 max_tokens 设置不当或模型输出超长压测结果不可信。从源码看script.js压测的核心请求体为{ messages: [ {role: system, content: You are ChatGPT, an AI assistant.}, {role: user, content: 数据集中的真实对话 prompt} ], model: my-model, stream: true, seed: 42, max_tokens: 512, stop: [|im_end|] }请求通过sse.open(${server_url}/chat/completions, ...)以 SSE 流式方式发送首个 SSE 事件到达时刻被记录为 prompt 处理完成时间最后一个事件到达时刻为整体结束时间finish_reason从最后一个 chunk 的choices[0].finish_reason获取。服务端侧指标llama-server /metrics 端点文档建议将 k6 指标与 llama-server 自带的指标进行对照。服务端开启--metrics后可用 curl 直接抓取curl http://localhost:8080/metrics这些指标的实际计算逻辑位于 server.cpp服务端基于内部累积的耗时与 token 计数实时计算 gauge 值例如llamacpp:prompt_tokens_seconds的计算公式为1.e3 / t_prompt_processing * n_prompt_tokens_processedtoken/sllamacpp:kv_cache_usage_ratio为kv_cache_used_cells / params.n_ctx1 表示 KV 缓存 100% 占用。完整的端点说明见 examples/server/README.mdllamacpp:prompt_tokens_total/llamacpp:tokens_predicted_total处理过的 prompt / 生成 token 总数llamacpp:prompt_tokens_secondsprompt 阶段平均吞吐token/sllamacpp:predicted_tokens_seconds生成阶段平均吞吐token/sllamacpp:kv_cache_usage_ratioKV 缓存使用率1 表示 100%llamacpp:kv_cache_tokensKV 缓存中的 token 数llamacpp:requests_processing/llamacpp:requests_deferred正在处理 / 被延迟排队的请求数。k6 侧指标反映的是端到端 HTTP 视角包含网络与排队开销服务端指标反映的是引擎内部视角纯推理吞吐两者对照可定位瓶颈是在推理还是在调度/网络。第六步用 bench.py 一键完成 CI 化压测bench.py 把整个流程自动化了主要步骤见源码main函数与start_benchmark/start_server解析命令行参数构造并后台启动 llama-server轮询等待服务端口就绪最多等待约 10 秒CI 环境下翻倍设置SERVER_BENCH_*环境变量并运行 k6--summary-export k6-results.json导出结果若 Prometheus 在 9090 端口可用则通过查询接口拉取llamacpp:prompt_tokens_seconds、llamacpp:predicted_tokens_seconds、llamacpp:kv_cache_usage_ratio、llamacpp:requests_processing、llamacpp:requests_deferred五个指标的时序数据用 matplotlib 各画一张趋势图同时输出.mermaid格式备用汇总http_req_duration、prompt/generation 吞吐的 p95 与均值等关键结果写入results.github.env供 GitHub Actions 等 CI 消费。手动运行示例从 bench 目录执行LLAMA_SERVER_BIN_PATH../../../cmake-build-release/bin/llama-server python bench.py \ --runner-label local \ --name local \ --branch git rev-parse --abbrev-ref HEAD \ --commit git rev-parse HEAD \ --scenario script.js \ --duration 5m \ --hf-repo ggml-org/models \ --hf-file phi-2/ggml-model-q4_0.gguf \ --model-path-prefix models \ --parallel 4 \ -ngl 33 \ --batch-size 2048 \ --ubatch-size 256 \ --ctx-size 4096 \ --n-prompts 200 \ --max-prompt-tokens 256 \ --max-tokens 256参数与官方文档中的环境变量一一对应bench.py 参数对应环境变量 / 含义--n-promptsSERVER_BENCH_N_PROMPTS数据集抽取样本数--max-prompt-tokensSERVER_BENCH_MAX_PROMPT_TOKENSprompt 长度过滤阈值--max-tokensSERVER_BENCH_MAX_CONTEXTprompt 预测 token 的上下文过滤阈值--scenariok6 脚本路径script.js--durationk6 压测时长--hf-repo/--hf-file模型仓库与文件server 通过--hf-repo/--hf-file自动下载--model-path-prefix模型文件本地存放目录默认models--parallel对应 server 的--parallel与 k6 的--vus--batch-size/--ubatch-sizeserver 的 prompt 处理批大小与物理最大批大小--ctx-sizeserver 的上下文窗口-ngl卸载到 GPU 的层数脚本内部启动 server 时还会追加一些固定参数以保证压测质量--n-predict max_tokens*2保证有足够生成空间、--defrag-thold 0.1KV 缓存碎片整理阈值、--cont-batching、--metrics、--flash-attn启用 Flash Attention。两个可覆盖路径的环境变量LLAMA_SERVER_BIN_PATH指定 llama-server 可执行文件路径BENCH_K6_BIN_PATH指定 k6 二进制路径。依赖安装pip install -r examples/server/bench/requirements.txt附Prometheus 抓取配置prometheus.yml 每 10 秒抓取一次本机 8080 端口的指标并为指标打上llamacpp: server外部标签global: scrape_interval: 10s external_labels: llamacpp: server scrape_configs: - job_name: llama.cpp server static_configs: - targets: [localhost:8080]配合 llama-server 的--metrics参数即可把服务端引擎指标纳入 Prometheus供 bench.py 或 Grafana 等工具进一步分析。总结这套 bench 压测套件的价值在于打通了并发负载模拟 → OpenAI 兼容 API → 引擎内部指标三个层面k6 脚本模拟真实用户以 SSE 流式方式请求 Chat Completions产出端到端吞吐与截断率等质量指标llama-server 的/metrics端点提供 KV 缓存占用、请求排队等引擎内部视角bench.py 则把启服、压测、采集、出图、导出结果整合为一条可在 CI 中复用的流水线。无论是本地评估某次参数调整如 batch-size、parallel、层卸载对服务吞吐的影响还是长期跟踪多版本回归都可以直接复用本文的命令与指标体系。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表