显存碎片化与CUDA OOM解决

1 篇文章 0 订阅

目录

一.显存碎片化与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,这样可以减轻显存碎片化的问题。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值