大语言模型推理性能测试
性能测试需要使用acs-bench工具。acs-bench prof命令主要用于LLM性能benchmark测试任务,支持给定数据长度和数量,在不同请求并发度的场景下对于Ascend vLLM服务进行性能测试,目前支持爬坡测试和性能压测两种模式。
安装acs-bench工具
昇腾云6.5.906及以后版本的配套镜像中默认已经安装acs-bench工具的whl包acs_bench-1.0.1-py3-none-any.whl,无需单独安装。
可以通过如下命令查看是否已经安装acs-bench工具。
$ pip show acs-bench
如果需要安装acs-bench工具,请参考以下步骤执行。
- 获取acs-bench工具的whl包。whl包存放在软件包AscendCloud-LLM-xxx.zip > llm_tools目录中。acs-bench工具安装在python运行环境中,可以访问待测试的推理服务即可,建议在推理服务启动的容器中操作。
- 配置pip源,按实际需要配置pip源。(可选)
$ mkdir -p ~/.pip $ vim ~/.pip/pip.conf # 配置文件填入如下内容,下述命令以华为源为例: [global] index-url=https://mirrors.tools.huawei.com/pypi/simple trusted-host=mirrors.tools.huawei.com timeout = 120
- 执行如下命令安装acs-bench工具。(可选)
$ pip install llm_tools/acs_bench-*-py3-none-any.whl
使用前准备工作:配置providers.yaml
ACS Bench工具通过配置providers.yaml文件访问服务端,它包含了服务端的id、name、api_key、base_url、model_name和model_category等信息。
使用ACS Bench工具前,请在本地创建一个providers.yaml文件,将参数的值按实际情况填写后保存,示例如下:
providers: - id: 'ascend-vllm' name: 'ascend-vllm' api_key: 'EMPTY' base_url: 'http://服务端IP:端口/v1' model_name: 'Qwen3-32b' model_category: 'Qwen3-32b'
具体参数说明如下表1所示:
字段 |
是否必填 |
含义 |
---|---|---|
id |
否 |
服务提供商标识。 |
name |
否 |
服务提供商名称。 |
api_key |
否 |
原为openai的api_key,现可作为MaaS的认证码。 |
base_url |
是 |
服务端基础URL(添加类似 http://{$IP}:{$PORT}/v1 的url) |
model_name |
是 |
启动推理服务时的模型名称。 如果启动推理服务时有设置served-model-name参数,则填写为served-model-name的值。 如果启动推理服务时没有设置served-model-name参数,则填写启动服务时默认的model路径。 |
model_category |
否 |
模型所属的类别,可不指定。 |
获取数据集
本章节介绍获取数据集。
acs-bench工具需要使用数据集进行测试,目前支持的开源数据集包括LongBench、ShareGPT格式,如果本地不能存在开源数据集,可以使用acs-bench generate dataset 用于生成自定义数据集,使用示例如下,参数说明参见生成数据集参数说明。
- 生成随机数据集。
$ acs-bench generate dataset \ --tokenizer ./tokenizer/Qwen3-32b \ --dataset-type random \ --output-path ./built_in_dataset \ --input-length 128 \ --num-requests 100
- 生成embedding数据集。
$ acs-bench generate dataset \ --tokenizer ./tokenizer/Qwen3-32b \ --task embedding \ --output-path ./built_in_dataset \ --input-length 128 \ --num-requests 100
- 生成rerank数据集。
$ acs-bench generate dataset \ --tokenizer ./tokenizer/Qwen3-32b \ --task rerank \ --document-size 4 \ --output-path ./built_in_dataset \ --input-length 128 \ --num-requests 100
- 从LongBench数据集中筛选符合条件的数据集。
$ acs-bench generate dataset \ --tokenizer ./tokenizer/Qwen3-32b \ --dataset-type LongBench \ --input-path ./dataset/long_bench --output-path ./built_in_dataset \ --input-length 128 \ --num-requests 100
- 从ShareGPT数据集中筛选符合条件的数据集。
$ acs-bench generate dataset \ --tokenizer ./tokenizer/Qwen3-32b \ --dataset-type ShareGPT \ --input-path ./dataset/ShareGPT --output-path ./built_in_dataset \ --input-length 128 \ --num-requests 100
- LongBench下载地址: https://huggingface.co/datasets/zai-org/LongBench/tree/main
- ShareGPT下载地址: https://huggingface.co/datasets/shibing624/sharegpt_gpt4

生成数据集命令中的--input-length和--num-requests仅支持单个值。
如果需要生成其他规格的数据集,将--input-length或--num-requests修改成对应规格的值后,执行命令。
参数名 |
参数类型 |
是否必选 |
参数说明 |
---|---|---|---|
-dt/--dataset-type |
String |
否 |
指定生成的数据集来源,即用于数据筛选的开源数据集类型,默认是random,即随机token组合模式。 |
-i/--input-path |
String |
否 |
指定用于数据筛选的开源数据集路径,当--dataset-type为random模式时无需指定该参数。 |
-mt/--modal-type |
String |
否 |
多模态数据集的模式类型,默认值为text,当前可选项为text、image-text、video-text。 |
-tk/--task |
String |
否 |
数据集任务后端,默认值为generate,当前可选项为generate、rerank、embedding。 |
-cfg/--config-option |
String |
否 |
多模态配置选项,以“KEY:VALUE”对的形式指定多模态使用的选项,可以提供多个“KEY:VALUE”对。允许的键选项包括“image_height”、“image_width”、“duration”和“fps”。 |
-o/--output-path |
String |
是 |
生成prompt的json文件输出路径。 |
-il/ --input-length |
Int |
是 |
自定义数据集中每个prompt的长度。 |
-pl/--prefix-length |
Int |
否 |
自定义数据集中公共前缀prompt长度,只在random模式下生效,默认是0。 |
-n/--num-requests |
Int |
是 |
生成的prompt个数。 |
-ds/--document-size |
Int |
否 |
每个查询的文档大小,默认是4。 |
-t/ --tokenizer |
String |
是 |
tokenizer模型文件夹路径,支持本地路径以及huggingface的模型路径。 |
-rv/--revision |
String |
否 |
指定huggingface社区的模型分支,只适用于tokenizer为huggingface的模型路径,默认是master。 |
-ra/--range-ratio-above |
Float |
否 |
表示prompt长度能够动态上浮的比例,即最大长度为input_length * (1 + range_ratio_above),取值范围是[0, 1],默认是0.0。 |
-rb/--range-ratio-blow |
Float |
否 |
表示prompt长度能够动态下潜的比例,即最小长度为input_length * (1 - range_ratio_above),取值范围是[0, 1],默认是0.0。 |
-seed/--random-seed |
Int |
否 |
随机种子,用于固定随机性。 |
-trc/--trust-remote-code |
Bool |
否 |
是否信任远端代码,只适用于tokenizer为huggingface的模型路径,默认是False |
性能压测模式验证
# 使用线程池为例进行并发测试,后端并发模式默认为多线程模式`threading-pool`,可以选择异步协程并发模式`asyncio`、多进程模式`processing-pool`或者多线程模式`threading-pool` $ acs-bench prof \ --provider ./provider/providers.yaml \ --dataset-type custom --input-path ./built_in_dataset/ \ --concurrency-backend threading-pool \ --backend openai-chat --warmup 1 \ --epochs 2 \ --num-requests 1,2,4,8 --concurrency 1,2,4,8 \ --input-length 128,128,2048,2048 --output-length 128,2048,128,2048 \ --benchmark-save-path ./output_path/
爬坡模式验证
# 以多线程并发模式为例,并发度从1开始进行爬坡,每隔5000ms并发度增加2 $ acs-bench prof \ --provider ./provider/providers.yaml \ --dataset-type custom --input-path ./built_in_dataset/ \ --concurrency-backend threading-pool \ --backend openai-chat --warmup 1 \ --epochs 2 \ --use-climb --climb-mode linear --growth-rate 2 --init-concurrency 1 --growth-interval 5000 \ --num-requests 1,2,4,8 --concurrency 1,2,4,8 \ --input-length 128,128,2048,2048 --output-length 128,2048,128,2048 \ --benchmark-save-path ./output_path/
基于embedding数据集对embedding模型进行并发测试
使用acs-bench prof命令进行embedding模型并发测试的示例如下,详细参数解释请参见使用示例的参数说明,输出产物说明参见产物说明。
# 以多线程并发模式为例,后端backend为embedding $ acs-bench prof \ --provider ./provider/providers.yaml \ --dataset-type custom --input-path ./built_in_dataset/ \ --concurrency-backend threading-pool \ --backend embedding --warmup 1 \ --epochs 2 \ --num-requests 1,2,4,8 --concurrency 1,2,4,8 \ --input-length 128,128,2048,2048 --output-length 128,2048,128,2048 \ --benchmark-save-path ./output_path/
基于rerank数据集对rerank模型进行并发测试
使用acs-bench prof命令进行rerank模型并发测试的示例如下,详细参数解释请参见使用示例的参数说明,输出产物说明参见产物说明。
# 以多线程并发模式为例,后端backend为rerank $ acs-bench prof \ --provider ./provider/providers.yaml \ --dataset-type custom --input-path ./built_in_dataset/ \ --concurrency-backend threading-pool \ --backend rerank --warmup 1 \ --document-size 4,4,4,4 \ --epochs 2 \ --num-requests 1,2,4,8 --concurrency 1,2,4,8 \ --input-length 128,128,2048,2048 --output-length 128,2048,128,2048 \ --benchmark-save-path ./output_path/
使用示例的参数说明

1.下列参数说明中的--concurrency、--init-concurrency、--num-requests、--input-length、--output-length、--config-option除了支持使用英文逗号(,)隔开的方式指定,逗号中间不能添加空格,也可以分开指定多组参数的使用方式。其中,--num-requests参数如果不指定,默认和--concurrency参数的值保持一致。
参考示例如下:
$ acs-bench prof \ --provider ./provider/providers.yaml \ --dataset-type custom --input-path ./built_in_dataset/ \ --concurrency-backend threading-pool \ --backend openai-chat --warmup 1 \ --epochs 2 \ --num-requests 1 --num-requests 2 --num-requests 4 --num-requests 8 \ --concurrency 1 --concurrency 2 --concurrency 4 --concurrency 8 \ --input-length 128 --input-length 128 --input-length 2048 --input-length 2048 \ --output-length 128 --output-length 2048 --output-length 128 --output-length 2048 \ --benchmark-save-path ./output_path/
2.性能压测模式验证和爬坡模式验证示例中的 --input-length参数值,必须在提前生成的数据集中存在,如果不存在,参考获取数据集,生成对应输入长度的数据集。
性能benchmark测试参数主要由数据集配置参数Dataset Options、并发控制配置参数Concurrency Options、指标统计配置参数Metrics Options和服务请求配置参数Serving Options四部分组成,以下将按照配置类型进行介绍。
$ acs-bench prof -h
参数名 |
参数类型 |
是否必选 |
参数说明 |
---|---|---|---|
-dt/--dataset-type |
String |
否 |
指定数据集类型,默认是custom,即自定义制作的数据集。 |
-cfg/--config-option |
String |
否 |
多模态配置选项,以“KEY:VALUE”对的形式指定多模态使用的选项,可以提供多个“KEY1:VALUE1,KEY2:VALUE2,”对。允许的键选项包括“image_height”、“image_width”、“duration”和“fps”。 |
-mt/--modal-type |
String |
否 |
多模态数据集的模式类型,默认值为text,当前可选项为text、image-text、video-text。 |
-i/--input-path |
String |
是 |
指定用于数据集路径。 |
-il/--input-length |
Int |
是 |
指定自定义数据集的长度,只在dataset-type为custom时生效,支持指定多组输入长度,使用`,`分隔。 |
-ds/--document-size |
Int |
否 |
每个查询的文档大小,支持多个整数输入 |
-n/--num-requests |
Int |
是 |
用于并发测试的请求个数,支持指定多组请求数,使用`,`分隔,默认和并发数相等。 |
-t/--tokenizer |
String |
否 |
tokenizer模型文件夹路径,支持本地路径以及huggingface的模型路径。 |
-rv/--revision |
String |
否 |
指定huggingface社区的模型分支,只适用于tokenizer为huggingface的模型路径,默认是master。 |
-seed/--random-seed |
Int |
否 |
随机种子,用于固定随机性。 |
-trc/--trust-remote-code |
Bool |
否 |
是否信任远端代码,只适用于tokenizer为huggingface的模型路径,默认是False。 |
参数名 |
参数类型 |
是否必选 |
参数说明 |
---|---|---|---|
-c/--concurrency |
Int |
否 |
最大并发数,默认是1,支持指定多组并发数,使用`,`分隔。 |
-nc/--num-process |
Int |
否 |
并行处理的进程数,应该小于等于cpu数量,支持指定多组进程数,使用`,`分隔,默认为[1]。 |
-r/--request-rate |
Float |
否 |
请求到达的请求速率,仅在并发数为1时有效,默认值为无穷大(INF)。 |
-rm/--request-mode |
String |
否 |
请求到达模式,支持 `normal` 和 `pd-adaptive`,默认值为:normal。 |
-pc/--prefill-concurrency |
INT |
否 |
PD分离部署场景中,所有prefill的最大并发量,prefill并发数用于PD独立部署,仅在--request-mode为pd-adaptive时有效。 |
-dc/--decoder-concurrency |
INT |
否 |
PD分离部署场景中,所有Decoder的最大并发量,decode并发数用于PD独立部署,仅在--request-mode为pd-adaptive时有效。 |
-burst/--burstiness |
Float |
否 |
请求的突发因子,仅当request_rate不是inf时生效,默认是1.0。 |
-cb/--concurrency-backend |
Str |
否 |
并发后端,默认是threading-pool。支持以下参数选项:
|
-ub/--use-climb |
Bool |
否 |
是否开启爬坡模式,默认是False,表示不开启爬坡模式 |
-gr/--growth-rate |
Int |
否 |
每次爬坡增长的并发度,只在爬坡模式生效,默认是0。 |
-gi/--growth-interval |
Float |
否 |
每次爬坡的时间间隔,只在爬坡模式生效,默认是1000ms。 |
-ic/--init-concurrency |
Int |
否 |
初始并发数,只在爬坡模式生效,默认等于concurrency,支持指定多组初始并发数,使用`,`分隔。 |
-cm/--climb-mode |
String |
否 |
爬坡模式,只在爬坡模式生效,默认为linear。 支持以下参数选项:
|
参数名 |
参数类型 |
是否必选 |
参数说明 |
---|---|---|---|
-g, --goodput |
String |
否 |
服务SLO,表示满足业务诉求的性能指标,单位是毫秒(ms),支持配置ttft、tpot、e2el三种指标类型。 可以通过-g ttft:50 -g e2e 1000指定ttft和e2e两个指标。 |
-bi, --bucket-interval |
Float |
否 |
表示实时性能指标采样间隔,单位是毫秒,若指定该参数,则可以动态统计bucket_interval毫秒内的性能指标变化。 |
参数名 |
参数类型 |
是否必选 |
参数说明 |
---|---|---|---|
-b, --backend |
String |
否 |
请求服务接口类型,支持openai、openai-chat、embedding、rerank。默认是openai-chat。 |
-p, --provider |
String |
是 |
provider文件路径,需要用户自己创建并指定。 |
-pid, --provider-id |
String |
否 |
指定需要测试的provider id,适用于provider文件中有多个配置且只需要运行指定ID的provider场景。 |
-ol/--output-length |
Int |
是 |
输出token长度,支持指定多组输出长度,使用`,`分隔。 |
-ra/--range-ratio-above |
Float |
否 |
表示输出token长度能够动态上浮的比例,即最大长度为output_length * (1 + range_ratio_above),取值范围是[0, 1],默认是0.0。 |
-rb/--range-ratio-below |
Bool |
否 |
表示输出token长度能够动态下潜的比例,即最小长度为output_length * (1 - range_ratio_above),取值范围是[0, 1],默认是0.0。 |
-w/--warmup |
Int |
否 |
warmup的请求数量,默认是0,表示不开启warmup。 |
-e/--epochs |
Int |
否 |
同一个并发配置的计算次数,默认是1,表示每一组并发只执行一次。 |
-tk/--top-k |
Int |
否 |
Top-k采样参数,仅对与OpenAI兼容的后端有效,默认是-1。 |
-tp/--top-p |
Float |
否 |
Top-p采样参数,仅对与OpenAI兼容的后端有效,默认是1.0。 |
-mp/--min-p |
Float |
否 |
Min-p采样参数,表示一个token被考虑的最小概率。必须位于[0, 1]之间。仅对与OpenAI兼容的后端有效。 |
-temper/--temperature |
Float |
否 |
Temperature采样参数,默认是0。 |
-cs/--chunk-size |
Int |
否 |
流式请求中,返回的chrunk大小,默认是1024。 |
-ef/--encoding-format |
String |
否 |
嵌入后端的返回编码格式支持“float”或“base64”,默认值为float。 |
-usd/--use-spec-decode |
Bool |
否 |
表示服务端是否开启了投机推理。若开启投机推理,则可以结合--num-spec-tokens参数用于计算MTP的接受率。默认是False,表示不开启投机推理。 |
-nst/--num-spec-tokens |
Int |
否 |
表示服务端投机推理配置的投机推理个数,该值设为1表示服务端每次会多推理一个token,则可以结合--use-spec-decode参数用于计算MTP的接受率。默认是-1。 |
-umar/--use-mtp-accept-rate |
Bool |
否 |
表示计算MTP接受率时是否忽略模型本身生成的token数。默认是True,表示忽略。 |
-nss/--num-scheduler-steps |
Int |
否 |
表示服务端multi step的大小,用于计算MTP的接受率,默认是1。 |
-timeout/--timeout |
Float |
否 |
请求超时时间,默认是1000s。 |
-ie/--ignore-eos |
Bool |
否 |
是否忽略EOS,默认是True,表示忽略EOS标识。 |
-cus/--continuous-usage-stats |
Bool |
否 |
流式请求中,是否开启每个返回chrunk数据中包含usage信息,默认True,表示每个返回chrunk数据中包含usage信息。 |
-sst/--skip-special-tokens |
Bool |
否 |
是否跳过特殊标记,默认值:False。 |
-er/--enable-max-tokens-exclude-reasoning |
Bool |
否 |
是否启用max-tokens排除推理功能,该功能将在达到max-tokens时主动断开与服务器的连接,默认值为:True。 |
-pf/ --profile |
Bool |
否 |
是否采集服务端Service Profiler信息。默认是False,表示不采集。 warmup阶段不会采集服务端服务化信息。 |
-pl/--profile-level |
String |
否 |
服务端Service Profiler的采集级别,支持Level_none、Level0、Level1、Level2,只在开启profile场景生效,默认是none。 |
-trace/--trace |
Bool |
否 |
是否打开工具trace开关,开启后会对并发过程进行跟踪和呈现。默认是False,表示不开启。 |
-s/--benchmark-save-path |
String |
否 |
性能指标落盘的文件夹路径,默认为./benchmark_output。 |
产物说明
脚本运行完成后,会在--benchmark-save-path参数指定的输出路径下,会创建一个requests目录和summary开头的csv文件,其中在requests目录下,输出以requests开头的csv文件
1.requests_{provider}_{dataset_type}_{control_method}_concurrency{concurrency}_{concurrency_backend}_input{input_length}_output{output_length}_{current_time}.csv
2.summary_{provider}_{control_method}_{concurrency_backend}_{current_time}.csv
示例如下图所示。

