我们把训练模型建立以后,投入到生产环境的时候,问题来了,一张图片进行预测,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)
通过这种方法得出以下的数据:
从图中可以看出,有两个耗时严重的地方,对应代码来看就是加载一张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 |
然后在组装机上跑的结果如下:
用时约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还在测试中!