查看PyTorch的GPU使用情况的工具

news2024/10/9 5:12:10

文章目录

  • torch.cuda API
  • Snapshot
  • torchinfo

torch.cuda API

  • torch.cuda.memory_stats:返回给定设备的 CUDA 内存分配器统计信息字典。该函数的返回值是一个统计字典,每个字典都是一个非负整数。
  • torch.cuda.memory_summary:返回给定设备当前内存分配器统计信息的人类可读的打印输出。这对于在训练期间或处理内存不足异常时定期显示非常有用。
  • torch.cuda.memory_snapshot:返回所有设备上的 CUDA 内存分配器状态的快照。解释该函数的输出需要熟悉内存分配器的内部结构。
  • torch.cuda.reset_peak_memory_stats:重置 CUDA 内存分配器跟踪的“峰值”统计数据。峰值统计数据对应于每个单独统计字典中的“峰值”键。
  • torch.cuda.memory_allocated:返回给定设备的张量当前占用的 GPU 内存(以字节为单位)。这可能小于 nvidia-smi 中显示的数量,因为缓存分配器可以保留一些未使用的内存,并且需要在 GPU 上创建一些上下文。
  • torch.cuda.max_memory_allocated:返回给定设备的张量占用的最大 GPU 内存(以字节为单位)。默认情况下,这将返回自该程序开始以来分配的内存峰值reset_peak_memory_stats()可用于重置跟踪此指标的起点。例如,这两个函数可以测量训练循环中每次迭代的峰值分配内存使用情况。
  • torch.cuda.memory_reserved:返回给定设备的缓存分配器管理的当前 GPU 内存(以字节为单位)。
  • torch.cuda.max_memory_reserved:返回给定设备的缓存分配器管理的最大 GPU 内存(以字节为单位)。默认情况下,这将返回自该程序开始以来的峰值缓存内存reset_peak_memory_stats() 可用于重置跟踪此指标的起点。例如,这两个函数可以测量训练循环中每次迭代的峰值缓存内存量
  • torch.cuda.empty_cache:释放缓存分配器当前持有的所有未占用的缓存内存,以便这些内存可以在其他 GPU 应用程序中使用并在 nvidia-smi 中可见。empty_cache()不会增加 PyTorch 可用的 GPU 内存量。但是,在某些情况下,它可能有助于减少 GPU 内存碎片。

以下内容翻译自 Memory management 文档

PyTorch使用缓存内存分配器 (caching memory allocator) 来加快内存分配速度。这允许快速释放内存而无需设备同步。然而,由分配器管理的未使用内存在nvidia-smi中仍会显示为已使用。

  • 你可以使用memory_allocated()max_memory_allocated()来监控由张量占用的内存
  • 并使用memory_reserved()max_memory_reserved()来监控缓存分配器管理的总内存量
  • 调用empty_cache()可以释放PyTorch中所有未使用的缓存内存,以便其他GPU应用程序可以使用这些内存。然而,由张量占用的GPU内存不会被释放,因此它不能增加PyTorch可用的GPU内存量。

对于更高级的用户,我们提供了通过memory_stats()进行更全面的内存基准测试的功能。我们还提供了通过memory_snapshot()捕获内存分配器状态的完整快照的功能,这可以帮助你理解代码产生的底层分配模式。

在环境中设置PYTORCH_NO_CUDA_MEMORY_CACHING=1以禁用缓存。

缓存分配器的行为可以通过环境变量PYTORCH_CUDA_ALLOC_CONF来控制。格式为PYTORCH_CUDA_ALLOC_CONF=<option>:<value>,<option2>:<value2>...可用的选项有:

  • max_split_size_mb 阻止分配器拆分大于此大小(以MB为单位)的块。这可以帮助防止碎片化,并可能允许一些边缘工作负载在不耗尽内存的情况下完成。性能成本可能从‘零’到‘显著’不等,具体取决于分配模式。默认值是无限制,即所有块都可以被拆分。此选项应作为工作负载因‘内存不足’而中止并显示大量非活动拆分块时的最后手段。
  • roundup_power2_divisions 帮助将请求的分配大小四舍五入到最接近的2的幂除法,以更好地利用块。在当前的CUDACachingAllocator中,大小被四舍五入为512的块大小的倍数,因此这对于较小的大小来说很好。然而,对于较大的近邻分配,这可能效率低下,因为每个分配都会去不同大小的块,减少了这些块的重用。这可能会创建大量未使用的块,浪费GPU内存容量。此选项使分配大小四舍五入到最接近的2的幂除法。例如,如果我们需要四舍五入大小为1200,并且分割数为4,1200大小介于1024和2048之间,如果我们在它们之间进行4次分割,值分别为1024、1280、1536和1792。因此,分配大小为1200将被四舍五入到1280作为最接近的2的幂分割上限。
  • roundup_bypass_threshold_mb 对于超过阈值大小(以MB为单位)的分配请求,绕过四舍五入分配大小。这可以在进行预计会持久或寿命较长的大型分配时帮助减少内存占用。
  • garbage_collection_threshold 帮助主动回收未使用的GPU内存,以避免触发代价高昂的同步和回收所有操作(release_cached_blocks),这对延迟敏感的GPU应用程序(如服务器)可能不利。设置此阈值后(例如0.8),如果GPU内存容量使用超过阈值(即分配给GPU应用程序的总内存的80%),分配器将开始回收GPU内存块。算法倾向于首先释放旧的和未使用的块,以避免释放正在积极重用的块。阈值值应大于0.0且小于1.0。

Snapshot

以下内容摘自博客:PyTorch显存可视化与Snapshot数据分析

以下内容摘自博客:Pytorch 显存管理机制与显存占用分析方法

torchinfo

torchinfo,可实现模型参数量计算各层特征图形状计算计算量计算等功能。

使用参考:6.5 模型参数打印 · PyTorch实用教程(第二版)

支持版本:PyTorch 1.4.0+

安装:pip install torchinfo

def summary(
    model: nn.Module,
    input_size: Optional[INPUT_SIZE_TYPE] = None,
    input_data: Optional[INPUT_DATA_TYPE] = None,
    batch_dim: Optional[int] = None,
    cache_forward_pass: Optional[bool] = None,
    col_names: Optional[Iterable[str]] = None,
    col_width: int = 25,
    depth: int = 3,
    device: Optional[torch.device] = None,
    dtypes: Optional[List[torch.dtype]] = None,
    mode: str | None = None,
    row_settings: Optional[Iterable[str]] = None,
    verbose: int = 1,
    **kwargs: Any,
) -> ModelStatistics:

Summarize the given PyTorch model. Summarized information includes: 总结给定的 PyTorch 模型。汇总信息包括:

  • Layer names,
  • input/output shapes,
  • kernel shape,
  • # of parameters,
  • # of operations (Mult-Adds),
  • whether layer is trainable

可选参数:

  • model (nn.Module):要汇总的 PyTorch 模型。模型应该完全处于 train() 或 eval() 模式。如果层不全处于同一模式,运行 summary 可能会对 batchnorm 或 dropout 统计数据产生副作用。
  • input_size (Sequence of Sizes):输入数据的形状,格式为 List/Tuple/torch.Size(数据类型必须与模型输入匹配,默认是 FloatTensors)。应在元组中包括批量大小。默认值:None
  • input_data (Sequence of Tensors):模型前向传递的参数(数据类型推断)。如果 forward() 函数需要多个参数,请传入 args 列表或 kwargs 字典(如果 forward() 函数只接受一个字典参数,请将其包装在一个列表中)。默认值:None
  • batch_dim (int):输入数据的批量维度。如果 batch_dim 为 None,则假设 input_data / input_size 包含批量维度,并在所有计算中使用它。否则,扩展所有张量以包含 batch_dim。指定 batch_dim 可以作为运行时优化,因为如果指定了 batch_dim,torchinfo 在前向传递时使用批量大小为 1。默认值:None
  • cache_forward_pass (bool):如果为 True,使用模型类名称作为键缓存 forward() 函数的运行。如果前向传递是一个耗时的操作,这可以更容易地修改模型摘要的格式,例如更改深度或启用的列类型,特别是在 Jupyter Notebooks 中。警告:在启用此功能时修改模型架构或输入数据/输入大小不会使缓存失效或重新运行前向传递,可能会导致不正确的摘要。默认值:False
  • col_names (Iterable[str]):指定输出中要显示的列。目前支持的有:“input_size”, “output_size”, “num_params”, “params_percent”, “kernel_size”, “mult_adds”, “trainable”。默认值:“output_size”, “num_params”。如果未提供 input_data / input_size,则仅使用 “num_params”。
  • col_width (int):每列的宽度。默认值:25
  • depth (int):显示嵌套层的深度(例如,Sequentials)。低于此深度的嵌套层将不会在摘要中显示。默认值:3
  • device (torch.Device):为模型和 input_data 使用此 torch 设备。如果未指定,则使用 input_data 的数据类型(如果已提供)或模型的参数。否则,使用 torch.cuda.is_available() 的结果。默认值:None
  • dtypes (List[torch.dtype]):如果使用 input_size,torchinfo 假设输入使用 FloatTensors。如果模型使用不同的数据类型,请指定该数据类型。对于多个输入,请指定每个输入的大小,并在此处指定每个参数的类型。默认值:None
  • mode (str):“train” 或 “eval” 中的一个,决定在调用 summary() 之前调用 model.train() 还是 model.eval()。默认值:“eval”
  • row_settings (Iterable[str]):指定在一行中显示哪些特性。目前支持的有:“ascii_only”, “depth”, “var_names”。默认值:“depth”
  • verbose (int):0(静默):无输出;1(默认):打印模型摘要;2(详细):详细显示权重和偏置层。默认值:1。如果使用 Jupyter Notebook 或 Google Colab,默认值为 0。
  • **kwargs:模型 forward 函数中使用的其他参数。不再支持传递 *args。

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

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

相关文章

数据库软题8-数据库的控制功能

一、事务管理 题1-事物的四个特性&#xff08;原子、一致、隔离、永久&#xff09; 1.隔离性 2.持久性 3.原子性 二、数据库的备份与恢复 题1-数据库恢复就是回到故障发生前的状态 题2 题3 三、并发控制 题1-排它锁 选D题2.共享锁排他锁 1. 加了排他锁&#xff0c;不能再加…

毕设 深度学习语义分割实现弹幕防遮(源码分享)

文章目录 0 简介1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果最后 0 简介 今天学长向大家分享一个毕业设计项目 毕业设计 深度学习语义分割实现弹幕防遮(源码分享) &#x1f9ff; 项目分享:见文末! 1 课题背景 弹幕是显示在视频上的评论…

设计模式、系统设计 record part04

结构型模式 结构型模式分为&#xff1a; 1.类结构型模式 2.对象结构型模式 3。类结构型&#xff0c;使用继承机制&#xff0c;耦合度高&#xff0c;不灵活 4.对象结构型&#xff0c;使用组合、聚合关系&#xff0c;耦合低&#xff0c;灵活 代理模式 1.代理就是中介 2.静态代理&…

64.DDR3读写控制器的设计与验证(1)(MIG IP核的配置)

&#xff08;1&#xff09;DRAM-动态随机存储器&#xff0c;SDRAM-同步动态随机存储器 DDR3 SDRAM- 第三代双倍速率同步动态随机存储器 双倍速率指的是时钟上升沿和下降沿都可以传输数据。同步指的是数据写入或读取时&#xff0c;是按时钟同步的。动态指的是硬件使用电容去存…

C# 自适应屏幕分辨率

一、新增AutoSizeFormClass.cs class AutoSizeFormClass{//(1).声明结构,只记录窗体和其控件的初始位置和大小。public struct controlRect{public int Left;public int Top;public int Width;public int Height;}//(2).声明 1个对象//注意这里不能使用控件列表记录 List nCtr…

云手机哪款好用?2024年云手机推荐对比指南

随着云手机市场的快速扩展&#xff0c;消费者在选择云手机时面临着众多选择。为了帮助大家找到最适合自己的云手机&#xff0c;小编特意整理了一份当前市场上几款备受关注的云手机品牌对比&#xff0c;大家一起往下看吧。 1. Ogphone云手机 Ogphone云手机是近年来海外业务版块迅…

图解C#高级教程(五):枚举器和迭代器

本章主要介绍 C# 当中枚举器、可枚举类型以及迭代器相关的知识。 文章目录 1. 枚举器和可枚举类型2. IEnumerator 和 IEnumerable 接口2.1 IEnumerator 接口2.2 IEnumerable 接口 3. 泛型枚举接口4. 迭代器4.1 使用迭代器创建枚举器4.2 使用迭代器创建可枚举类4.3 迭代器作为属…

谈论 MultiPHP

许多网站服务器提供商有大量客户&#xff0c;这些客户对他们的在线项目有各种需求。MultiPHP Manager界面可以帮助您轻松管理cPanel账户和域名的PHP和PHP-FPM配置&#xff0c;适用于运行EasyApache 4的系统。MultiPHP Manager界面提供了多种功能&#xff0c;包括&#xff1a; 服…

软考系统分析师知识点五:数据通信与计算机网络

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;32天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

安卓如何实现双击触摸唤醒点亮屏幕功能-源码分析linage os高通平台

背景&#xff1a; 前面文章已经有讲解过双击亮屏在一些方案调研情况&#xff0c;刚好linage os手机本身也有这个功能&#xff0c;刚好也有整体开源源码&#xff0c;所以今天带大家来对双击亮屏的源码部分进行剖析&#xff0c;本篇文章会一直分析到hal操作驱动节点。 设置作为…

有点晕,inline, crossinline,noinline小计

inline 主要用于展开铺平函数&#xff0c;用于高频访问但是代码不是很多的方法&#xff0c;减少函数对象的定义 fun <T> List<T>.normalForeach(action:(T)->Unit){for(item in this){action(item)} }inline fun <T> List<T>.inlinedForeach(action…

易图讯军用VR三维电子沙盘系统

深圳易图讯军用VR三维电子沙盘系统是一种集成了虚拟现实&#xff08;VR&#xff09;技术、三维建模技术、大数据分析、实时动态更新以及高度安全可靠的综合性军事指挥平台。该系统通过高精度三维模型真实再现战场环境&#xff0c;为指挥员提供沉浸式体验和交互操作的可能性&…

使用CANFD路由实现CAN与CANFD互通

随着科技的发展&#xff0c;汽车电子和工业领域中CAN通信需要承载数据量也越来越大&#xff0c;传统CAN通信有了向CANFD通信过渡的倾向。在实现过渡的过程中可能会出现自己设备是CAN通信&#xff0c;客户设备是CANFD通信的情况&#xff0c;或者自己设备是CANFD通信&#xff0c;…

react项目引入ant-design

当前react版本为&#xff1a; 1、安装antd npm install antd --save不需要安装babel-plugin-import&#xff0c;否则会报各种问题 2、引入Ant Design 样式 为了确保 Ant Design 样式在页面中生效&#xff0c;你需要在 _app.js 文件中全局引入样式。 当前项目用的Next.js。Ne…

vscode创建flutter项目,运行flutter项目

打开View&#xff08;查看&#xff09; > Command Palette...&#xff08;命令面板&#xff09;。 可以按下 Ctrl / Cmd Shift P 输入 flutter 选择Flutter: New Project 命令 按下 Enter 。选择Application 选择项目地址 输入项目名称 。按下 Enter 等待项目初始化完成 …

【HarmonyOS开发笔记 1】 -- 开发环境的搭建

DevEco Studio 的下载与安装 下载 下载路径&#xff1a; https://developer.huawei.com/consumer/cn/download/ 安装 解压后双击 deveco-studio-5.0.3.814.exe 指定安装目录&#xff0c;或者默认&#xff0c;然后下一步 一直“下一步”&#xff0c; 直到最后安装完成 新…

主机加固的关键要素:服务器防病毒

在数字化浪潮中&#xff0c;网络安全已成为企业不可忽视的一环。尤其是安全运维人员&#xff0c;他们肩负着保护企业数据不受侵害的重任。MCK主机加固解决方案&#xff0c;正是为了应对这一挑战而生。 网络安全的严峻现实 不久前&#xff0c;一家知名企业因勒索病毒攻击而被迫…

MVC、MVP和MVVM之间的区别

MVC&#xff08;Model-View-Controller&#xff09; 角色划分&#xff1a; Model&#xff1a;负责处理数据和业务逻辑&#xff0c;通常包括数据的存储、检索和更新等操作。 View&#xff1a;负责展示用户界面&#xff0c;接收用户输入&#xff0c;并将用户操作传递给 Controll…

如何在Visual Studio 2019中创建.Net Core WPF工程

如何在Visual Studio 2019中创建.Net Core WPF工程 打开Visual Studio 2019&#xff0c;选择Create a new project 选择WPF App(.Net Core) 输入项目名称和位置&#xff0c;单击Create 这样我们就创建好了一个WPF工程 工程文件说明 Dependencies 当前项目所使用的依赖库&…

java面向对之象类的继承与多态

目录 1.类的继承 图解 案例:创建一个动物类和一个猫类 1.代码 1)动物类 2)猫类 3.测试类 2.效果 2.父类方法的重写 案例:如何重写父类的方法 1.代码 1&#xff09;Animal类 2&#xff09;Dog类 3&#xff09;测试类 2.效果 3.super关键字 案例:如何在子类中调用父类的方…