有关Pytorch训练时Volatile Gpu-Util(GPU利用率)很低,而Memory-ueage(内存占比)很高的情况解释与说明

有关Pytorch训练时GPU利用率很低,而内存占比很高的情况

  • 前言
  • 有关GPU的Memory-usage的占用(GPU内存占有率)
  • 有关Volatile GPU-Utile的利用率(GPU的利用率)

直接参考

前言

模型开始训练时候,常用watch -n 0.1 nvidia-smi来观察GPU的显存占比情况,如下图所示,通常GPU显存占比和GPU利用率都很高,但有的模型训练的时候GPU利用率(Volatile GPU-util)占比在不断的动态变化,从0-100%之间不断浮动循环。

如果发生上述这种GPU利用率不断变化情况,可以进一步通过命令行中输入Top指令来查询一下CPU的利用率,可以从中发现问题所在。
有关Pytorch训练时Volatile Gpu-Util(GPU利用率)很低,而Memory-ueage(内存占比)很高的情况解释与说明_第1张图片

有关GPU的Memory-usage的占用(GPU内存占有率)

GPU中Memory-usage最直接的影响因素是模型的大小Batch size的大小。其中模型对GPU中Memory-usage因素包括网络的参数量(网络的深度,宽度等),而一般在训练时候模型结构都已经固定,很少再轻易的改动。因此,我们对Memory-usage的占用的影响主要调控在Batch size的大小,如batch size设置为12,Memory-usage为40%;与设置为24相比,Memory-usage内存占用率是80%,接近于2倍关系,偏差不大。所以在模型结构固定的情况下,尽量将batch size设置大,充分利用GPU的内存。(GPU会很快的算完你给进去的数据,而有关训练时间主要瓶颈在CPU的数据吞吐量上面。)

有关Volatile GPU-Utile的利用率(GPU的利用率)

这个是Volatile GPU-Util表示,当没有设置好CPU的线程数时,这个参数是在反复的跳动的,0%,20%,70%,95%,0%。这样停息1-2 秒然后又重复起来。其实是GPU在等待数据从CPU传输过来,当从总线传输到GPU之后,GPU逐渐起计算来,利用率会突然升高,但是GPU的算力很强大,0.5秒就基本能处理完数据,所以利用率接下来又会降下去,等待下一个batch的传入。因此,这个GPU利用率瓶颈在内存带宽和内存介质上以及CPU的性能上面。最好当然就是换更好的四代或者更强大的内存条,配合更好的CPU。

另外的一个方法是,在PyTorch这个框架里面,数据加载Dataloader上做更改和优化,包括num_workers(线程数),pin_memory=True,会提升速度。解决好数据传输的带宽瓶颈和GPU的运算效率低的问题。在TensorFlow下面,也有这个加载数据的设置

为了提高利用率,首先要将num_workers(线程数)设置得体,4,8,16是几个常选的几个参数。本人测试过,将num_workers设置的非常大,例如,24,32,等,其效率反而降低,因为模型需要将数据平均分配到几个子线程去进行预处理,分发等数据操作,设高了反而影响效率。当然,线程数设置为1,是单个CPU来进行数据的预处理和传输给GPU,效率也会低。其次,当你的服务器或者电脑的内存较大,性能较好的时候,建议打开pin_memory打开,就省掉了将数据从CPU传入到缓存RAM里面,再给传输到GPU上;为True时是直接映射到GPU的相关内存块上,省掉了一点数据传输时间。

你可能感兴趣的:(深度学习,pytorch,深度学习,python)