一、环境说明
| 配置项 | 具体信息 |
|---|---|
| 服务器 | 浪潮 NF5468M6 |
| 服务器操作系统 | UOS V2500 |
| VLLM 版本 | 0.11.2 |
| 训练卡 | NVIDIA 3060Ti |
| Python 版本 | 3.11.6(主版本)/ 3.11.16 |
| 支持 Python 版本范围 | 3.10、3.11、3.12(不支持 3.9 及以下、3.13 及以上) |
| 大语言模型 | DeepSeek-R1-Distill-Qwen-1.5B |
| 评测工具 | AISBench |
二、工具简介
AISBench Benchmark 基于 OpenCompass 构建,兼容其配置体系、数据集结构与模型后端实现,并扩展了对服务化模型的支持能力。AISBench 是国内信创主流大模型服务评测 & 压测工具 ,电子标准院牵头,Apache‑2.0 开源,广泛对接 vLLM、SGLang、Triton、昇腾 CANN,国产异构算力场景使用非常多。仓库:https://github.com/AISBench/benchmark,命令行入口:ais_bench
支持的评测场景
| 类型 | 能力说明 |
|---|---|
| 精度测评 | 验证服务化 / 本地模型在问答、推理等基准数据集上的精度,覆盖文本、多模态场景 |
| 性能测评 | 评估服务化模型的延迟、吞吐率,支持压测场景极限性能、稳态性能、业务流量模拟 |
官网文档:https://ais-bench-benchmark-rf.readthedocs.io/zh-cn/latest/index.html
三、工具安装与卸载
3.1 安装步骤
基础安装
bash
# 克隆项目源码
git clone https://github.com/AISBench/benchmark.git
cd benchmark/
# pip安装核心依赖
pip3 install -e ./ --use-pep517 -i https://pypi.tuna.tsinghua.edu.cn/simple
验证安装:执行 ais_bench -h,打印出帮助信息即安装成功。
可选依赖安装(按需选择)
| 场景 | 安装命令 |
|---|---|
| 服务化框架支持(vLLM/Triton) | pip3 install -r requirements/api.txt && pip3 install -r requirements/extra.txt |
| 多模态模型离线推理 | pip3 install -r requirements/hf_vl_dependency.txt |
| BFCL 测评支持 | pip3 install -r requirements/datasets/bfcl_dependencies.txt --no-deps |
| OCRBench_v2 数据集测评 | pip3 install -r requirements/datasets/ocrbench_v2.txt |
⚠️ 注意:安装 BFCL 依赖时,
--no-deps参数用于避免pathlib版本冲突(Python3.5+ 内置该库)。
3.2 卸载命令
pip3 uninstall ais_bench_benchmark
四、环境准备
4.1 数据集下载与部署
下载数据集
- 数据集下载参考路径:
{工具根路径}/ais_bench/benchmark/configs/datasets/[数据集名]/readme - 数据集默认存放路径:
{工具根路径}/ais_bench/datasets,下载后需解压至该目录。
下载示例(以 gsm8k 为例)
bash
cd ais_bench/datasets
wget http://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/gsm8k.zip
unzip gsm8k.zip
rm gsm8k.zip
验证部署
执行 tree gsm8k/,确认目录结构如下:
gsm8k/
├── test.jsonl
├── test_socratic.jsonl
├── train.jsonl
└── train_socratic.jsonl
可用数据集任务(gsm8k 示例)
| 任务名称 | 简介 | 评估指标 | few-shot | prompt 格式 | 配置文件路径 |
|---|---|---|---|---|---|
| gsm8k_gen_4_shot_cot_str | 生成式任务,带逻辑链 | accuracy | 4-shot | 字符串格式 | gsm8k_gen_4_shot_cot_str.py |
| gsm8k_gen_4_shot_cot_chat_prompt | 生成式任务,带逻辑链 | accuracy | 4-shot | 对话格式 | gsm8k_gen_4_shot_cot_chat_prompt.py |
| gsm8k_gen_0_shot_cot_str | 生成式任务 | accuracy | 0-shot | 字符串格式 | gsm8k_gen_0_shot_cot_str.py |
| gsm8k_gen_0_shot_cot_chat_prompt | 生成式任务 | accuracy | 0-shot | 对话格式 | gsm8k_gen_0_shot_cot_chat_prompt.py |
| gsm8k_gen_0_shot_cot_str_perf | 生成式任务(性能测评) | 性能测评 | 0-shot | 字符串格式 | gsm8k_gen_0_shot_cot_str_perf.py |
4.2 部署 vLLM 服务
参考《UOS V2500 CUDA 异构平台下 vLLM 部署手册》完成 vLLM 服务安装部署。
五、快速使用
AISBench 评测任务由「模型任务」「数据集任务」「结果呈现任务」组合定义,其他命令行参数指定评测场景(精度 / 性能)。
在使用前需要先修改测试脚本配置文件{工具根路径}/ais_bench/benchmark/configs/models/vllm_api下的.py脚本。例如修改vllm_api_general_chat.py,文件内容如下所示:

5.1 配置文件查询
运行命令前,可通过 --search 参数查询任务对应的配置文件绝对路径:
bash
ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_4_shot_cot_str --search
5.2 精度测试
5.2.1 单任务测试
用户通过--models和--datasets参数指定多个配置任务
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer
参数说明:
--models:指定模型任务(如vllm_api_general_chat)--datasets:指定数据集任务--summarizer:结果呈现任务(默认example,可省略)
执行结果存储路径:outputs/default/[时间戳],目录结构如下:
plaintext
[时间戳]/
├── configs # 合成的配置文件
│ └── [时间戳].py
├── logs # 执行日志
│ ├── eval # 精度评测日志
│ └── infer # 推理过程日志
├── predictions # 推理结果(JSON格式)
├── results # 精度原始分数(JSON格式)
└── summary # 最终结果(CSV/MD/TXT格式)
结果示例:
| dataset | version | metric | mode | vllm-api-general-chat |
|---|---|---|---|---|
| demo_gsm8k | 0ba9da | accuracy | gen | 37.50 |
5.2.2 多任务测试
用户可通过--models和--datasets参数指定多个配置任务,子任务数为--models配置任务数和--datasets配置任务数的乘积,即一个模型配置和一个数据集配置组成一个子任务,命令示例:
bash
ais_bench --models vllm_api_general_chat vllm_api_stream_chat --datasets gsm8k_gen_4_shot_cot_str
子任务数 = 模型任务数 × 数据集任务数,示例中执行 2 个子任务:
- vllm_api_general_chat + gsm8k_gen_4_shot_cot_str
- vllm_api_stream_chat + gsm8k_gen_4_shot_cot_str
执行结果:

5.2.3 多任务并行测试
默认情况下,多个子任务采用串行执行,单个任务内默认开启Continuous Batch,会根据用户配置的最大并发拉起多个进程发送和处理请求,允许配置较大的并发。在单个任务并发较小时,可以通过设置--max-num-workers参数实现多任务并行,示例如下:
bash
ais_bench --models vllm_api_general_chat vllm_api_stream_chat --datasets gsm8k_gen_4_shot_cot_str --max-num-workers 2
--max-num-workers:指定最大并发数,示例中 2 个子任务并行执行。
5.2.4 固定请求数测评
当集规模过大,只想针数据对部分样本执行性能测试时,可使用 --num-prompts 参数指定读取的数据条数。示例如下:
bash
ais_bench --models vllm_api_stream_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --num-prompts 1
--num-prompts:指定读取的数据条数(仅测试第一条样本);数据集按默认顺序读取,不支持随机抽样。
5.3 性能测试
5.3.1 核心参数说明
- 端到端性能输出结果:
| 性能指标 | 缩写 | 含义 |
|---|---|---|
| E2EL | - | 单请求从发送到接收全部响应的总时延 |
| TTFT | - | 首个 Token 返回时延 |
| TPOT | - | 输出阶段每个 Token 平均生成时延(不含首个 Token) |
| ITL | - | 相邻 Token 间平均间隔时延(不含首个 Token) |
| InputTokens | - | 请求输入 Token 数量 |
| OutputTokens | - | 请求生成输出 Token 数量 |
| OutputTokenThroughput | - | 输出 Token 吞吐率(Token/s) |
| Tokenizer | - | Tokenizer 编码耗时 |
| Detokenizer | - | Detokenizer 解码耗时 |
- 单次请求性能输结果:
- P75 / P90 / P99:以 TPOT 为例,表示所有请求的 TPOT 值分别处于第 75、90、99 百分位的性能表现。
- E2EL(End-to-End Latency):单个请求从发送到接收全部响应的总时延。
- TTFT(Time To First Token):首个 Token 返回的时延。
- TPOT(Time Per Output Token):输出阶段每个 Token 的平均生成时延(不含首个 Token)。
- ITL(Inter-token Latency):相邻 Token 间的平均间隔时延(不含首个 Token)。
- InputTokens:请求的输入 Token 数量。
- OutputTokens:请求生成的输出 Token 数量。
- OutputTokenThroughput:输出 Token 的吞吐率(Token/s)。
- Tokenizer:Tokenizer 编码耗时。
- Detokenizer:Detokenizer 解码耗时。
| Performance Parameters | Stage | Average | Max | Min | Median | P75 | P90 | P99 | N |
|---|---|---|---|---|---|---|---|---|---|
| E2EL | 统计此参数的阶段 | 平均请求时延 | 最大请求时延 | 最小请求时延 | 请求时延中位数 | 请求时延75分位值 | 请求时延90分位值 | 请求时延99分位值 | 测试数据量,来源于输入参数 |
| TTFT | 统计此参数的阶段 | 首个token平均时延 | 首个token最大时延 | 首个token最小时延 | 首个token中位数时延 | 首个token75分位时延 | 首个token90分位时延 | 首个token99分位时延 | 测试数据量,来源于输入参数 |
| TPOT | 统计此参数的阶段 | Decode阶段平均时延 | 最大Decode阶段时延 | 最小Decode阶段时延 | Decode阶段中位数时延 | 75分位Decode阶段时延 | 90分位每条请求Decode阶段平均时延 | 99分位Decode阶段时延 | 测试数据量,来源于输入参数 |
| ITL | 统计此参数的阶段 | token间平均时延 | token间最大时延 | token间最小时延 | token间中位数时延 | token间75分位时延 | token间90分位时延 | token间99分位时延 | 测试数据量,来源于输入参数 |
| InputTokens | 统计此参数的阶段 | 输入token平均长度 | 最大输入token长度 | 最小输入token长度 | 输入token中位数长度 | 75分位输入token长度 | 90分位输入token长度 | 99分位输入token长度 | 测试数据量,来源于输入参数 |
| OutputTokens | 统计此参数的阶段 | 输出token平均长度 | 最大输出token长度 | 最小输出token长度 | 输出token中位数长度 | 75分位输出token长度 | 90分位输出token长度 | 99分位输出token长度 | 测试数据量,来源于输入参数 |
| OutputTokenThroughput | 统计此参数的阶段 | 平均输出吞吐 | 最大输出吞吐 | 最小输出吞吐 | 中位数输出吞吐 | 输出吞吐75分位 | 输出吞吐90分位 | 输出吞吐99分位 | 测试数据量,来源于输入参数 |
5.3.2 单任务测试
AISBench服务化性能测评命令含义与工具快速入门/命令含义中的解释相同。在此基础上需要额外加上--mode perf或-m perf来进入性能评测场景,以如下AISBench命令为例:
bash
ais_bench --models vllm_api_stream_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer default_perf --mode perf
-
--mode perf/-m perf:指定性能评测场景 -
结果存储:除基础日志外,新增
performance目录,包含:单次请求性能(CSV)、端到端性能(JSON)、并发可视化报告(HTML)。20260130_093245 # 每次实验基于时间戳生成的唯一目录
├── configs # 自动存储的所有已转储配置文件
├── logs # 执行过程中日志,命令中如果加--debug,都直接打印出来了
│ └── performance/ # 推理阶段的日志文件
└── performance # 性能测评结果
│ └── vllm-api-stream-chat/ # 对应模型任务配置文件中models的 abbr参数
│ ├── demo_gsm8k.csv # 单次请求性能输出(CSV)
│ ├── demo_gsm8k.json # 端到端性能输出(JSON)
│ ├── demo_gsm8k_plot.html # 请求并发可视化报告(HTML)
│ └── ......
5.3.3 多任务测试
用户可通过--models和--datasets参数指定多个配置任务,子任务数为--models配置任务数和--datasets配置任务数的乘积,即一个模型配置和一个数据集配置组成一个子任务。
bash
ais_bench --models vllm_api_general_chat vllm_api_stream_chat --datasets gsm8k_gen_4_shot_cot_str --mode perf
执行逻辑同精度多任务测试,最终批量输出所有子任务性能结果。执行结果如下图所示:

5.3.4 自定义序列长度测评
-
查询配置文件路径:
自定义序列长度测评需要指定特殊的数据集任务synthetic_gen_string,执行如下命令来检索synthetic_gen_string对应的配置文件所在路径":ais_bench --models vllm_api_general_chat --datasets synthetic_gen_string --search
-
修改配置文件(
synthetic_gen_string.py):
修改{工具根路径}/ais_bench/benchmark/configs/datasets/synthetic/synthetic_gen_string.py中的synthetic_config。配置内容如下所示:
python
synthetic_config = {
"Type":"string",
"RequestCount": 10, # 请求总数(1~1048576)
"TrustRemoteCode": False,
"StringConfig" : {
"Input" : {
"Method": "uniform", # 均匀分布
"Params": {"MinValue": 1, "MaxValue": 200} # 输入长度范围
},
"Output" : {
"Method": "gaussian", # 高斯分布
"Params": {"Mean": 100, "Var": 200, "MinValue": 1, "MaxValue": 100}
}
},
}
- 配置模型忽略 EOS(确保输出达最大长度)
为了确保推理服务达到设置的最大输出,需要在服务化模型配置的generation_kwargs中配置特殊的后处理参数ignore_eos = True,以控制请求的最大输出长度(不提前结束)。
python
models = [
dict(
attr="service",
type=VLLMCustomAPIChat,
abbr="vllm-api-general-chat",
path="/root/xyh/models/DeepSeek-R1-Distill-Qwen-1.5B",
model="DeepSeek-R1-Distill-Qwen-1.5B",
stream=False,
request_rate=0,
retry=2,
api_key="",
host_ip="localhost",
host_port=8000,
url="",
max_out_len=512,
batch_size=10,
trust_remote_code=False,
generation_kwargs=dict(
temperature=0.01,
ignore_eos=True, # 忽略EOS,输出达max_out_len
),
pred_postprocessor=dict(type=extract_non_reasoning_content),
)
]
- 执行评测:
bash
ais_bench --models vllm_api_general_chat --datasets synthetic_gen_string -m perf
- 评测结果:

5.3.5 固定请求数测评
当集规模过大,只想针数据对部分样本执行性能测试时,可使用 --num-prompts参数指定读取的数据条数。示例如下:
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt -m perf --num-prompts 1
上述命令仅对示例数据集中的第一条记录进行推理并测量性能。
⚠️ 注意:当前数据集会按照默认队列顺序依次读取,不支持随机抽样或打乱顺序。
5.3.6 自定义性能维度(如新增 P95)
- 查询结果呈现任务配置路径:
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer default_perf -m perf --search
- 修改配置文件(
default_perf.py):
配置文件路径:{工具根路径}/ais_bench/benchmark/configs/summarizers/perf/default_perf.py
python
from ais_bench.benchmark.summarizers import DefaultPerfSummarizer
from ais_bench.benchmark.calculators import DefaultPerfMetricCalculator
summarizer = dict(
attr = "performance",
type=DefaultPerfSummarizer,
calculator=dict(
type=DefaultPerfMetricCalculator,
stats_list=["Average", "Min", "Max", "Median", "P75", "P90","P95", "P99"],
)
)
⚠️ 注意:其中
stats_list中最多同时承载8个性能维度的数据。
- 执行评测:
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer default_perf -m perf
- 输出结果:

5.4 稳定状态性能测试
5.4.1 稳态测试
稳态测试命令在此性能测试基础上需要指定--summarizer stable_stage按照稳态方式统计性能数据,以如下AISBench命令为例:
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer stable_stage --mode perf --pressure --debug
5.4.2 压力测试
压力测试的流程与稳态测试基本一致,差异主要有如下两点:
通过命令参数--pressure-time指定压力测试的持续时间,压测持续时间不能超过86400秒(24小时)。 通过配置模型配置文件中的request_rate参数来指定每个进程新增线程(客户端)的频率。此参数取值越大,实际新增线程(客户端)的频率偏差越大(偏差和cpu单核处理能力有关)。 通过修改配置常量文件参数中的WORKERS_NUM参数来指定压力测试中使用的进程数,提高压力测试的并发能力。
- 修改全局常量配置(
ais_bench/benchmark/global_consts.py):
python
WORKERS_NUM = 16 # 进程数(0~CPU核数,0为自动分配)
MAX_CHUNK_SIZE = 2 ** 16 # 单chunk最大缓存(字节)
REQUEST_TIME_OUT = None # 请求超时时间(None=无限等待)
- 执行压测命令:
bash
ais_bench --models vllm_api_general_chat --datasets demo_gsm8k_gen_4_shot_cot_chat_prompt --summarizer stable_stage --mode perf --debug --pressure --pressure-time 120
- 参数说明:
--pressure:启用压力测试模式--pressure-time:压测持续时间(秒,≤86400)request_rate(模型配置):进程新增客户端频率WORKERS_NUM:压测进程数(提升并发能力)