AI 五月 04, 2025

昇腾推理引擎性能测试套件 MindIE Benchmark

文章字数 17k 阅读约需 16 mins. 阅读次数

MindIE Benchmark

MindIE Benchmark 是 昇腾推理引擎(MindIE,Mind Inference Engine)中推理服务组件 MindIE Service 组件包含的性能测试套件,提供测试大语言模型在不同配置参数下推理性能和精度的能力。

详细信息可参见官方文档 MindIE Benchmark 1.0.0 功能介绍

MindIE Benchmark 支持 Client 和 Engine 两种不同的推理模式:

  1. Client 模式调用 MindIE Client 的 .generate().generate_stream() 接口,对应 MindIE Server 的 兼容Triton的文本推理接口兼容Triton的流式推理接口。适用于模拟多用户并发场景,主要用于测量服务化性能。Client测量的吞吐量为用户真实感知的吞吐量,其计入包括网络请求和数据处理等消耗的时间。
  2. Engine 模式直接调用底层 API,并将 NPU 推理返回的结果暂存,当所有推理完成后再由 CPU 处理暂存的数据,其测量的吞吐量更接近 NPU 卡的真实性能。

Client 推理模式样例

  • 文本非流式推理
benchmark \
--DatasetPath "/{数据集路径}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型权重路径}/llama_7b" \
--TestType client \
--Http https://{ipAddress}:{port} \
--ManagementHttp https://{managementIpAddress}:{managementPort} \
--Concurrency 128 \
--TaskKind text \
--Tokenizer True \
--MaxOutputLen 512
  • 文本流式推理
benchmark \
--DatasetPath "/{数据集路径}/GSM8K" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型权重路径}/llama_7b" \
--TestType client \
--Http https://{ipAddress}:{port} \
--ManagementHttp https://{managementIpAddress}:{managementPort} \
--Concurrency 128 \
--TaskKind stream \
--Tokenizer True \
--MaxOutputLen 512

Engine 推理模式样例

  • 文本推理模式
# Engine模式 文本推理
benchmark \ 
--DatasetPath "/{数据集路径}/GSM8K" \
--DatasetType gsm8k \
--ModelName baichuan2_13b \
--ModelPath "/{模型权重路径}/baichuan2-13b" \
--TestType engine \
--MaxOutputLen 512 \
--Tokenizer True

测试数据集

支持的数据集以及数据集获取链接,可在 MindIE 镜像中获取,以 1.0.0 版本为例,镜像中 /usr/local/Ascend/atb-models/tests/modeltest/README_NEW.md 文档包含支持数据集相关信息如下:

支持数据集 下载地址
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

实测数据

环境准备

以使用 swr.cn-south-1.myhuaweicloud.com/ascendhub/mindie:1.0.0-800I-A2-py311-openeuler24.03-lts 镜像和 GSM8K 数据集为例(测试数据集在 /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
# 进入容器
docker exec -it mindie-bench bash
# 修改 benchmark 中 config.json 文件权限
chmod 640 /usr/local/lib/python3.11/site-packages/mindiebenchmark/config/config.json

Client 模式非流式推理性能测试

# Client 模式非流式 128 并发数执行性能测试
nohup benchmark \
--DatasetPath "/data/test.jsonl" \
--DatasetType "gsm8k" \
--ModelName llama_7b \
--ModelPath "/{模型权重路径}/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 需要先设定 MINDIE_LOG_TO_STDOUT 环境变量,否则日志中没有输出内容:export MINDIE_LOG_TO_STDOUT="benchmark:1; client:1"

client-text

Client 模式流式推理性能测试

client-stream

性能监控

MindIE Service 中提供了普罗米修斯格式的服务监控指标查询接口:GET: http(s)://{ip}:{port}/metrics

  • {ip}字段优先读取环境变量值MIES_CONTAINER_MANAGEMENT_IP;如果没有该环境变量,则取配置文件的“managementIpAddress”参数;如果配置文件中没有“managementIpAddress”参数,则取配置文件的“ipAddress”参数。
  • {port}字段读取配置文件的“metricsPort”参数。

如需使用该接口,请确保在启动服务前,开启服务化监控开关。开启服务化监控功能的命令如下:

export MIES_SERVICE_MONITOR_MODE=1

接口详情可参考 服务监控指标查询接口(普罗格式)

使用 Prometheus 存储和检索监控数据

使用 ARM 版镜像启动 Prometheus 服务:

# 拉取镜像
$ 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。

节点监控

普罗米修斯官方也提供了很多 Exporter 组件用于监控各类资源使用情况,如监控计算资源节点的 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 默认监听 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 可视化监控数据

使用 ARM 版镜像启动 Grafana 服务:

# 拉取镜像
$ 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/ 可进入 Grafana Web UI。默认用户名和密码均为 admin,第一次登录会需要修改密码。

以下内容引自 MindIE服务化部署实现监控功能

点击 Connection > Data sources > Add new data source,选择 prometheus,之后把 prometheus 的 URL http://localhost:9090/ 填上去,点击最下面 Save & test。

datasource

之后可以在 Grafana 页面建立 dashboard,在 Home > Dashboards > New dashboard 建立 dashboard, Dashboard 手动构建较麻烦,可以参考一些 Grafana教程 https://imageslr.com/2024/grafana.html。

dashboard

好在可以通过 json 格式输入或 json 文件 import 快速构建 dashboard
这里选择参考下面 vllm 的 grafana json 文件,将其中的 vllm: 字段去掉(因为 MindIE 的 metrics 字段和 vllm 的 metric 有区别)
http://www.gitpp.com/digiman/vllm/-/blob/main/examples/production_monitoring/grafana.json?ref_type=heads

import

最终得到MindIE指标监控看板界面

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

实测数据

client-text-grafana

client-stream-grafana

client-stream-1000-grafana

由上面的图表可知(使用 GSM8K 数据集):

  • 128 并发进行推理时,流式及非流式推理性能差别不大:请求提示词 token 数在 10~200 范围,响应 token 数在 200~5000 范围,并行推理数基本能够稳定在 128,等待推理的请求数基本为 0,每秒生成 token 数量在 1500~2000 左右。
  • 1000 并发时:出现大量等待请求,并行推理数与等待请求数呈互补型波动,每秒生成 token 数也呈现出较大范围的波动。

每秒输出 token 总数,会受到输入 token 数、输出 token 数、并行推理数、等待请求数的影响:

  • 输入输出 token 数越多,能够并行的推理数就会越少;
  • 等待的请求数增多,并行推理数也会减少;
  • 并行推理数下降,每秒输出的 token 总数就会下降;
  • 并行推理数最大值,受限于 NPU 卡的性能和 maxBatchSize 配置参数及 TotalBlockNum 影响。计算 maxBatchSize 最大值,可参考 性能调优流程 文档;TotalBlockNum 值也可参照该文档,且可能会根据不同的输入输出 token 数而变化。
0%