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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/84565.shtml
英文地址,請注明出處:http://en.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;而這些操作又需要隨著需求的變化而不斷變化時&…