我最近开始在PyTorch脚本中使用wandb模块,以确保GPU高效运行。然而,我不确定这些图表具体表示什么。
我一直在按照这个链接的教程进行操作,https://lambdalabs.com/blog/weights-and-bias-gpu-cpu-utilization/,但对这个图表感到困惑:
我对GPU %和GPU内存访问百分比图表感到不确定。博客中的描述如下:
-
GPU %:这个图表可能是最重要的。它跟踪在过去的采样周期内,GPU上执行一个或多个内核的时间百分比。基本上,你希望这个值接近100%,这意味着GPU一直在忙于数据处理。上图中有两条曲线。这是由于有两个GPU,而其中只有一个(蓝色)用于实验。蓝色GPU大约90%的时间都在忙碌,这意味着它表现还不错,但仍有改进的空间。这种次优利用的原因是我们在这个实验中使用的小批量大小(4)。GPU非常频繁地从其内存中获取少量数据,无法饱和内存总线或CUDA核心。稍后我们将看到,仅仅通过增加批量大小,就有可能提高这个数值。
-
GPU内存访问百分比:这是一个有趣的指标。它测量在过去的采样周期内GPU内存被读取或写入的时间百分比。我们应该保持这个百分比低,因为你希望GPU大部分时间用于计算而不是从其内存中获取数据。在上图中,忙碌的GPU大约有85%的时间在访问内存。这是非常高的,导致了一些性能问题。一种降低这里百分比的方法是增加批量大小,这样数据获取会变得更有效率。
我有以下几个问题:
- 上述值的总和不等于100%。看起来我们的GPU要么在计算上花时间,要么在读取/写入内存上花时间。这两个值的总和怎么可能超过100%?
- 为什么增加批量大小会减少访问GPU内存的时间?
回答:
-
如果硬件是顺序处理的,GPU利用率和GPU内存访问应该加起来等于100%是正确的。但现代硬件不是这样操作的。GPU在计算数字的同时也会访问内存。
- GPU%实际上是GPU利用率百分比。我们希望这个值达到100%。这样它将100%的时间用于所需的计算。
- GPU内存访问百分比是GPU读取或写入GPU内存的时间。我们希望这个数值低。如果GPU内存访问百分比高,GPU在使用数据进行计算之前可能会有一些延迟。这并不意味着这是一个顺序过程。
W&B允许你监控这两个指标并基于它们做出决策。最近我使用
tf.data.Dataset
实现了一个数据管道。GPU利用率接近0%,内存访问也接近0%。我读取了三个不同的图像文件并将它们堆叠在一起。这里CPU是瓶颈。为了解决这个问题,我通过堆叠图像创建了一个数据集。每个epoch的预计时间从1小时减少到3分钟。
从图表中,你可以推断出GPU的内存访问增加了,而GPU利用率接近100%。CPU利用率下降,这正是瓶颈所在。
- 这里有一篇不错的文章由Lukas回答这个问题。