Sha*_*sai 6 nvidia multi-gpu keras tensorflow
我有一台4 GPU机器,使用Keras在其上运行Tensorflow(GPU)。我的一些分类问题需要几个小时才能完成。
nvidia-smi返回的Volatile GPU-Util在我的4个GPU中都没有超过25%。如何增加GPU使用率并加快培训速度?
Oli*_*ene 12
如果您的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
Run Code Online (Sandbox Code Playgroud)
tf.data非常灵活,但是像Tensorflow中的任何东西(渴望的除外)一样,它使用静态图。有时这可能会很痛苦,但是加快速度是值得的。
要走得更远,您可以查看性能指南和Tensorflow数据指南。
我也遇到了类似的问题 - 所有 GPU 的内存都是由 Keras 分配的,但 Volatile 大约为 0%,并且训练花费的时间几乎与 CPU 相同。我正在使用ImageDataGenerator,结果证明这是一个瓶颈。当我将方法中的工作线程数量fit_generator从默认值 1 增加到所有可用 CPU 时,训练时间迅速下降。
您还可以将数据加载到内存中,然后使用flow方法准备带有增强图像的批次。
| 归档时间: |
|
| 查看次数: |
3619 次 |
| 最近记录: |