概述

在选择 GPU 时,除了查看官方参数,实际性能测试同样重要。本文将介绍如何使用字节跳动开源的 byte_micro_perf 和 Ray 项目推出的 llmperf 两款工具,对 GPU 进行从底层算力到真实大模型推理性能的全方位测试。无需自己编写复杂脚本,跟着步骤操作即可获得专业级的性能数据。


一、背景与工具介绍

1、为什么需要测试 GPU 性能?

  • 规格参数不等于实际表现:相同型号的 GPU 在不同系统、驱动和软件环境下性能可能有差异。
  • 针对性测试:AI 工作负载与传统的图形或通用计算不同,需要专门测试其张量计算和大模型推理能力。
  • 量化对比:当需要在多款 GPU(例如不同品牌、不同代际)之间做选择时,客观的测试数据是最好的决策依据。

2、测试什么?

本次测试分为两个层次:

  1. 微观算力测试(byte_micro_perf):测试 GPU 的基础计算单元(“算子”)的性能,如矩阵乘法(GEMM)、激活函数(如 GELU、SiLU)等。这反映了 GPU 的“理论算力”发挥效率。
  2. 宏观推理测试(llmperf):测试 GPU 在搭载真实大语言模型(如 Qwen3-8B)时的端到端性能,如吞吐量(每秒输出多少token)、延迟等。这反映了 GPU 在实际 AI 应用中的“实战能力”。

二、测试环境准备

1. 设置环境变量

首先,设置一些必要的环境变量,以便后续下载模型和访问网络。

# 如果身处需要代理的网络环境,请设置代理
export HTTPS_PROXY="http://your-proxy-address:port"

# 设置你的 Hugging Face 访问令牌,用于下载模型
export HF_TOKEN=<你的_huggingface_token>

2. 获取测试工具源码

创建一个工作目录,并拉取字节跳动的性能测试工具源码。

mkdir byte_micro_perf
cd byte_micro_perf
git clone https://github.com/bytedance/xpu-perf.git

三、微观算力测试:byte_micro_perf

1. 下载测试模型

测试需要一些模型权重文件作为计算负载。我们从 Hugging Face 下载两个常用的小模型。

# 安装模型下载工具
pip3 install -U huggingface_hub

# 配置 Git 凭证以安全存储令牌
git config --global credential.helper store

# 登录 Hugging Face
hf auth login --token $HF_TOKEN --add-to-git-credential
hf auth whoami # 验证登录成功

# 下载测试模型(这里以 Gemma 和 Qwen 为例)
hf download google/gemma-3-1b-it --local-dir ./models/gemma-3-1b-it
hf download Qwen/Qwen2.5-7B-Instruct --local-dir ./models/Qwen2.5-7B-Instruct

# 登出(可选)
hf auth logout

备选方案:如果你更习惯使用 Modelscope,也可以用以下命令:

pip install modelscope
modelscope download --model Qwen/Qwen3-8B --local_dir ./models/Qwen3-8B/

2. 在 Docker 容器中运行测试

为了保证环境一致性,我们使用 Docker 容器。这里选用英伟达官方 PyTorch 镜像。

# 拉取 Docker 镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvcr.io/nvidia/pytorch:24.10-py3

# 清理可能存在的旧容器
docker stop byte_micro_perf
docker rm byte_micro_perf

# 启动新容器,并挂载当前目录
docker run --gpus all --shm-size=32g -dit -e NVIDIA_VISIBLE_DEVICES=all \
    --privileged --net=host \
		-v $PWD:/home \
		-w /home \
		--name byte_micro_perf \
    swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvcr.io/nvidia/pytorch:24.10-py3 /bin/bash

3. 执行算力测试

进入容器,安装依赖,并运行全套算子测试。

# 进入容器    
docker exec -ti byte_micro_perf bash

# 安装依赖
cd /home/xpu-perf/byte_micro_perf
pip3 install -r requirements.txt

# 运行所有算子的性能测试(这将花费一些时间)
rm reports -rf
python3 launch.py --backend GPU --task all

# 测试完成后,查看结果
# 这里我们筛选出使用 bfloat16 精度、batch size 为 1 的测试结果,便于阅读
cat `find . -name "*.csv"` | grep -w "bfloat16,1"
exit # 退出容器

4. 解读测试结果

执行上述命令后,你会看到类似下方的 CSV 格式输出。每一行代表一个算子在特定参数下的性能:

字段 含义解释
sku_name GPU 型号,如 NVIDIA GeForce RTX 3090
op_name 算子名称,如 gemm(矩阵乘)、add(加法)
dtype 计算精度,如 bfloat16
batch_size, dim_size 计算维度参数
latency(us) 核心指标:算子执行耗时(微秒),越低越好
mem_bw(GB/s) 内存带宽利用率(GB/秒),越高表示内存访问越高效
calc_flops_power(tflops) 计算吞吐量(万亿次浮点运算/秒),越高越好
calc_mem_ratio 计算与内存访问的比率,用于判断是计算密集型还是内存密集型
sku_name,op_name,provider,arg_type,dtype,batch_size,dim_size,latency(us),read_bytes(B),write_bytes(B),io_bytes(B),mem_bw(GB/s),calc_flops,calc_flops_power(tflops),calc_mem_ratio,kernels
NVIDIA GeForce RTX 3090,add,torch,default,bfloat16,1,1024,4.301,4096,2048,6144,1.429,1024,0.0,0.167,[]
NVIDIA GeForce RTX 3090,cos,torch,default,bfloat16,1,1024,4.608,2048,2048,4096,0.889,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,cast,torch,default,bfloat16,1,1024,5.12,2048,4096,6144,1.2,1024,0.0,0.167,[]
NVIDIA GeForce RTX 3090,host2device,torch,default,1,bfloat16,1,1024,16.384,2048,2048,0.125,0.125,[],0.125,0.125,[16.384],[0.125],[0.125]
NVIDIA GeForce RTX 3090,silu,torch,default,bfloat16,1,1024,7.373,2048,2048,4096,0.556,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,sqrt,torch,default,bfloat16,1,1024,13.325,2048,2048,4096,0.307,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,device2host,torch,default,1,bfloat16,1,1024,5.53,2048,2048,0.37,0.37,[],0.37,0.37,[5.53],[0.37],[0.37]
NVIDIA GeForce RTX 3090,log,torch,default,bfloat16,1,1024,10.758,2048,2048,4096,0.381,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,gelu,torch,default,bfloat16,1,1024,16.595,2048,2048,4096,0.247,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,sub,torch,default,bfloat16,1,1024,6.656,4096,2048,6144,0.923,1024,0.0,0.167,[]
NVIDIA GeForce RTX 3090,device2device,torch,default,bfloat16,1,1024,19.024,2048,2048,4096,0.215,0,0.0,0.0,[]
NVIDIA GeForce RTX 3090,mul,torch,default,bfloat16,1,1024,13.242,4096,2048,6144,0.464,1024,0.0,0.167,[]
NVIDIA GeForce RTX 3090,div,torch,default,bfloat16,1,1024,5.018,4096,2048,6144,1.224,1024,0.0,0.167,[]
NVIDIA GeForce RTX 3090,sin,torch,default,bfloat16,1,1024,7.904,2048,2048,4096,0.518,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,exp,torch,default,bfloat16,1,1024,15.843,2048,2048,4096,0.259,1024,0.0,0.25,[]
NVIDIA GeForce RTX 3090,gemm,torch,default,bfloat16,1,4096,4096,46.694,33562624,8192,33570816,718.947,33554432,0.719,1.0,[]
NVIDIA GeForce RTX 3090,gemm,torch,default,bfloat16,1,8192,8192,156.979,134234112,16384,134250496,855.212,134217728,0.855,1.0,[]
NVIDIA GeForce RTX 3090,gemm,torch,default,bfloat16,1,8192,1024,28.058,16793600,2048,16795648,598.613,16777216,0.598,0.999,[]
NVIDIA GeForce RTX 3090,gemm,torch,default,bfloat16,1,1024,8192,34.397,16779264,16384,16795648,488.291,16777216,0.488,0.999,[]

四、宏观推理测试:llmperf

微观测试之后,我们再来看看 GPU 运行真实大模型的表现。我们需要先启动一个模型服务。

1. 部署 vLLM 推理服务

vLLM 是一个高效的大模型推理引擎。我们将其部署为兼容 OpenAI API 的服务。

# 拉取 vLLM 镜像
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vllm/vllm-openai:v0.15.0

# 清理旧容器并启动新服务
docker stop vllm_srv
docker rm vllm_srv
docker run --gpus all --shm-size=32g -it -e NVIDIA_VISIBLE_DEVICES=all \
    -v $PWD:/home --name vllm_srv \
    --env "HF_TOKEN=$HF_TOKEN" \
    --env "HTTPS_PROXY=$HTTPS_PROXY" \
    -p 8000:8000 \
    --ipc=host \
    swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/vllm/vllm-openai:v0.15.0 \
    --model /home/models/Qwen3-8B --served-model-name Qwen3-8B --max-model-len 32000

2. 验证服务可用性

使用简单的 curl 命令测试服务是否正常响应。

curl -X POST "http://localhost:8000/v1/chat/completions" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-local" \
  -d '{
    "model": "Qwen3-8B",
    "messages": [{"strict": true,"store": false,"role": "user", "content": "1+2=?"}],
    "temperature": 0.2
  }'|jq '.'	

如果看到模型返回的回答,说明服务部署成功。

3. 使用 llmperf 进行压力测试

llmperf 可以模拟多用户并发请求,测试推理服务的吞吐量和延迟。

# 下载 llmperf 测试套件
git clone https://github.com/ray-project/llmperf.git

# 创建并启动测试专用容器
docker stop llmperf
docker rm llmperf
docker run --gpus all --shm-size=32g -dit -e NVIDIA_VISIBLE_DEVICES=all \
		--privileged --net=host \
		--env "HF_TOKEN=$HF_TOKEN" \
		--env "HTTPS_PROXY=$HTTPS_PROXY" \
		-v $PWD:/home \
		-w /home \
		--name llmperf \
		swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nvcr.io/nvidia/pytorch:24.10-py3 /bin/bash

# 进入容器并安装 llmperf
docker start llmperf   
docker exec -ti llmperf bash

# 安装依赖
cd /home/llmperf
pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple

# 设置环境变量,指向我们刚刚启动的 vLLM 服务
export OPENAI_API_KEY=secret_abcdefg
export OPENAI_API_BASE="http://localhost:8000/v1"

# 运行性能基准测试
python token_benchmark_ray.py \
--model "Qwen3-8B" \
--mean-input-tokens 550 \
--mean-output-tokens 150 \
--max-num-completed-requests 150 \
--timeout 600 \
--num-concurrent-requests 10 \
--results-dir "result_outputs" \
--llm-api openai \
--additional-sampling-params '{}'

4. 解读测试结果

测试完成后,控制台会输出关键指标,例如:

Number Of Errored Requests: 0        # 错误请求数,应为0
Overall Output Throughput: 319.75    # 核心指标:总体输出吞吐量(tokens/秒)
Number Of Completed Requests: 150    # 成功完成的请求总数
Completed Requests Per Minute: 113.0 # 每分钟完成的请求数
  • Overall Output Throughput: 319.75:这是最重要的指标,表示该 GPU 搭载 Qwen3-8B 模型时,平均每秒能生成 319.75 个 token。这个值越高,代表 GPU 的推理性能越强。
  • 你可以更换不同的 GPU 或模型,在相同参数下运行此测试,通过对比该吞吐量数值,即可直观评估性能差异。

五、总结

通过 byte_micro_perf,你可以深入了解 GPU 底层算子的绝对性能;通过 llmperf,你能获得 GPU 运行大模型的实际端到端性能。两者结合,便构成了一套从微观到宏观的完整 GPU AI 性能评估体系。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐