更新时间:2025-09-17 GMT+08:00
分享

大语言模型推理性能测试

性能测试需要使用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工具,请参考以下步骤执行。

  1. 获取acs-bench工具的whl包。whl包存放在软件包AscendCloud-LLM-xxx.zip > llm_tools目录中。acs-bench工具安装在python运行环境中,可以访问待测试的推理服务即可,建议在推理服务启动的容器中操作。
  2. 配置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
  3. 执行如下命令安装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所示:

表1 providers.yaml文件参数说明

字段

是否必填

含义

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 用于生成自定义数据集,使用示例如下,参数说明参见生成数据集参数说明

  1. 生成随机数据集。
    $ acs-bench generate dataset \
    --tokenizer ./tokenizer/Qwen3-32b \
    --dataset-type random \
    --output-path ./built_in_dataset \
    --input-length 128 \
    --num-requests 100
  2. 生成embedding数据集。
    $ acs-bench generate dataset \
    --tokenizer ./tokenizer/Qwen3-32b \
    --task embedding \
    --output-path ./built_in_dataset \
    --input-length 128 \
    --num-requests 100
  3. 生成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
  4. 从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
  5. 从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

生成数据集命令中的--input-length和--num-requests仅支持单个值。

如果需要生成其他规格的数据集,将--input-length或--num-requests修改成对应规格的值后,执行命令。

生成数据集参数说明

查询生成数据集参数命令如下:

$ acs-bench generate dataset -h
表2 自定义数据集生成命令参数介绍

参数名

参数类型

是否必选

参数说明

-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

性能压测模式验证

使用acs-bench prof命令进行性能压测的示例如下,详细参数解释请参见使用示例的参数说明,输出产物说明参见产物说明
# 使用线程池为例进行并发测试,后端并发模式默认为多线程模式`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/

爬坡模式验证

使用acs-bench prof命令进行爬坡测试的示例如下,详细参数解释请参见使用示例的参数说明,输出产物说明参见产物说明
# 以多线程并发模式为例,并发度从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测试的参数命令如下:
$ acs-bench prof -h
表3 Dataset Options

参数名

参数类型

是否必选

参数说明

-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。

表4 Concurrency Options

参数名

参数类型

是否必选

参数说明

-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。支持以下参数选项:

  • threading-pool:单进程多线程并发后端。
  • asyncio:异步协程并发后端。
  • processing-pool:多进程并发后端。当并发后端为processing-pool时,num-process需要小于等于min(concurrency, init_concurrency),如果不满足上述条件,工具会自动将较小的concurrency或init_concurrency设置为num-process。

-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。

支持以下参数选项:

  • static:并发数保持不变,等价于压测模式。
  • linear:并发数随时间间隔线性增长,直到达到最大并发数。
表5 Metrics Options

参数名

参数类型

是否必选

参数说明

-g, --goodput

String

服务SLO,表示满足业务诉求的性能指标,单位是毫秒(ms),支持配置ttft、tpot、e2el三种指标类型。

可以通过-g ttft:50 -g e2e 1000指定ttft和e2e两个指标。

-bi, --bucket-interval

Float

表示实时性能指标采样间隔,单位是毫秒,若指定该参数,则可以动态统计bucket_interval毫秒内的性能指标变化。

表6 Serving Options

参数名

参数类型

是否必选

参数说明

-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

示例如下图所示。

图1 请求详情结果(示意图)
图2 性能指标统计CSV文件(示意图)

相关文档