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 os
os.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 nn
device = 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 显存资源的浪费,保障模型训练稳定进行。
知识星球服务内容:Dify源码剖析及答疑,Dify对话系统源码,NLP电子书籍报告下载,公众号所有付费资料。加微信buxingtianxia21进NLP工程化资料群。
(文:NLP工程化)