【问题标题】:How to fix low volatile GPU-Util with Tensorflow-GPU and Keras?如何使用 Tensorflow-GPU 和 Keras 修复低挥发性 GPU-Util?
【发布时间】:2018-04-28 03:34:48
【问题描述】:

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

nvidia-smi 返回 Volatile GPU-Util,它在我的 4 个 GPU 中的任何一个上都不会超过 25%。 如何提高 GPU Util% 并加快训练速度?

【问题讨论】:

标签: tensorflow keras nvidia multi-gpu


【解决方案1】:

如果您的 GPU 利用率低于 80%,这通常是输入管道瓶颈的迹象。这意味着GPU大部分时间处于空闲状态,等待CPU准备数据:

您想要的是 CPU 在 GPU 进行训练以保持 GPU 供给的同时继续准备批次。这称为预取:

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

我们可以通过并行化 I/O 走得更远:

现在要在 Keras 中实现这一点,您需要使用 Tensorflow 数据 API 和 Tensorflow 版本 >= 1.9.0。这是一个例子:

让我们假设,为了这个例子,你有两个 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

【讨论】:

    【解决方案2】:

    我遇到了类似的问题 - 所有 GPU 的内存都是由 Keras 分配的,但 Volatile 大约为 0%,并且训练花费的时间几乎与 CPU 相同。我使用的是ImageDataGenerator,结果证明这是一个瓶颈。当我将fit_generator 方法中的worker 数量从默认值1 增加到所有可用的CPU 时,训练时间迅速下降。

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

    【讨论】:

    • 嗨@Konrad,您能详细说明一下您是如何增加flow_from_directory 中的工人数量的吗?
    • @SharanyaArcotDesai,我错误地提到了flow_from_directory,但是工人编号设置为fit_generator方法的参数。很抱歉,我也会在上面更新我的答案。
    • @Konrad 谢谢。你的修复在一定程度上帮助了我。但是我没有看到 GPU 的持续使用。目前我已经将batch size设置为32,我应该减少它吗?
    • @KK2491 如果您的批次适合 GPU 内存 - 我会保持原样。正如Olivier mentioned in his answer,如果 GPU 没有被使用在 80% 左右,这可能是由输入瓶颈引起的 - CPU 无法按时为 GPU 准备数据。所以你可能需要做一些预处理优化魔法来充分利用 GPU。
    • @Konrad 对预处理优化技术有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2018-05-07
    • 2021-04-13
    • 1970-01-01
    • 2019-09-25
    • 2018-08-16
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多