我有一台4 GPU机器,我用Keras运行Tensorflow(GPU)。我的一些分类问题需要几个小时才能完成。
nvidia-smi返回Volatile GPU-Util,我的4个GPU中的任何一个都不会超过25%。 如何增加GPU Util%并加快培训速度?
答案 0 :(得分:5)
如果您的GPU使用率低于80%,通常表明输入管道出现瓶颈。这意味着GPU在很多时间都处于空闲状态,等待CPU准备数据:
您想要的是CPU在训练GPU以保持供电的同时继续准备批处理。这称为预取:
很好,但是如果批次准备仍比模型训练更长,GPU仍将保持空闲状态,等待CPU完成下一个批次。为了使批次准备更快,我们可以并行化不同的预处理操作:
现在要在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 guide和Tensorflow data guide。
答案 1 :(得分:2)
我遇到了类似的问题-所有GPU的内存都是由Keras分配的,但是Volatile大约为0%,训练所花费的时间几乎与CPU上的时间相同。我正在使用ImageDataGenerator
,结果发现它是一个瓶颈。当我将fit_generator
方法中的工作人员数量从默认值1增加到所有可用的CPU时,培训时间迅速减少了。
您还可以将数据加载到内存中,然后使用flow
方法准备带有增强图像的批次。