pytorch 显存分配机制

pytorch 显存分配机制

pyTorch 的显存分配机制旨在高效利用 GPU 的显存,并减少不必要的显存分配和释放操作,从而提高模型训练和推理的性能。以下是 PyTorch 在使用 CUDA 进行显存分配和管理时的一些主要机制和特点:

1. 显存管理的基础

PyTorch 使用了 动态显存分配 策略。当你在 PyTorch 中使用 CUDA 张量时,显存不会在一开始就分配完所有可用的 GPU 内存,而是根据需要动态分配。例如,当你创建一个张量并将其移动到 GPU 上时,PyTorch 会分配所需的显存。如果张量被删除或不再需要,PyTorch 会释放显存,以便其他任务使用。

import torch# 张量创建并移动到 GPU
x = torch.randn(1024, 1024, device='cuda')  # 动态分配显存

2. 显存缓存机制 (Caching Allocator)

为了优化显存的使用和减少内存碎片,PyTorch 使用了一个 Caching Allocator(缓存分配器)。该机制通过以下方式减少显存的频繁分配和释放操作:

  • 当一个 CUDA 张量被销毁时,PyTorch 并不会立刻将显存还给操作系统,而是将这部分显存缓存起来,以便在后续的张量操作中复用。这种机制避免了频繁的显存分配和释放带来的开销。
  • 下次需要分配相同大小的张量时,PyTorch 会优先复用之前缓存的显存,从而加快内存分配速度并减少碎片。

例如,下面的代码可能只会导致一次显存分配,后续的张量可以复用之前的显存:

x = torch.randn(1024, 1024, device='cuda')
del x  # 不会立即释放显存,而是缓存
y = torch.randn(1024, 1024, device='cuda')  # 复用已缓存的显存

3. 显存分配与释放的控制

PyTorch 提供了几个控制和监视显存使用的工具,可以帮助开发者手动管理显存的分配和释放:

  • torch.cuda.empty_cache():这个函数不会实际释放显存给操作系统,但它会清空 PyTorch 的缓存,使得显存可以被其他 CUDA 程序使用。开发者可以在不希望显存被过度缓存时调用该函数。

    torch.cuda.empty_cache()  # 清空 PyTorch 内部缓存的显存
    
  • torch.cuda.memory_allocated()torch.cuda.memory_reserved():这些函数可以帮助监视当前显存的使用情况。memory_allocated() 返回当前已经分配的显存量,而 memory_reserved() 返回当前为缓存保留的显存量。

    print(f"Allocated Memory: {torch.cuda.memory_allocated()} bytes")
    print(f"Reserved Memory: {torch.cuda.memory_reserved()} bytes")
    

4. 显存复用与共享机制

PyTorch 的 Caching Allocator 不仅支持在同一进程中复用显存,还能够确保多个操作之间共享相同的显存。如果一个操作的输出张量和输入张量具有相同的大小和形状,PyTorch 可以在后台共享显存,以减少显存占用。这种机制在某些场景下可以进一步优化显存使用。

5. 多 GPU 显存分配

当使用多个 GPU 时,PyTorch 为每个 GPU 独立管理显存分配。每个 GPU 都有自己的显存缓存机制,并且 PyTorch 可以自动将张量分配到不同的 GPU 上,前提是你明确指定了设备。例如:

device1 = torch.device("cuda:0")
device2 = torch.device("cuda:1")x = torch.randn(1024, 1024, device=device1)  # 分配到 GPU 0
y = torch.randn(1024, 1024, device=device2)  # 分配到 GPU 1

PyTorch 的显存分配机制在多 GPU 模式下仍然使用缓存分配器,以减少每个 GPU 的显存分配开销。

6. 显存溢出与自动混合精度 (AMP)

在大模型训练中,显存管理非常重要,尤其是当显存有限时。PyTorch 提供了 自动混合精度(AMP) 功能,结合 torch.cuda.amp 来减少显存占用。AMP 通过在前向传播中使用 16 位浮点数(FP16)来减少显存使用量,同时在某些关键计算中保持 32 位精度以确保数值稳定性。

scaler = torch.cuda.amp.GradScaler()with torch.cuda.amp.autocast():output = model(input)  # 使用混合精度进行计算

使用 AMP 不仅可以减少显存占用,还可以提升计算性能,尤其是在最新的 NVIDIA GPU 上(如 RTX 30 系列),它们对混合精度计算有硬件支持。

7. 显存分配的动态调整与调试

为了帮助调试显存使用问题,PyTorch 提供了一些工具来跟踪和优化显存使用情况:

  • torch.cuda.set_per_process_memory_fraction():允许设置当前进程最多使用 GPU 显存的比例。例如,你可以限制某个进程最多使用 GPU 总显存的 80%。

    
    torch.cuda.set_per_process_memory_fraction(0.8, device='cuda:0')
    
  • torch.cuda.memory_summary():这是一个详细的显存使用报告工具,可以输出当前 GPU 显存的使用情况,包括缓存的分配器状态。对于调试显存溢出或内存泄漏问题,这个工具非常有用。

    
    print(torch.cuda.memory_summary())
    

8. 自动释放显存(当不再需要时)

PyTorch 的 autograd 机制会跟踪张量的依赖关系,并自动管理显存的释放。当某些张量不再需要时(例如,在反向传播后),PyTorch 会自动释放这些张量占用的显存。这是通过计算图的生命周期管理来实现的,尤其是在训练结束或前向传播和反向传播完成后,计算图会被销毁,从而释放显存。

# 在反向传播之后,计算图被销毁,相关的张量显存被释放
loss.backward()

总结

  • 动态显存分配:PyTorch 在需要时动态分配显存,而不是一次性占用所有可用显存。
  • 缓存分配器 (Caching Allocator):避免频繁分配和释放显存,减少内存碎片,优化性能。
  • 显存监控工具:提供了多种 API 来监控显存使用情况,并在需要时手动清空缓存。
  • 自动混合精度 (AMP):通过降低部分计算的精度来减少显存占用。
  • 多 GPU 管理:每个 GPU 独立管理显存,支持多 GPU 下的显存分配和调度。

Reference:

  1. https://github.com/pytorch/pytorch
  2. https://stackoverflow.com/questions/tagged/pytorch
  3. https://docs.nvidia.com/deeplearning/cudnn/latest/api/cudnn-graph-library.html
  4. https://pytorch.org/docs/stable/torch_cuda_memory.html
  5. pytorch显存管理机制优化参考

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

数据集 InterHand2.6M 双手交互 三维手势建模 >> DataBall

数据集 InterHand2.6M 双手交互 三维手势建模 人工智能 深度学习 >> DataBall 数据集 InterHand2.6M,双手/单手交互 ---------------------------------------------------------------------------------------------------------- Train set * Train (H):…

MybatisPlus代码生成器使用

一、前言 Mybatis逆向工程也可以生成代码,但配置太过复杂,不便于后期维护,Mybatis Plus 主动集成了代码的自动生成,用起来也很方便,两种代码自动生成我都用过,没有好坏之分,如果非要我推荐哪一…

跨游戏引擎的H5渲染解决方案(腾讯)

本文是腾讯的一篇H5 跨引擎解决方案的精炼。 介绍 本文通过实现基于精简版的HTML5(HyperText Mark Language 5)来屏蔽不同引擎,平台底层的差异。 好处: 采用H5的开发方式,可以将开发和运营分离,运营部门自…

一个安卓鸿蒙化工具

DevEco插件,为已有安卓项目鸿蒙化加速。 目前支持: 1、安卓Vector Assets转svg; 2、json转ets model; 3、kotlin model转ets model; 下载地址:andtoharplugin1.1.0 安装: deveco插件安装选硬…

傻白甜萌妹爆改成长型女主!男频番的花瓶也有高光?

“师父,师妹不是任何人的依附,也不是小琼峰的一个摆件。” 能说出这句话的男主,堪称人间清醒。 男频作品的女性塑造向来是备受瞩目的话题。“镶边”、“挂件”、“花瓶”…总有这样的标签一个个打在“她们”身上,看似暗讽&#…

seL4 Untyped(二)

链接: Untyped Untyped 这篇主要是针对seL4物理内存管理的介绍。 物理内存 在seL4系统中,除了内核占用的一小部分静态内存之外,其他的所有的物理内存都是用户一级管理的。seL4在启动时创建的对象能力,以及seL4管理的其余物理资源&#xf…

tensorflow底层架构

tensorflow底层架构 架构图 Training libraries 和 Inference libs(训练库和推理库) Training libraries:用于模型的训练过程,包括定义模型、计算梯度、更新模型权重等。这些库提供了在训练过程中所需的所有功能。Inference lib…

推荐几本值得阅读的书籍!

大家好,这里是大话硬件。 初次关注我公众号的朋友第一反应基本都是认为内容太专业! 其实不然,大话硬件公众号除了有硬件设计方面的内容,还包含书籍推荐,个人反思总结模块等内容。 今天这篇文章继上篇荐书《相见恨晚的…

学习IEC 62055付费系统标准

1.IEC 62055 国际标准 IEC 62055 是目前关于付费系统的唯一国际标准,涵盖了付费系统、CIS 用户信息系统、售电系统、传输介质、数据传输标准、预付费电能表以及接口标准等内容。 IEC 62055-21 标准化架构IEC 62055-31 1 级和 2 级有功预付费电能表IEC 62055-41 STS…

如何快速恢复误删除的文件?教你一招,不花一分钱,三步就可以搞定!

电脑文件越存越多,我们都会不定时的进行清理,但有时候,我们难免会误删除一些重要文件。当遇到类似情况的时候,不要着急,很多时候,删除的文件是有办法恢复的。 市面上有很多文件恢复软件,就可以帮…

常用工具推荐!分享7款AI论文修改软件工具网站

在当今学术研究和写作领域,AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率,还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站,其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…

YOLOv8改进 | 特征融合篇,YOLOv8添加iAFF(多尺度通道注意力模块),并与C2f结构融合,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

心理辅导系统:Spring Boot技术驱动

3 系统分析 3.1可行性分析 在进行可行性分析时,我们通常根据软件工程里方法,通过四个方面来进行分析,分别是技术、经济、操作和法律可行性。因此,在基于对目标系统的基本调查和研究后,对提出的基本方案进行可行性分析。…

攻防世界---->Windows_Reverse1(补)

做题笔记。 做题回顾。 假设,我们不知道地址随机怎么办?不能动调,只能静态分析。 下载 查壳 upx脱壳。 32ida打开。 动调报错。 重新打开,静态分析。 跟进关键函数。 不明白可以反汇编和汇编一起看。 溯源。 *decode 取值等于 by…

robomimic应用教程(一)——模型训练

Robomimic使用集中式配置系统来指定所有级别的(超)参数 本文介绍了配置(推荐)和启动训练运行的两种方法 目录 一、使用config json(推荐) 二、在代码中构造一个配置对象 三、查看运行结果 1. 实验结果会存在一个固定文件夹中…

嵌入式入门小工程

此代码基于s3c2440 1.点灯 //led.c void init_led(void) {unsigned int t;t GPBCON;t & ~((3 << 10) | (3 << 12) | (3 << 14) | (3 << 16));t | (1 << 10) | (1 << 12) | (1 << 14) | (1 << 16);GPBCON t; }void le…

如何精准高效做好网站安全防护?一文解读

企业数字化转型过程中&#xff0c;难免会受到多种网络安全威胁带来的负面影响。比如攻击者通过利用Web服务程序以及网站系统的安全漏洞&#xff0c;对企业进行数据窃取等破坏活动&#xff0c;严重损害企业利益。如何精准高效做好网站安全防护&#xff1f;相信本文会为你带来启发…

心觉:保持感恩的心,为什么可以吸引更多好机会和财富

​Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作176/1000天 保持一颗感恩的心&#xff0c;就可以吸引更多的机会和财富 很多人可能不理解&#xff0c;但是这是事实 千正万确的…

armbian debian 系统安装overlayroot后无法启用

千盼万盼 终于debian12可以用了 它终于也跟ubuntu 系统一样可以安装overlayroot了 但是 满怀欣喜的装完了发现 压根没法启动 这。。。。。 原因吗 也简单。。。 默认的映像里没有busybox......... 而它有这个要求。。。 overlayroot 包中有一个小错误&#xff1a;它要求 gr…

Java基础(上)

Java基础&#xff08;上&#xff09; 基础概念与常识 Java语言有哪些特点&#xff1f; 简单易学&#xff08;语法简单&#xff0c;上手容易&#xff09;面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;平台无关性&#xff08;Java虚拟机实现平台无关…