优化用于 Keras 模型训练的 GPU 使用

Posted

技术标签:

【中文标题】优化用于 Keras 模型训练的 GPU 使用【英文标题】:Optimising GPU use for Keras model training 【发布时间】:2020-08-25 19:44:18 【问题描述】:

我正在训练一个 Keras 模型。在训练期间,我只使用了 5% 到 20% 的 CUDA 内核和同样小比例的 NVIDIA RTX 2070 内存。模型训练目前非常缓慢,我真的很想利用尽可能多的可用 CUDA 内核来加快速度!

nvidia dmon # (during model training)

# gpu   pwr gtemp mtemp    sm   mem   enc   dec  mclk  pclk
# Idx     W     C     C     %     %     %     %   MHz   MHz
    0    45    49     -     9     6     0     0  6801  1605

为了提高 CUDA 核心利用率以更快地训练相同的模型,我应该调整哪些参数?

这是我当前图像生成和训练步骤的简化示例(如果需要,我可以详细说明/编辑,但我目前认为这些是解决问题的关键步骤):

train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    r'./input_training_examples',
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary'
)
validation_generator = test_datagen.flow_from_directory(
    r'./input_validation_examples',
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary'
)

history = model.fit(
    train_generator,
    steps_per_epoch=128, epochs=30,
    validation_data=validation_generator, validation_steps=50,
)

硬件:NVIDIA 2070 GPU

平台:Linux 5.4.0-29-generic #33-Ubuntu x86_64、NVIDIA 驱动程序 440.64、CUDA 10.2、Tensorflow 2.2.0-rc3

【问题讨论】:

【参考方案1】:

GPU 利用率是一项棘手的工作,涉及的因素太多。

首先要尝试的显然是:增加批量大小

但这并不能确保最大利用率,也许你的 I/O 很慢,所以 data_generator 存在瓶颈。

如果您有足够的 RAM 内存,您可以尝试将完整数据加载为 NumPy 数组。

您可以尝试在多处理方案中增加工人数量。

model.fit(..., use_multiprocessing=True, workers=8)

最后,取决于您的模型,如果您的模型太轻且不够深,那么您的利用率就会很低,并且没有标准的方法可以进一步改进它。

【讨论】:

以上是关于优化用于 Keras 模型训练的 GPU 使用的主要内容,如果未能解决你的问题,请参考以下文章

keras使用多GPU并行训练模型 | keras multi gpu training

使用 tf.keras 模型训练时 GPU 随机冻结

使用 GPU 在 EC2 实例上训练 Keras 模型很慢

如何使用 gpu 并行训练 tensorflow.keras 模型? TensorFlow 版本 2.5.0

小白学习keras教程九keras 使用GPU和Callbacks模型保存

在单个 GPU 上并行拟合多个 Keras 模型