如何使用Tensorflow-GPU和Keras修复低易失性GPU-Util?

时间:2017-11-15 02:33:47

标签: tensorflow keras nvidia multi-gpu

我有一台4 GPU机器,我用Keras运行Tensorflow(GPU)。我的一些分类问题需要几个小时才能完成。

nvidia-smi返回Volatile GPU-Util,我的4个GPU中的任何一个都不会超过25%。  如何增加GPU Util%并加快培训速度? NVIDIA GPU Util

2 个答案:

答案 0 :(得分:5)

如果您的GPU使用率低于80%,通常表明输入管道出现瓶颈。这意味着GPU在很多时间都处于空闲状态,等待CPU准备数据:enter image description here

您想要的是CPU在训练GPU以保持供电的同时继续准备批处理。这称为预取:enter image description here

很好,但是如果批次准备仍比模型训练更长,GPU仍将保持空闲状态,等待CPU完成下一个批次。为了使批次准备更快,我们可以并行化不同的预处理操作: enter image description here

通过并行化I / O,我们可以走得更远: enter image description here

现在要在Keras中实现此功能,您需要使用Tensorflow版本> = 1.9.0的Tensorflow Data API。这是一个示例:

为了这个例子,让我们假设您有两个numpy数组x和y。您可以将tf.data用于任何类型的数据,但这更易于理解。

def preprocessing(x, y):
     # Can only contain TF operations
     ...
     return x, y

dataset = tf.data.Dataset.from_tensor_slices((x, y)) # Creates a dataset object 
dataset = dataset.map(preprocessing, num_parallel_calls=64) # parallel preprocessing
dataset = dataset.batch(batch_size)
dataset = dataset.prefetch(None) # Will automatically prefetch batches

....

model = tf.keras.model(...)
model.fit(x=dataset) # Since tf 1.9.0 you can pass a dataset object

tf.data非常灵活,但是与Tensorflow中的所有内容(渴望的除外)一样,它都使用图形。有时候可能会很痛苦,但是加快速度是值得的。

要走得更远,您可以看看performance guideTensorflow data guide

答案 1 :(得分:2)

我遇到了类似的问题-所有GPU的内存都是由Keras分配的,但是Volatile大约为0%,训练所花费的时间几乎与CPU上的时间相同。我正在使用ImageDataGenerator,结果发现它是一个瓶颈。当我将fit_generator方法中的工作人员数量从默认值1增加到所有可用的CPU时,培训时间迅速减少了。

您还可以将数据加载到内存中,然后使用flow方法准备带有增强图像的批次。