如何在带有tensorflow2和keras的多GPU上训练模型?

时间:2019-11-28 21:29:15

标签: tensorflow keras gpu tensorflow2.0

我有一个要在多个GPU上训练的LSTM模型。我将代码转换为执行此操作,在nvidia-smi中,我可以看到它正在使用所有GPU的所有内存,并且每个GPU都使用了大约40%的BUT,估计每批次的培训时间几乎是等于1 gpu。

有人可以引导我并告诉我如何在多个GPU上正确训练吗?

我的代码:

import tensorflow as tf

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout

import os
from tensorflow.keras.callbacks import ModelCheckpoint



checkpoint_path = "./model/"
checkpoint_dir = os.path.dirname(checkpoint_path)
cp_callback = ModelCheckpoint(filepath=checkpoint_path, save_freq= 'epoch', verbose=1 )

# NNET - LSTM
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    regressor = Sequential()

    regressor.add(LSTM(units = 180, return_sequences = True, input_shape = (X_train.shape[1], 3)))
    regressor.add(Dropout(0.2))

    regressor.add(LSTM(units = 180, return_sequences = True))
    regressor.add(Dropout(0.2))

    regressor.add(LSTM(units = 180))
    regressor.add(Dropout(0.2))

    regressor.add(Dense(units = 4))

    regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')

regressor.fit(X_train, y_train, epochs = 10, batch_size = 32, callbacks=[cp_callback])

2 个答案:

答案 0 :(得分:2)

假设单个GPU的batch_sizeN,每批花费的时间为X秒。

您可以通过测量模型收敛所需的时间来衡量训练速度,但是您必须确保使用2个GPU正确输入batch_size,因为2个GPU的单个GPU的内存,您应该将batch_size线性缩放到2N。可能令人迷惑的是,该模型每批次仍需要X秒,但是您应该知道,现在您的模型正在每批次看到2N个样本,这会导致快速收敛< / strong>,因为现在您可以以更高的学习速度进行培训。

如果两个GPU的内存都被占用并且处于40%利用率,则可能有多种原因

  • 模型太简单了,您不需要所有的计算。
  • 您的batch_size很小,您的GPU可以处理更大的batch_size
  • 您的CPU是瓶颈,因此使GPU等待数据准备就绪,当您看到GPU利用率达到峰值时,情况可能就是这种情况
  • 您需要编写更好的性能数据管道。您可以在这里找到有关有效数据输入管道的更多信息-https://www.tensorflow.org/guide/data_performance

答案 1 :(得分:0)

您可以尝试使用CuDNNLSTM。它比通常的LSTM层要快。

https://www.tensorflow.org/api_docs/python/tf/compat/v1/keras/layers/CuDNNLSTM