昇騰推理引擎性能測試套件 MindIE Benchmark

原文地址: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 兩種不同的推理模式:

  1. Client 模式調(diào)用 MindIE Client 的 .generate().generate_stream() 接口,對應(yīng) MindIE Server 的 兼容Triton的文本推理接口兼容Triton的流式推理接口。適用于模擬多用戶并發(fā)場景,主要用于測量服務(wù)化性能。Client測量的吞吐量為用戶真實感知的吞吐量,其計入包括網(wǎng)絡(luò)請求和數(shù)據(jù)處理等消耗的時間。
  2. 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-text

Client 模式流式推理性能測試

client-stream

性能監(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ù)

client-text-grafana
client-stream-grafana
client-stream-1000-grafana

由上面的圖表可知(使用 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ù)而變化。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容