使用byte_micro_perf和llmperf测试GPU的AI性能
摘要 本文介绍使用byte_micro_perf和llmperf两款工具测试GPU性能的方法。测试分为微观算力测试和宏观推理测试两个层次:前者测试基础计算单元性能(如矩阵乘法、激活函数等),后者测试真实大语言模型的端到端性能(如吞吐量、延迟)。文中详细说明了测试环境准备、模型下载、Docker容器配置等步骤,并提供了测试结果解读方法。通过这两个工具,用户可以获取专业级的GPU性能数据,为硬件选择提
使用byte_micro_perf和llmperf测试GPU的AI性能
概述
在选择 GPU 时,除了查看官方参数,实际性能测试同样重要。本文将介绍如何使用字节跳动开源的 byte_micro_perf 和 Ray 项目推出的 llmperf 两款工具,对 GPU 进行从底层算力到真实大模型推理性能的全方位测试。无需自己编写复杂脚本,跟着步骤操作即可获得专业级的性能数据。
一、背景与工具介绍
1、为什么需要测试 GPU 性能?
- 规格参数不等于实际表现:相同型号的 GPU 在不同系统、驱动和软件环境下性能可能有差异。
- 针对性测试:AI 工作负载与传统的图形或通用计算不同,需要专门测试其张量计算和大模型推理能力。
- 量化对比:当需要在多款 GPU(例如不同品牌、不同代际)之间做选择时,客观的测试数据是最好的决策依据。
2、测试什么?
本次测试分为两个层次:
- 微观算力测试(byte_micro_perf):测试 GPU 的基础计算单元(“算子”)的性能,如矩阵乘法(GEMM)、激活函数(如 GELU、SiLU)等。这反映了 GPU 的“理论算力”发挥效率。
- 宏观推理测试(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 性能评估体系。
更多推荐


所有评论(0)