- 人工智能
- 大模型
- 模型推理服务
- 推理引擎
- 本地部署
- 模型量化
【免费下载链接】lmdeploy
LMDeploy is a toolkit for compressing, deploying, and serving LLMs.
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, --concurrency | 256 | 并发工作线程数,即同时处理的请求数 |
-n, --num-prompts | 5000 | 从数据集中采样的提示数量 |
--csv | ./profile_pipeline_api.csv | 结果导出文件路径 |
--seed | 0 | 数据集采样随机种子 |
--stream-output | False | 是否以流式接口(stream_infer)发送请求 |
--dataset-name | sharegpt | 数据集类型,可选sharegpt/random |
--sharegpt-output-len | None | 覆盖 ShareGPT 数据集的输出长度,统一各请求生成长度 |
--random-input-len/--random-output-len | None | random 数据集下每个请求的输入 / 输出 token 数 |
--random-range-ratio | 0.0 | random 数据集下输入 / 输出长度的采样波动范围 |
--top-p/--temperature/--top-k | 0.8 / 0.8 / 1 | 采样参数 |
--backend | turbomind | 推理后端,可选pytorch/turbomind |
--log-level | WARNING | 日志级别 |
--trust-remote-code | False | 是否信任模型仓库中的远程代码 |
脚本按后端分别构造引擎配置(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-output | False | 关闭流式输出(默认流式) |
--skip-tokenize | False | 发请求前预先完成 tokenize,排除 tokenize 开销 |
--skip-detokenize | False | 跳过输出 token 的 detokenize |
--cancel-rate | 0.0 | 请求被中途取消的概率,用于模拟客户端中断场景 |
--use-uvloop | False | 使用 uvloop 事件循环提升异步性能 |
--distributed-executor-backend | None | PyTorch 引擎分布式执行后端,可选uni/mp/ray |
--dp/--cp | 1 | 数据并行度 / 上下文并行度(TurboMind,要求 tp 为 cp 的倍数) |
--dtype | auto | 权重与激活数据类型,可选auto/float16/bfloat16 |
--max-prefill-token-num | 8192 | prefill 阶段单次迭代的最大 token 数 |
--piecewise-cudagraph-max-tokens | None | 开启 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 兼容协议解析流式响应。核心参数(定义见 脚本参数解析):
| 参数 | 默认值 | 说明 |
|---|---|---|
--backend | sglang | 目标推理引擎,支持lmdeploy、lmdeploy-chat、vllm、vllm-chat、sglang*、trt、gserver等,可用于跨引擎对比 |
--host/--port | 0.0.0.0/ 按引擎 | 服务地址;不指定端口时 lmdeploy 默认 23333、vllm 默认 8000 |
--base-url | None | 直接指定完整 API 地址(优先级高于 host/port) |
--model | None | 模型名;缺省时自动请求/v1/models获取 |
--model-path/--tokenizer | None | 本地模型 / tokenizer 路径,用于统计 token 数与输出重分词校验 |
--num-prompts | 1000 | 请求数量(注意与另两个脚本默认 5000 不同) |
--request-rate | inf | 每秒请求数;inf表示所有请求同时发出,否则按泊松过程生成到达间隔 |
--multi/--request-rate-range | False /2,34,2 | 多档请求速率扫描模式,格式为start,stop,step或逗号分隔的速率列表 |
--dataset-name | sharegpt | 数据集类型,可选sharegpt/random/image |
--dataset-path | '' | 数据集路径 |
--sharegpt-output-len/--random-input-len/--random-output-len/--random-range-ratio | None / None / None / 0.0 | 与离线脚本含义一致 |
--image-count/--image-resolution/--image-format/--image-content | 1 /1080p/jpeg/random | 图像数据集参数(多模态压测),分辨率支持4k/1080p/720p/360p预设或自定义heightxwidth |
--disable-stream/--disable-ignore-eos | False / False | 关闭流式响应 / 关闭忽略 EOS |
--disable-warmup | False | 跳过正式评测前的单请求预热(预热失败会直接报错提示检查参数) |
--extra-request-body | None | 以 JSON 字符串附加额外请求体字段(如采样参数) |
--output-file | None | 自定义结果输出文件;缺省自动生成带日期与后端名的文件名 |
--seed | 1 | 采样随机种子 |
--disable-tqdm | False | 关闭进度条 |
--trust-remote-code | False | 信任远程代码 |
后端与 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指定路径。
小结与评测建议
综合三个脚本的源码实现,可以总结出几条实用的评测建议:
- 明确评测目标再选脚本:Pipeline API 反映真实应用端到端体验;引擎 API 关注算力本身;在线脚本反映服务化部署后的 SLA(TTFT/TPOT 分位数)。三者指标口径不同,不宜直接跨脚本对比。
- 保证变量受控:统一
--seed、--concurrency、--num-prompts、--sharegpt-output-len等参数,确保不同配置、不同引擎之间具备可比性;在线评测还要固定--request-rate或使用--multi多档扫描观察吞吐-延迟曲线。 - 善用 profiling 开关定位瓶颈:
--skip-tokenize/--skip-detokenize可剥离前后处理开销;--stream-output开关决定 TTFT/ITL 是否纳入统计;--cancel-rate可模拟真实场景中的客户端中断。 - 调参优先关注显存与批处理:
--cache-max-entry-count、--cache-block-seq-len、--session-len、--concurrency共同决定 KV cache 容量与并发能力,是影响吞吐上限的第一组参数。 - 配套文档:服务端启动细节见 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.
相关推荐
LMDeploy 性能基准测试指南:profile_throughput / profile_restful_api / benchmark_guided 实战详解
LMDeploy 性能基准测试指南:profile_throughput / profile_restful_api / benchmark_guided 实战
人工智能大模型模型推理服务推理引擎本地部署模型量化LMDeploy性能优化与基准测试
LMDeploy性能优化与基准测试 LMDeploy提供了一套完整的推理性能基准测试工具集和优化方法论,涵盖从单机推理到分布式服务的全方位性能评估。文章详细介绍
人工智能大模型模型推理服务推理引擎本地部署模型量化gpui-kit 快速上手:用一行依赖从零搭建 GPUI 跨平台桌面应用
gpui kit 快速上手:用一行依赖从零搭建 GPUI 跨平台桌面应用 gpui kit 是面向 GPUI 的一站式 Rust UI 工具包,它把 GPUI、
人工智能大模型模型推理服务推理引擎本地部署模型量化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考