技巧-GPU显存和利用率如何提高和batch_size/num_works等参数的实验测试

目录

  • 简介
  • 实验测试
    • 显存占用问题
    • GPU占用率波动问题
    • num_work不是越大越好
  • 总结

本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送

简介

在PyTorch中使用多个GPU进行模型训练时,各个参数和指标之间存在一定的关系。以下是对这些参数和指标的详细说明和举例:
GPU显存(GPU Memory):
GPU显存是限制模型训练规模的关键因素。当使用多个GPU进行训练时,每个GPU都会分配一部分显存用于存储中间变量、梯度、权重等。GPU显存的使用量取决于模型的复杂度、批量大小(batch size)以及数据类型等因素。
举例:假设我们使用两个GPU(GPU 0和GPU 1)进行训练,每个GPU的显存为12GB。若批量大小为32个样本,模型复杂度为中等,则每个GPU可能需要大约4GB的显存。如果批量大小增加到64个样本,每个GPU可能需要大约8GB的显存。
2. GPU利用率(GPU Utilization):
GPU利用率表示GPU在训练过程中的繁忙程度。高利用率表示GPU在大部分时间都在进行计算操作,而低利用率则表示GPU有空闲时间未被充分利用。
举例:假设我们使用两个GPU进行训练,其中一个GPU的利用率达到了90%,而另一个只有50%。这可能意味着负载分配不均衡,可能影响训练速度和稳定性。可以通过调整批量大小(batch size)或数据并行来优化GPU利用率。
3. Batch Size:
批量大小是每次更新模型权重时使用的样本数量。增加批量大小可以加速训练,但也需要更多的GPU显存。合理选择批量大小需要在速度和内存之间取得平衡。
举例:假设我们使用两个GPU进行训练,批量大小为64个样本。如果模型复杂度较高,可能会导致GPU显存不足,需要减小批量大小或增加GPU数量。如果批量大小过小,则可能无法充分利用GPU的计算能力,导致训练速度变慢。
4. Pin Memory:
Pin Memory是一种将数据固定在内存中的技术,以减少数据在CPU和GPU之间的传输时间。在PyTorch中,通过设置torch.cuda.pin_memory_device()来使用Pin Memory。该选项对于需要频繁访问小块数据的深度学习模型特别有用。
举例:当我们使用多个GPU进行训练时,可以将数据加载到CPU内存中,然后使用Pin Memory技术将其固定在GPU内存中,以减少数据传输开销。这对于需要频繁访问小块数据的深度学习模型特别有用。
5. Num Workers(Number of Workers):
Num Workers是指在数据加载过程中用于并行处理数据加载任务的线程数。增加Num Workers可以加速数据加载,但也需要更多的CPU资源。
举例:假设我们使用两个GPU进行训练,Num Workers设置为2。这将使数据加载并行执行,加速数据加载过程。但是,如果CPU资源有限或数据集较小,增加Num Workers可能不会带来明显的加速效果,反而可能导致资源浪费。
6. CPU利用率(CPU Utilization):
CPU利用率表示CPU在训练过程中的繁忙程度。高利用率表示CPU在大部分时间都在进行计算操作或数据预处理,而低利用率则表示CPU有空闲时间未被充分利用。
举例:假设我们使用两个GPU进行训练,其中一个CPU核心的利用率达到了90%,而另一个只有50%。这可能意味着数据处理或数据预处理不均衡,可能影响训练速度和稳定性。可以通过调整Num Workers或优化数据处理流程来优化CPU利用率。

实验测试

老规矩我们还是拿MMDetection进行测试

显存占用问题

深度学习中神经网络的显存占用,往传有如下公式:
显存占用 = 模型显存占用 + batch_size × 每个样本的显存占用
因此我做以下测试:
batch_size为1:
在这里插入图片描述
batch_size为3:
在这里插入图片描述

batch_size为32:
在这里插入图片描述
不难计算出显存不是和batch-size简单的成正比,上述公式也不能准确描述,尤其是模型自身比较复杂的情况下:比如全连接很大,Embedding层很大.但在至少可以确定batch-size和显存占用直接相关

GPU占用率波动问题

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

设置batch_size=1,num_work为1时,时常出现GPU占用率为0的情况
在这里插入图片描述
设置batch_size=1,num_work为8时,GPU占用率为0的情况明显变少
在这里插入图片描述
所以num_work可以提高GPU的占用率,不至于时常处于等待数据的空闲状态,因此当然可以提高训练速度,见我的前面博客

num_work不是越大越好

通常可以根据cpu和核数去设置num_work,查看cpu核数的命令

lscpu

在这里插入图片描述
图中的CPU(s)就是cpu的核数
实验过程中发现num_work过高导致save权重及其缓慢,num_work不是越大越好。因为越大,虽然线程多了,但是切分到每一个线程消耗也大了,所以会增加CPU的负荷,从而降低对GPU的利用。num_workers数一般和batch_size数配合使用。
设置num_work为32时:
num_work为32
num_work为16
数据读取时间num_work为16时反倒快于num_work为32

总结

要提高GPU的显存和利用率以加快模型的训练速度,可以从以下几个方面进行考虑:
batch_size:Batch Size是每次更新模型权重时使用的样本数量。选择适当的batch size可以提高GPU的显存利用率和训练速度。如果batch size过小,会导致频繁的数据传输开销,降低GPU的利用率。而如果batch size过大,可能会导致GPU显存不足,需要减小批量大小或增加GPU数量。因此,需要根据模型复杂度、显存限制和数据集大小等因素来选择合适的batch size。
使用多个GPU:通过使用多个GPU并行计算,可以显著提高模型的训练速度。可以使用torch.nn.DataParallel或torch.nn.parallel.DistributedDataParallel等包装器来实现数据并行。在使用多个GPU时,需要注意合理分配工作负载,避免负载不均衡导致训练速度下降。
使用Pin Memory技术:对于需要频繁访问小块数据的深度学习模型,可以使用Pin Memory技术。Pin Memory可以将数据固定在GPU内存中,减少数据在CPU和GPU之间的传输时间,从而提高训练速度。在使用Pin Memory时,需要注意合理管理数据生命周期,避免内存泄漏或过度占用。
多线程数据读取:合理选择num_work,保证数据流动的连续性,避免因等待GPU完成计算而造成不必要的延迟。
还有使用混合精度训练:混合精度训练是指同时使用半精度(FP16)和单精度(FP32)数据进行训练。这种方法可以减少显存的使用量,并提高GPU的利用率。通过将权重和梯度等参数存储为FP16格式,可以减少显存的使用。然而,需要注意的是,混合精度训练可能会引入数值稳定性和精度损失的问题。这一部分我后续会进行实验验证,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/210521.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3-快速体验

1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…

⭐ Unity 里让 Shader 动画在 Scene 面板被持续刷新

写 Unity Shader的时候&#xff0c;只有播放状态下的 Game 面板能看到Shader 顺畅的动态效果&#xff0c;不方便。 想要带有动态效果的 Shader 在 Scene 面板持续更新动画&#xff0c;只需要打开一个开关就能让 Scene 持续刷新动画了。 感谢大家的观看&#xff0c;您的点赞和关…

【上海大学《面向对象程序设计A》课程小项目报告】抽象向量类模板及其派生类

1 项目内容及要求 本项目通过设计一个抽象向量类模板&#xff0c;以及一个通用的向量类模板和一个字符串类作为其派生类&#xff0c;以满足各种应用场景中的数据存储和处理需求。 项目内容&#xff1a; 抽象向量类模板。派生向量类。派生字符串类。测试及异常处理。联合测试…

1.1配置开发环境

一、虚拟机 虚拟机可以安装vmware社区板&#xff0c;再在Ubuntu系统下载https://cn.ubuntu.com/download 下载Ubuntu操作系统&#xff0c;在vm中安装&#xff0c;具体可以参考&#xff08;感谢这名作者&#xff09;VMware虚拟机安装Ubuntu与配置Ubuntu&#xff08;超详细教程&…

12.5 作业

1&#xff0c; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有…

制作一个RISC-V的操作系统二-RISC-V ISA介绍

文章目录 ISA的基本介绍啥是ISA为什么要设计ISACISCvsRISCISA的宽度知名ISA介绍 RISC-V历史和特点RISC-V发展RISC-V ISA 命名规范模块化的ISA通用寄存器Hart特权级别Control and Status Register&#xff08;CSR&#xff09;内存管理与保护异常和中断 ISA的基本介绍 啥是ISA …

Java集合常见问题

目录 Java集合 1.前言2.集合3.Collection接口类3.1 List接口3.1.1 ArrayList&#xff08;常用&#xff09;3.1.2 LinkedList&#xff08;常用&#xff09;3.1.3 Vector&#xff08;不常用&#xff09; 3.2 Set接口3.2.1 HashSet&#xff08;常用&#xff09;3.2.2 LinkedHash…

万兆光模块:单模光纤和多模光纤的选择指南

随着网络技术的不断发展&#xff0c;数据传输的速度也越来越快。在这样的背景下&#xff0c;万兆光模块逐渐成为了数据中心和网络设备的必备组件。而在选择万兆光模块时&#xff0c;用户通常会面临一个难题&#xff1a;选择单模还是多模&#xff1f;本文易天光通信将为您解析。…

Web端功能测试的测试方向有哪些?

一、功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征&#xff0c;主要是用于页面之间切换跳转&#xff0c;指导用户去一些不知道地址的页面的主要手段&#xff0c;链接测试一般关注三点&#xff1a; 1&#xff09;链接是否按照既定指示那样&#xff0c;确实链接到…

多模块项目打包lib成aar

首先 我们要理解原理lib和app的gradle配置区别 plugins { id com.android.application } plugins { id "com.android.library" } assembleDebug&#xff08;assembleRelease&#xff09;两者分别生成是apk 和aar 对于app来说有包名、有版本号而library没有。 接…

WordPress免费插件大全清单【2023最新】

WordPress已经成为全球范围内最受欢迎的网站建设平台之一。要让您的WordPress网站更具功能性、效率性&#xff0c;并提供卓越的用户体验&#xff0c;插件的选择与使用变得至关重要。 WordPress插件的作用 我们先理解一下插件在WordPress生态系统中的作用。插件是一种能够为Wo…

【shell】

shell 一、shell简介二、shell脚本的执行方式三、shell变量3.1 shell变量介绍3.2 shell变量的定义3.1.1 基本语法3.2.2 定义变量的规则3.2.3 将命令的返回值赋予变量 四、环境变量的设置4.1 基本语法&#xff1a; 五、位置参数变量5.1 基本介绍5.2 基本语法 六、预定义变量6.1 …

C++ Primer 第十六章 模板与泛型编程 重点解读

文章目录 1 定义模板1.1 类模板成员函数的实例化&#xff1a;1.2 在类代码内简化模板类名的使用&#xff1a;1.3 令模板自己的类型参数成为友元&#xff08;C11&#xff09;1.4 模板类型别名1.4.1 typedef1.4.2 为模板定义类型别名(C11) 1.5 函数模板与类模板的区别1.6 使用类的…

【Vulnhub 靶场】【CEREAL: 1】【困难】【20210529】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/cereal-1,703/ 靶场下载&#xff1a;https://download.vulnhub.com/cereal/Cereal.ova 靶场难度&#xff1a;困难 发布日期&#xff1a;2021年5月29日 文件大小&#xff1a;1.1 GB 靶场作者&#xff1a;Thomas…

外包干了4年,技术退步明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

Rocky Linux 9.3 为 PowerPC 64 位带回云和容器镜像

RHEL 克隆版 Rocky Linux 9.3 今天发布了&#xff0c;作为红帽企业 Linux 发行版 CentOS Stream 和 Red Hat Enterprise Linux 的免费替代版本&#xff0c;现在可供下载。 Rocky Linux 9.3 是在 Rocky Linux 9.2 发布 6 个月之后发布的&#xff0c;它带回了 PowerPC 64 位 Lit…

如何正确使用高防IP?高防IP使用教程

随着网络攻击的日益猖獗&#xff0c;越来越多的企业开始重视网络安全&#xff0c;并选择使用高防IP来保护自己的服务器。但是&#xff0c;使用高防IP并不是简单的开通服务就能够达到防护效果的&#xff0c;它需要正确的使用方法才能够发挥出应有的作用。 本文将向大家介绍如何正…

公有云迁移研究——AWS DMS

大纲 1 什么是DMS2 DMS的作用3 DMS在迁移的时候都做些什么4 在使用DMS的时候我们需要做些什么5 操作5.1 创建两个数据库终端节点5.2 创建迁移任务 6 可能遇到的问题7 总结 在本地机房或其他云往AWS上做迁移时&#xff0c;往往会遇到数据库迁移的任务。如果数据量不是特别大&…

一篇吃透大厂面试题,2024找工作一帆风顺。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

MySQL -DDL 及表类型

DDL 创建数据库 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:[DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1.CHARACTER SET&#xff1a…