显存碎片化与CUDA OOM解决

目录

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

相关推荐

  1. c# 字典内存碎片

    2024-05-26 01:00:41       30 阅读
  2. 碎片的互联网

    2024-05-26 01:00:41       58 阅读
  3. c# 内存碎片

    2024-05-26 01:00:41       40 阅读
  4. GPU

    2024-05-26 01:00:41       42 阅读
  5. tensorflow中分配

    2024-05-26 01:00:41       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-26 01:00:41       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-26 01:00:41       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-26 01:00:41       82 阅读
  4. Python语言-面向对象

    2024-05-26 01:00:41       91 阅读

热门阅读

  1. VUE学习

    VUE学习

    2024-05-26 01:00:41      35 阅读
  2. 模块、包、库的区别

    2024-05-26 01:00:41       28 阅读
  3. docker的使用以及常用命令

    2024-05-26 01:00:41       40 阅读
  4. C语言期末习题之二维数组转置

    2024-05-26 01:00:41       35 阅读
  5. hetaozy-2D/2D数列位置问题

    2024-05-26 01:00:41       33 阅读
  6. 从零学算法1542

    2024-05-26 01:00:41       33 阅读
  7. 在Juniper SRX系列防火墙上配置DNS

    2024-05-26 01:00:41       34 阅读
  8. k8s配置pods滚动发布

    2024-05-26 01:00:41       40 阅读
  9. Git下载慢

    2024-05-26 01:00:41       32 阅读
  10. 使用FFmpeg进行多媒体处理的完整指南

    2024-05-26 01:00:41       39 阅读
  11. MySQL技术点合集

    2024-05-26 01:00:41       34 阅读
  12. PaddleClas 指定gpu

    2024-05-26 01:00:41       32 阅读
  13. PHP开发安全:专家级代码审计策略与方法

    2024-05-26 01:00:41       33 阅读
  14. Flutter 中的 ExpandIcon 小部件:全面指南

    2024-05-26 01:00:41       32 阅读
  15. Python项目开发实战:五子棋游戏(案例教程)

    2024-05-26 01:00:41       31 阅读