在 Tensorflow 2.5 中训练 GAN 时 GPU 利用率不稳定

Erratic GPU Utilization while training GAN in Tensorflow 2.5

我正在使用 Tensorflow 2.5 训练用于生成图像 (128x128 jpeg) 的 starGAN 网络。我正在使用 tf.keras.preprocessing.image_dataset_from_directory 从子文件夹加载图像。 此外,我正在使用参数来最大化加载性能,如各种 post 和 loadedDataset.cache().repeat.prefetch 等线程中所建议的那样 我还使用 num_parallel_calls=tf.data.AUTOTUNE 作为 post 的映射函数 - 在加载后处理图像。

在 GPU 上训练网络时,我获得的 GPU 利用率的性能如下图所示。

我的问题是:

  1. GPU 的使用是正常的还是不应该如此不稳定来训练 GAN?
  2. 有什么方法可以使这种表现更加一致吗?
  3. 有什么方法可以提高训练性能以充分利用GPU?

请注意,我也记录了我的磁盘 I/O,并且磁盘 (nvme ssd) 没有瓶颈 reading/writing。 该系统具有 32GB RAM 和带有 8GB Vram 的 RTX3070。我也在 colab 上尝试过 运行;但性能同样不稳定。

  1. 像任何一种并行化软件(包括训练 GAN)一样,利用率不稳定是很正常的。当然,如果您能充分利用您的 GPU 会更好,但是编写执行此操作的软件具有挑战性,并且当您谈论像 GAN 这样的复杂应用程序时,这几乎是不可能的。

    让我试着用一个简单的例子来演示。假设您有两个线程,threadA 和 threadB。 threadA 是 运行 以下 python 代码:

    x = some_time_comsuming_task()
    y = get_y_from_threadB()
    print(x+y)
    

    此处线程 A 正在执行大量计算以获得 x 的值,检索 y 的值,并打印出 x+y 的总和。想象一下线程 B 也在做某种耗时的计算来生成 y 的值。除非线程 A 准备好在线程 B 完成计算的同一时间检索 y,否则在整个程序持续时间内,您不会 100% 使用两个线程。这只是两个线程,当你有 100 个线程与多个链式数据依赖项一起工作时,你可以看到消除任何和所有线程花费在等待其他线程上的时间以将输入传递到下一步计算.

  2. 试图让你的“性能更稳定”是没有意义的。无论您的 GPU 利用率是上升还是下降(如您分享的图表所示),还是它恰好保持在整个执行的平均利用率,都不会改变整体执行时间,这可能是此处真正重要的指标。利用率最有助于确定可以优化代码的位置。

  3. 充分利用?可能不会。正如我在对第一个问题的回答中所解释的那样,协调您的 GAN 以完全消除瓶颈几乎是不可能的。我鼓励您在优化 GAN 时尝试缩短执行时间,而不是提高利用率。没有任何您错过的神奇设置可以完全释放您的 GPU 的所有潜力。