目录
一.显存碎片化与CUDA OOM解决
1.查看显卡内存容量
2.显存碎片化
(1)如何理解显存中“已分配”和“未分配”的内存块?
(2)碎片化形成的原因?
(3)如何减轻显存碎片化?
3.实现
(1)设置环境变量限制显存
(2)代码实现限制显存
一.显存碎片化与CUDA OOM解决
1.查看显卡内存容量
2.显存碎片化
有时候遇到cuda OOM问题,可以通过限制显存分配减轻碎片化
(1)如何理解显存中“已分配”和“未分配”的内存块?
已分配的内存块:
定义:已分配的内存块是指显存中已经被程序占用的内存区域。这些区域被用来存储数据、模型参数、纹理等,供 GPU 使用。
用途:这些内存块包含了当前正在使用的数据,例如深度学习模型的权重、训练数据的批次、图形渲染所需的纹理等。
未分配的内存块:
定义:未分配的内存块是显存中尚未被任何程序占用的空闲内存区域。
用途:这些内存块可用于未来的内存分配请求。当程序需要更多显存时,会尝试在这些未分配的区域中找到足够的空间。
假设一个显存有 8GB 的容量,最初整个 8GB 都是未分配的空闲内存。随着程序的运行,显存会被逐渐分配和释放。例如:
在以上示例中,尽管显存中还有 4GB 未分配的空闲内存,但这些未分配的内存块是不连续的。如果程序需要一个连续的 4GB 内存块,则会分配失败,可能会引发“CUDA out of memory”错误。这种现象就称为显存碎片化。
(2)碎片化形成的原因?
显存碎片化主要是由于频繁分配和释放不同大小的内存块导致的。当显存中存在很多不连续的已分配和未分配内存块时,尽管总的未分配内存量足够,但由于缺少足够大的连续内存块,新的内存分配请求可能会失败。
(3)如何减轻显存碎片化?
通过限制显存分配减轻碎片化:
a.减少内存分配和释放操作:
通过限制显存使用,程序在启动时会一次性申请较大的内存块,避免在运行过程中频繁分配和释放小块内存。
b.预留固定大小的内存块:
限制显存分配可以确保在程序运行时,显存的使用是连续和可控的,减少动态分配导致的碎片化。
c.更好地管理内存:
通过限制显存分配,可以更好地管理内存,确保不会因为显存不足而频繁触发内存分配和释放操作,从而减轻碎片化。
3.实现
(1)设置环境变量限制显存
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
(2)代码实现限制显存
import os
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'max_split_size_mb:128'
这个设置将最大块的显存分配限制为128MB,这样可以减轻显存碎片化的问题。