- 人工智能
- 大模型
- 模型推理服务
- Ascend
- CANN
【免费下载链接】vllm-ascend
Community maintained hardware plugin for vLLM on Huawei Ascend
本文以 vLLM Ascend(vllm-ascend)开源仓库的官方评测指南为主线,讲解如何在昇腾 NPU 上以"在线服务"方式启动 vLLM Server,并通过 AISBench 工具对 C-Eval、MMLU、GPQA、MATH-500、LiveCodeBench、AIME 2024、GSM8K 等主流数据集执行精度(accuracy)与性能(performance)评估。读完本文,你将掌握从环境准备、数据集下载、评测配置到结果解读与常见故障排查的完整链路,并能结合仓库中的 tools/aisbench.py 封装理解评测的自动化与阈值校验机制。
1. 认识 AISBench 与 vllm-ascend 的评测方案
AISBench 是面向昇腾 AI 硬件生态的基准评测框架,同时提供精度评估(accuracy)与性能评估(performance)能力,覆盖数学、知识问答、代码生成、多模态理解等多种评测场景。vllm-ascend 官方文档将其作为推荐评测工具之一,与 lm-eval、EvalScope 等方案并列(可对比阅读 using_lm_eval.md 与 using_evalscope.md)。
在仓库的 tools/aisbench.py 中,AisbenchRunner类将 AISBench 进一步封装为三类可自动化、可验证的任务(对应aisbench_config["case_type"]):
accuracy:跑通数据集推理并计算准确率,默认用baseline ± threshold(阈值默认 1)区间校验结果是否达标(见_accuracy_verify);performance:统计输出吞吐、输入吞吐、TPOT 等指标,默认校验Output Token Throughput >= 0.97 * baseline(见_performance_verify),并支持可选的input_throughput_threshold与tpot_threshold额外约束;spec_decode:基于指标服务测量投机解码(speculative decoding)的接受率(见_spec_decode_verify)。
这意味着本文讲解的手工流程同样可以被 CI/e2e 测试复用,例如 tests/e2e/cases/features/kv_pool/test_qwen3_30b_acc.py 就通过run_aisbench_cases(model, port, aisbench_cases)批量跑精度用例。下面从最基础的手工流程讲起。
2. 前置准备:在单卡昇腾 NPU 上启动 vLLM 在线服务
2.1 启动 Docker 容器
vllm-ascend 官方镜像已经内置 vLLM Ascend 运行环境。执行以下命令启动容器(需按实际环境修改DEVICE与IMAGE):
# Update DEVICE according to your device (/dev/davinci[0-7]) export DEVICE=/dev/davinci7 # Update the vllm-ascend image export IMAGE=quay.io/ascend/vllm-ascend:{{ vllm_ascend_version }} docker run --rm \ --name vllm-ascend \ --shm-size=1g \ --device $DEVICE \ --device /dev/davinci_manager \ --device /dev/devmm_svm \ --device /dev/hisi_hdc \ -v /usr/local/dcmi:/usr/local/dcmi \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \ -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \ -v /etc/ascend_install.info:/etc/ascend_install.info \ -v /root/.cache:/root/.cache \ -p 8000:8000 \ -e VLLM_USE_MODELSCOPE=True \ -e PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:256 \ -it $IMAGE \ /bin/bash各挂载与环境变量的作用说明:
--device系列:将 NPU 设备(/dev/davinci[0-7])以及驱动管理节点(davinci_manager、devmm_svm、hisi_hdc)透传进容器;/usr/local/dcmi、npu-smi、Ascend 驱动 lib64 与version.info、/etc/ascend_install.info:供容器内感知驱动与设备信息;/root/.cache:复用宿主机模型与数据集缓存;-p 8000:8000:暴露 vLLM OpenAI 兼容服务端口;VLLM_USE_MODELSCOPE=True:让 vLLM 从 ModelScope 下载模型,便于国内网络环境;PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:256:调整 NPU 侧 PyTorch 内存分配粒度,缓解大模型场景下的碎片化。
2.2 在容器内启动 vLLM Server
vllm serve Qwen/Qwen2.5-0.5B-Instruct --max-model-len 35000 &注意:
--max-model-len应设置为大于35000,这一长度对绝大多数评测数据集都足够,否则可能影响精度评估结果。
服务启动成功后,日志应包含:
INFO: Started server process [9446] INFO: Waiting for application startup. INFO: Application startup complete.此时http://localhost:8000即对外提供 OpenAI 兼容的/v1接口,供 AISBench 以service模式接入。
3. 安装 AISBench
在容器内从源码安装 AISBench:
git clone https://github.com/AISBench/benchmark.git cd benchmark/ pip3 install -e ./ --use-pep517再安装评测所需的扩展依赖:
pip3 install -r requirements/api.txt pip3 install -r requirements/extra.txt安装完成后,运行ais_bench -h确认 CLI 可用。
4. 下载评测数据集
AISBench 仓库按ais_bench/benchmark/configs/datasets目录组织各数据集的评测配置,每个数据集附带README.md说明下载与安装方式。下面给出官方文档示例中的常用数据集下载命令(均需在ais_bench/datasets目录下执行)。
4.1 C-Eval
cd ais_bench/datasets mkdir ceval/ mkdir ceval/formal_ceval cd ceval/formal_ceval wget https://www.modelscope.cn/datasets/opencompass/ceval-exam/resolve/master/ceval-exam.zip unzip ceval-exam.zip rm ceval-exam.zip4.2 MMLU
cd ais_bench/datasets wget https://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/mmlu.zip unzip mmlu.zip rm mmlu.zip4.3 GPQA
cd ais_bench/datasets wget https://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/gpqa.zip unzip gpqa.zip rm gpqa.zip4.4 MATH
cd ais_bench/datasets wget https://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/math.zip unzip math.zip rm math.zip4.5 LiveCodeBench
cd ais_bench/datasets # If HuggingFace is slow or unreachable, set HF_ENDPOINT to a mirror: # export HF_ENDPOINT=https://hf-mirror.com huggingface-cli download livecodebench/code_generation_lite --repo-type dataset --local-dir code_generation_lite4.6 AIME 2024
cd ais_bench/datasets mkdir aime/ cd aime/ wget https://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/aime.zip unzip aime.zip rm aime.zip4.7 GSM8K
cd ais_bench/datasets wget https://opencompass.oss-cn-shanghai.aliyuncs.com/datasets/data/gsm8k.zip unzip gsm8k.zip rm gsm8k.zip提示:仓库 tools/aisbench.py 中的
DATASET_RENAME映射(如aime2024 -> aime、gsm8k-lite -> gsm8k、textvqa-lite -> textvqa)说明自动化流程在复制数据集时会统一目录名,手工操作时建议按同样命名放置,避免配置与目录对不上。
5. 配置模型评测参数
精度与性能评测共用一个模型配置文件:ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py。需要根据环境修改以下字段:
| 字段 | 含义 | 说明 |
|---|---|---|
attr | 推理后端类型标识 | 固定为service(基于服务的推理)或local(本地加载模型) |
type | 后端 API 类型 | 用于选择不同的后端 API 实现,示例使用VLLMCustomAPIChat |
abbr | 本地任务唯一标识 | 用于区分多个评测任务 |
path | 模型权重路径 | 本地模型权重路径 |
model | vLLM 中的模型名 | 需与vllm serve启动时的模型名一致 |
host_ip/host_port | vLLM 服务地址与端口 | 默认localhost:8000 |
max_out_len | 最大生成长度 | 注意max_out_len+ 输入长度必须小于 vLLM Server 的max_model_len;32768对大多数数据集足够 |
batch_size | 批大小 | 按数据集规模调整 |
temperature | 采样温度 | 按评测要求设置推理参数 |
官方示例配置如下:
from ais_bench.benchmark.models import VLLMCustomAPIChat from ais_bench.benchmark.utils.model_postprocessors import extract_non_reasoning_content models = [ dict( attr="service", type=VLLMCustomAPIChat, abbr='vllm-api-general-chat', path="xxxx", model="xxxx", request_rate = 0, retry = 2, host_ip = "localhost", host_port = 8000, max_out_len = xxx, batch_size = xxx, trust_remote_code=False, generation_kwargs = dict( temperature = 0.6, top_k = 10, top_p = 0.95, seed = None, repetition_penalty = 1.03, ), pred_postprocessor=dict(type=extract_non_reasoning_content) ) ]关键点解读:
extract_non_reasoning_content作为后处理器,会从模型输出中剥离思维链/推理过程,只保留最终答案文本,确保评测打分器拿到的结果是干净的作答内容;request_rate = 0表示按需发送(而非压测模式下的固定速率),retry = 2允许失败重试。
从源码看,自动化封装正是围绕该模板做"定制化生成":AisbenchRunner._init_request_conf读取vllm_api_general_chat.py,用正则替换model、host_port、host_ip、max_out_len、batch_size、trust_remote_code等字段,并支持注入top_k、top_p、seed、min_p、presence_penalty、repetition_penalty、thinking(即chat_template_kwargs={"thinking": True})与reasoning_effort等推理参数,最终写出vllm_api_general_chat_custom.py(tools/aisbench.py)。对应地,性能模式会强制temperature=0、ignore_eos=True,精度/投机解码模式默认temperature=0.6。单元测试 tests/ut/tools/test_aisbench.py 验证了reasoning_effort与thinking字段能够被正确注入生成文件,手工流程可参考此逻辑保证配置一致性。
6. 执行精度评估
运行以下命令分别执行各数据集的精度评估:
# run C-Eval dataset ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt.py --mode all --dump-eval-details --merge-ds # run MMLU dataset ais_bench --models vllm_api_general_chat --datasets mmlu_gen_0_shot_cot_chat_prompt.py --mode all --dump-eval-details --merge-ds # run GPQA dataset ais_bench --models vllm_api_general_chat --datasets gpqa_gen_0_shot_str.py --mode all --dump-eval-details --merge-ds # run MATH-500 dataset ais_bench --models vllm_api_general_chat --datasets math500_gen_0_shot_cot_chat_prompt.py --mode all --dump-eval-details --merge-ds # run LiveCodeBench dataset ais_bench --models vllm_api_general_chat --datasets livecodebench_code_generate_lite_gen_0_shot_chat.py --mode all --dump-eval-details --merge-ds # run AIME 2024 dataset ais_bench --models vllm_api_general_chat --datasets aime2024_gen_0_shot_chat_prompt.py --mode all --dump-eval-details --merge-ds # run GSM8K dataset ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_0_shot_cot_chat_prompt.py --mode all --dump-eval-details --merge-ds命令行参数说明:
--models:指定模型配置(对应configs/models/vllm_api下的文件名,不带.py);--datasets:指定数据集配置(对应configs/datasets下的文件名);--mode all:同时执行推理与精度评分;--dump-eval-details:导出逐样本的评测细节;--merge-ds:合并数据集,便于一次汇总结果。
每次执行后,结果保存在带时间戳的目录中,例如outputs/default/20250628_151326:
20250628_151326/ ├── configs # Combined configuration file for model tasks, dataset tasks, and result presentation tasks │ └── 20250628_151326_29317.py ├── logs # Execution logs; if --debug is added to the command, no intermediate logs are saved to disk (all are printed directly to the screen) │ ├── eval │ │ └── vllm-api-general-chat │ │ └── demo_gsm8k.out # Logs of the accuracy evaluation process based on inference results in the predictions/ folder │ └── infer │ └── vllm-api-general-chat │ └── demo_gsm8k.out # Logs of the inference process ├── predictions │ └── vllm-api-general-chat │ └── demo_gsm8k.json # Inference results (all outputs returned by the inference service) ├── results │ └── vllm-api-general-chat │ └── demo_gsm8k.json # Raw scores calculated from the accuracy evaluation └── summary ├── summary_20250628_151326.csv # Final accuracy scores (in table format) ├── summary_20250628_151326.md # Final accuracy scores (in Markdown format) └── summary_20250628_151326.txt # Final accuracy scores (in text format)目录语义:configs保存本次评测的合并配置(模型任务 + 数据集任务 + 结果展示任务);logs分eval(基于predictions的评分日志)与infer(推理过程日志)两类;predictions是推理服务返回的全部原始输出;results是评分后的原始分数;summary则是 CSV / Markdown / TXT 三种格式的最终汇总表,也是人工阅读结论的首选文件。
在自动化校验场景下,_get_result_accuracy会读取汇总表最后一个单元格作为准确率,并断言其落在[baseline - threshold, baseline + threshold]区间内(tools/aisbench.py),你可以据此在 CI 中设定达标基线。
7. 执行性能评估
性能评估使用--mode perf,并搭配--summarizer default_perf聚合指标。
7.1 纯文本基准
# run C-Eval dataset ais_bench --models vllm_api_general_chat --datasets ceval_gen_0_shot_cot_chat_prompt.py --summarizer default_perf --mode perf # run MMLU dataset ais_bench --models vllm_api_general_chat --datasets mmlu_gen_0_shot_cot_chat_prompt.py --summarizer default_perf --mode perf # run GPQA dataset ais_bench --models vllm_api_general_chat --datasets gpqa_gen_0_shot_str.py --summarizer default_perf --mode perf # run MATH-500 dataset ais_bench --models vllm_api_general_chat --datasets math500_gen_0_shot_cot_chat_prompt.py --summarizer default_perf --mode perf # run LiveCodeBench dataset ais_bench --models vllm_api_general_chat --datasets livecodebench_code_generate_lite_gen_0_shot_chat.py --summarizer default_perf --mode perf # run AIME 2024 dataset ais_bench --models vllm_api_general_chat --datasets aime2024_gen_0_shot_chat_prompt.py --summarizer default_perf --mode perf # run GSM8K dataset ais_bench --models vllm_api_general_chat --datasets gsm8k_gen_0_shot_cot_str_perf.py --summarizer default_perf --mode perf注意 GSM8K 的性能评测使用单独的gsm8k_gen_0_shot_cot_str_perf.py配置,与精度评测的 prompt 配置不同。
7.2 多模态基准(文本 + 图像)
# run textvqa dataset ais_bench --models vllm_api_stream_chat --datasets textvqa_gen_base64 --summarizer default_perf --mode perf多模态评测使用vllm_api_stream_chat模型配置(流式对话 API)与textvqa_gen_base64数据集配置(Base64 图像输入)。
性能结果同样输出到带时间戳的目录,例如:
20251031_070226/ |-- configs # Combined configuration file for model tasks, dataset tasks, and result presentation tasks | `-- 20251031_070226_122485.py |-- logs | `-- performances | `-- vllm-api-general-chat | `-- cevaldataset.out # Logs of the performance evaluation process `-- performances `-- vllm-api-general-chat |-- cevaldataset.csv # Final performance results (in table format) |-- cevaldataset.json # Final performance results (in json format) |-- cevaldataset_details.h5 # Final performance results in details |-- cevaldataset_details.json # Final performance results in details |-- cevaldataset_plot.html # Final performance results (in html format) `-- cevaldataset_rps_distribution_plot_with_actual_rps.html # Final performance results (in html format)其中cevaldataset.csv/cevaldataset.json是最终指标,cevaldataset_details.*是逐请求明细,两个 HTML 文件则提供可视化图表(结果曲线与真实请求速率分布)。核心指标包括 TTFT(首 Token 延迟)、TPOT(每输出 Token 延迟)、输出/输入 Token 吞吐与请求吞吐等;自动化校验时即从 JSON 的Output Token Throughput["total"]与 CSV 的TPOT行读取数据做断言(tools/aisbench.py)。
8. 常见问题排查:TextVQA 图像路径错误
按 AISBench 官方文档下载 TextVQA 数据集时:
cd ais_bench/datasets git lfs install git clone https://huggingface.co/datasets/maoxx241/textvqa_subset mv textvqa_subset/ textvqa/ mkdir textvqa/textvqa_json/ mv textvqa/*.json textvqa/textvqa_json/ mv textvqa/*.jsonl textvqa/textvqa_json/可能遇到如下报错:
AISBench - ERROR - /vllm-workspace/benchmark/ais_bench/benchmark/clients/base_client.py - raise_error - 35 - [AisBenchClientException] Request failed: HTTP status 400. Server response: {"error":{"message":"1 validation error for ChatCompletionContentPartImageParam\nimage_url\n Input should be a valid dictionary [type=dict_type, input_value='data/textvqa/train_images/b2ae0f96dfbea5d8.jpg', input_type=str]\n For further information visit https://errors.pydantic.dev/2.12/v/dict_type None","type":"BadRequestError","param":null,"code":400}}原因分析:数据集 JSON 中记录的图片路径是相对路径(data/textvqa/train_images/...),而 OpenAI 兼容接口的image_url要求传入可访问的绝对路径,pydantic 校验ChatCompletionContentPartImageParam时因此返回 400。
解决办法:用sed将 JSON 中的相对路径批量替换为实际绝对路径:
cd ais_bench/datasets/textvqa/textvqa_json sed -i 's#data/textvqa/train_images/#/path/to/benchmark/ais_bench/datasets/textvqa/train_images/#g' textvqa_val.json将/path/to/benchmark/ais_bench/datasets/textvqa/train_images/替换为你机器上图像文件真实存放的绝对目录即可。
9. 小结与延伸阅读
本指南完整覆盖了 vllm-ascend 环境下 AISBench 评测的标准流程:Docker 启动单卡 vLLM 服务(注意--max-model-len需大于 35000)、安装 AISBench、下载七类常用数据集、修改vllm_api_general_chat.py配置(重点是max_out_len与max_model_len的约束关系)、分别执行--mode all精度评测与--mode perf性能评测,以及 TextVQA 图像路径的修复。读懂outputs/default/<时间戳>目录结构(predictions/results/summary)即可快速定位最终得分。
如果你想将同样的评测接入自动化验证,可深入研究仓库中的 tools/aisbench.py(AisbenchRunner的配置生成与阈值校验逻辑)及其单元测试 tests/ut/tools/test_aisbench.py,并参考 e2e 用例 tests/e2e/cases/features/kv_pool/test_qwen3_30b_acc.py 的aisbench_cases组织方式。若需对比其他评测框架,可阅读同目录下的 using_lm_eval.md(lm-eval 的在线/离线/本地数据集用法)与 using_evalscope.md(EvalScope 的精度评测与压测)。
- 人工智能
- 大模型
- 模型推理服务
- Ascend
- CANN
【免费下载链接】vllm-ascend
Community maintained hardware plugin for vLLM on Huawei Ascend
相关推荐
开源大模型食用指南:昇腾 Ascend NPU 平台大模型部署实战(MindIE / vLLM-ascend / sglang-ascend)
开源大模型食用指南:昇腾 Ascend NPU 平台大模型部署实战(MindIE / vLLM ascend / sglang ascend) 本文是《开源大模
教程大模型本地部署微调OpenBot 多智能体协作:让 AI Bot 互相交接任务的 handoff 机制深度解析
OpenBot 多智能体协作:让 AI Bot 互相交接任务的 handoff 机制深度解析 OpenBot 是一个开源 AI 同事(AI coworker)平
人工智能大模型模型推理服务AscendCANNvLLM Ascend 插件(vllm-ascend)完全指南:在昇腾 NPU 上无缝运行 vLLM 的社区硬件插件
vLLM Ascend 插件(vllm ascend)完全指南:在昇腾 NPU 上无缝运行 vLLM 的社区硬件插件 本文档系统介绍 vllm ascend 这
人工智能大模型模型推理服务AscendCANN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考