【问题标题】:multiple GPUs keras weird speedup多个 GPU keras 奇怪的加速
【发布时间】:2017-12-04 15:43:37
【问题描述】:

我确实实现了类似的代码,例如来自 keras 的多 GPU 代码 (multiGPU tutorial)。在具有 2 个 GPU 的服务器上运行此程序时,每个 epoch 的训练时间如下:

  • 仅显示 Keras 一个 GPU 并设置变量 gpus = 1(仅使用一个 GPU),一个 epoch = 32s
  • 显示 Keras 两个 GPU,gpus = 1,一个 epoch = 31 s
  • 显示 Keras 两个 GPU,gpus = 2,一个 epoch = 37 s

输出看起来有点奇怪,虽然初始化代码似乎会为每个 GPU 创建多个 Tensorflow 设备,但我不确定这是否是正确的行为。但我看到的大多数其他示例每个 GPU 都只有一条这样的线路。

第一次测试(显示一个 GPU,GPU = 1):

2017-12-04 14:54:04.071549: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 0 with properties: 
name: Tesla P100-PCIE-16GB
major: 6 minor: 0 memoryClockRate (GHz) 1.3285
pciBusID 0000:82:00.0
Total memory: 15.93GiB
Free memory: 15.64GiB
2017-12-04 14:54:04.071597: I tensorflow/core/common_runtime/gpu/gpu_device.cc:976] DMA: 0 
2017-12-04 14:54:04.071605: I tensorflow/core/common_runtime/gpu/gpu_device.cc:986] 0:   Y 
2017-12-04 14:54:04.071619: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:54:21.531654: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)

第二次测试(显示 2 个 GPU,GPU = 1):

2017-12-04 14:48:24.881733: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 1 with properties: 
...(same as earlier)
2017-12-04 14:48:24.882924: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:48:24.882931: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-PCIE-16GB, pci bus id: 0000:83:00.0)
2017-12-04 14:48:42.353807: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:48:42.353851: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-PCIE-16GB, pci bus id: 0000:83:00.0)

奇怪的是例如 3 (gpus = 2):

2017-12-04 14:41:35.906828: I tensorflow/core/common_runtime/gpu/gpu_device.cc:955] Found device 1 with properties:
...(same as earlier)
2017-12-04 14:41:35.907996: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:41:35.908002: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-PCIE-16GB, pci bus id: 0000:83:00.0)
2017-12-04 14:41:52.944335: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:41:52.944377: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-PCIE-16GB, pci bus id: 0000:83:00.0)
2017-12-04 14:41:53.709812: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:82:00.0)
2017-12-04 14:41:53.709838: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1045] Creating TensorFlow device (/gpu:1) -> (device: 1, name: Tesla P100-PCIE-16GB, pci bus id: 0000:83:00.0)

代码:

LSTM = keras.layers.CuDNNLSTM
model.add(LSTM(knots, input_shape=(timesteps, X_train.shape[-1]), return_sequences=True))
model.add(LSTM(knots))
model.add(Dense(3, activation='softmax'))

if gpus>=2:
    model_basic = model
    with tf.device("/cpu:0"):
        model = model_basic
    parallel_model = multi_gpu_model(model, gpus=gpus)
    model = parallel_model
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
hist = model.fit(myParameter)

这是典型的行为吗?我的代码有什么问题,每个 GPU 创建了多个设备。提前致谢。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    我尝试了multiGPU tutorial 的确切代码。 它看起来像是某种预期的输出。但是为了看到预期的速度差异,我不得不增加样本数量(20000)并且需要将高度和宽度增加到 100(由于 RAM 限制)。

    我不完全确定为什么在我的情况下我没有看到两个 GPU 的加速。我预计这是由于内存速度的限制。因为我的批量很小,每个样本也很小。这导致数据的管理需要比实际计算更多的时间。 使用 2 个 GPU 时,数据的分布变得更加耗时,而每个 GPU 上的实际运行时间会减少。 如果我可以检查显卡的利用率,就可以证明这种效果。可惜我不知道该怎么做。

    如果有人对此有其他想法,请告诉我。谢谢

    【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2017-07-13
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2018-10-05
    • 2017-07-03
    • 2019-04-13
    • 1970-01-01
    相关资源
    最近更新 更多