原文地址:https://alphahinex.github.io/2025/05/04/mindie-benchmark/
description: "通過實測和監(jiān)控,獲得實際場景的真實性能"
date: 2025.05.04 10:34
categories:
- AI
tags: [Python, MindIE]
keywords: MindIE, benchmark, GSM8K, metrics, prometheus, grafana, node-exporter
MindIE Benchmark
MindIE Benchmark 是 昇騰推理引擎(MindIE,Mind Inference Engine)中推理服務(wù)組件 MindIE Service 組件包含的性能測試套件,提供測試大語言模型在不同配置參數(shù)下推理性能和精度的能力。
詳細(xì)信息可參見官方文檔 MindIE Benchmark 1.0.0 功能介紹。
MindIE Benchmark 支持 Client 和 Engine 兩種不同的推理模式:
- Client 模式調(diào)用 MindIE Client 的 .generate() 和 .generate_stream() 接口,對應(yīng) MindIE Server 的 兼容Triton的文本推理接口 和 兼容Triton的流式推理接口。適用于模擬多用戶并發(fā)場景,主要用于測量服務(wù)化性能。Client測量的吞吐量為用戶真實感知的吞吐量,其計入包括網(wǎng)絡(luò)請求和數(shù)據(jù)處理等消耗的時間。
- Engine 模式直接調(diào)用底層 API,并將 NPU 推理返回的結(jié)果暫存,當(dāng)所有推理完成后再由 CPU 處理暫存的數(shù)據(jù),其測量的吞吐量更接近 NPU 卡的真實性能。
Client 推理模式樣例
- 文本非流式推理
benchmark \
--DatasetPath "/{數(shù)據(jù)集路徑}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型權(quán)重路徑}/llama_7b" \
--TestType client \
--Http https://{ipAddress}:{port} \
--ManagementHttp https://{managementIpAddress}:{managementPort} \
--Concurrency 128 \
--TaskKind text \
--Tokenizer True \
--MaxOutputLen 512
- 文本流式推理
benchmark \
--DatasetPath "/{數(shù)據(jù)集路徑}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型權(quán)重路徑}/llama_7b" \
--TestType client \
--Http https://{ipAddress}:{port} \
--ManagementHttp https://{managementIpAddress}:{managementPort} \
--Concurrency 128 \
--TaskKind stream \
--Tokenizer True \
--MaxOutputLen 512
Engine 推理模式樣例
- 文本推理模式
# Engine模式 文本推理
benchmark \
--DatasetPath "/{數(shù)據(jù)集路徑}/GSM8K" \
--DatasetType gsm8k \
--ModelName baichuan2_13b \
--ModelPath "/{模型權(quán)重路徑}/baichuan2-13b" \
--TestType engine \
--MaxOutputLen 512 \
--Tokenizer True
測試數(shù)據(jù)集
支持的數(shù)據(jù)集以及數(shù)據(jù)集獲取鏈接,可在 MindIE 鏡像中獲取,以 1.0.0 版本為例,鏡像中 /usr/local/Ascend/atb-models/tests/modeltest/README_NEW.md 文檔包含支持?jǐn)?shù)據(jù)集相關(guān)信息如下:
| 支持?jǐn)?shù)據(jù)集 | 下載地址 |
|---|---|
| BoolQ | dev.jsonl |
| CEval | ceval-exam |
| CMMLU | cmmlu |
| HumanEval | humaneval |
| HumanEval_X |
cpp java go js python |
| GSM8K | gsm8k |
| LongBench | longbench |
| MMLU | mmlu |
| NeedleBench |
PaulGrahamEssays multi_needle_reasoning_en multi_needle_reasoning_zh names needles zh_finance zh_game zh_general zh_government zh_movie zh_tech |
| TextVQA |
train_val_images.zip textvqa_val.jsonl textvqa_val_annotations.json |
| VideoBench |
Eval_QA/ Video-Bench |
| VocalSound |
VocalSound 16kHz Version |
| TruthfulQA | truthfulqa |
實測數(shù)據(jù)
環(huán)境準(zhǔn)備
以使用 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-800I-A2-py311-openeuler24.03-lts 鏡像和 GSM8K 數(shù)據(jù)集為例(測試數(shù)據(jù)集在 /data 路徑下):
# 啟動容器
docker run -it -d --net=host --shm-size=1800g \
--name=mindie-bench \
--privileged \
--device=/dev/davinci_manager \
--device=/dev/hisi_hdc \
--device=/dev/devmm_svm \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver:ro \
-v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/sbin:/usr/local/sbin:ro \
-v /etc/hccn.conf:/etc/hccn.conf \
-v /data:/data:rw \
swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-800I-A2-py311-openeuler24.03-lts bash
# 進(jìn)入容器
docker exec -it mindie-bench bash
# 修改 benchmark 中 config.json 文件權(quán)限
chmod 640 /usr/local/lib/python3.11/site-packages/mindiebenchmark/config/config.json
Client 模式非流式推理性能測試
# Client 模式非流式 128 并發(fā)數(shù)執(zhí)行性能測試
nohup benchmark \
--DatasetPath "/data/test.jsonl" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型權(quán)重路徑}/llama_7b" \
--TestType client \
--Http https://{ipAddress}:{port} \
--ManagementHttp https://{managementIpAddress}:{managementPort} \
--Concurrency 128 \
--TaskKind text \
--Tokenizer True \
--MaxOutputLen 2048 \
> /home/client_text_128.log 2>&1 &
mindie 2.0 需要先設(shè)定
MINDIE_LOG_TO_STDOUT環(huán)境變量,否則日志中沒有輸出內(nèi)容:export MINDIE_LOG_TO_STDOUT="benchmark:1; client:1"

Client 模式流式推理性能測試

性能監(jiān)控
MindIE Service 中提供了普羅米修斯格式的服務(wù)監(jiān)控指標(biāo)查詢接口:GET: http(s)://{ip}:{port}/metrics。
- {ip}字段優(yōu)先讀取環(huán)境變量值MIES_CONTAINER_MANAGEMENT_IP;如果沒有該環(huán)境變量,則取配置文件的“managementIpAddress”參數(shù);如果配置文件中沒有“managementIpAddress”參數(shù),則取配置文件的“ipAddress”參數(shù)。
- {port}字段讀取配置文件的“metricsPort”參數(shù)。
如需使用該接口,請確保在啟動服務(wù)前,開啟服務(wù)化監(jiān)控開關(guān)。開啟服務(wù)化監(jiān)控功能的命令如下:
export MIES_SERVICE_MONITOR_MODE=1
接口詳情可參考 服務(wù)監(jiān)控指標(biāo)查詢接口(普羅格式)。
使用 Prometheus 存儲和檢索監(jiān)控數(shù)據(jù)
使用 ARM 版鏡像啟動 Prometheus 服務(wù):
# 拉取鏡像
$ docker pull prom/prometheus-linux-arm64:v3.3.0
# 啟動容器
$ docker run --name prometheus -d -p 9090:9090 \
-v /root/prometheus-conf:/etc/prometheus/ \
prom/prometheus-linux-arm64:v3.3.0
Prometheus 配置 MindIE Metrics 端點地址時,需要添加 fallback_scrape_protocol: PrometheusText0.0.4:
# /root/prometheus-conf/prometheus.yml
...
scrape_configs:
...
- job_name: "mindie"
# set fallback_scrape_protocol to be compatible with mindie metrics API's response content type (application/json)
fallback_scrape_protocol: PrometheusText0.0.4
static_configs:
- targets: ["localhost:1027", "localhost:1028"]
labels:
app: "mindie"
# 重啟容器
docker restart prometheus
更新配置重啟容器后,可通過 http://localhost:9090 訪問 Prometheus Web UI。
節(jié)點監(jiān)控
普羅米修斯官方也提供了很多 Exporter 組件用于監(jiān)控各類資源使用情況,如監(jiān)控計算資源節(jié)點的 Node Exporter。同樣可以通過官方鏡像快速啟動:
# 拉取鏡像
$ docker pull prom/node-exporter:v1.9.1 --platform arm64
# 啟動容器
$ docker run -d \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
prom/node-exporter:v1.9.1 \
--path.rootfs=/host
node_exporter 默認(rèn)監(jiān)聽 HTTP 9100 端口。容器啟動成功后,可添加到 Prometheus 配置文件中:
# /root/prometheus-conf/prometheus.yml
...
scrape_configs:
...
- job_name: "node"
static_configs:
- targets: ["localhost:9100"]
labels:
app: "node"
包含 Node Exporter 和 MindIE Metrics 的完整配置文件可參考 prometheus.yml。
使用 Grafana 可視化監(jiān)控數(shù)據(jù)
使用 ARM 版鏡像啟動 Grafana 服務(wù):
# 拉取鏡像
$ docker pull grafana/grafana:11.6.0 --platform arm64
# 啟動容器
$ docker run -d --name=grafana -p 3000:3000 grafana/grafana:11.6.0
容器啟動成功后,訪問 http://localhost:3000/ 可進(jìn)入 Grafana Web UI。默認(rèn)用戶名和密碼均為 admin,第一次登錄會需要修改密碼。
以下內(nèi)容引自 MindIE服務(wù)化部署實現(xiàn)監(jiān)控功能:
點擊 Connection > Data sources > Add new data source,選擇 prometheus,之后把 prometheus 的 URL http://localhost:9090/ 填上去,點擊最下面 Save & test。
datasource
之后可以在 Grafana 頁面建立 dashboard,在 Home > Dashboards > New dashboard 建立 dashboard, Dashboard 手動構(gòu)建較麻煩,可以參考一些 Grafana教程 https://imageslr.com/2024/grafana.html。
dashboard
好在可以通過 json 格式輸入或 json 文件 import 快速構(gòu)建 dashboard
這里選擇參考下面 vllm 的 grafana json 文件,將其中的 vllm: 字段去掉(因為 MindIE 的 metrics 字段和 vllm 的 metric 有區(qū)別)
http://www.gitpp.com/digiman/vllm/-/blob/main/examples/production_monitoring/grafana.json?ref_type=heads
import
最終得到MindIE指標(biāo)監(jiān)控看板界面
mindie-dashboard
MindIE Dashboard json 配置文件可參考 mindie-dashboard.json。
Node Exporter Dashboard json 配置文件可從 https://grafana.com/grafana/dashboards/16098-node-exporter-dashboard-20240520-job/ 下載,或直接使用 node-exporter-dashboard.json。
實測數(shù)據(jù)



由上面的圖表可知(使用 GSM8K 數(shù)據(jù)集):
- 128 并發(fā)進(jìn)行推理時,流式及非流式推理性能差別不大:請求提示詞 token 數(shù)在
10~200范圍,響應(yīng) token 數(shù)在200~5000范圍,并行推理數(shù)基本能夠穩(wěn)定在 128,等待推理的請求數(shù)基本為 0,每秒生成 token 數(shù)量在1500~2000左右。 - 1000 并發(fā)時:出現(xiàn)大量等待請求,并行推理數(shù)與等待請求數(shù)呈互補型波動,每秒生成 token 數(shù)也呈現(xiàn)出較大范圍的波動。
每秒輸出 token 總數(shù),會受到輸入 token 數(shù)、輸出 token 數(shù)、并行推理數(shù)、等待請求數(shù)的影響:
- 輸入輸出 token 數(shù)越多,能夠并行的推理數(shù)就會越少;
- 等待的請求數(shù)增多,并行推理數(shù)也會減少;
- 并行推理數(shù)下降,每秒輸出的 token 總數(shù)就會下降;
- 并行推理數(shù)最大值,受限于 NPU 卡的性能和 maxBatchSize 配置參數(shù)及 TotalBlockNum 影響。計算 maxBatchSize 最大值,可參考 性能調(diào)優(yōu)流程 文檔;TotalBlockNum 值也可參照該文檔,且可能會根據(jù)不同的輸入輸出 token 數(shù)而變化。



