【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考

这篇具有很好参考价值的文章主要介绍了【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

已经证实了我的猜想“从batch_size角度考虑”的正确性。详细解释在后面更新。

GPU利用率低而显存占用率高的思考

问题描述:在深度学习training中,可以看到cpu利用率很高、内存占用率很高、显存占用率很                           高,但GPU利用率很低,train比较耗时。

本文对这个问题进行了思考。

(仅仅是自己遇到问题思考的一些内容,也不一定正确,期待和大家交流探讨)

1.先了解下深度学习中数据的加载问题

先将硬盘中的数据读取到内存中,然后CPU从内存中读取数据,再将数据传输到显存中,等待GPU处理,处理完成之后会传递一部分参数数据到CPU。同时CPU还会将网络和损失函数等传递给GPU。详细可以看这里:http://t.csdn.cn/reYH6。

2.遇到的问题描述

性能可以在任务管理中查看,也可以通过终端查看。不多过阐述。

内存占用率很高(27G/63G);CPU利用率很高70%-90%;显存占用率很高,GPU利用率不高。可以看下图,我用的dataset是Cityscapes精细标注的版本。

【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考

3.问题分析

1)从CPU传输数据角度来考虑

   GPU处理的数据是从CPU拿过来的,是否存在io传输瓶颈的问题?针对我的情况来看,我的理解是cpu、显存占用率都这么高,可以理解为GPU要从显存拿数据做处理,如果传输受到了限制,那首先显存占用率会降下来,所以这一点可以排除。

2)从batch_size角度考虑

可以从bs传输数据的的角度考虑,先假设GPU处理数据时间小于数据传输时间(具体计算是又模型来决定,而且确实是小于的,因为没看到显卡的数据一直是满的),当传一个bs的数据就非常大的时候(足以占满显存),那GPU利用率低的主要原因是由于显存大小限制的,因为GPU一直在空闲等待数据中。

但是这个角度我还不能验证,等我训练完之后抽空试试看,但是这个思路可以和大家分享。

以上两点是我的思考,以下是两点有关调参的小tips。

Num_works和pin memory这两个参数的作用,第一个是开辟多少个CPU线程来处理数据,可以根据CPU核数设置,一般用4,8,16等。但是这个参数也不能太大。当这个参数太大是,在分发数据的时候可能会消耗一定的时间,极端点可以理解为CPU处理数据很快只要1s,但是因为线程数太多而分发数据的时候花了5s。pin memory的介绍可以参考这里:pin_memory - 知乎。简单讲就是该参数开启时,可以减少数据传递到显存中的时间。

更新2022.5.31

解释:这段时间对代码有进行了修改,对细节也把握更多了。我跑的代码是GSCNN的代码,看到作者传进模型的feature map 是[b,3,720,720],进过wideresnet七层处理之后最后得到m7为[b,4096,90,90],然后传入到ASPP做卷积操作。当时跑代码的时候,模型只有cnn的计算,可以看到设备使用情况,在上面可以看到。当时设置的训练集和验证集的bs都为6,num_works设置好像为5.

后面这段时间我将transformers加入到GSCNN中,计划是将在不同的cnn层之后加入TF,但是在实际操作过程中由于太吃显存了,硬件条件有限(48G 2*3090),最后只加了一层TF,但是就这一层TF加进去之后,GPU的利用率马上就上来了。很明显大家都知道TF的计算量是非常大的。所以基于这一点我们可以得出结论,之前显存里面全是加载进来的数据,GPU计算性能没被拉满,是因为受到显存的限制。假设GPU的计算能力为十个单位。传入同样大小的数据,以占满显存为准(48G),纯CNN的时候计算需求为1个单位,那加入TF之后计算需求为4个单位。(举个例子)

【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考

性能利用率对比
内存 cpu利用率 显存 GPU利用率
CNN 27 89% 23.8/24 9%
CNN+TF 21.6 40% 23.3/24 40%

关于内存和CPU利用率变化的原因是bs和num_works设置的时候不一样引起的,这个不是重点讨论对象,根据这个现象我们可以得出结论:1、显存会限制GPU性能的发挥,2、利用率(可以理解为计算需求)和模型中计算量有关。

思考到这里我又有了疑问了:之前也跑过同样数据集,好像是deeplabv3+模型,其中一个模型跑起来速度超级快的,(当时已经意识到了GPU利用率的问题,所以特地有关注GPU利用率)GPU利用率也很高,好想达到了百分之八九十的样子。对比这个模型(纯CNN的),同样都是一些卷积操作,为什么dpV3+ 跑起来GPU利用率那么高,训练耗时少 ,而gscnn就不行。

结合我上面的思路我考虑到了是不是传给模型的数据问题,我测试了gscnn中传给模型的数据为

[b,3,720,720],但是我没有测试dpV3+的数据是多大,所以疑问就是不同大小分辨率的图片传给模型会对性能有影响吗?为什么有的代码传给模型的分辨率较高,有的较低,这一差异的出发点在哪?

待我探索完成后来更新这个问题的答案。

参考:

https://www.jb51.net/article/213809.htm

https://www.cxyzjd.com/article/ProLayman/104758331文章来源地址https://www.toymoban.com/news/detail-439214.html

到了这里,关于【已证实】训练神经网络时,GPU利用率低而显存占用率高的思考的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PyTorch GPU利用率为0%(很低)

    一、确保Pytorch与TorchVision是CUDA(GPU)版本 参考链接:【Xiang哥避坑指南】YOLOV5只在CPU跑不在GPU跑的问题。 在Python终端下操作: 1、Pytorch 2、TorchVision 输出的结果是 +cu 就是 CUDA(GPU) 输出的结果是 +cpu 就是 CPU 二、确保Pytorch与TorchVision以及CUDA ToolKit的版本一致 在Python终端下操作 t

    2024年01月17日
    浏览(32)
  • GPU显存占满但利用率却很低

    来帕多瓦联培已经一个多月了,最近调代码跑实验又发现了这个问题。这里提供另外一个解决思路。一个原因还是 cpu没跟上gpu节奏 。 通常我们都会用尽可能大的 batch 来占满显存。但是如果cpu的读取和传输跟不上的话就会导致gpu利用率时上时下,而且训练时间还会变长。 这

    2024年02月04日
    浏览(93)
  • AI芯片:神经网络研发加速器、神经网络压缩简化、通用芯片 CPU 加速、专用芯片 GPU 加速

      神经网络研发加速器 神经网络编译器组成:编译器、图表示、图优化、计算优化、代码生成。   神经网络编译器 问题: 如何将高级别的神经网络模型有效转换为在多种硬件上运行的优化代码? ONNX的角色: 统一格式 :ONNX提供了一个标准化的格式来表示不同深度学习框架中

    2024年01月21日
    浏览(33)
  • 神经网络训练算法的调用,神经网络中的矩阵运算

    反向传播算法(Backpropagation)是目前用来训练人工神经网络(Artificial Neural Network,ANN)的最常用且最有效的算法。其主要思想是: (1)将训练集数据输入到ANN的输入层,经过隐藏层,最后达到输出层并输出结果,这是ANN的前向传播过程; (2)由于ANN的输出结果与实际结果

    2023年04月08日
    浏览(37)
  • openmv云端训练神经网络自动生成openmv的神经网络模型

    打开openmv工具栏如图所示,点击新数据集  弹出如下界面,这里我选择的是我自己新建的new date文件夹,你们选择自己新建的文件夹即可  接下来我们点击左边红框框起来的地方,可得到中间那个界面,可自己创建名称  左上角就是我创建好的两个,接下来我们点击下面红框

    2024年02月12日
    浏览(27)
  • 神经网络变得轻松(第二部分):网络训练和测试

    概述 在上一篇名为神经网络变得轻松的文章中,我们曾研究过利用 赫兹量化交易软件配合完全连接的神经网络一起操作的 CNet 构造原理。 在本文中,我将演示一个示例,说明如何在 EA 中利用该类,并在实际条件下评估该类。 1. 定义问题 在开始创建智能交易系统之前,必须

    2024年02月16日
    浏览(30)
  • 机器学习18:训练神经网络-最佳实践

    在【 机器学习17 】中, 笔者介绍了 反向传播算法。反向传播算法 是神经网络最常见的训练算法。它使得梯度下降对于多层神经网络来说是可行的。 TensorFlow 可以自动处理反向传播,因此我们不需要深入了解该算法。要了解其工作原理,请阅读 【 机器学习17

    2024年02月12日
    浏览(34)
  • 神经网络小结:训练的全过程

    这一节我们主要是将之前的知识穿起来,形成一个整体。如果之前的没看过可以回翻一下专栏。但是在整体回归之前,我们还需要学习一个小知识点——随机初始化 在神经网络中,我们大致的训练流程就是:通过前向传播得出当前 θ theta θ 下的假设结果,使用代价函数对比

    2024年02月10日
    浏览(29)
  • 神经网络的训练过程、常见的训练算法、如何避免过拟合

    神经网络的训练是深度学习中的核心问题之一。神经网络的训练过程是指通过输入训练数据,不断调整神经网络的参数,使其输出结果更加接近于实际值的过程。本文将介绍神经网络的训练过程、常见的训练算法以及如何避免过拟合等问题。 神经网络的训练过程通常包括以下

    2024年02月05日
    浏览(30)
  • [pytorch]手动构建一个神经网络并且训练

    上一篇博客全都是说明类型的,实际代码能不能跑起来两说,谨慎观看.本文中直接使用fashions数据实现softmax的简单训练并且完成结果输出.实现一个预测并且观测到输出结果. 并且更重要的是,在这里对一些训练的过程,数据的形式,以及我们在softmax中主要做什么以及怎么做来进行说

    2024年02月05日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包