Tensorflow性能(版本1与2和CPU与GPU)

时间:2019-08-26 12:07:40

标签: python performance tensorflow tf.keras

我是机器学习的新手,发现自己花费不成比例的时间来设置Tensorflow。我使用Anaconda来管理不同版本的环境。我设法安装了

  • Tensorflow-cpu_1.14.0

  • Tensorflow-gpu_1.14.0

  • Tensorflow-cpu_2.0.0-beta1。

由于CUDA驱动程序存在一些问题,我无法设置Tensorflow-gpu_2.0.0-beta,我暂时已经放弃了。

我的目标是确保上面指定的三个版本正常运行,并使用系统上的所有可用资源。特别是我的问题是:

  1. 如何可靠地衡量现有计算机和Tensorflow设置的性能?

  2. 例如使用仅CPU版本的示例更快是正常的吗?

  3. 如何为系统选择和安装最佳的Tensorflow设置?

我阅读了许多有关Windows性能问题以及GPU和CPU运行时之间的比较的主题,但似乎没有一个可以解决上述问题。非常感谢您对我的任务有任何见解!

我没有找到任何建立的标准示例来测试性能,因此我建立了自己的示例(可能是一个严重的错误)。我在家用计算机(Windows 10 Home,x64)上测试了所有三种环境(使用下面指定的代码)。处理器:Intel i7-8750 CPU @ 2.20GHz,2208Mhz,6核,12逻辑处理器。RAM:16GB。图形卡: GeForce RTX 2060)。我还运行了1的测试示例,该示例说明了使用GPU进行矩阵乘法的速度更快。我认为这是由于某些原因造成的,我想念了。请随意评论代码中可能出现的基本错误。

# python 3.6
import numpy as np
import tensorflow as tf
from tensorflow.python.client import device_lib
from timeit import default_timer as timer

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(64, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

model.compile(optimizer=tf.compat.v1.train.AdamOptimizer(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])


def random_one_hot_labels(shape):
    n, n_class = shape
    classes = np.random.randint(0, n_class, n)
    tmp_labels = np.zeros((n, n_class))
    tmp_labels[np.arange(n), classes] = 1
    return tmp_labels


data = np.random.random((1000, 32))
labels = random_one_hot_labels((1000, 10))

durations = []
for i in range(10):  # run N times
    start = timer()
    model.fit(data, labels, epochs=500, batch_size=32)
    durations.append(timer() - start)

print(f"tf.version.VERSION = {tf.version.VERSION}")
print(f"tf.keras.__version__ = {tf.keras.__version__}")
devices = device_lib.list_local_devices()  # this may allocate all GPU memory ?!
print(f"devices = {[x.name for x in devices]}")
print(f"model.fit durations: {durations}")

仅CPU版本均优于GPU版本。此外,不同的Tensorflow版本之间存在巨大差异。在使用三种不同环境的代码输出下方:

tf.version.VERSION = 1.14.0
tf.keras.__version__ = 2.2.4-tf
2019-08-26 13:41:15.980626: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1640] Found device 0 with properties:
name: GeForce RTX 2060 major: 7 minor: 5 memoryClockRate(GHz): 1.2
pciBusID: 0000:01:00.0
2019-08-26 13:41:15.986261: I tensorflow/stream_executor/platform/default/dlopen_checker_stub.cc:25] GPU libraries are statically linked, skip dlopen check.
2019-08-26 13:41:15.990784: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1763] Adding visible gpu devices: 0
2019-08-26 13:41:15.993919: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1181] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-08-26 13:41:15.997211: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1187]      0
2019-08-26 13:41:16.000263: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1200] 0:   N
2019-08-26 13:41:16.002807: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/device:GPU:0 with 4616 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2060, pci bus id: 0000:01:00.0, compute capability: 7.5)
devices = ['/device:CPU:0', '/device:GPU:0']
model.fit durations: [34.81, 33.84, 34.37, 34.21, 34.54, 34.18, 35.09, 33.24, 33.32, 33.54]

-----------------------------------------------------------

tf.version.VERSION = 1.14.0
tf.keras.__version__ = 2.2.4-tf
devices = ['/device:CPU:0']
model.fit durations: [23.48, 23.43, 23.25, 23.71, 23.54, 24.017, 23.43, 24.08, 23.67, 23.94]

-----------------------------------------------------------

tf.version.VERSION = 2.0.0-beta1
tf.keras.__version__ = 2.2.4-tf
devices = ['/device:CPU:0']
model.fit durations: [15.53, 14.87, 14.65, 14.73, 14.68, 14.67, 15.11, 14.71, 15.54, 14.38]

2 个答案:

答案 0 :(得分:1)

我已经使用Tensorflow已有一段时间了,所以我将尝试回答您的问题。

  1. 衡量性能的一种好方法是使用Tensorboard。安装Tensorflow时会自动安装它。训练模型时,请在代码中指出要保存检查点的位置。例如,将它们放在一个名为“培训”的文件夹中。您想得到一个像这样的文件夹树:Difference = ( SUM ( Opportunity[Revenue] ) + SUM ( 'August 2019'[Revenue] ) ) - SUM ( '2018 Invoice'[Revenue] ) 。使用终端,像这样trainings/training_1/my_model.ckpt来调用Tensorboard。 Tensorboard递归地浏览该文件夹,因此,如果每个培训有一个文件夹,Tensorboard将分别向您显示每个培训,而您不必每次培训运行1个Tensorboard。 Tensorboard上有一些图表,这些图表指示诸如训练的准确性,计算时间,学习率等多方面的事情。正如您在下图中看到的,我能够说出#1的训练比#2快了1500万: Tensorboard graph example。如果您不知道如何保存检查点,则可以查看this link
  2. 看看您的GPU的计算能力,它的持续时间应该比CPU长。您使用什么版本的CUDA和cuDNN?
  3. 不幸的是,这取决于您在做什么。通常最好使用最新版本,但是它可能会包含最新版本中没有的错误。我将继续进行您正在做的事情,并为我要使用的每个版本创建虚拟环境。请记住,如果导出冻结的推理图,则只能由导出时使用的相同版本的Tensorflow进行推理。因此,如果我在使用Tensorflow 1.14时导出图形,则无法使用Tensorflow 1.13进行任何推断。

答案 1 :(得分:0)

我用不同的网络大小测试了相同的代码。事实证明,当使用较大型的网络时,GPU版本的性能要比仅CPU版本好得多。我怀疑这是由于将数据加载到GPU内存而产生的开销。

如果要对此进行测试,请使用例如上面的代码中每层1024个节点(并减少了时期数)。