You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何提升Keras猫狗分类模型GPU利用率以缩短训练时间

提升Keras猫狗分类器GPU利用率的实用方案

嘿,我来帮你捋捋这个问题——你用NVIDIA GeForce 940M训练时GPU利用率上不去,反而CPU跑满,训练还比CPU慢,核心原因其实有两个:一是940M本身是入门级移动GPU,算力和显存都有限;二是数据预处理和加载的瓶颈拖了后腿,GPU大部分时间都在等CPU喂数据,自然利用率上不去。

下面给你几个针对性的优化方法,亲测能有效提升GPU利用率、缩短训练时间:

一、优化数据加载与预处理,让GPU“吃饱”

GPU利用率低最常见的原因就是CPU喂数据的速度跟不上,导致GPU处于“摸鱼”状态。你可以这么调整:

  • 用多线程/多进程加速数据加载:在flow_from_directory里加上workers=4(根据你CPU核心数调整,比如4核就设4)和use_multiprocessing=True,让CPU同时处理多个图片的预处理,加快数据输送到GPU的速度。
  • 增大batch size:940M一般有2G显存,你可以把batch size从默认的32调到64(如果爆显存就降到48),让GPU每次处理更多数据,利用率自然会提升。如果还是爆显存,就开启混合精度训练,代码如下:
    from tensorflow.keras.mixed_precision import set_global_policy
    set_global_policy('mixed_float16')
    
    混合精度能在几乎不损失精度的前提下,把显存占用降低一半,这样就能用更大的batch size了。
  • 提前把数据加载到内存:猫狗数据集总共25000张左右,不算特别大,你可以先把所有图片预处理成numpy数组存在内存里,训练时直接从内存读取,避免频繁磁盘IO的开销。
  • 换用tf.data.Dataset替代ImageDataGeneratortf.data是TensorFlow官方推荐的高性能数据管道,比ImageDataGenerator效率更高,能更流畅地给GPU喂数据。比如你可以这么写:
    import tensorflow as tf
    import os
    
    def preprocess_image(file_path):
        img = tf.io.read_file(file_path)
        img = tf.image.decode_jpeg(img, channels=3)
        img = tf.image.resize(img, (150, 150))
        img = img / 255.0
        label = tf.strings.split(file_path, os.sep)[-2]
        label = tf.cast(label == 'cat', tf.float32)
        return img, label
    
    train_dataset = tf.data.Dataset.list_files('train_dir/*/*.jpg')
    train_dataset = train_dataset.map(preprocess_image, num_parallel_calls=tf.data.AUTOTUNE)
    train_dataset = train_dataset.batch(64).prefetch(tf.data.AUTOTUNE)
    

二、调整模型与训练细节,减少不必要的开销

  • 简化模型(如果可行):如果你用的是比较复杂的模型(比如VGG16),可以换成更轻量的模型,比如MobileNetV2,既能减少GPU计算量,又能加快训练速度。当然如果是简单模型,这条可以忽略。
  • 降低回调的频率:如果你用了TensorBoard、ModelCheckpoint这类回调,别设置太频繁的保存/记录频率,比如把TensorBoard的update_freqbatch改成epoch,减少CPU的额外开销。
  • 关闭不必要的日志输出:训练时过多的日志打印会占用CPU资源,你可以把Keras的日志级别调低,比如设置verbose=1而不是verbose=2

三、环境与硬件的小调整

  • 确保CUDA、cuDNN和TensorFlow版本匹配:版本不兼容会严重影响GPU性能,比如TensorFlow 2.10对应CUDA 11.2、cuDNN 8.1,你可以查官方的版本对照表,确保三者版本匹配。
  • 关闭后台占用GPU的程序:比如浏览器的硬件加速、其他AI训练任务,避免GPU被分流。
  • 更新显卡驱动:去NVIDIA官网下载最新的驱动,旧驱动可能存在性能瓶颈。

最后再解释下你疑惑的点:CPU利用率满是因为它一直在做数据加载、预处理、把数据传给GPU这些工作,而940M作为入门级GPU,算力本身不如现代多核CPU,再加上数据喂得慢,所以训练耗时反而更长。按照上面的方法优化后,GPU利用率应该能提升到60%以上,训练时间也会明显缩短。

内容的提问来源于stack exchange,提问作者vrkarthik 14

火山引擎 最新活动