tensorflow分类预测引发的性能测试

时间:2022-08-02 13:51:32

我们把训练模型建立以后,投入到生产环境的时候,问题来了,一张图片进行预测,tensorflow启动加载模型在进行需要跑好几秒钟,才能得出一个预测值。这在真实环境中是不允许的。因为太慢了,为了找出原因所在,开始了如下的探究和测试。

调试确定问题

以google-inception模型中的test.py为例,先在测试模型中记录两个时间,最后相互减就得出所用时间,确定在哪一个环节耗时严重。

# coding=utf-8
import tensorflow as tf
import sys
import datetime

# 命令行参数,传入要判断的图片路径
image_file = sys.argv[1]
# print(image_file)

# 读取图像
image = tf.gfile.FastGFile(image_file, 'rb').read()
print (datetime.datetime.now())
# 加载图像分类标签
labels = []
for label in tf.gfile.GFile("output_labels.txt"):
labels.append(label.rstrip())

# 加载Graph
with tf.gfile.FastGFile("output_graph.pb", 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
tf.import_graph_def(graph_def, name='')

print (datetime.datetime.now())
with tf.Session() as sess:
softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
print (datetime.datetime.now())
predict = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image})
print (datetime.datetime.now())

# 根据分类概率进行排序
top = predict[0].argsort()[-len(predict[0]):][::-1]
for index in top:
human_string = labels[index]
score = predict[0][index]
print(human_string, score)

通过这种方法得出以下的数据:

tensorflow分类预测引发的性能测试
从图中可以看出,有两个耗时严重的地方,对应代码来看就是加载一张test.jpg图片和tensorflow真正处理图片的时候。其中处理图片耗时最严重,近2秒,基本可以确定问题出在这。围绕这个2秒开始了下面的一系列比较和性能测试。
为了确定是内因还是外因,找了另一台电脑进行测试:
由于下面的测试都是围绕这两台电脑之间 ,所以先列出两台机器相关指标。

机器及指标 笔记本 组装机
GPU GeForce GTX 860M GTX 1080Ti
内存 ddr3-8G ddr3-8G
CPU 8核 @ 2.90GHz 4核 @ 3.6GHz
硬盘 SSD SSD
主板 联想y50

然后在组装机上跑的结果如下:
tensorflow分类预测引发的性能测试
用时约2.5秒,用时比笔记本还多。按常理来说:gtx1080ti这么好的显卡没有道理啊,是不是电脑其他配置的问题,如内存,CPU ,主板那些。随后进行了两个机器的性能测试
如下:

测试工具:

phoronix-test-suite :ubuntu下比较好用的一款机器性能测试工具。

# 安装phoronix
$sudo apt-get -y install phoronix-test-suite
# 列出提供的tests
$phoronix-test-suite list-tests
#安装test模块
$phoronix-test-suite install xxx
#模块测试
$phoronix-test-suite xxx

以上是常用的就是这几个命令。

测试项目

GPU 内存 CPU 硬盘 主板

测试项目 选用模块 笔记本得分 组装机得分
GPU gputest(tessMark) 4836 36306
内存 ramspeed 1200 600
CPU stresscpu2
硬盘 aio-stress 955 670

通过这个表,可以得出笔记本gpu被虐爆了,8倍的差距,gtx1080ti不是吃素的;内存笔记本是DDR3-1600,台式机是DDR2-800,所以笔记本是他的两倍也可以说通了;硬盘由于组装机是两块SSD,这个也没有太大差别。CPU还在测试中!