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

Tensorflow performance (versions 1 vs 2 and CPU vs GPU)

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

由于 CUDA 驱动程序的一些问题,我未能设置 Tensorflow-gpu_2.0.0-beta,我暂时放弃了。

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

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

  2. 我使用 CPU-only 版本更快的示例是否正常?

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

我阅读了许多关于 Windows 性能问题的主题以及 GPU 和 CPU 运行时之间的比较,但 none 似乎解决了上述问题。

我没有找到任何单一的已建立的标准示例来测试性能,所以我建立了自己的(可能是一个严重的错误)。我在家用电脑上测试了所有三种环境(使用下面指定的代码)(Windows 10 Home,x64。处理器:Intel i7-8750 CPU @2.20GHz,2208Mhz,6 核,12 逻辑处理器内存: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]

我使用 Tensorflow 有一段时间了,所以我会尽量回答你的问题。

  1. 衡量性能的一个好方法是使用 Tensorboard。它会在您安装 Tensorflow 时自动安装。训练模型时,在代码中指明要保存检查点的位置。例如,将它们放在名为 "trainings" 的文件夹中。您希望最终得到一个如下所示的文件夹树:trainings/training_1/my_model.ckpt。使用终端,像这样调用 Tensorboard tensorboard --logdir=trainings。 Tensorboard 递归地查看文件夹,因此如果每次训练有一个文件夹,Tensorboard 将分别显示每个训练,而无需 运行 每个训练 1 个 Tensorboard。 Tensorboard 的图表显示了多种情况,例如训练的准确性、计算时间、学习率等。正如您在下一张图片中看到的,我可以看出训练 #1 比 #2 快 1500 万:请参阅下面的 Tensorboard 图示例图像。 如果你不知道如何保存检查点,你可以看看this link.

  2. 看你GPU的计算能力,它的拟合持续时间应该比CPU好。您使用什么版本的 CUDA 和 cuDNN?

  3. 不幸的是,这取决于你在做什么。通常最好使用最新版本,但它可能存在上一版本中没有的错误。我会按照您已经在做的事情去做,并为我想使用的每个版本创建虚拟环境。请记住,如果您导出冻结的推理图,它将只能用于您在导出时使用的相同版本的 Tensorflow 的推理。因此,如果我在使用 Tensorflow 1.14 时导出图表,我将无法使用 Tensorflow 1.13 进行任何推断。

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

如果您想对此进行测试,请使用例如上述代码中每层 1024 个节点(并减少 epoch 的数量)。