☰
LMDeploy 基准测试实战指南:用 profile_pipeline_api、profile_throughput 与 profile_restful_api 度量 LLM 推理性能
2026/9/27 4:44:57 网站建设 项目流程
  • 人工智能
  • 大模型
  • 模型推理服务
  • 推理引擎
  • 本地部署
  • 模型量化

【免费下载链接】lmdeploy

LMDeploy is a toolkit for compressing, deploying, and serving LLMs.

项目地址:https://gitcode.com/gh_mirrors/lm/lmdeploy
点击查看免费下载

LMDeploy 在 benchmark/ 目录下提供了一套开箱即用的性能剖析工具,覆盖离线 Pipeline API、离线引擎 API与**在线 Serving(RESTful API)**三种典型评测场景。本文以 docs/en/benchmark/benchmark.md 为骨架,结合仓库源码逐项拆解三个脚本的用法、命令行参数与底层指标计算逻辑,帮助你建立一套可复现、可对比的 LLM 推理性能评测流程。

环境准备:安装、脚本与数据集

在运行任何基准测试脚本之前,需要依次完成三件事:安装与当前脚本版本对齐的 lmdeploy 预编译包、获取对应版本的 benchmark 脚本、下载标准测试数据集。

# 1. 安装 lmdeploy 预编译包 pip install lmdeploy # 2. 克隆仓库以获取 benchmark 脚本 git clone --depth=1 https://github.com/InternLM/lmdeploy cd lmdeploy # 3. 切换到与已安装版本对应的 tag git fetch --tags # 查看已安装的 lmdeploy 版本号 pip show lmdeploy | grep Version # 将 <version> 替换为上面查到的版本字符串后执行 git checkout <version> # 4. 下载测试数据集(ShareGPT 清洗后的对话数据) wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json

版本对齐是基准测试可比性的前提:脚本的行为(如指标定义、参数默认值)随版本演进而变化,pip install lmdeploy安装的版本必须与git checkout检出的脚本版本一致,否则可能出现参数不兼容或指标口径不一致的问题。该数据集下载地址同样内嵌于 profile_restful_api.py,若本地不存在该文件,脚本会自动下载并缓存到/tmp目录。

三个基准测试脚本概览

仓库中的 benchmark 目录包含以下与本文直接相关的剖析工具(benchmark/README.md 有更简略的速查说明):

脚本评测对象典型场景
profile_pipeline_api.py离线 Pipeline API(lmdeploy.pipeline)在单机内评估完整推理链路(含前后处理)
profile_throughput.py离线引擎 API(TurboMind / PyTorch Engine)剔除前后处理开销,度量引擎本身的吞吐与延迟
profile_restful_api.py在线 RESTful 服务(OpenAI 兼容接口)模拟真实在线流量压测 API Server

三者共享同一套请求采样逻辑(ShareGPT / random / image 数据集)与核心指标概念(TTFT、TPOT、ITL、E2E 延迟、吞吐量),但各自面向不同层面的性能关注点,下文逐一展开。

离线 Pipeline API 基准测试:profile_pipeline_api.py

Pipeline API 是 LMDeploy 提供的高层推理入口,内部封装了 tokenize、模型推理、detokenize 等完整链路。profile_pipeline_api.py通过并发调用pipeline或stream_infer接口来度量端到端请求吞吐:

python3 benchmark/profile_pipeline_api.py ShareGPT_V3_unfiltered_cleaned_split.json meta-llama/Meta-Llama-3-8B-Instruct

两个位置参数分别为数据集路径与模型路径(本地路径或 HuggingFace repo_id)。model_path支持传入本地目录或远程模型标识,脚本内部会构建pipeline实例并配合AutoTokenizer进行 token 统计(Engine 类)。

完整参数列表可执行python3 benchmark/profile_pipeline_api.py -h查看。结合 parse_args 实现,核心参数如下:

参数默认值说明
-c, --concurrency256并发工作线程数,即同时处理的请求数
-n, --num-prompts5000从数据集中采样的提示数量
--csv./profile_pipeline_api.csv结果导出文件路径
--seed0数据集采样随机种子
--stream-outputFalse是否以流式接口(stream_infer)发送请求
--dataset-namesharegpt数据集类型,可选sharegpt/random
--sharegpt-output-lenNone覆盖 ShareGPT 数据集的输出长度,统一各请求生成长度
--random-input-len/--random-output-lenNonerandom 数据集下每个请求的输入 / 输出 token 数
--random-range-ratio0.0random 数据集下输入 / 输出长度的采样波动范围
--top-p/--temperature/--top-k0.8 / 0.8 / 1采样参数
--backendturbomind推理后端,可选pytorch/turbomind
--log-levelWARNING日志级别
--trust-remote-codeFalse是否信任模型仓库中的远程代码

脚本按后端分别构造引擎配置(main 函数):

  • TurboMind 后端:TurbomindEngineConfig(max_batch_size=concurrency, tp, cache_max_entry_count, session_len, cache_block_seq_len, model_format, quant_policy, num_tokens_per_iter, max_prefill_iters, enable_prefix_caching, communicator, async_)
  • PyTorch 后端:PytorchEngineConfig(cache_max_entry_count, session_len, block_size, max_batch_size, tp, device_type, thread_safe=False, eager_mode, enable_prefix_caching, enable_return_routed_experts)

其中高频调优参数及其底层含义(定义见 lmdeploy/cli/utils.py):

  • --cache-max-entry-count(默认 0.8):KV cache 占用的可用显存比例(不含权重),直接决定能容纳的并发序列数与长上下文能力;
  • --cache-block-seq-len(默认 64):单个 KV block 的 token 序列长度。TurboMind 引擎在 GPU 计算能力 ≥ 8.0 时需为 32 的倍数,否则需为 64 的倍数;
  • --session-len:序列最大会话长度,即上下文窗口上限;
  • --enable-prefix-caching:开启前缀缓存与匹配,适合多请求共享前缀的负载;
  • --quant-policy:KV cache 量化策略,可选none/int4/int8/fp8/fp8_e5m2/turbo_quant(等价数值0/4/8/16/17/42);
  • --model-format:模型权重格式,可选hf/awq/gptq/compressed-tensors/fp8/mxfp4;
  • --num-tokens-per-iter:单次前向推理处理的 token 数(0 表示自动);
  • --max-prefill-iters:prefill 阶段的最大前向次数;
  • --communicator(默认nccl):多卡通信后端,可选nccl/native(已废弃,等价cuda-ipc);
  • --async(默认 1):是否启用异步执行。

脚本还支持通过--speculative-algorithm开启投机解码评测,可选算法包括eagle、eagle3、deepseek_mtp、hy3_mtp、qwen3_5_mtp、dflash,配合--speculative-draft-model(草稿模型路径)与--speculative-num-draft-tokens(默认 1)使用。

请求执行时使用GenerationConfig(ignore_eos=True, do_sample=False),即强制每个请求生成满output_len个 token,从而保证吞吐量指标不受 EOS 提前终止影响(process_request 实现)。

离线引擎 API 基准测试:profile_throughput.py

profile_throughput.py直接绕过 Pipeline 层,通过引擎实例的async_stream_infer接口驱动推理,仅保留 tokenize/detokenize 的最小开销,更贴近引擎真实算力表现:

python3 benchmark/profile_throughput.py ShareGPT_V3_unfiltered_cleaned_split.json meta-llama/Meta-Llama-3-8B-Instruct

同样以数据集与模型为位置参数。相比 Pipeline 版,该脚本新增了若干面向引擎细节的开关(见 parse_args 实现):

参数默认值说明
--no-stream-outputFalse关闭流式输出(默认流式)
--skip-tokenizeFalse发请求前预先完成 tokenize,排除 tokenize 开销
--skip-detokenizeFalse跳过输出 token 的 detokenize
--cancel-rate0.0请求被中途取消的概率,用于模拟客户端中断场景
--use-uvloopFalse使用 uvloop 事件循环提升异步性能
--distributed-executor-backendNonePyTorch 引擎分布式执行后端,可选uni/mp/ray
--dp/--cp1数据并行度 / 上下文并行度(TurboMind,要求 tp 为 cp 的倍数)
--dtypeauto权重与激活数据类型,可选auto/float16/bfloat16
--max-prefill-token-num8192prefill 阶段单次迭代的最大 token 数
--piecewise-cudagraph-max-tokensNone开启 PyTorch 引擎分段 CUDA Graph 并设置捕获 token 桶上限
--dllm-block-length等--dllm-*系列—动态线性层(DLLM)相关的块长、去掩码策略、去噪步数与置信度阈值

该脚本的请求执行采用异步任务队列模型:将采样后的请求放入Queue,启动concurrency个协程并发消费,每个协程独立持有引擎实例并调用async_stream_infer(Engine._inference 实现)。需要注意,实际生效的并发数为min(concurrency, num_prompts)(见 main 函数)。

引擎配置构建同样区分后端(main 函数):TurboMind 使用TurbomindEngineConfig(含dp、cp、dtype等),PyTorch 使用PytorchEngineConfig(含distributed_executor_backend、max_prefill_token_num、piecewise_cudagraph_max_tokens与 DLLM 参数)。

在线 Serving 基准测试:profile_restful_api.py

在线评测需要先启动一个 OpenAI 兼容的服务端。LMDeploy 通过lmdeploy serve api_server启动,例如:

lmdeploy serve api_server meta-llama/Meta-Llama-3-8B-Instruct --server-port 23333

完整的启动方式(CLI、Docker、Kubernetes)与 RESTful API 定义可参考 在线服务启动指南。随后运行:

python3 benchmark/profile_restful_api.py --backend lmdeploy --num-prompts 5000 --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json

该脚本模拟真实在线流量,以Poisson 过程控制请求到达速率,通过 aiohttp 异步并发发送请求,并按 OpenAI 兼容协议解析流式响应。核心参数(定义见 脚本参数解析):

参数默认值说明
--backendsglang目标推理引擎,支持lmdeploy、lmdeploy-chat、vllm、vllm-chat、sglang*、trt、gserver等,可用于跨引擎对比
--host/--port0.0.0.0/ 按引擎服务地址;不指定端口时 lmdeploy 默认 23333、vllm 默认 8000
--base-urlNone直接指定完整 API 地址(优先级高于 host/port)
--modelNone模型名;缺省时自动请求/v1/models获取
--model-path/--tokenizerNone本地模型 / tokenizer 路径,用于统计 token 数与输出重分词校验
--num-prompts1000请求数量(注意与另两个脚本默认 5000 不同)
--request-rateinf每秒请求数;inf表示所有请求同时发出,否则按泊松过程生成到达间隔
--multi/--request-rate-rangeFalse /2,34,2多档请求速率扫描模式,格式为start,stop,step或逗号分隔的速率列表
--dataset-namesharegpt数据集类型,可选sharegpt/random/image
--dataset-path''数据集路径
--sharegpt-output-len/--random-input-len/--random-output-len/--random-range-ratioNone / None / None / 0.0与离线脚本含义一致
--image-count/--image-resolution/--image-format/--image-content1 /1080p/jpeg/random图像数据集参数(多模态压测),分辨率支持4k/1080p/720p/360p预设或自定义heightxwidth
--disable-stream/--disable-ignore-eosFalse / False关闭流式响应 / 关闭忽略 EOS
--disable-warmupFalse跳过正式评测前的单请求预热(预热失败会直接报错提示检查参数)
--extra-request-bodyNone以 JSON 字符串附加额外请求体字段(如采样参数)
--output-fileNone自定义结果输出文件;缺省自动生成带日期与后端名的文件名
--seed1采样随机种子
--disable-tqdmFalse关闭进度条
--trust-remote-codeFalse信任远程代码

后端与 API 端点的映射关系(run_benchmark 实现):lmdeploy/vllm/sglang-oai走/v1/completions;lmdeploy-chat/vllm-chat/sglang-oai-chat走/v1/chat/completions;sglang系走/generate;trt走/v2/models/ensemble/generate_stream。请求解析逻辑分别实现在 async_request_openai_completions 与 async_request_openai_chat_completions 中,两者均逐块解析 SSE 流式数据,记录首个 token 时间(TTFT)与相邻 token 间隔(ITL)。

发送速率控制位于 get_request:request_rate=inf时所有请求立刻发出;否则每个请求发出后按指数分布asyncio.sleep(1/request_rate)模拟泊松到达。评测开始前默认发送一个请求做预热(benchmark 函数),确保引擎完成权重加载与显存初始化后再进入正式计时。

数据集采样与请求生成逻辑

三个脚本共享两套请求生成函数(以 profile_pipeline_api.py 的实现为例):

ShareGPT 数据集(--dataset-name sharegpt)

  • 过滤掉对话轮数少于 2 的样本,仅保留前两轮(prompt + completion);
  • 丢弃prompt_len < 4或output_len < 4的过短样本;
  • 丢弃prompt_len > 1024的样本;当未指定固定输出长度时,还丢弃prompt_len + output_len > 2048的样本;
  • 默认用 completion 的真实 token 数作为output_len,也可用--sharegpt-output-len统一覆盖;
  • 最终打印采样集合的输入 / 输出 token 总量,便于复现与对比。

random 数据集(--dataset-name random)

  • 先按[input_len * range_ratio, input_len]与[output_len * range_ratio, output_len]区间随机生成每个请求的目标长度;
  • 再从 ShareGPT 数据集中抽取真实文本,通过截断或循环填充对齐到目标输入长度,保证文本分布接近真实语料(源码注释指出纯随机整数 token 可能引发 NaN 问题,因此默认走真实文本路径)。

image 数据集(--dataset-name image,仅在线脚本)

  • 按--image-count生成随机或纯色图片,以 base64 形式内嵌进请求体;
  • 通过AutoProcessor计算「文本 token + 视觉 token」的完整提示长度,并分别统计text_prompt_len与vision_prompt_len,用于区分文本与视觉部分的输入吞吐。

指标解读:从源码看 Profiler 的统计口径

三个脚本的离线指标统一由 lmdeploy/profiler.py 中的Profiler与Session计算,默认统计mean 与 P50/P75/P95/P99分位数(Profiler(stream_output, [50, 75, 95, 99]))。核心指标与计算逻辑(compute_metrics 实现)如下:

指标含义计算方式
Output throughput (tok/s)输出 token 吞吐成功请求生成 token 总数 / 总耗时
Input throughput (tok/s)输入 token 吞吐成功请求输入 token 总数 / 总耗时
Request throughput (req/s)请求吞吐成功请求数 / 总耗时
End-to-end Latency端到端延迟请求首个 tick 到最后一个 tick 的时间差
Time to First Token (TTFT)首 token 延迟流式模式下首个 token 的 tick 时间(非流式不统计)
Time per Output Token (TPOT)每输出 token 平均耗时末 tick 与首 tick 时间差 /(生成 token 数 - 1);非流式退化为全程耗时 / token 数
Inter-token Latency (ITL)相邻输出 token 间隔流式 tick 时间序列的一阶差分
Tokens per Tick每个 tick 产生的 token 数流式 tick 的 token 增量

仅统计Session.SUCCESS且生成量达到req_output_len的请求(Session 状态定义),未达到目标长度的请求会被跳过,避免因中途失败污染指标。离线脚本在profiler.summarize()中打印上述全部指标并以表格对齐输出,同时通过save_csv()将结果追加写入 CSV(结果导出实现)。

在线脚本的指标由 calculate_metrics 独立计算,输出包括:成功请求数、总输入 / 输出 token 数、请求吞吐、输入 / 输出 token 吞吐,以及 TTFT / TPOT / ITL / E2E 的 mean、median、std、P99。此外还额外计算retokenized 输出 token 数——即对生成文本重新分词后的长度,用于校验流式计数的准确性。结果默认以 CSV/JSONL 形式追加保存,可通过--output-file指定路径。

小结与评测建议

综合三个脚本的源码实现,可以总结出几条实用的评测建议:

  1. 明确评测目标再选脚本:Pipeline API 反映真实应用端到端体验;引擎 API 关注算力本身;在线脚本反映服务化部署后的 SLA(TTFT/TPOT 分位数)。三者指标口径不同,不宜直接跨脚本对比。
  2. 保证变量受控:统一--seed、--concurrency、--num-prompts、--sharegpt-output-len等参数,确保不同配置、不同引擎之间具备可比性;在线评测还要固定--request-rate或使用--multi多档扫描观察吞吐-延迟曲线。
  3. 善用 profiling 开关定位瓶颈:--skip-tokenize/--skip-detokenize可剥离前后处理开销;--stream-output开关决定 TTFT/ITL 是否纳入统计;--cancel-rate可模拟真实场景中的客户端中断。
  4. 调参优先关注显存与批处理:--cache-max-entry-count、--cache-block-seq-len、--session-len、--concurrency共同决定 KV cache 容量与并发能力,是影响吞吐上限的第一组参数。
  5. 配套文档:服务端启动细节见 docs/en/llm/api_server.md,各脚本的更简略速查可参考 benchmark/README.md,统一的参数定义与默认值见 lmdeploy/cli/utils.py,多模态与长文本专项压测脚本(如 autotest/benchmark/ 下的用例)也可在此基础上扩展。
  • 人工智能
  • 大模型
  • 模型推理服务
  • 推理引擎
  • 本地部署
  • 模型量化

【免费下载链接】lmdeploy

LMDeploy is a toolkit for compressing, deploying, and serving LLMs.

项目地址:https://gitcode.com/gh_mirrors/lm/lmdeploy
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询