SGLang 服务基准测试
随着大语言模型在生产环境中的广泛应用,评估与优化在线服务性能变得至关重要。SGLang 内置的 sglang.bench_serving 模块提供了强大且灵活的基准测试能力,支持在不同推理后端与负载模式下精确测量服务性能。
1. 核心功能与指标
sglang.bench_serving 的核心目标是模拟真实在线请求负载,并精确测量服务端的关键性能数据。
1.1 功能概述
- 负载生成:根据数据集或合成数据生成 Prompt,并提交给目标服务接口。
- 模式支持:支持流式(Streaming)与非流式(Non-streaming)模式。
- 流量控制:支持精确的请求速率(Rate Control)与最大并发限制。
1.2 核心测量指标
| 指标 | 英文简称 | 解释 |
|---|---|---|
| 请求吞吐量 | Req/s | 每秒处理的请求数 |
| Token 吞吐量 | Tok/s | 每秒处理的 Token 总数(输入 + 输出) |
| 端到端延迟 | End-to-End Latency | 单个请求从发送到完整接收的总耗时 |
| 首个 Token 时间 | TTFT | 从请求发送到收到第一个 Token 的时间 |
| Token 间延迟 | ITL | 连续两个输出 Token 之间的时间间隔 |
| Token 处理时间 | TPOT | TTFT 后的平均 Token 处理时间: |
| 并发度 | Concurrency | 所有请求总耗时除以实际挂钟时间 |
| 推测解码接受长度 | Accept Length | SGLang 专属指标,衡量推测解码的平均接受长度 |
2. 支持的后端与接口
bench_serving 通过统一的 OpenAI 兼容接口支持多种主流后端:
| 后端名称 | 兼容性 | 接口路径 |
|---|---|---|
sglang / sglang-native | SGLang 原生 API | POST /generate |
sglang-oai, vllm, lmdeploy | OpenAI Completions | POST /v1/completions |
sglang-oai-chat, vllm-chat, lmdeploy-chat | OpenAI Chat Completions | POST /v1/chat/completions |
trt | TensorRT-LLM | POST /v2/models/ensemble/generate_stream |
truss | Truss Framework | POST /v1/models/model:predict |
3. 快速开始
3.1 启动 SGLang 服务
bash
python3 -m sglang.launch_server --model-path meta-llama/Llama-3.1-8B-Instruct3.2 基础基准测试(SGLang 原生接口)
bash
python3 -m sglang.bench_serving \
--backend sglang \
--host 127.0.0.1 --port 30000 \
--num-prompts 1000 \
--model meta-llama/Llama-3.1-8B-Instruct3.3 OpenAI 兼容接口测试(例如 vLLM)
bash
python3 -m sglang.bench_serving \
--backend vllm \
--base-url http://127.0.0.1:8000 \
--num-prompts 1000 \
--model meta-llama/Llama-3.1-8B-Instruct4. 数据集配置
基准测试的准确性高度依赖模拟的请求特征。通过 --dataset-name 参数选择数据集:
| 数据集名称 | 特点与用途 | 关键参数 |
|---|---|---|
sharegpt(默认) | 加载 ShareGPT 对话数据,模拟真实用户请求 | --sharegpt-context-len, --sharegpt-output-len |
random | 随机生成输入/输出长度 | --random-input-len, --random-output-len, --random-range-ratio |
image | 视觉语言模型测试 | --image-count, --image-resolution, --image-format, --image-content |
generated-shared-prefix | 测试 KV Cache 共享效率 | --gsp-system-prompt-len, --gsp-question-len |
mmmu | 多模态数学推理 | 需要额外依赖 |
4.1 多模态 VLM 测试示例
bash
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-VL-3B-Instruct \
--disable-radix-cache
python3 -m sglang.bench_serving \
--backend sglang-oai-chat \
--dataset-name image \
--num-prompts 500 \
--image-count 3 \
--image-resolution 720p \
--random-input-len 512 \
--random-output-len 5125. 高级配置
5.1 流量控制与模式
| 参数 | 说明 |
|---|---|
--request-rate | 每秒发送请求数;inf 表示立即全部发送(突发模式),否则模拟泊松到达 |
--max-concurrency | 限制最大并发进行中的请求数 |
--disable-stream | 禁用流式输出;非流式模式下 TTFT 等于总延迟 |
5.2 模型、分词器与数据格式
--model:模型 ID 或本地路径。--tokenizer:分词器 ID 或路径,默认与--model相同。--apply-chat-template:应用聊天模板。--tokenize-prompt:发送整数 Token ID 而非文本(目前仅sglang后端支持)。
5.3 输出与定制
--output-file FILE.jsonl:将详细结果追加到 JSONL 文件。--output-details:在 JSONL 中记录每个请求的详情(生成文本、错误、TTFT 等)。--extra-request-body '{"top_p":0.9,"temperature":0.6}':以 JSON 字符串形式添加额外采样参数。
5.4 优化与调试
| 参数 | 说明 |
|---|---|
--warmup-requests N | 正式测试前执行 N 个短输出请求进行预热,默认 1 |
--flush-cache | 测试前调用 /flush_cache(仅 SGLang) |
--profile | 启动服务器端性能分析 |
--lora-name name1 ... | 随机选择 LoRA 名称并传递给后端 |
5.5 鉴权配置
若服务需要 OpenAI 风格 API Key,设置环境变量:
bash
export OPENAI_API_KEY=sk-your-key基准测试脚本会自动在请求头中添加 Authorization: Bearer <key>。
6. 实战案例
6.1 严格流量控制(SGLang 原生)
bash
python3 -m sglang.bench_serving \
--backend sglang \
--host 127.0.0.1 --port 30000 \
--model meta-llama/Llama-3.1-8B-Instruct \
--dataset-name random \
--random-input-len 1024 \
--random-output-len 1024 \
--random-range-ratio 0.5 \
--num-prompts 2000 \
--request-rate 100 \
--max-concurrency 512 \
--output-file sglang_random.jsonl \
--output-details6.2 共享前缀优化测试
bash
python3 -m sglang.bench_serving \
--backend sglang \
--host 127.0.0.1 --port 30000 \
--model meta-llama/Llama-3.1-8B-Instruct \
--dataset-name generated-shared-prefix \
--gsp-num-groups 64 \
--gsp-prompts-per-group 16 \
--gsp-system-prompt-len 2048 \
--gsp-question-len 128 \
--gsp-output-len 256 \
--num-prompts 10246.3 OpenAI 兼容聊天接口测试(vLLM Chat)
bash
python3 -m sglang.bench_serving \
--backend vllm-chat \
--base-url http://127.0.0.1:8000 \
--model meta-llama/Llama-3.1-8B-Instruct \
--dataset-name random \
--num-prompts 500 \
--apply-chat-template7. 故障排查
- 请求全部失败:检查
--backend、地址、端口、--model名称是否正确,确认服务已启动。 - 吞吐量过低:调整
--request-rate与--max-concurrency以匹配服务器极限;检查 Batch Size 与调度策略。 - Token 计数异常:优先使用带正确聊天模板的 Chat / Instruct 模型。
- 鉴权错误(401/403):确认
OPENAI_API_KEY已正确设置。