PYTORCH_CUDA_ALLOC_CONF基本原理和具体示例

PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb 是 PyTorch 提供的一项环境变量配置,用于控制 CUDA 显存分配的行为。通过指定此参数,可以有效管理 GPU 显存的碎片化,缓解因显存碎片化而导致的 “CUDA out of memory”(显存溢出)问题。

一.基本原理

在 PyTorch 中,CUDA 显存的管理由 PyTorch 自身的 CUDA 缓存分配器负责。当 GPU 显存中存在多个较小的碎片区域时,即使总体剩余显存充足,也可能因缺少足够大的连续显存块而无法分配大张量,导致显存分配失败(OOM)。

max_split_size_mb 参数作用是:

  • 限制 CUDA 缓存分配器在分割较大显存块时生成碎片的最小尺寸。

  • 更具体而言,当 GPU 需要分配一定大小的显存时,如果已有的显存块太大,分配器将尝试分割现有显存块为两部分:一部分用于满足请求,另一部分用于未来请求。

  • 通过设置该值,可以避免过度分割显存导致严重碎片化。例如,较高的值意味着较少的碎片,但可能会浪费更多显存。

简单理解:设置 max_split_size_mb 的数值越高,意味着更倾向于保留较大的连续显存块,显存碎片化越低,但可能导致显存空间利用率降低;反之,则利用率更高,但容易碎片化。

二.如何设置

1. 命令行设置

export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
python train.py

2. Python代码中设置

import osos.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"import torch# 后续代码

注意:环境变量需在导入 PyTorch 前设置。

三.实际示例说明

假设训练一个较大的 Transformer 模型过程中发生显存错误(OOM):

RuntimeError: CUDA out of memory. Tried to allocate 128 MiB.

通过配置此变量,尝试缓解碎片化。

1.命令行示例

export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:256
python train.py

2.Python代码示例

import os
os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:256"import torch
from torch import nndevice = torch.device('cuda')# 模拟大量显存分配与释放过程:
x = [torch.randn(1024, 1024, device=device) for _ in range(10)]
del x[::2]  # 隔一个删除一个张量,制造显存碎片# 再次尝试分配较大的张量
try:large_tensor = torch.randn(4096, 4096, device=device)
except RuntimeError as e:print("OOM:", e)# 显示当前显存使用情况
print(torch.cuda.memory_summary(device=device))

四.如何选择合适的值

  • 初始尝试推荐值:128MB、256MB、512MB

  • 经验法则:

    • 若反复出现OOM但整体显存还有空余,提高此值以减少碎片。

    • 若显存非常紧张(使用率很高),则降低此值以提高利用率。

典型应用场景:

  • 大模型训练(Transformer、BERT、GPT模型等)

  • 多次频繁显存分配/释放的任务(如频繁forward/backward)

五.常用命令快速诊断显存碎片

print(torch.cuda.memory_summary(device='cuda', abbreviated=False))

查看显存碎片程度:

  • 查看 "inactive_split_bytes"和"inactive_split_bytes.all.peak"等指标。

  • 根据此诊断是否需要调整 max_split_size_mb

PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb 提供了一种快速、有效的手段,以缓解 PyTorch CUDA 显存分配时的碎片化问题,有效避免 GPU 显存资源的浪费,保障模型训练稳定进行。

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

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

相关文章

Halcon仿射变换---个人笔记

文章目录 1.概述2.仿射变换类型3.仿射变换流程4.根据特征点、角度计算仿射变换矩阵4.1 从空变换矩阵创建仿射变换矩阵4.2 把旋转角度添加到仿射变换矩阵4.3 把缩放添加到仿射变换矩阵4.4 把平移添加到防射变换矩阵4.5 把斜切添加到仿射变换矩阵4.6 根据点和角度计算刚性仿射变换…

《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》

《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》 一、引言 在当今数字化的时代背景下,Linux操作系统凭借其卓越的性能、可靠性和开源的优势,在服务器、云计算、嵌入式系统等众多领域占据着举足轻重的地位。对于IT运维…

【Webtrees 用户手册】第 2 章 - 访客须知

Webtrees 用户手册/访客指南 信 第 2 章 - 访客须知 <- 章节概述 目录 1页面结构2标题菜单 2.1主题 2.1.1云2.1.2颜色2.1.3绝佳2.1.4最小2.1.5网络树2.1.6西妮娅 2.2语言2.3登记2.4搜索字段 3主菜单 3.1家谱3.2图表3.3列表3.4日历3.5报告3.6寻找3.7故事3.8常见问题 (FAQ) 4…

动态规划-918.环形子数组的最大和-力扣(LeetCode)

一、题目解析 听着有点复杂&#xff0c;这里一图流。 将环形问题转化为线性问题。 二、算法原理 1.状态表示 2.状态转移方程 详细可以移步另一篇博客&#xff0c;53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 3.初始化 由于计算中需要用到f[i-1]和g[i-1]的值&…

飞牛fnNAS远程映射盘符

目录 一、NAS、PC端配置Zerotier 二、使用网上邻居 三、使用WebDAV 1.开启WebDAV 2.PC上安装RaiDrive并设置 如果能将NAS作为本机一个盘符来使用,一定会令我非常方便。如果是本地,可以很方便实现。 将飞牛NAS映射为本地盘符,常用两种方式,一种是网上邻居,另一种是We…

华为2025年校招笔试手撕真题教程(二)

一、题目 大湾区某城市地铁线路非常密集&#xff0c;乘客很难一眼看出选择哪条线路乘坐比较合适&#xff0c;为了解决这个问题&#xff0c;地铁公司希望你开发一个程序帮助乘客挑选合适的乘坐线路&#xff0c;使得乘坐时间最短&#xff0c;地铁公司可以提供的数据是各相邻站点…

SAP ABAP VK11/VK12 创建销售物料价格(附源码)

需求: 通过接口批量创建销售物料的价格(含阶梯价),对应事务码VK11/VK12 方法:(会在下面源码写出各个方法的优缺点,仅供参考) 通过函数 RV_CONDITION_COPY创建(目前最优)通过函数 BAPI_PRICES_CONDITIONS通过BDC录屏使用VK11事务码进行创建分析: 通过测试可发现,VK…

噪声建模在一小时:最小化准备工作的自监督低光RAW图像去噪

论文标题: Noise Modeling in One Hour: Minimizing Preparation Efforts for Self-supervised Low-Light RAW Image Denoising发表日期: 2025年5月作者: Feiran Li, Haiyang Jiang*, Daisuke Iso发表单位: Sony Research, Tokyo University原文链接: https://arxiv.org/pdf/25…

Puppeteer 浏览器自动化操作工具

pyppeteer 是 Python 版本的 Puppeteer&#xff0c;而 Puppeteer 是由 Google 开发的一个 Node.js 库&#xff0c;用于控制 Chrome 或 Chromium 浏览器。pyppeteer 允许你通过 Python 代码自动化操作浏览器&#xff0c;实现网页爬取、自动化测试、生成截图或 PDF 等功能。 核心…

接口性能测试-工具JMeter的学习

接口登录链接http://111.230.19.204:8080/blog_login.html 一、JMeter基本使用流程 1、启动Jmeter 2、在“测试计划”下添加线程组 3、在“线程组”下添加“HTTP”取样器 4、填写“HTTP请求”的相关请求数据 5、在“线程组”下添加“查看结果树”监听器 6、点击“启动”按钮…

mybatis-plus与jsqlparser共用时报sql解析错误

手动引入jsqlparser-4.6版本&#xff0c;但mybatis-plus中引用为4.4版本 解决方法一&#xff1a; jsqlparser版本与mybatis-plus中引用版本一致。 解决方法而二&#xff1a; 排除掉mybatis-plus中的jsqlparser。

用MMdetection框架训练自己的数据集(全流程实战)

前面我们准备好了COCO格式的数据集&#xff1a;将YOLO格式的数据集转换为mmdetection格式-CSDN博客https://blog.csdn.net/qq_54708219/article/details/148224187?spm1001.2014.3001.5501 下面我们使用MMdetection开始训练。 1.创建新的数据集类 首先&#xff0c;在mmdet/d…

VS Code中Maven未能正确读取`settings.xml`中配置的新路径

在VS Code中Maven未能正确读取settings.xml中配置的新路径&#xff0c;通常是由于以下原因导致的&#xff1a; 一、VS Code未使用你修改的settings.xml文件 VS Code的Maven插件可能使用了默认配置或指向其他settings.xml文件。解决方法&#xff1a; 手动指定settings.xml路径…

2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 A题 医学图像的配准 原题再现&#xff1a; 图像的配准是图像处理领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合同一对象在不同条件下获取的图像。例如为了更好地综合多种信息来辨识不同组织或病变&#xff0c;医生可能使用…

RPM之(1)基础使用

RPM之(1)基础使用 Author: Once Day Date: 2025年5月26日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: Linux实践记录_Once-Day的博客-CSDN博客 …

国内可做大批量pcb的工厂有哪些?

在电子产业升级浪潮中&#xff0c;PCB作为电子设备的基础载体&#xff0c;其批量生产能力直接决定着终端产品的市场响应速度与品质稳定性。本文精选五家具备核心竞争力的厂商&#xff0c;从工艺深度、产能规模到服务模式展开剖析&#xff0c;为采购决策提供专业参考。 猎板PCB…

【视频】使用海康SDK保存的MP4无法在浏览器(html5)中播放

1、问题描述 在使用海康 SDK 的 NET_DVR_SaveRealData 接口&#xff0c;将视频流保存成MP4文件后&#xff0c;通过浏览器无法播放MP4&#xff0c;播放其它的MP4正常。 2、原因分析 对比可以正常播放的MP4 和 无法播放的MP4文件&#xff0c;比较它们的详细信息&#xff0c;发…

AI时代新词-生成对抗网络(GAN)

一、什么是生成对抗网络&#xff08;GAN&#xff09;&#xff1f; 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;简称GAN&#xff09;是一种由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;组成的深度学习模…

使用AutoKeras2.0的AutoModel进行结构化数据回归预测

1、First of All: Read The Fucking Source Code import autokeras as ak import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error# 生成数据集 np.random.seed(42) x np.random.rand(1000, 10) # 生成1…

实战设计模式之访问者模式

概述 访问者模式允许我们在不改变类的前提下&#xff0c;向已有类添加新的功能。简单来说&#xff0c;就是将算法与对象的数据结构进行分离的一种方法。在实际应用中&#xff0c;当我们需要对一组对象执行一些操作&#xff0c;而这些操作又需要随着需求的变化而不断变化时&…