简介
该文档介绍使用Tensorflow框架,测试 NVIDIA 驱动的常见python 代码。
环境信息
编号 |
软件 |
软件版本 |
备注 |
01 |
驱动 |
470.57.02 |
|
02 |
cuda 版本 |
11.2 |
|
03 |
cudnn 版本 |
8.1.1.33 |
|
04 |
tensorflow |
2.6 |
功能测试代码:
import tensorflow as tf
with tf.device('/CPU:1'):
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)
print(c)
GPU 压力测试代码:
# On Titan X (Pascal)
# 8192 x 8192 matmul took: 0.10 sec, 11304.59 G ops/sec
# http://stackoverflow.com/questions/41804380/testing-gpu-with-tensorflow-matrix-multiplication
import os
import sys
import tensorflow as tf
import time
import timeit
import datetime
n=1000000000 #10亿次
dtype = tf.float32
with tf.device("/gpu:0"):
matrix1 = tf.Variable(tf.ones((1, n), dtype=dtype))
matrix2 = tf.Variable(tf.ones((n, 1), dtype=dtype))
def gpu_run():
with tf.device("/gpu:0"):
product = tf.matmul(matrix1, matrix2)
return product
print("开始计算:", time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
gpu_time = timeit.timeit(gpu_run, number=1000)
print("计算结束:", time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
CPU/GPU 压测比较代码:
# 屏蔽tensorflow输出的log信息
# 注意:代码在import tensorflow之前
import os
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "2"
import sys
print("python的版本信息:",sys.version)
#python的版本信息: 3.7.9 (default, Aug 31 2020, 17:10:11) [MSC v.1916 64 bit (AMD64)]
import tensorflow as tf
'''
验证GPU相对于CPU,在并行计算优势明显
'''
n=100000000 #1亿次
# 创建在 CPU 环境上运算的 2 个矩阵
with tf.device('/cpu:0'):
cpu_a = tf.random.normal([1, n])
cpu_b = tf.random.normal([n, 1])
print(cpu_a.device, cpu_b.device)
# 创建使用 GPU 环境运算的 2 个矩阵
with tf.device('/gpu:0'):
gpu_a = tf.random.normal([1, n])
gpu_b = tf.random.normal([n, 1])
print(gpu_a.device, gpu_b.device)
import timeit
def cpu_run(): # CPU 运算函数
with tf.device('/cpu:0'):
c = tf.matmul(cpu_a, cpu_b)
return c
def gpu_run():# GPU 运算函数
with tf.device('/gpu:0'):
c = tf.matmul(gpu_a, gpu_b)
return c
# 第一次计算需要热身,避免将初始化时间结算在内
cpu_time = timeit.timeit(cpu_run, number=100)
gpu_time = timeit.timeit(gpu_run, number=100)
print('首先计算10次(含热身环境)的平均时间,CPU计算消耗时间:%.3fms,GPU计算消耗时间:%.3fms!'%(cpu_time*1000, gpu_time*1000) )
#正式计算10次,取平均时间
cpu1_time = timeit.timeit(cpu_run, number=10)
gpu1_time = timeit.timeit(gpu_run, number=10)
print('正式计算10次的平均时间,CPU计算消耗时间:%.3fms,GPU计算消耗时间:%.3fms!'%(cpu1_time*1000, gpu1_time*1000))
压测
编号 |
先卡类型 |
显卡架构 |
计算时间 |
cuda 版本 |
TF版本 |
算力使用率 |
备注 |
01 |
P40-22G |
帕斯卡 |
17秒 |
10.1 |
2.3 |
100% |
x86_64 |
02 |
T4-16G |
图灵 |
15秒 |
11.2 |
2.6 |
100% |
x86_64 |
03 |
V100-32G |
沃尔塔 |
7秒 |
10.1 |
2.3 |
100% |
x86_64 |
04 |
A10-24G |
安培 |
10秒 |
11.2 |
2.6 |
100% |
x86_64 |
05 |
A100-40G |
安培 |
6秒 |
11.2 |
2.6 |
100% |
x86_64 |
1. 背景目的
对现有gpu的性能没有相关的测试,需要进行摸底测试
预期测试目的:
-
完成gpu对训练及预测服务的性能测试
-
对现场部署及使用提供支持
2. 测试环境
OS:Centos7
Linux kernel:Linux 3.10.0-1160.90.1.el7.x86_64
Docker Version:1.13.1
Docker Image:nvcr.io/nvidia/tensorflow:23.03-tf1-py3 (V1.15版本)
Docker OS:Ubuntu 20.04.5 LTS
Nvidia GPU Version:NVIDIA-SMI 470.161.03
CUDA Version: 12.1
TensorFlow Version:1.15.1
python Version:3.8.10
3. 测试方案
3.1、训练性能测试方案
-
训练文件来源:GitHub - tensorflow/benchmarks: A benchmark framework for Tensorflow
-
训练模型:resnet50
-
训练数据集:全量imagenet数据,总大小约150G,图片张数超过1400w
-
测试步骤:
-
将全量的已转换为tfrecord格式的imagenet数据上传至存储卷下
-
创建3个notebook任务,资源配置如下:
-
CPU |
GPU |
memory |
6 |
0.5 |
20G |
6 |
1 |
20G |
12 |
2 |
40G |
- 上传tf_cnn_benchmark代码
- 运行测试指令:python tf_cnn_benchmarks.py --model=resnet50 --num_gpus=${NUM_GPUS} --batch_size=32 --variable_update=parameter_server --data_dir=${DATA_DIR} --num_epochs=2
${DATA_DIR}为训练数据集文件train目录的路径
${NUM_GPUS}为当前notebook任务申请的GPU数量
2. 预测性能测试方案:
-
预测服务模型:TensorFlow-Resnet50 v1,SavedModel格式
-
模型来源:https://tfhub.dev/tensorflow/resnet_50/classification/1
-
发压工具:
-
下载
-
说明:封装locust的性能测试工具,支持模型预测的性能测试。
-
-
测试步骤:
-
模型中心导入TensorFlow-Resnet50
-
创建模型对应服务,资源配置如下:
-
CPU |
GPU |
MEMORY |
4 |
0.5 |
8G |
4 |
1 |
8G |
8 |
2 |
16G |
- 创建相关应用
-
利用发压工具对服务接口持续发压,观察压力测试结果及压测期间gpu显存使用情况及gpu使用率
-
一、GPU性能测试数据报告如下
1 需求背景
使用性能评估对服务终端进行压力测试,评估服务端性能,有助于定位性能瓶颈。
由于全量版本过多,高优测试一轮每个框架的最新版本,模型性能。
2. 测试方案
2.1 模型预测配置
-
每个副本 默认资源配置
-
副本数:1
-
CPU:4
-
内存:8GB / 8192MB
-
GPU:
-
仅用CPU的模型预测:0
-
依赖GPU(或必须使用GPU才能发挥性能的模型预测 :TensorFlow、Pytorch、Paddle):1
-
-
GPU类型:Tesla-T4
-
注意
当测试时,发现服务的资源配置成为性能瓶颈时,应适当改大资源,否则无法测试出最大的性能数据。
2.2 模型选择
模型类型 |
镜像名称:镜像tag |
是否使用GPU |
模型类型 |
其他说明 |
|
Sklearn-v0.20 |
infsms-sklearn0.20.2 |
e0828eb1d118 |
否 |
modelserver |
- |
GBDT-v1.2.0 |
infsms-xgboost1.2.0 |
d09b82ae7baa |
否 |
modelserver |
服务需要设置环境变量: OMP_NUM_THREADS:1 (NUM_WORKERS建议设置,本次测试没有设置此参数) |
H2O-v3.26.0.5 |
infsms-h2o3.26.0.5 |
929fa6a953d1 |
否 |
modelserver |
- |
R-3.5.2 |
infsms-r3.5.2 |
64ff114623cb |
否 |
modelserver |
多并发请求成功率全部低于30 |
PMML |
infsms-pmml0.9.11 |
d0276f6c47d9 |
否 |
modelserver |
多并发请求成功率全部低于50 |
TensorFlow-v2.6.0 |
infsms-tensorflow2.6.0-cuda11.2-cudnn8 |
e88ef44c5251 |
是 |
modelserver |
- |
paddle-2.1 |
infsms-paddle2.1.0-cuda10.1-cudnn7 |
683ef1373304 |
是 |
modelserver |
- |
PyTorch-v1.10.1 |
infsms-pytorch1.10.0-cuda10.2-cudnn7 |
8812b855b620 |
是 |
modelserver |
- |
OONX-1.8 |
infsms-onnx1.3.0-cuda10.1-cudnn7 |
9840c6d7a900 |
是 |
modelserver |
模型起预测onnx框架image信息匹配的不对 |
2.3 性能指标说明
-
最大并发:长时间压测下,预测服务能承受的稳定无异常的最大并发数。
-
最大TPS:长时间压测下,预测服务能达到的最大TPS
-
资源使用率:
-
包括CPU使用率、GPU算力平均使用率、GPU显存平均使用率、内存使用率
-
来自前端页面 用户可见的副本监控数据(获取自性能评估报告、 Prometheus监控数据)
-
仅列出压测过程中 采样到的最大占用率
-
3 模型预测性能
3.1 GBDT-v1.2.0模型预测
性能指标 |
pod性能数据 |
||||||
1个并发 |
中间数据 |
最大并发 |
中间数据 |
中间数据 |
中间数据 |
中间数据 |
|
单副本资源数 |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
Users(并发数) |
1 |
30 |
50 |
100 |
300 |
500 |
1000 |
递增速率(VU/s) |
1 |
2 |
5 |
10 |
20 |
35 |
66 |
发压时间 |
30min |
30min |
30min |
30min |
30min |
30min |
30min |
发送请求数 |
537930 |
1406038 |
1408861 |
1405880 |
814857 |
822581 |
873953 |
req/s(QPS) |
299.02 |
782.87 |
784.44 |
782.78 |
452.95 |
457.24 |
485.8 |
failures(整体失败率) |
0 |
0 |
0 |
0 |
0.68% |
1.64% |
3.61% |
failures/s |
0 |
0 |
0 |
0 |
3.08 |
7.49 |
17.5 |
响应时间(最大) |
75 |
77 |
119 |
1311 |
91852 |
91792 |
92606 |
响应时间(最小) |
2 |
2 |
2 |
6 |
5 |
8 |
18 |
响应时间(中位数) |
3 |
38 |
63 |
130 |
140 |
140 |
140 |
响应时间(平均值) |
2.97 |
37.62 |
64.03 |
126.88 |
664.91 |
1184.59 |
2365.61 |
响应时间 latency 95% |
3 |
40 |
67 |
130 |
270 |
290 |
3400 |
响应时间 latency 99% |
4 |
42 |
69 |
140 |
7200 |
59000 |
61000 |
CPU使用率 |
20% |
53% |
53.06% |
53.12% |
46%->32% |
40%->34% |
35% |
内存使用率 |
2.34% |
2.34% |
2.35% |
2.37% |
2.46% |
2.65% |
3.19% |
分析说明:
-
最大并发为100
-
30min发压时间的平均QPS 最大是784.44左右
-
并发达到50后,QPS基本稳定,超过100并发时,开始出现报错:报错基本集中在发压后几分钟内,几分钟后请求成功率逐步上升,趋势图如下
3.2 Sklearn-v0.20 模型预测
性能指标 |
pod性能数据 |
|||
1个并发 |
中间数据 |
最大并发 |
中间数据 |
|
单副本资源数 |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
Users(并发数) |
1 |
50 |
100 |
300 |
递增速率(VU/s) |
1 |
5 |
10 |
20 |
发压时间 |
30min |
30min |
30min |
30min |
发送请求数 |
450442 |
1255059 |
1260003 |
690064 |
req/s(TPS) |
250.38 |
697.64 |
700.39 |
383.58 |
failures(整体失败率) |
0 |
0 |
0 |
0.86% |
failures/s |
0 |
0 |
0 |
3.29 |
响应时间(最大) |
1046 |
1078 |
1343 |
91855 |
响应时间(最小) |
2 |
3 |
5 |
15 |
响应时间(中位数) |
3 |
70 |
140 |
150 |
响应时间(平均值) |
3.07 |
70.3 |
141.36 |
772.63 |
响应时间 latency 95% |
3 |
77 |
160 |
1100 |
响应时间 latency 99% |
5 |
83 |
160 |
12000 |
CPU使用率 |
19% |
54.27% |
54.33% |
54%->34% |
内存使用率 |
1.95% |
2% |
2.02% |
2.15% |
分析说明
-
最大并发为200
-
30min发压时间的平均TPS 最大是700.39左右
-
并发达到100后,TPS 基本稳定,超过100并发时,开始出现报错。
3.3 H2O-V3.26.5模型预测
性能指标 |
pod性能数据 |
|||||
1个并发 |
最大并发 |
中间数据 |
中间数据 |
中间数据 |
中间数据 |
|
单副本资源数 |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
4/0/8G |
Users(并发数) |
1 |
50 |
100 |
300 |
500 |
1000 |
递增速率(VU/s) |
1 |
5 |
10 |
20 |
35 |
66 |
发压时间 |
30min |
30min |
30min |
30min |
30min |
30min |
发送请求数 |
29799 |
28356 |
10579 |
11883 |
18374 |
36941 |
req/s(TPS) |
16.59 |
15.79 |
5.9 |
6.62 |
10.24 |
20.59 |
failures(整体失败率) |
0 |
0 |
0.59 |
66.66 |
75.15 |
99.91 |
响应时间(最大) |
1671 |
6552 |
61043 |
92294 |
92502 |
61352.15 |
响应时间(最小) |
33 |
102 |
1963 |
21743 |
21946 |
26621 |
响应时间(中位数) |
57 |
3100 |
8300 |
60000 |
60000 |
61000 |
响应时间(平均值) |
59.57 |
3166 |
17643 |
55670 |
61223.9 |
61352.15 |
响应时间 latency 95% |
80 |
3900 |
38000 |
67000 |
78000 |
85000 |
响应时间 latency 99% |
94 |
4800 |
58000 |
92000 |
92000 |
92000 |
CPU使用率 |
50% |
76.43% |
91.5% |
92.5% |
94.14% |
94.56% |
内存使用率 |
20% |
33.34% |
35.09% |
35.62% |
36.14% |
37.18% |
分析说明
-
最大并发为50
-
30min发压时间的平均TPS 最大是16.59左右
-
并发超过50时,开始出现报错。
3.4 Paddle-v2.1模型预测
性能指标 |
pod性能数据 |
|||||
1个并发 |
最大并发 |
中间数据 |
中间数据 |
中间数据 |
中间数据 |
|
单副本资源数 |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
Users(并发数) |
1 |
50 |
100 |
300 |
500 |
1000 |
递增速率(VU/s) |
1 |
5 |
10 |
20 |
35 |
66 |
发压时间 |
30min |
30min |
30min |
30min |
30min |
30min |
发送请求数 |
20305 |
50549 |
50534 |
46758 |
57051 |
81977 |
req/s(TPS) |
11.29 |
28.1 |
28.14 |
26.03 |
31.77 |
45.64 |
failures(整体失败率) |
0 |
0 |
0.37 |
16.19 |
31.11 |
51.93 |
响应时间(最大) |
1366 |
3977 |
62301 |
92458 |
91758 |
109176 |
响应时间(最小) |
33 |
147 |
531 |
101 |
59 |
1 |
响应时间(中位数) |
83 |
1800 |
3500 |
3600 |
4700 |
7500 |
响应时间(平均值) |
79.65 |
1768.93 |
3592.37 |
12314.43 |
17432.58 |
26336.36 |
响应时间 latency 95% |
87 |
1800 |
3600 |
60000 |
60000 |
61000 |
响应时间 latency 99% |
90 |
1800 |
3600 |
67000 |
68000 |
68000 |
CPU使用率 |
11.73 |
26.80 |
26.42 |
26.42 |
26.34 |
23.13 |
内存使用率 |
21.39 |
21.42 |
21.46 |
21.60 |
22.11 |
22.79 |
AI加速卡算力平均使用率 |
21.30 |
16.64 后期是0 |
17.22 中途有使用率为0的一段 |
72.27 |
59.12 |
58.96 |
AI加速卡显存平均使用率 |
5.94 |
5.94 |
5.94 |
5.94 |
5.94 |
5.94 |
分析说明
-
最大并发为50
-
30min发压时间的平均TPS 最大是28.1左右
-
并发超过50时,开始出现报错。 加速卡算力平均使用率存在0的情况。
3.5 Tensorflow-v2.6模型预测
性能指标 |
pod性能数据 |
|||||
1个并发 |
中间数据 |
最大并发 |
中间数据 |
中间数据 |
中间数据 |
|
单副本资源数 |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
Users(并发数) |
1 |
50 |
100 |
300 |
500 |
1000 |
递增速率(VU/s) |
1 |
5 |
10 |
20 |
35 |
66 |
发压时间 |
30min |
30min |
30min |
30min |
30min |
30min |
发送请求数 |
20992 |
78283 |
76802 |
65464 |
78072 |
103178 |
req/s(TPS) |
11.67 |
43.51 |
42.76 |
36.45 |
43.4 |
57.35 |
failures(整体失败率) |
0 |
0 |
0 |
11.94 |
21.95 |
41.15 |
响应时间(最大) |
1892 |
2224 |
63084 |
92619 |
92785 |
91528 |
响应时间(最小) |
36 |
78 |
153 |
872 |
1004 |
1 |
响应时间(中位数) |
86 |
1100 |
2300 |
2900 |
2900 |
3700 |
响应时间(平均值) |
76.74 |
1139.09 |
2344.31 |
8678.17 |
13413.85 |
20421.58 |
响应时间 latency 95% |
90 |
1300 |
2500 |
60000 |
60000 |
60000 |
响应时间 latency 99% |
92 |
1300 |
2600 |
61000 |
61000 |
61000 |
CPU使用率 |
14.16 |
53.05 |
53.08 |
53.04 |
42.71 |
42.73 |
内存使用率 |
29.98 |
30.34 |
30.49 |
30.83 |
31.32 |
32.01 |
AI加速卡显存平均使用率 |
96.44 |
96.44 |
96.44 |
96.44 |
96.44 |
96.44 |
AI加速卡算力平均使用率 |
32.58 |
120.36 |
120.47 |
136.48 |
119.38 |
134.65 |
分析说明
-
最大并发为100
-
30min发压时间的平均QPS 最大是42.76左右
-
并发超过100时,开始出现报错。
-
并发超过100时,加速卡算力平均使用率存在一直为96.44的情况。.
-
并发超过50时,AI加速卡算力平均使用率超过100%。
3.6 Pytorch-v1.10模型预测
性能指标 |
pod性能数据 |
|||||
1个并发 |
最大并发 |
中间数据 |
中间数据 |
中间数据 |
中间数据 |
|
单副本资源数 |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
4/1/8G |
Users(并发数) |
1 |
50 |
100 |
300 |
500 |
1000 |
递增速率(VU/s) |
1 |
5 |
10 |
20 |
35 |
66 |
发压时间 |
30min |
30min |
30min |
30min |
30min |
30min |
发送请求数 |
19985 |
50643 |
49420 |
47723 |
55325 |
83476 |
req/s(TPS) |
11.11 |
28.15 |
27.52 |
26.57 |
30.8 |
46.48 |
failures(整体失败率) |
0 |
0 |
0.16 |
15.29 |
30.06 |
51.07 |
响应时间(最大) |
123 |
3926 |
54769 |
92485 |
92408 |
91646 |
响应时间(最小) |
34 |
165 |
599 |
228 |
1006 |
2 |
响应时间(中位数) |
83 |
1800 |
3600 |
3700 |
6200 |
7300 |
响应时间(平均值) |
81.1 |
1766.19 |
3656.31 |
12284.4 |
18043.53 |
24809.95 |
响应时间 latency 95% |
87 |
1800 |
3600 |
60000 |
60000 |
60000 |
响应时间 latency 99% |
89 |
1800 |
3700 |
67000 |
66000 |
61000 |
CPU使用率 |
11.92 |
26.84 |
26.73 |
23.50 |
24.78 |
22.76 |
AI加速卡显存平均使用率 |
8.87 |
8.87 |
8.87 |
8.87 |
8.87 |
8.87 |
AI加速卡算力平均使用率 |
6.4 出现为0情况 |
11 出现为0情况 |
30 出现为0情况 |
70 |
60 |
64.9 |
内存使用率 |
32.72 |
35.72 |
32.80 |
33.15 |
33.56 |
34.38 |
分析说明
-
最大并发为50
-
30min发压时间的平均TPS 最大是28.15左右
-
并发超过50时,开始出现报错
-
加速卡算力平均使用率存在一直为8.87的情况文章来源:https://www.toymoban.com/news/detail-609893.html
-
并发小于300时,AI加速卡算力平均使用率出现为0时间段文章来源地址https://www.toymoban.com/news/detail-609893.html
到了这里,关于GPU压力测试篇- TensorFlow的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!