如何使用 Tensorflow-GPU 和 Keras 修复低挥发性 GPU-Util?
Posted
技术标签:
【中文标题】如何使用 Tensorflow-GPU 和 Keras 修复低挥发性 GPU-Util?【英文标题】:How to fix low volatile GPU-Util with Tensorflow-GPU and Keras? 【发布时间】:2018-04-28 03:34:48 【问题描述】:我有一台 4 GPU 机器,我在上面运行带有 Keras 的 Tensorflow (GPU)。我的一些分类问题需要几个小时才能完成。
nvidia-smi 返回 Volatile GPU-Util,它在我的 4 个 GPU 中的任何一个上都不会超过 25%。 如何提高 GPU Util% 并加快训练速度?
【问题讨论】:
根据Performance Guide,输入管道可能是瓶颈。 【参考方案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 guide 和Tensorflow 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 对预处理优化技术有什么建议吗?以上是关于如何使用 Tensorflow-GPU 和 Keras 修复低挥发性 GPU-Util?的主要内容,如果未能解决你的问题,请参考以下文章
如何降级使用 tensorflow-gpu 安装的 hdf5
如何确认 NVIDIA K2200 和 Tensorflow-GPU 一起正常工作?
已安装 Tensorflow-gpu、CUDA 和 cudnn,但发现 GPU 设备但未使用 [重复]